c++寒假营day05

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循环易错点分析

  1. 忘记更新循环变量 → 导致无限循环
  2. 循环条件设置错误 → 少循环或多循环一次
  3. 边界条件处理不当 → 特别是等于号的使用

🔢 第二部分: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循环?

  1. 循环次数不确定时
cpp 复制代码
// 读取用户输入直到输入特定值
char choice;
while (true) {
    cout << "继续吗?(y/n): ";
    cin >> choice;
    if (choice == 'n' || choice == 'N') {
        break;
    }
    // 处理其他逻辑
}
  1. 条件复杂,不是简单计数器时
cpp 复制代码
// 寻找最大公约数
int a = 56, b = 98;
while (b != 0) {
    int temp = b;
    b = a % b;
    a = temp;
}
cout << "最大公约数:" << a << endl;

3.2 何时使用for循环?

  1. 明确知道循环次数时
cpp 复制代码
// 计算1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
cout << "1-100的和:" << sum << endl;
  1. 遍历数组或容器时
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 课后作业

  1. 基础题:使用for循环打印以下图形(输入n控制大小)

    **




  2. 提高题:计算1!+2!+3!+...+n!的值

  3. 挑战题:解决洛谷P1420 最长连号问题

    • 输入n个整数
    • 找出最长连续递增序列的长度

🎯 第六部分:总结

6.1 今日重点回顾

  1. while循环:适合条件驱动、次数不确定的场景
  2. for循环:适合计数驱动、次数明确的场景
  3. 循环控制:break和continue的使用
  4. 循环选择:根据场景选择合适的循环结构

6.2 常见错误提醒

  1. 避免无限循环:确保循环条件能变为false
  2. 注意循环变量的作用域
  3. 边界条件要仔细检查
  4. 嵌套循环时变量名不要重复

学习建议

  1. 多动手:在IDE中实际运行每个示例
  2. 画流程图:复杂循环先画执行流程图
  3. 调试技巧:使用cout输出中间变量值
  4. 题目分类:将做过的题目按类型整理

教学重点

  1. 强调for循环的三位一体结构(初始化、条件、更新)
  2. 通过对比帮助学生理解何时使用while或for
  3. 重视边界条件的测试(特别是第一次和最后一次循环)

学生常见问题解答

  1. Q :for循环的三个表达式都可以省略吗?
    A :可以,但分号必须保留。如for(;;)是无限循环。

  2. Q :for循环中定义的变量能在循环外使用吗?
    A:不能,for循环中定义的变量作用域仅限于循环内部。

  3. Q :while和for可以互相转换吗?
    A:大多数情况下可以,但for循环更简洁时不要强行用while。


最后提醒:循环是C++编程的基础,掌握好循环结构对后续学习数组、函数等至关重要。鼓励大家多做练习,从简单题开始,逐步增加难度。明天我们将进入更精彩的循环嵌套世界!

相关推荐
枫叶丹41 小时前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
重生之后端学习1 小时前
74. 搜索二维矩阵
开发语言·数据结构·算法·职场和发展·深度优先
@atweiwei1 小时前
rust所有权机制详解
开发语言·数据结构·后端·rust·内存·所有权
JYeontu1 小时前
程序员都该掌握的“质因数分解”
前端·javascript·算法
上海云盾-高防顾问2 小时前
DNS异常怎么办?快速排查+解决指南
开发语言·php
开发者小天2 小时前
python安装 Matplotlib 库 安装 Seaborn 库
开发语言·python·matplotlib
wjs20242 小时前
《Foundation 折叠列表:设计与应用解析》
开发语言
with-the-flow2 小时前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法
tyb3333332 小时前
leetcode:吃苹果和队列
算法·leetcode·职场和发展