C++寒假营第五天课件:循环结构深入------从while到for循环
📚 今日大纲
一、课程回顾与导入
二、while循环深度复习
三、for循环系统讲解
四、循环结构对比与应用
五、真题演练
六、总结
🔄 第一部分:while循环深度复习
1.1 while循环基本语法回顾
cpp
while (循环条件) {
// 循环体
// 需要包含改变循环条件的语句
}
1.2 while循环执行流程详解
开始
↓
判断条件 → false → 结束循环
↓ true
执行循环体
↓
更新循环变量
↓
返回判断条件
1.3 while循环常见应用场景
- 不确定次数循环:输入验证、游戏主循环
- 条件驱动循环:读取文件直到结束
- 无限循环与退出 :使用
break控制
1.4 典型while循环示例
cpp
// 示例1:计数器控制的循环
#include <iostream>
using namespace std;
int main() {
int i = 1; // 初始化
while (i <= 5) { // 条件判断
cout << "第" << i << "次循环" << endl;
i++; // 更新
}
return 0;
}
// 示例2:用户输入控制的循环
#include <iostream>
using namespace std;
int main() {
int num;
int sum = 0;
cout << "请输入整数(输入0结束):";
cin >> num;
while (num != 0) {
sum += num;
cout << "当前总和:" << sum << endl;
cout << "请输入整数(输入0结束):";
cin >> num;
}
cout << "最终总和:" << sum << endl;
return 0;
}
1.5 while循环易错点分析
- 忘记更新循环变量 → 导致无限循环
- 循环条件设置错误 → 少循环或多循环一次
- 边界条件处理不当 → 特别是等于号的使用
🔢 第二部分:for循环系统讲解
2.1 for循环引入的必要性
问题 :while循环在计数器场景下需要三行代码分别处理初始化、条件和更新
解决方案:for循环将这三个部分集成到一个语句中
2.2 for循环基本语法
cpp
for (初始化表达式; 循环条件; 更新表达式) {
// 循环体
}
2.3 for循环执行流程解析
开始
↓
执行初始化表达式(只执行一次)
↓
判断循环条件 → false → 结束循环
↓ true
执行循环体
↓
执行更新表达式
↓
返回判断条件
2.4 for循环与while循环对比
| 特性 | while循环 | for循环 |
|---|---|---|
| 适用场景 | 条件驱动,次数不确定 | 计数驱动,次数明确 |
| 结构 | 分散(初始化在外) | 集中(三位一体) |
| 可读性 | 条件变化明显时较好 | 计数器场景更清晰 |
| 内存管理 | 循环变量作用域更广 | 循环变量可限制在for内 |
2.5 for循环的多种写法
cpp
// 标准写法
for (int i = 0; i < 10; i++) {
cout << i << " ";
}
// 多个变量初始化
for (int i = 0, j = 10; i < j; i++, j--) {
cout << "i=" << i << ", j=" << j << endl;
}
// 省略部分表达式
int i = 0;
for (; i < 5; ) { // 类似while循环
cout << i << " ";
i++;
}
// 无限循环
for (;;) {
// 无限循环体
// 需要用break退出
}
2.6 for循环嵌套初步
cpp
// 打印九九乘法表
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 9; i++) { // 外层循环:控制行
for (int j = 1; j <= i; j++) { // 内层循环:控制列
cout << j << "×" << i << "=" << i*j << "\t";
}
cout << endl; // 换行
}
return 0;
}
2.7 循环控制语句在for中的应用
cpp
#include <iostream>
using namespace std;
int main() {
// break示例:找到第一个能被7整除的数
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
cout << "找到第一个能被7整除的数:" << i << endl;
break; // 跳出整个循环
}
}
// continue示例:跳过奇数,只输出偶数
cout << "1-10中的偶数:";
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue; // 跳过本次循环剩余部分
}
cout << i << " ";
}
cout << endl;
return 0;
}
🔄 第三部分:循环结构对比与应用选择
3.1 何时使用while循环?
- 循环次数不确定时
cpp
// 读取用户输入直到输入特定值
char choice;
while (true) {
cout << "继续吗?(y/n): ";
cin >> choice;
if (choice == 'n' || choice == 'N') {
break;
}
// 处理其他逻辑
}
- 条件复杂,不是简单计数器时
cpp
// 寻找最大公约数
int a = 56, b = 98;
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
cout << "最大公约数:" << a << endl;
3.2 何时使用for循环?
- 明确知道循环次数时
cpp
// 计算1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
cout << "1-100的和:" << sum << endl;
- 遍历数组或容器时
cpp
int arr[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
cout << "arr[" << i << "] = " << arr[i] << endl;
}
3.3 循环选择流程图
开始循环需求
↓
是否需要计数器? → 否 → 使用while循环
↓是
循环次数是否确定? → 否 → 考虑while或do-while
↓是
使用for循环
🏆 第四部分:真题
4.1 信奥一本通相关题目
题目1:P1001 计算a+b
cpp
// 使用for循环计算多组a+b
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
题目2:P1002 计算2的幂
cpp
// 使用for循环计算2^n
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long result = 1; // 使用long long防止溢出
for (int i = 0; i < n; i++) {
result *= 2;
}
cout << result << endl;
return 0;
}
题目3:P1003 数位分离
cpp
// 使用while循环进行数位分离
#include <iostream>
using namespace std;
int main() {
int num;
cin >> num;
// 处理0的特殊情况
if (num == 0) {
cout << 0 << endl;
return 0;
}
// 使用while循环反向输出各位数字
while (num > 0) {
cout << num % 10 << " ";
num /= 10;
}
cout << endl;
return 0;
}
4.2 洛谷相关题目
题目1:P1421 小玉买文具
cpp
// 计算最多能买多少支笔
#include <iostream>
using namespace std;
int main() {
int a, b; // a元b角
cin >> a >> b;
// 全部转换为角
int total = a * 10 + b;
int price = 19; // 1元9角 = 19角
// 使用for循环尝试购买
int max_pens = 0;
for (int i = 1; ; i++) {
if (i * price <= total) {
max_pens = i;
} else {
break;
}
}
cout << max_pens << endl;
return 0;
}
// 更简单的while循环解法
int main() {
int a, b;
cin >> a >> b;
int money = a * 10 + b;
int count = 0;
while (money >= 19) {
money -= 19;
count++;
}
cout << count << endl;
return 0;
}
题目2:P1085 不高兴的津津
cpp
// 找出津津最不高兴的一天
#include <iostream>
using namespace std;
int main() {
int max_unhappy = 0; // 最大不高兴程度
int unhappy_day = 0; // 最不高兴的日子
for (int day = 1; day <= 7; day++) {
int school, extra;
cin >> school >> extra;
int total = school + extra;
if (total > 8) { // 超过8小时会不高兴
int unhappy = total - 8;
if (unhappy > max_unhappy) {
max_unhappy = unhappy;
unhappy_day = day;
}
}
}
cout << unhappy_day << endl;
return 0;
}
题目3:P1424 小鱼的航程(改进版)
cpp
// 计算小鱼在特定天数内的游泳距离
#include <iostream>
using namespace std;
int main() {
int x, n; // 从周x开始,连续n天
cin >> x >> n;
int total_distance = 0;
// 使用for循环模拟每一天
for (int i = 0; i < n; i++) {
int current_day = (x + i - 1) % 7 + 1; // 计算当前是周几
// 周六和周日不游泳
if (current_day != 6 && current_day != 7) {
total_distance += 250;
}
}
cout << total_distance << endl;
return 0;
}
4.3 综合挑战题
题目:数字金字塔
输入:5
输出:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int num = 1; // 当前要打印的数字
// 外层循环控制行数
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
// 打印数字
for (int j = 1; j <= i; j++) {
cout << num << " ";
num++;
}
cout << endl;
}
return 0;
}
📝 第五部分:扩展练习
5.1 课堂练习
练习1:使用for循环计算阶乘
cpp
// 输入n,计算n!
#include <iostream>
using namespace std;
int main() {
int n;
long long factorial = 1; // 使用long long防止溢出
cout << "请输入一个正整数:";
cin >> n;
// 使用for循环计算阶乘
for (int i = 1; i <= n; i++) {
factorial *= i;
}
cout << n << "! = " << factorial << endl;
return 0;
}
练习2:寻找水仙花数
cpp
// 找出100-999之间的所有水仙花数
// 水仙花数:各位数字的立方和等于该数本身
#include <iostream>
using namespace std;
int main() {
cout << "100-999之间的水仙花数有:" << endl;
for (int num = 100; num <= 999; num++) {
int a = num / 100; // 百位
int b = (num / 10) % 10; // 十位
int c = num % 10; // 个位
if (a*a*a + b*b*b + c*c*c == num) {
cout << num << " ";
}
}
cout << endl;
return 0;
}
5.2 课后作业
-
基础题:使用for循环打印以下图形(输入n控制大小)
**
-
提高题:计算1!+2!+3!+...+n!的值
-
挑战题:解决洛谷P1420 最长连号问题
- 输入n个整数
- 找出最长连续递增序列的长度
🎯 第六部分:总结
6.1 今日重点回顾
- while循环:适合条件驱动、次数不确定的场景
- for循环:适合计数驱动、次数明确的场景
- 循环控制:break和continue的使用
- 循环选择:根据场景选择合适的循环结构
6.2 常见错误提醒
- 避免无限循环:确保循环条件能变为false
- 注意循环变量的作用域
- 边界条件要仔细检查
- 嵌套循环时变量名不要重复
学习建议
- 多动手:在IDE中实际运行每个示例
- 画流程图:复杂循环先画执行流程图
- 调试技巧:使用cout输出中间变量值
- 题目分类:将做过的题目按类型整理
教学重点
- 强调for循环的三位一体结构(初始化、条件、更新)
- 通过对比帮助学生理解何时使用while或for
- 重视边界条件的测试(特别是第一次和最后一次循环)
学生常见问题解答
-
Q :for循环的三个表达式都可以省略吗?
A :可以,但分号必须保留。如for(;;)是无限循环。 -
Q :for循环中定义的变量能在循环外使用吗?
A:不能,for循环中定义的变量作用域仅限于循环内部。 -
Q :while和for可以互相转换吗?
A:大多数情况下可以,但for循环更简洁时不要强行用while。
最后提醒:循环是C++编程的基础,掌握好循环结构对后续学习数组、函数等至关重要。鼓励大家多做练习,从简单题开始,逐步增加难度。明天我们将进入更精彩的循环嵌套世界!