C++循环编程知识点详解
基于2025年9月2日劲松校区课程内容整理
目录
1. C++程序基础框架
1.1 标准程序结构
#include <iostream>
using namespace std;
int main() {
// 程序代码
return 0;
}
1.2 各部分详解
头文件 #include <iostream>
- 作用:引入输入输出流库
- 记忆方法:头文件放在程序最顶部("头"的位置)
- 核心概念:
i= input(输入)o= output(输出)stream= 流(C++中的数据传输概念)
命名空间 using namespace std;
- 作用:指定使用标准命名空间,避免命名冲突
- 生动比喻:
- 就像班级里有多个叫"小明"的同学
- 需要用"一班的小明"、"二班的小明"来区分
std::cin和std::cout就是"std空间的cin"和"std空间的cout"- 使用好处:声明后可以直接写
cin、cout,不用每次都写std::
主函数 int main()
- 作用:程序的入口点,程序从这里开始执行
- 返回值:
return 0;表示程序正常结束
1.3 完整示例
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a; // 输入
cout << a; // 输出
return 0; // 程序结束
}
2. 循环结构基础
2.1 for循环语法
for (初始化; 条件判断; 更新) {
// 循环体
}
2.2 循环要素
- 循环变量:通常用
i、j等表示 - 起始值:循环从哪里开始
- 结束条件:什么时候停止循环
- 步进:每次循环后如何更新
2.3 基础循环示例
从A到B的循环
int a, b;
cin >> a >> b;
for (int i = a; i <= b; i++) {
cout << i << " "; // 输出从a到b的所有数
}
3. 双层循环与图形输出
3.1 核心规律
外层循环控制行数,内层循环控制列数
3.2 标准格式
for (int i = 1; i <= 行数; i++) {
for (int j = 1; j <= 列数; j++) {
// 输出内容
}
cout << endl; // 每行结束后换行
}
3.3 矩形边框输出
题目要求
输出N行M列的矩形,首尾列用#,内部用*
解题思路
首列和尾列位置输出#,其他位置输出*
完整代码
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cout << "#"; // 第一列
for (int j = 1; j <= m; j++) {
cout << "*";
}
cout << "#"; // 最后一列
cout << endl;
}
return 0;
}
3.4 数字三角形
题目要求
输出如下图形:
1
22
333
关键点
- 每行的列数与行号相关
- 第i行输出i个数字i
代码实现
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) { // 注意:j <= i
cout << i;
}
cout << endl;
}
4. 累加与累乘算法
4.1 累加算法
核心思想
- 需要一个累加变量存储结果
- 初始值必须为0(0加任何数等于该数本身)
标准模板
int sum = 0; // 累加变量,初始值为0
for (int i = 起始值; i <= 结束值; i++) {
sum += i; // 等价于 sum = sum + i
}
cout << sum;
区间求和示例
// 计算100到200之间所有整数的和
int sum = 0;
for (int i = 100; i <= 200; i++) {
sum += i;
}
cout << sum; // 输出:15150
4.2 累乘算法(阶乘)
核心思想
- 需要一个累乘变量存储结果
- 初始值必须为1
- 如果是0:0乘任何数都是0
- 如果是2或其他:结果会错误
标准模板
int product = 1; // 累乘变量,初始值为1
for (int i = 1; i <= n; i++) {
product *= i; // 等价于 product = product * i
}
cout << product;
阶乘示例
// 计算5!(5的阶乘)
int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
cout << result; // 输出:120
5. 幂运算实现
5.1 基本概念
- 2的3次方 = 2 × 2 × 2 = 8
- a的b次方 = b个a相乘
5.2 通过循环实现幂运算
2的N次方
int n;
cin >> n;
int result = 1; // 初始值为1
for (int i = 1; i <= n; i++) {
result *= 2; // 每次乘以2
}
cout << result;
A的B次方(通用版本)
int a, b;
cin >> a >> b;
int result = 1;
for (int i = 1; i <= b; i++) {
result *= a; // 每次乘以a
}
cout << result;
5.3 执行过程分析
以2的3次方为例: 1. 初始:result = 1 2. 第1次循环:result = 1 × 2 = 2 3. 第2次循环:result = 2 × 2 = 4 4. 第3次循环:result = 4 × 2 = 8 5. 输出:8
6. 数据类型与溢出处理
6.1 int类型范围
- 最大值:2^31 - 1 = 2,147,483,647(约21亿)
- 最小值:-2^31 = -2,147,483,648
- 记忆技巧:约为2×10^9
6.2 溢出现象
int a = 2147483647;
cout << a + 1; // 输出:-2147483648(溢出变成负数)
6.3 使用long long解决
- 范围:约为-9×10^18 到 9×10^18
- 声明方式:
long long
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= a;
}
6.4 科学计数法表示
// 表示10的9次方(1后面9个0)
int limit = 1e9; // 等价于 1000000000
7. 竞赛真题解析
7.1 题目:乘方(2022年信息学竞赛)
题目要求
- 计算a的b次方
- 如果结果超过10^9,输出-1
- 需要在计算过程中判断溢出
关键难点
- 不能等计算完再判断(可能已经溢出)
- 必须在循环过程中实时判断
完整解决方案
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
long long result = 1;
for (int i = 1; i <= b; i++) {
result *= a;
// 在循环内判断是否超过10^9
if (result > 1e9) {
cout << -1;
return 0; // 直接结束程序
}
}
cout << result;
return 0;
}
7.2 金币问题(NOI 2015普及组)
题目描述
- 第1天获得1枚金币
- 第2-3天每天获得2枚金币
- 第4-6天每天获得3枚金币
- 以此类推...
规律分析
- 第k组连续k天,每天获得k枚金币
- 需要双层循环处理
代码框架
int total = 0;
int day = 0;
int n;
cin >> n;
for (int k = 1; day < n; k++) {
for (int j = 1; j <= k && day < n; j++) {
day++;
total += k;
}
}
cout << total;
8. 常见错误与调试技巧
8.1 常见错误
错误1:累加变量未初始化
// 错误
int sum; // 未初始化
for (int i = 1; i <= 10; i++) {
sum += i;
}
// 正确
int sum = 0; // 初始化为0
错误2:累乘初始值错误
// 错误
int result = 0; // 0乘任何数都是0
for (int i = 1; i <= n; i++) {
result *= 2;
}
// 正确
int result = 1; // 初始值必须为1
错误3:循环边界错误
// 计算2的n次方
// 错误:只循环了n-1次
for (int i = 2; i <= n; i++) {
result *= 2;
}
// 正确:循环n次
for (int i = 1; i <= n; i++) {
result *= 2;
}
8.2 代码格式规范
良好的缩进
// 推荐格式
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << "*";
}
cout << endl;
}
8.3 调试技巧
-
输出中间结果
for (int i = 1; i <= n; i++) { result *= a; cout << "第" << i << "次:" << result << endl; // 调试输出 } -
分步骤测试
- 先测试单层循环
- 再测试双层循环
-
最后加入复杂逻辑
-
使用小数据测试
- 先用小数据验证逻辑正确性
- 再测试边界情况
- 最后测试大数据
总结
核心要点回顾
- 双层循环:外层控制行,内层控制列
- 累加:初始值为0,使用
+= - 累乘:初始值为1,使用
*= - 幂运算:循环n次,每次乘以底数
- 溢出处理:使用long long,循环内判断
学习建议
- 熟练背诵基础框架代码
- 多练习循环嵌套题目
- 理解累加累乘的本质
- 注意数据范围和溢出问题
- 保持良好的代码格式习惯