C++课堂笔记样式参考


发布于 2026-02-03 / 6 阅读 / 0 评论 /
输入输出 程序框架(头文件) #include <bits/stdc++.h> using namespace std; int main(){ //此中间空白部分是你编写代码的地方; //使用双斜杠代表注释,及双斜杠后面的内容不运行 return 0; } 注

输入输出

程序框架(头文件)

#include <bits/stdc++.h>
using namespace std;

int main(){

    //此中间空白部分是你编写代码的地方;
    //使用双斜杠代表注释,及双斜杠后面的内容不运行
    
    return 0;
}

注意:程序中出现的括号,类似于尖括号,小括号,大括号,都是成对出现的。

cout输出 和 cin输入

cout

  • 使用格式:cout <<

cout<<"Hello,World!"<<endl;
cout<<"Hello,World!"<<'\n'; // ‘\n’ 和 endl 都表示换行
cout<<"Hello"<<','<<"World"<<'!'<<endl;//也可以使用串联输出多个内容

int a = 1, b = 2, c = 3;
cout << a << b << c;

注意:cout输出语句,必须要链接输出符号 << 使用,如果要连续输出多个数据,都需要用 << 连接起来;

比如可以这样:cout << n << a << c << endl;

  • 对齐输出

    • setw( ) 函数:可以控制输出流的下一个输出内容的场宽为括号里的参数,当下一个输出的内容的宽度不足设置的参数时,自动在内容前面添加字符(默认为空格)来补齐宽度。如 cout << setw(10) << a ; 仅对下一个输出内容有效。

    • leftright 修饰符:left 使输出内容左对齐,right 使输出内容右对齐,可结合 setw( ) 函数使用,如 cout << left << setw(10) << a ;

    • setfill( ) 函数:设置补齐宽度时,指定用什么字符(而不使用默认的空格)。

如: cout << setfill(‘*’) << setw(10) << a << setw(9) << b ; 它将对设置后的所有输出内容有效。

cin

使用格式:cin >>

int n,a,b;
cin >> n >> a >> b;

注:必须要使用 >> 连接符跟在 cin 后面,再往后连接要输入(读入)的内容;

输入输出加速(cin 和 cout)

#include <bits/stdc++.h>
using namespace std;

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    //先加这两行代码,再正常编写其他代码


    return 0;
}

文件输入输出(文件读写提交方式)

#include <bits/stdc++.h>
using namespace std;

int main(){

    freopen("题目英文名.in", "r", stdin);
    freopen("题目英文名.out", "w", stdout);
    //编写调试好程序,准备提交之前,在int main 下面的第一行,先增加这两行代码


    return 0;
}

注释:题目英文名在正式比赛中在试卷第一页就会有,在 OJ 上一般标题下面会有个“文件 IO” 的英文名称

数据类型与变量

变量的含义

变量,可以理解为“可以变化的量”,它就像是一个可被命名的容器,核心作用是存储和管理数据。

和数学中的变量不太一样,在编程中,需要用到变量,首先就必须得先创建一个变量。

即:先创建,再使用。

变量的创建

变量创建的格式:数据类型+变量名字; 为了方便观看,用+号代表了空格,实际编写代码时一定要写空格,而没有+号,如下:

int a;
int b = 0;
int c = 1,d = 2,e = 3; //= 代表赋值语句,意思是 将 = 后面的值,赋值给前面的变量;

变量的命名规则

  • 只能字母或下划线开头,不能是数字开头

  • 只能包含字母、数字、下划线

  • 不能是 C++中的关键字

  • 变量的命名是为了方便编写程序者快速使用变量,所以起名通常遵循“见名知意”的原则。

变量的赋值

  • 在c++编程中等号 = 代表赋值,如 a = 6 ;代表把 6 赋值给变量 a,之后变量 a 里面存的值就是 6;接下来可以再 a=3 ;此时变量 a 里面存的值就变成 3 了。

  • 变量可参与运算:a = 10 ; a = a - 6 ;

a=1 ;代表把 10 赋值给变量 a,此时变量 a 的值为10;

a=a-6;表示把变量 a 里面的值减去 6,得到的结果重新赋值回给变量 a;此时变量 a 的值就变成了 4;

可以通过以下代码查看一下变量值的变化过程:

int a; // 创建一个用于储存 int 类型的变量,名字为 a
a = 10; //给 a 赋值为 10;
cout << a << '\n' ; //第一次输出 a 的值
a = a - 6;
cout << a << '\n' ; //第二次输出 a 的值

常用数据类型

数据类型

常表示

储存范围

占用内存大小

scanf/printf标识符

int / signed

32位整数

−231 ∼ 231−1

约 −2×109 ∼ 2×109

(10位长度,约正负20亿)

4 Bytes

%d

long long

64位整数

