一、工具安装
Dev-C++安装:https://www.bilibili.com/video/BV1kC411G7CS
一般比赛会用到Dev-C++, 但是Dev-C++还是有自身的局限性 , 后续的博客学习中 , 必要的时候 , 会使用VS2022 , 下面是VS2022的安装和使用教程。
VS2022安装:https://www.bilibili.com/video/BV11R4y1s7jz
二、第一个C++程序
2.1 基础程序
#include <iostream>
using namespace std;int main()
{cout << "hello world" << endl;return 0;
}
2.2 main 函数
main 函数是程序的入口 , C++程序不管有多少行代码 , 都是从main 函数开始执行的 , main 函数也被叫做主函数 。 main 函数前面的 int 表示 main 函数执行结束的时候返回一个整型类型的值 , 而在 main 函数的最后写 return 0 ; 正好前后呼应
- main 函数是程序的入口
- main 函数 有且仅有一个
- 一个项目中可以有多个 . cpp 文件 , 但是只能有一个main 函数(因为程序的入口只能有一个。
对于函数的详细讲解,将在此系列的第七篇讲解。
2.3 字符串
在C语言中 。 使用单引号括起来一个字符 , 表示字符字面值 , 比如 : '1' , ' a ' , 使用双引号括起来多个字符表示一个字符串 , 比如 "abcdefg" , " hello world" , 字符串中可以有一个或者多个字符 , 也可以没有任何字符 , " " 表示空字符串。
C++的STL 中引入了 string 来表示字符串 , 功能更加强大 , C语言不支持 , 后期篇章会详细介绍 。
2.4 头文件
#include <iostream> ---> 包含头文件 ,头文件的名字叫: iostream ,使用 #include <> 的形式进行包含。在 C++ 程序中要完成输入和输出的操作会涉及到 iostream 文 件中的多个定义,所以就要包含这个头文件的。比如:代码中的 cout 是输出流对象,就是用来完成数据输出的,就需要包含头文件。
除了iostream 这个头文件之外 , C++ 的编译器自带了很多头文件 , 每个头文件都支持一组特定的工具 。
C++库函数相关头文件:https://zh.cppreference.com/w/cpp/header
注:1. 在C语言中头文件的扩展名是 .h ,但是C++中的用法发生了⼀些变化,对老式C的头文件保留了扩展名 .h ,但是C++自己的文件没有扩展名了。C语言头文件:https://zh.cppreference.com/w/c/header2. 有些C的头文件被转换成C++头文件,这些文件名被重命名,去掉了.h扩展名,并在文件名的前面加上了前缀c(表示来自C语言);例如:C语言中有关数学的头文件名字是 math.h ,在C++中就是 cmath 。当然还得注意,有时头文件的C语言版本和C++版本相同,而有时候,新版本做了⼀些修改。
例如:
2.5 cin 和 cout 初识
cout << "hello world " <<endl ;
1 . 这句代码在上面的程序中是最重要的代码 , 其他所有的代码都是为了编写这句代码。
2 . 代码中 cout 是标准输出流对象(针对控制台 , 也就是屏幕) , 其实还有标准输入流对象(针对的是键盘) cin ;
3 . cout 是告诉程序把后面双引号中的内容打印到标准输出设备(屏幕) 上 , 双引号的内容可以替换的。
#include <iostream>
using namespace std;int main()
{int num;cin >> num ;cout << num << endl;return 0;
}
- cin 和 cout 是全局的流对象 , cin 负责输入数据 , cout 负责输出数据。
- endl 是C++中一个特殊的操作符 , 效果是换行和刷新缓冲区 , 使用时必须包含在iostream 头文件中 。
- << 是流插入运算符 , 和 cout 配合使用 , >> 是流提取运算符 , 和cin 搭配使用 , 两者容易混淆 , 需要区分 。
- 使用C++输入输出更方便 。 不需要像printf / scanf 输入输出时那样 , 需要手动控制格式 。 C++输入输出可以自动识别变量类型 。
2.6 名字空间
using namespace std;这句代码的意思是:使用名字空间 std (名字空间也叫命名空间)
1 . 在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称如果都存在于全局作用域中,可能会导致很多冲突。使用名字空间的 目的是对标识符的名称进行隔离,以避免命名冲突或名字污染, namespace 关键字的出现就是针对这种问题的。2 . std 是C++标准库的名字空间名,C++将标准库的定义实现都放到这个命名空间中,当我们需要使用标准库中的内容时,就需要加上: using namespace std ;当有了这句代码的时候,表示名字空间 std 中信息都是可见和可用的,⽐如: cin 、 cout 、 endl 等。
名字空间也是根据需要⾃⼰可以定义的,这⾥就不加详细介绍,可以自行拓展学习。 C++ 的第一个程序_c++第一个程序-CSDN博客
2.7 注释
C++ 里主要有两种形式 : // 单行注释 和 /* */多行注释
1 . 注释本来是对代码进行解释的文字 , 要放在代码中 , 但是又无需编译 。
2 . 注释是给程序员自己看的 , 编译器会忽略注释 , 基于注释是编译器忽略的这个特点 , 在代码中有些代码不再需要的时候夜壶使用注释的方式屏蔽。
单行注释(//):指的是当前行不参与编译和运行
#include <iostream>
using namespace std;int main()
{int num;cin >> num;// cout << num << endl;return 0;
}
多行注释(/* */) : 指的是被包含在内的多行不参与编译和运行
/*
#include <iostream>
using namespace std;int main()
{int num;cin >> num;cout << num << endl;return 0;
}
*/
小贴士:
1. 在VS环境中注释和取消注释的快捷键 : Ctrl + K + C , Ctrl + K + U
2. 在DevC++ 中注释和取消的快捷键 : Ctrl + /
2.8 练习
练习一:Hello,World!
B2002 Hello,World! - 洛谷
#include <iostream>
using namespace std;
int main()
{cout << "Hello,World!" << endl;return 0;
}
1. 要仔细读题、审题2. 注意语法细节: main函数写法、大括号匹配、中英文标点符号的使用、包含头文件。
练习二:打印飞机
小飞机_牛客题霸_牛客网
#include <iostream>
using namespace std;int main()
{cout <<" **" << endl;cout <<" **" << endl;cout <<"************"<<endl;cout <<"************"<<endl;cout <<" * *"<<endl;cout <<" * *"<<endl;return 0;
}
OJ(Online Judge --> 在线判题) 题目输出的结果有严格的检查,代码输出的结果必须和题目要求的统⼀才是可以的。
练习三:第二个整数
B2003 输出第二个整数 - 洛谷
#include <iostream>
using namespace std;int main()
{int n1,n2,n3;cin >> n1 >> n2 >>n3;cout << n2 << endl;return 0;
}
注意 :1. 这里的 n1 和 n2 两个整数,可以分两次读入,也可以⼀次读入,只有获取到第⼆个输入值才能输出结果。2 . cin 是支持连续读入几个数值的3 . cout 也是支持连续输出几个数值的
练习四:字符三角形
B2005 字符三角形 - 洛谷
#include <iostream>
using namespace std;int main()
{char c;cin >> c;cout << " " << c << " " << endl;cout << " " << c << c << c << endl;cout << c << c << c << c << c << endl; return 0;
}
三、数据类型
C++中提供了丰富的数据类型来描述生活中的各种数据。 比如 :可以使用整型类型来描述整数 , 使用字符类型来描述字符 , 使用浮点数类型来描述小数 。
所谓 " 类型 " , 就是相似的数据所拥有的共同特征 , 编译器只有知道了数据的类型 , 才能知道如何操作数据 。
3.1 字符型
char // character 缩写
键盘上可以敲出各种字符 , 如 : a , q , # , @ 等 ,这些符号都被成为字符 , 字符是用单引号括起来的 , 如 : 'a ' , ' b' , '1' , '#' 。 为了能说明这些字符 , 给他们抽象出一种类型 , 就是字符型
我们不需要记住所有的ASCII码表中的数字,使用时查看就可以,不过我们最好能掌握几组特殊的数据:
- 字符A~Z :65 ~ 90
- 字符 a ~ z :97 ~ 122
- 对应的大小写字符(a和A)的ASCII 码值的差值是 32
- 数字字符0 ~ 9 的ASCII 码值从 48 ~ 57
- 换行 \n 的ASCII码值 : 10
- ASCII 码值 从 0~31 这32 个字符是不可打印字符 , 无法打印在屏幕上观察
#include <iostream>
using namespace std;int main()
{char c1 = 'Q' ;cout << c1 << endl;char c2 = 81;cout << c2 << endl; // 这里的81是字符Q的ASCII码值 , 也是可以正常打印的 return 0;
}
3.2 整型
整型类型就是对所有整型的抽象 , 为了能对整数形成统一的类型标识 , 就有整型 ;
C++ 和 C 中整型被分为四大类 :
short [int] 短整型
int 整型
long [int] 长整型
long long [int] 更长的整型
3.3 浮点型
浮点型式对所有实数(小数) 的抽象 , 为了能对实数进行统一的类型标识 , 就有了浮点型。
浮点型有三种 :
float 单精度浮点型
double 双精度浮点型
long double 更长的双精度浮点型
#include <iostream>
using namespace std;int main()
{char c = 'C';short s = -10;short int s = -10;int s = -10;long l = -10;long int = -10;long long int = -10;long long = -10;float f = 3.14f;double d = 3.14;long double ld = 3.14;return 0;
}
在 C/C++中小数的书写形式 :
3.14; 编译器会默认识别为double 类型
3.14f; 编译器会识别为float 类型
1e5; 科学计数法 , ---> 1.0 * 10^5
1e5 + 10 ; 1.0 * 10^5 + 10 == 100010
1.23e5 + 10 ; 1.23 * 10^5 + 10 == 123010
3.4 布尔类型
C++有一种类型叫 bool(布尔类型) , 布尔类型的变量的值可以是true 或 false , 这种类型的变量专门用来表示真或假 。 当然在C 和 C++ 中 , 0表示假 , 非0表示真 , 有时候不使用bool 类型也能表示相同的逻辑 。
#include <iostream>
using namespace std;int main()
{bool flag = true;if(flag)printf("I like C++!");return 0;
}
#include <iostream>
using namespace std;int main()
{int flag = 0;cin >> flag; //输入非0 , flag为trueif(flag)printf("I like C++!"); return 0;
}
3.5 signed 与 unsigned
signed 和 unsigned 关键字修饰字符型和整型类型的。
1.signed 关键字 , 表示一个类型带有正负号 , 包含负值;比如:温度、银行存款。
2.unsigned 关键字 , 表示该类型不带有正负号 , 只能表示0和正整数 , 比如:年龄。
//字符型
char
signed char //有符号的字符类型 // 范围为 -128 到 127
unsigned char //⽆符号的字符类型 // 范围为 0 到 255//短整型
short [int]
[signed] short [int] //有符号的短整型
unsigned short [int] //⽆符号的短整型//整型
int
[signed] int //有符号的整型
unsigned [int] //⽆符号的整型//⻓整型
long [int]
[signed] long [int] //有符号的⻓整型
unsigned long [int] //⽆符号的⻓整型//更⻓的整型
long long [int]
[signed] long long [int] //有符号的
unsigned long long [int] //⽆符号的
- 对于int 类型 , 默认是带有正负号的 , 也就是说 int == signed int ;
- 变量声明unsigned 的好处是 , 同样长度的内存能表示的最大整数值 , 增大了一倍
比如,16位的 signed short int 的取值范围是: -32768~32767 ,最大是 32767 ;但unsigned short int 的取值范围是: 0~65535 ,最大值增大到了 65535 。注意:
char 类型到底是 signed char 还是 unsigned char ,由编译器决定。大部分的编译器上 char 就是 signed char 。这就是说, char 不等同于 signed char ;它有可能是 signed char ,也有可能是 unsigned char 。与 int 不同, int 就是等同于 signed int 。
3.6 数据类型长度
每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。
sizeof 操作符
sizeof 是一个关键字,也是操作符,专门是用来计算特定数据类型的长度的,单位是字节。sizeof 操作符的操作数可以是类型,也可是变量名或者表达式, sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。sizeof ( 类型 )sizeof 表达式
#include <iostream>
using namespace std;int main()
{int a = 10;cout << sizeof(a) << endl;cout << sizeof a << endl; //a是变量的名字,可以省略掉sizeof后边的(),但不建议去掉cout << sizeof(int) << endl;return 0;
}
各数据类型长度
#include <iostream>
using namespace std;int main()
{cout << sizeof(char) << endl;cout << sizeof(bool) << endl;cout << sizeof(short) << endl;cout << sizeof(int) << endl;cout << sizeof(long) << endl;cout << sizeof(long long) << endl;cout << sizeof(float) << endl;cout << sizeof(double) << endl;cout << sizeof(long double) << endl;return 0;
}
如何理解这些数据类型的长度呢?
3.7 各类型取值范围
不同的数据类型所创建的变量的长度是有差异的, 这个长度差异又决定了,这种变量中能存储的值的大小。下面是不同数据类型的取值范围:
对这些数据类型的取值范围 还需要知道取值范围的数量级 , 像 int 类型取值大概是 : -2.1 *10^9 ~ 2.1 * 10^9 , 这里大概是10 ^9 这样的数量级。
3.8 typedef
在C++中有⼀个关键字是和类型有关的,是用来给类型重命名的。 当有⼀个类型比较复杂的时候,可以简化类型。 typedef 在竞赛中经常使用,可以提升编码速度。typedef使用的基本语法形式:typedef 旧类型名 新类型名;
3.9 练习
练习一 :整数
牛牛学说话之-整数_牛客题霸_牛客网
#include <iostream>
using namespace std;int main()
{int a;cin >> a;cout << a;return 0;
}
练习二:打印字符
B2018 打印字符 - 洛谷
#include <iostream>
using namespace std;int main()
{int n;cin >> n;char ch = n ;cout << ch << endl;return 0;
}
练习三:倒序
登录—专业IT笔试面试备考平台_牛客网
#include <iostream>
using namespace std;int main()
{int a, b, c;cin >> a >> b >> c;cout << c << " " << b << " " << a << endl;return 0;
}
练习四:整型数据类型存储空间大小
信息学奥赛一本通(C++版)在线评测系统
#include <iostream>
using namespace std;int main()
{int a = 0;short b = 0;cin >> a >> b;cout << sizeof(a) << " " << sizeof(b) << endl;return 0;
}
四、变量和常量
4.1 变量的创建
类型是用来创建变量的。1. 变量 ----> 把经常变化的值称为变量,不变的值 <------常量。2. 变量创建的语法形式是这样的:data_type name;| || |数据类型 变量名int age; // 整型变量char ch; // 字符变量double weight; // 浮点型变量
4.2 变量的初始化
变量在创建的时候就给一个初始值,就叫初始化;
4.3 变量的分类
1 . 全局变量:在大括号外部定义的变量就是全局变量 , 全局变量的使用范围更广,整个⼯程中想使用,都是有办法使用的2 . 局部变量:在大括号内部定义的变量就是局部变量 ,局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的
#include <iostream>
using namespace std;int global = 2025; //全局变量 int main()
{int local = 2024; //局部变量cout << local << endl;cout << global << endl; return 0;
}
如果局部和全局变量,名字相同:
如果想使用全局变量:
未初始化的局部变量:
#include <iostream>
using namespace std;//未初始化的局部变量
int main()
{int a;char c;float f;double d;cout << "int:" << a << endl;cout << "char:" << c << endl;cout << "float:" << f << endl;cout << "double:" << d << endl;return 0;
}
局部变量通常不会自动初始化 。它们需要在使用之前明确地赋值或初始化。如果没有初始化,它们的值将是未定义的,使用未初始化的局部变量可能会导致不可预测的行为或运行时错误,因此局部变量建议初始化。
未初始化的全部变量:
#include <iostream>
using namespace std;int a;char c;float f;double d;//未初始化的全部变量
int main()
{cout << "int:" << a << endl;cout << "char:" << c << endl;cout << "float:" << f << endl;cout << "double:" << d << endl;return 0;
}
全局变量:全局变量通常在定义时就被初始化, 如果没有明确指定初始值,它们通常会被初始化为 0。
注意:
如果⼀个题目既可以使用全局变量,又可以使用局部变量,那怎么选择呢?
如果是在竞赛中: 能使用全局变量,⼀般会直接是全局变量,这样的好处是:1. 变量不需要初始化,因为默认会初始化为0,这样写会比较快2. 很多时候,会避免传参,因为全局变量到处都可以使用。(后面会讲)所以在在竞赛中其实哪种方便就使用哪种,全局变量的使用很常见。但是在企业里软件开发的工程实践中一般建议:能使用局部变量的,尽量少使用全局变量。因为企业级的开发,代码量比较大,全局变量在任意地方都可以使用,这样就变得不可控了。
4.4 常量
常量就是不能被改变的值 , 通常我们会使用三种常量 :
字面常量:
#define 常量
#define 常量名 内容
注意:后面无分号
#include <iostream>
using namespace std;#define M 100
#define CH 'x'
#define PI 3.14159int main()
{cout << M << endl;cout << CH << endl;cout << PI << endl;return 0;
}
1. 这里定义的M 、 CH 、PI 都是常量 , 可以直接使用 , 但是不能被修改 !
2. 使用 #define 定义常量的时候是不关注类型的 , 只关注常量的名字叫啥 , 常量的值是啥 , 编译在处理这种常量的时候就是直接替换 , 在出现常量名字的地方 , 通通替换成常量的内容 。
上述代码被编译器替换后就是:
#include <iostream>
using namespace std;int main()
{cout << 100 << endl;cout << x << endl;cout << 3.14159 << endl;return 0;
}
const 定义常量
会有具体类型 , 比 #define 定义常量更加严谨 , 语法形式如下:
const 类型 常量名字 = 常量值 ;
- 习惯上 , const常量的名字一般会使用大写 ,而普通常量的名字不会全部大写
- const 常量 增加了程序的可维护性 , 如果改变常量的值 , 只需要在定义的部分修改 , 使用的地方也就随之改变 , 做到了"一改全改"的效果。
- const 常量 增加了程序的可读性 , PI 比 3..1415926 更加容易书写 、 使用
- 常量不可修改
#include <iostream>
using namespace std;const double PI = 3.14159926;int main()
{int r = 0;cin >> r;cout << "周长:" << 2 * PI * r << endl;cout << "面积:" << PI * r * r << endl;//PI = 3.14; //这种写法会报错 , 因为常量不可以被修改 return 0;}
4.5 练习
练习一:买票
牛牛买电影票_牛客题霸_牛客网
#include <iostream>
using namespace std;int main()
{int x;cin >> x;cout << 100 * x << endl;return 0;
}
练习二:A + B 问题
B2007 A + B 问题 - 洛谷
#include <iostream>
using namespace std;int main()
{int a,b;cin >> a >> b;int sum = a + b;cout << sum << endl;return 0;
}
练习三 :鸡兔同笼
B2614 【深基1.习6】鸡兔共笼 - 洛谷
#include <iostream>
using namespace std;int main()
{int j = 0;int t = 0;int h = 35;int f = 94;j = (4*h - f )/2;t = h - j;cout << t << " " << j << endl;return 0;
}