————本文为团队知识点汇总————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
我可能在下方回复,也有可能修改
无用信息会删评
入团:巴州二中
——————————————————————分割线————————————————————————
9月13日
一、循环结构
1. 什么是循环
循环就是让一段代码重复执行多次。
比如:输出 100 次 “Hello”,不需要写 100 遍 cout,用循环就能轻松搞定。
C++ 中三种循环:for、while、do while。
2. for 循环 —— 用于“次数确定”的场景
语法三要素
for (初始化; 条件判断; 更新) {
// 循环体
}
初始化:设置循环变量的初始值(如 int i = 1;)
条件判断:每次循环前检查,为 true 则继续,为 false 则退出
更新:每轮循环结束后修改循环变量(如 i++)
执行过程
① 初始化 → ② 判断条件 → ③ 若真执行循环体 → ④ 更新 → ⑤ 回到②,直到条件为假。
示例:输出 1~10
for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
3. while 循环 —— 用于“次数不确定”的场景
循环次数事先不知道,由某个条件控制是否继续。
语法
while (条件) {
// 循环体
}
只要条件为真,就一直执行;条件为假时跳出。
常见应用:数位分离
思想:把一个整数的每一位数字拆出来。
例如:n = 123,想得到 3, 2, 1。
实现步骤:
每次取个位:digit = n % 10
去掉个位:n = n / 10
当 n > 0 时继续循环(不确定位数,用 while)。
int n = 123;
while (n > 0) {
cout << n % 10 << " "; // 输出 3 2 1
n /= 10;
}
4. do while 循环 —— 至少执行一次
语法(特别注意末尾分号!)
do {
// 循环体
} while (条件); // 分号不能丢!
特点
先执行一次循环体,再判断条件是否成立。
即使条件一开始就不成立,循环体也会至少执行一次。
常考陷阱
题目中给了一段 do while 代码,让你算结果,如果漏看了末尾分号,可能以为自己写对了,但编译会报错,所以第一件事:检查有没有分号。
对比:for 和 while 条件不成立时一次都不执行,而 do while 至少执行一次。
int a = 5;
do {
cout << a;
a--;
} while (a > 5); // 条件为假,但循环体仍然执行了一次,输出 5
二、数组(一维数组)
1. 概念
数组是同一数据类型的有序集合,用于存储多个相同类型的变量。
例如:存储 5 个学生的分数,不需要定义 s1, s2, ...,只需一个数组 int score[5];。
2. 定义与初始化
定义
int arr[10]; // 定义包含10个整数的数组(下标0~9)
初始化
全部赋值:int arr[5] = {1, 2, 3, 4, 5};
部分赋值:int arr[5] = {1, 2}; // 剩余元素自动初始化为 0
省略长度:int arr[] = {1, 2, 3}; // 编译器自动推断长度为 3
全局数组 vs 局部数组
全局数组(定义在 main 函数外):自动初始化为 0。
局部数组(定义在 main 函数内):不会自动初始化,里面是随机值,务必手动赋值。
int globalArr[10]; // 全局,默认全 0
int main() {
int localArr[10]; // 局部,未初始化,值随机
return 0;
}
3. 重要注意事项
下标从 0 开始:长度为 n 的数组,有效下标是 0 ~ n-1。
数组长度尽量多开 5~10:防止越界(访问超出范围的元素会导致程序崩溃或错误)。
既不能开太小(溢出),也不能开过大(内存不够)。
4. 输入输出模板
int n;
cin >> n;
int a[100]; // 假设 n <= 100,多开几个
// 输入
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 输出
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
三、字符数组
字符数组用于存储一串字符(比如单词、句子)。本质是 char 类型的数组。
1. 定义与初始化
char str[100]; // 定义
char str2[] = "Hello"; // 初始化,自动包含 '\0' 结尾
char str3[10] = "Hi"; // 剩余部分补 '\0'
2. 输入方式
(1)不带空格的输入(cin >>)
遇到空格、Tab、回车停止。适用于输入一个单词。
char s[100];
cin >> s; // 输入 "hello" 可以,但 "hello world" 只会读入 "hello"
(2)带空格的输入( fgets() )
可以读取整行,包括空格。
char s[100];
fgets( 数组名, 数组大小, stdin); // 第二个参数是数组最大存储长度
3. 求长度
使用 strlen(s),需要头文件 <cstring>。
#include <cstring>
char s[100] = "hello";
cout << strlen(s); // 输出 5
四、字符串(string 类型)
string 是 C++ 标准库提供的更方便的字符串类型,比字符数组好用得多。
特性: 输入多少个字符,会自动匹配多大长度,并且相关操作也简洁
功能完全覆盖字符数组,且更安全。
1. 定义与初始化
#include <string>
string s1; // 空字符串
string s2 = "Hello";
2. 输入方式
不带空格:cin >> s;(遇到空白停止)
带空格(整行):getline(cin, s);
string s;
getline(cin, s); // 读取一行,包含空格
3. 求长度
int len = s.length(); // 或 s.size();
4. 三大常用操作(拼接、赋值、比较)
拼接(+)
string a = "Hello", b = "World";
string c = a + " " + b; // "Hello World"
赋值(=)
string a = "ABC";
string b = a; // b 复制了 a 的内容
比较:字典序(按字母顺序)
比较两个字符串时,就像查字典一样,从左到右一个字符一个字符地逐一对比。具体分为以下几步:
先把两个字符串左对齐,然后从左到右逐位比较
先看第一个字符,如果不同,谁的 ASCII 码值 大,谁对应的整个字符串就更大。
例如:'b' > 'a',所以 "banana" > "apple"。
如果当前位相同,继续比较下一位
直到找到第一个不相等的字符为止,按照该位的 ASCII 码值决定大小。
例如:"cat" 和 "car",前两位 'c'、'a' 相同,第三位 't'(ASCII 116)比 'r'(ASCII 114)大,所以 "cat" > "car"。
如果所有对应位置的字符都相同
那么长度更长的字符串更大,因为短字符串是长字符串的前缀。
例如:"app" 是 "apple" 的前三位,所以 "app" < "apple"。
如果长度也相同,并且每一位都相等
则两个字符串相等。
例如:"hello" == "hello"。
一句话总结
先比第一位,不同看 ASCII;相同往下比;全都相同比长短;长短一样才相等。
string 类型比较时,直接使用关系运算符:>, <, ==, >=, <=。
string a = "apple", b = "banana";
if (a < b) cout << "apple 排在 banana 前面"; // 比较按字母顺序
五、循环嵌套
1. 什么是嵌套
一个循环的循环体内部又包含另一个完整的循环结构。
2. 执行过程
外层循环每执行一次,内层循环会从头到尾执行一轮(全部次数)。
总执行次数 = 外层循环次数 × 内层循环次数。
for (int i = 1; i <= 3; i++) { // 外层 3 次
for (int j = 1; j <= 2; j++) { // 内层 2 次
cout << i << "," << j << " ";
}
cout << endl;
}
// 输出:1,1 1,2 2,1 2,2 3,1 3,2
3. 图形题 —— 输出正三角形
解题通用思路:
外层循环控制行数(行号)。
内层循环控制每一行要输出的内容(列)。
先观察图形整体:左边是什么(比如空格),右边是什么(比如星号)。
示例:输出 4 行的正三角形(*)
分析:第 i 行(i 从 1 开始)有 空格 = 4 - i 个,星号 = i 个。
int n = 4;
for (int i = 1; i <= n; i++) {
// 输出空格
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
// 输出星号
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl; // 换行
}
提醒:先看整体图形左边是什么、右边是什么,然后分别用内层循环控制输出次数。
六、二维数组
1. 定义
二维数组可以看作“表格”,有行和列。
定义方式:数据类型 数组名[行数][列数]; //左行,右列,顺序不可以改变
int a[3][4]; // 3行4列的整数矩阵
2. 初始化
int a[2][3] = {{1,2,3}, {4,5,6}}; // 全部赋值
int b[2][3] = {{1,2}, {3}}; // 部分赋值,其余补 0
3. 输入与输出模板
通常用双重循环,外层遍历行,内层遍历列。
int n, m; // n 行,m 列
cin >> n >> m;
int a[100][100];
// 输入
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
// 输出
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl; // 每行输出后换行
}
📌 总结速记卡
知识点 核心要点
for 循环 次数确定,记住三要素
while 循环 次数不确定,常用于数位分离(%10 和 /10)
do while 至少执行一次,末尾必须加分号 ;
数组 下标从 0 起,长度多开 5~10,防止越界
字符数组 用 cin.getline() 读空格,用 strlen 求长度
string 用 getline(cin, s) 读空格,用 s.length() 求长度,+ 拼接,= 赋值,< 等比较
循环嵌套 外层行,内层列,总次数 = 乘积
二维数组 双重循环输入/输出,先外行再内列
口诀:
次数确定 for 来扛,次数不定 while 忙;
do while 至少跑一趟,末尾分号不能忘。
数组下标从零起,长度多开更稳当;
字符数组求长度,strlen 来帮忙;
string 更易用,拼接赋值比较强;
嵌套循环画图形,外层行来内层列;
二维数组像表格,行行列列遍历全。
加粗文本