−263 ∼ 263−1

约 −9×1018 ∼ 9×1018

(19位长度)

8 Bytes

%lld

float

单精度浮点数

(小数)

−3.4×1038 ∼ 3.4×1038

有效数字 6 ∼ 7 位

4 Bytes

%f

double

双精度浮点数

(小数)

−1.7×10308 ∼ 1.7×10308

有效数字 15 ∼ 16 位

8 Bytes

%lf

char

字符

至少能储存 0 ∼ 127

常见范围为 −128 ∼ 127

1 Byte

%c

unsigned long long

无符号64位整数

0 ∼ 264−1

约 0 ∼ 1.8×1019

8 Bytes

%llu

及其他常用:bool (布尔类型) 、 string (字符串类型)。占用内存大小可以自己尝试定义并使用sizeof(变量)输出。

const (常量),一般用大写字母当变量名: const int N = 1e5 + 10;

注:强制转换数据类型,可以使用(新的数据类型)+要转换的变量;

比如:double ave = (double)10 / 3;

字符类型

  • 'a' :单引号括起来的属于字符

  • '3' :字符

  • '\n':这个表示换行,这类含有反斜杠'\'的属于转义字符,如'\0','\t'

  • "hello,world" :字符串

  • "a" :只要是双引号括起来的,即使一个字符也是字符串

  • "":双引号括起来的空串,也是字符串

ASCII码(信息交换标准代码)

  • 在计算机中,所有的数据在存储和运算时都要使用二进制数表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是就有了统一使用标准,上述常用符号具体用哪些二进制数来表示。具体可以百度查看ascii码对照表。

  • '0' ~ '9' 对应的 ASCII 为 48 ~ 57

  • 'A' ~ 'Z' 对应的 ASCII 为 65 ~ 90

  • 'a' ~ 'z' 对应的 ASCII 为 97 ~ 122

基础二进制

  • 二进制即要求满二进一,因此每一位为 0 或 1

  • 二进制从最低位到最高位,数位的权值分别为:20 , 21 , 22 , 23 , … 即 1, 2, 4, 8, 16, 32, 64, 128, …

原码、反码、补码

  • 原码

    • 最高位为符号位,正数为 0,负数为 1。

    • 剩下位置为原数绝对值的二进制。

  • 反码

    • 正数反码与原码一致。

    • 负数反码除最高位之外,在原码基础上取反。

  • 补码

    • 正数补码与原码一致

    • 负数补码在反码基础上加 1。

字符与整数转换

int a;
char c; //定义两个类型的变量
  • 数字字符转换为对应整数:(int)(c - '0')

  • 数字转换为对应字符:(char)(a + '0')

  • 大写字母映射到 0 ∼ 25:(int)(c - 'A')

  • 小写字母映射到 0 ∼ 25:(int)(c - 'a')

  • 大写转小写:(char)(c - 'A' + 'a')

  • 小写转大写:(char)(c - 'a' + 'A')

内存大小换算

  • bit:位(1个二进制位),计算机储存的最小单位

  • Byte:字节(8个连续的二进制位),计算机储存的基本单位

  • 换算方法

    • 1 B(Byte) = 8 bits

    • 1 KB(KiB) = 1024 B(210 B)

    • 1 MB(MiB) = 1024 KB

    • 1 GB(GiB) = 1024 MB

    • 1 TB(TiB) = 1024 GB

    • 1 PB(PiB) = 1024 TB

基础运算

数学运算符

  • +-*/%: 加法、减法、乘法、除法、取余/取模

  • (): 数学中的小括号、中括号、大括号在 C++ 中全都用小括号表示

  • 整数和整数进行运算,结果也会是整数(除法会变成得到商)

  • 只要有一个运算数是小数(浮点数),运算结果就会得到小数类型

  • 取余运算只能在整数间进行,不能对小数取余运算!不能除以0或对0取余!

保留小数位

  • 保留小数位,可使用 cout<<fixed<<setprecision(y); 表示保留 y 位小数位。

  • 上述的这种方式和我们直观理解中的四舍五入稍有差别,对于 4 舍和 6 入的部分是没有问题的,对于舍入位是5,不同情形会出现不同的结果。

  • 一般题目的对比结果都会用精度控制,比如相对或绝对误差在 10−6(即 0.000001)以内就算对,此时保留 7 位小数就可以。

浮点数取整

  • floor() 函数向下取整:每个数可以被取整为不超过它的最大的的整数。例如:floor(2.6) = 2; floor(-2.6) = -3;

  • ceil() 函数向上取整:每个数可以被取整为不小于它的最小整数。例如:ceil(2.3) = 3; ceil(-2.6) = -2;

  • round() 函数四舍五入取整:首先舍入后的符号不变。然后考虑|x|,如果它的小数点后一位在0-4之间,会被直接舍去;而在5-9之间则会进位。例如:round(3.49) = 3; round(3.50) = 4; round(-3.6) = -4; round(-3.4) = -3;

赋值语句

C++中的单个等号 = 代表赋值。如 a = 3 ; 表示将数值 3赋值给变量 a ,即 a 的值变为 3 。

再如 变量 a = 表达式 ;表示的意思是:先计算 = 的右边表达式的值,然后再把得到的值存入(赋值给)左边的变量。

注:整个赋值语句的值为赋值后值,因此可以写 a = b = c = 0; 这样的连续赋值语句(但不推荐)。

赋值基本语法

  • a += b; --> a = a + b;

  • a -= b; --> a = a - b;

  • a *= b; --> a = a * b;

  • a /= b; --> a = a / b;

  • a %= b; --> a = a % b;

  • a++; ~ 将 a 增加 1;作为表达式时,值为增加之前的值; a--; 同理;

  • ++a; ~ 将 a 增加 1;作为表达式时,值为增加之后的值; --a; 同理;

随机数生成

srand( time( 0 ) ); 使用当前时间使随机数发生器随机化;使用 rand() 函数生成范围内的随机数,总结如下(a,b均小于等于RAND_MAX):

  • [a,b] : (rand() % (b - a + 1)) + a;

  • (a,b) : (rand() % (b - a + 1)) + a - 1;

  • [a,b) : (rand() % (b - a)) + a;

  • (a,b] : (rand() % (b - a)) + a + 1;

注:使用随机数生成范围时,要确保 a 和 b 的取值合理,避免出现不符合预期的结果。

选择语句(选择/分支结构)

关键词

  • if:如果

  • else:否则

语法格式

  • 最基础的判断语法,可以没有否则的语句

if( 条件表达式 ){
    //条件满足则执行此语句;
}
  • 判断语句带分支的判断,表达式为真/假时执行不同的判断

if( 条件表达式 ){
    //条件满足,则执行语句 1;
}else{
    //否则,执行语句 2;
}
  • 多个条件依次判断,选择执行其中一条。下面的代码可以继续并列更多 else if

if (条件表达式 1){
    //表达式 1 满足,则执行的内容;
} else if (条件表达式 2){
    //表达式 1 不满足,并且条件表达式 2 满足时,执行的内容
}else{
    //表达式 1 不满足,并且条件表达式 2 也不满足时,执行的内容
}

关系运算符

  • >: 大于

  • <: 小于

  • ==: 等于

  • !=: 不等于

  • <=: 小于等于

  • >=: 大于等于

关系运算符用于比较两个值之间的关系,其结果为布尔类型(真或假)。

逻辑运算符

表示含义

首选记号

代用记号

并且(与)

&&

and

或者(或)

||

or

不是(非)

!

not

位运算符

位运算直接操作整数在内存中的二进制位(0和1),仅适用于整型(如int、char)和字符型数据。

其核心优势在于‌执行效率高。所有运算符均按二进制位逐位操作,具体如下:

名称

首选记号

含义

用途或用法

‌按位与

&

两位均为1时结果为1,否则为0。

清零特定位(如n & 0xF保留低4位)或判断奇偶(n & 1为0则偶数)

‌按位或

|

任一位为1时结果为1,否则为0。

设置特定位为1(如n | 0x10将第5位设置为1)

‌按位异或

^

两位相异时结果为1,相同为0。

交换变量(a ^= b; b ^= a; a ^= b)或加密算法中对数据进行混淆

‌按位取反

~

0变1,1变0。

(结果需按补码解释)

~5在32位系统中为-6(00000101取反得11111010,补码为-6),常用于对整数的二进制位进行反转操作。

‌左移

<<

二进制位左移,低位补0,

等效乘以2的幂次。

5 << 2101左移2位得10100,即20),常用于快速计算乘以2的幂次,提高计算效率。

‌右移

>>

二进制位右移,高位补0(逻辑右移)或符号位(算术右移),等效除以2的幂次。

13 >> 21101右移2位得0011,即3),常用于优化除法运算,提高效率。

布尔类型与逻辑运算

  • C++ 中可以使用 bool 布尔类型储存真 true 与假 false

  • bool 类型参与运算时,真与假会分别对应到 1 与 0。

  • 数值类型转换到布尔类型时,0 为假,其他值都为真

  • 布尔逻辑运算如下:

A

B

A && B(A and B)

A || B(A or B)

!A(not A)

true

true

true

true

false

true

false

false

true

false

false

true

false

true

true

false

false

false

false

true

常见选择语句中的逻辑判断

三个数找最大数

一个数比其他两个数都大。

a > b && a > c

注意:千万不要不要不要写成a>b>c 错误的!!

闰年判断

  • 普通闰年:y % 4 == 0 && y % 100 != 0

  • 世纪闰年:y % 400 == 0

  • 闰年判断:(y % 4 == 0 && y % 100 != 0) || y % 400 == 0

    • 因为 && 优先级高于 ||,所以不写那个小括号也可以。

构成三角形判断

任意两边之和大于第三边。

a + b > c && a + c > b && b + c > a

上下取整判断

int p, q, x;,这里我们只讨论p,q > 0的情况。

  • 下取整()

    • x = p / q;

  • 上取整()

    • 第一种方式:

if (p % q == 0){ 
    x = p / q; 
}else{ 
    x = p / q + 1;
}
  • 第二种方式:x = (p + (q - 1)) / q;

  • 第三种方式:x = p / q + (p % q != 0);

是否为小数判断

int p, q, x;,这里我们只讨论p,q > 0的情况。

double l=1.0*p/q;
x=l;
if(x==l){
    cout<<"除的结果是整数";
}else{
    cout<<"除的结果是小数";
}
x=p/q;
if(x*q==p){
    cout<<"除的结果是整数";
}else{
    cout<<"除的结果是小数";
}

循环语句(循环结构)

for循环语句

for循环语法

for(变量初始值;进入循环的条件;变量的变化){

此处是循环的内容;

}

for(int i=1;i<=10;i++){ //设置变量i的值为1;当i小于等于10就进循环;执行一次循环后i增加1
    cout<<i<<endl; //进循环执行一次输出i的值,并换行;
}

while循环语句

while(进入循环的条件){

此处是循环的内容;

}

int i=1;
while(i<=10){ //当i小于等于10就进循环;
    cout<<i<<endl; //进循环执行一次输出i的值,并换行;
}
注:以上两种循环的语句,可进行总结:for循环一般更加适用于已知循环次数的情况。而while循环更加适用于未知循环次数,但知道什么时候执行循环(即,满足条件就一直执行)的情况。但总体上二者循环语句一模一样,可以互相转换。

高级控制

  • break; 立刻结束当前所在的循环

  • continue; 立刻跳过本次所在的循环,并进行下一次循环

  • return 0; 结束整个主函数程序

break语句

for (int i = 1; i <= 5; i++){
    cout << i;
    if (i == 3){
        break;
    }
    cout << i;
}

上面代码输出: 11223

continue语句

for (int i = 1; i <= 5; i++){
    cout << i;
    if (i == 3){
        continue;
    }
    cout << i;
}

上面代码输出: 112234455

常见循环语句逻辑表达

  • 输出 1~n 之间的所有整数

int n;
cin>>n;
for(int i = 1; i <= n; i++){
    cout << i << '\n';
}

上图为:输出1到100,for循环的运行过程顺序。

  • 求n个数的和

int n, x, ans;
cin >> n;
ans = 0;
for (int i = 1; i <= n; i++){
    cin >> x;
    ans += x;
}
cout << ans << "\n";
  • 求最值(最大最小值)

//例:求n个数中的最大值(所有数字均不大于1000)
int n, x, ans;
cin >> n;
ans = 0;
for (int i = 0; i < n; i++){
    cin >> x;
    if (x > ans){
        ans = x;
    }
}
cout << ans << "\n";
//例:求n个数中的最小值(所有数字均不大于1000)
int n, x, ans;
cin >> n;
ans = 1001;
for (int i = 1; i <= n; i++){
    cin >> x;
    ans = min(ans, x);
}
cout << ans << "\n";
  • 统计偶数的个数

int n, x, cnt;
cin >> n;
cnt = 0;
for (int i = 1; i <= n; i++){
    cin >> x;
    if (x % 2 == 0){
        cnt++;
    }
}
cout << cnt << "\n";
  • 拆位(短除法)

    • % 10:得到个位上的数

    • / 10:去掉个位后的数

    • 个位:a % 10

    • 十位:a / 10 % 10

    • 百位:a / 100 % 10

    • 千位:a / 1000 % 10

int x;
cin >> x;
while (x > 0){ //短除法拆位
    cout << x % 10 << ",";
    x /= 10;
}
int x;
cin >> x;
for (int i = x; i > 0; i /= 10){ //短除法拆位
    cout << i % 10 << ' ';
}
  • 判质数

int n;
cin >> n;

bool flag = ture;             // 一开始假设n是质数

if (n <= 1){                   // 不是大于1的自然数一定不可能是质数
    flag = false;
}

for (int i = 2; i <= n - 1; i++){  // 除了 1 和它本身以外(2 ~ 本身-1)
    if (n % i == 0){              // 如有其他因数,则不是质数
        flag = false;
    }
}

if (flag == true){  //根据 flag 的值,可以判断 n 是否是质数
    cout << "是质数";
}else{
    cout << "不是质数";
}



是否对你有帮助?

评论