c++寒假营day03

C++ while循环

while循环详解


一、课程大纲

第一部分:循环概念引入

  1. 什么是循环?生活中的循环实例
  2. 为什么需要循环?
  3. 循环的三种类型:while、do-while、for

第二部分:while循环详解

  1. while循环的基本语法
  2. 循环三要素:初始条件、循环条件、更新语句
  3. 执行流程分析
  4. 常见错误与调试技巧

第三部分:实战演练

  1. 基础练习:数字累加、计数问题
  2. 洛谷/一本通真题解析
  3. 综合应用案例

第四部分:扩展与总结

无限循环与循环控制


二、详细内容

1. 循环概念引入

生活中的循环实例:
cpp 复制代码
// 类比:每天重复做的事情
起床 -> 上学 -> 吃饭 -> 做作业 -> 睡觉
↑______________________________↓
  • 重复执行相同或相似的操作
  • 直到满足某个条件停止
编程中的循环:
cpp 复制代码
// 需求:输出1~100的数字
// 不用循环:要写100行cout语句!
// 用循环:几行代码解决

2. while循环详解

基本语法结构:
cpp 复制代码
// 语法格式
while (循环条件) {
    // 循环体:需要重复执行的代码
    // 更新语句(重要!)
}

// 执行流程:
// 1. 判断循环条件是否为true
// 2. 如果为true,执行循环体
// 3. 返回步骤1
// 4. 如果为false,退出循环
示例1:基础计数
cpp 复制代码
#include <iostream>


using namespace std;

int main() {
    int i = 1;  // 初始条件
    while (i <= 5) {  // 循环条件
        cout << "当前数字:" << i << endl;
        i = i + 1;  // 更新语句(避免无限循环!)
    }
    return 0;
}
示例2:累加求和
cpp 复制代码
// 计算1+2+3+...+100的和
#include <iostream>


using namespace std;

int main() {
    int sum = 0;  // 存储和
    int i = 1;    // 计数器
    
    while (i <= 100) {
        sum = sum + i;  // 累加
        i = i + 1;      // 计数器增加
    }
    
    cout << "1到100的和是:" << sum << endl;
    return 0;
}
循环三要素详解:
cpp 复制代码
// 要素1:初始条件
int count = 0;  // 循环前必须初始化

// 要素2:循环条件
while (count < 10)  // 决定循环何时停止

// 要素3:更新语句
count = count + 1;  // 改变循环条件相关的变量

3. 常见错误分析

错误1:忘记更新语句(无限循环)
cpp 复制代码
// ❌ 错误示例:死循环!
int i = 1;
while (i <= 5) {
    cout << i << endl;
    // 忘记写 i++ 或 i = i + 1
    // 程序会一直输出1,永远不会停止!
}

// ✅ 正确写法
while (i <= 5) {
    cout << i << endl;
    i++;  // 或 i = i + 1
}
错误2:初始条件错误
cpp 复制代码
// ❌ 如果要从1开始,i应该初始化为1
int i = 0;  // 错误初始值
while (i <= 5) {
    cout << i << endl;
    i++;
}
// 输出:0 1 2 3 4 5(多输出了0)

// ✅ 正确初始化
int i = 1;  // 正确初始值
错误3:循环条件边界错误
cpp 复制代码
// 需求:输出1~5
// ❌ 少输出一个
while (i < 5) {  // i=5时不执行
    cout << i << endl;
    i++;
}
// 输出:1 2 3 4

// ❌ 多输出一个
while (i <= 6) {  // i=6时还执行
    cout << i << endl;
    i++;
}
// 输出:1 2 3 4 5 6

// ✅ 正确边界
while (i <= 5) {
    cout << i << endl;
    i++;
}

4. 信奥一本通/洛谷真题实战

真题1:P1001 A+B Problem(洛谷)

题目要求: 输入两个整数a和b,输出它们的和。
扩展练习: 连续计算多组A+B,直到输入结束

cpp 复制代码
#include <iostream>


using namespace std;

int main() {
    int a, b;
    
    // 方法1:已知组数
    int n;  // 要计算多少组
    cin >> n;
    
    int count = 1;
    while (count <= n) {
        cin >> a >> b;
        cout << a + b << endl;
        count++;
    }
    
    // 方法2:未知组数(使用EOF判断)
    // 在洛谷等OJ平台,可以这样写:
    while (cin >> a >> b) {
        cout << a + b << endl;
    }
    
    return 0;
}
真题2:P1421 小玉买文具(洛谷)

题目描述: 班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是1元9角,而班主任给小玉的钱是a元b角,求最多可以买多少只笔。

cpp 复制代码
#include <iostream>


using namespace std;

int main() {
    int a, b;  // a元b角
    cin >> a >> b;
    
    // 全部转换为角
    int total_money = a * 10 + b;  // 总钱数(角)
    int pen_price = 19;  // 笔的价格(角)
    
    int count = 0;  // 能买的笔数
    while (total_money >= pen_price) {
        total_money = total_money - pen_price;
        count++;
    }
    
    cout << count << endl;
    return 0;
}
真题3:P1035 [NOIP2002 普及组] 级数求和

题目描述: 已知:S_n = 1 + 1/2 + 1/3 + ... + 1/n。给定一个整数k,求最小的n使得S_n >

k。

cpp 复制代码
#include <iostream>


using namespace std;

int main() {
    int k;
    cin >> k;
    
    double sum = 0.0;  // 累加和
    int n = 0;         // 当前项数
    
    while (sum <= k) {
        n++;
        sum = sum + 1.0 / n;  // 注意:1.0确保是浮点数除法
    }
    
    cout << n << endl;
    return 0;
}
真题4:P1980 [NOIP2013 普及组] 计数问题

题目描述: 试计算在区间1到n的所有整数中,数字x(0≤x≤9)共出现了多少次。

cpp 复制代码
#include <iostream>


using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    
    int count = 0;  // 出现次数
    
    int i = 1;
    while (i <= n) {
        // 检查i中x出现的次数
        int temp = i;  // 临时变量,用于分解数字
        
        while (temp > 0) {
            int digit = temp % 10;  // 获取个位数
            if (digit == x) {
                count++;
            }
            temp = temp / 10;  // 去掉个位数
        }
        
        i++;
    }
    
    cout << count << endl;
    return 0;
}

5. 进阶技巧

嵌套while循环
cpp 复制代码
// 打印九九乘法表的一部分
#include <iostream>


using namespace std;

int main() {
    int i = 1;
    while (i <= 9) {  // 外层循环:控制行
        int j = 1;
        while (j <= i) {  // 内层循环:控制列
            cout << j << "×" << i << "=" << i*j << "\t";
            j++;
        }
        cout << endl;
        i++;
    }
    return 0;
}
break和continue语句
cpp 复制代码
// break:立即退出循环
int i = 1;
while (i <= 10) {
    if (i == 5) {
        break;  // 当i等于5时,退出循环
    }
    cout << i << " ";
    i++;
}
// 输出:1 2 3 4

// continue:跳过本次循环剩余部分
int j = 0;
while (j < 10) {
    j++;
    if (j % 2 == 0) {
        continue;  // 如果是偶数,跳过输出
    }
    cout << j << " ";
}
// 输出:1 3 5 7 9

6. 小练习

1:猜数字游戏
cpp 复制代码
// 老师心里想一个1-100的数字
// 学生用while循环编写猜数字程序
#include <iostream>


using namespace std;

int main() {
    int secret = 42;  // 老师设定的数字
    int guess;
    int attempts = 0;
    
    cout << "猜一个1-100之间的数字:" << endl;
    
    while (true) {
        cin >> guess;
        attempts++;
        
        if (guess == secret) {
            cout << "恭喜!猜对了!" << endl;
            cout << "你用了" << attempts << "次猜中" << endl;
            break;
        } else if (guess < secret) {
            cout << "猜小了,再试试:" << endl;
        } else {
            cout << "猜大了,再试试:" << endl;
        }
    }
    
    return 0;
}
2:银行利息计算
cpp 复制代码
// 计算存款多少年能翻倍
#include <iostream>


using namespace std;

int main() {
    double money = 10000;  // 初始本金
    double target = money * 2;  // 目标:翻倍
    double rate = 0.05;  // 年利率5%
    int years = 0;
    
    while (money < target) {
        money = money * (1 + rate);  // 计算利息
        years++;
        cout << "第" << years << "年,金额:" << money << endl;
    }
    
    cout << "需要" << years << "年才能翻倍" << endl;
    return 0;
}
基础作业:
  1. 使用while循环计算1~100所有奇数的和
  2. 输入一个正整数n,输出n的阶乘(n!)
  3. 输入一个整数,逆序输出它的各位数字(如输入123,输出321)
提高作业(洛谷题目):
  1. P1420 最长连号(难度:入门)
  2. P1424 小鱼的航程(难度:入门)
  3. P1307 [NOIP2011 普及组] 数字反转(难度:入门)

常见问题解答(FAQ):

  1. Q:while和for循环有什么区别?

    A:for循环更适合已知循环次数的情况,while更适合条件控制的情况。下节课会详细讲解。

  2. Q:如何避免无限循环?

    A:确保循环条件最终会变为false,检查更新语句是否正确。

  3. Q:什么时候用while,什么时候用do-while?

    A:如果循环体至少要执行一次,用do-while;否则用while。


四、板书

复制代码
while循环结构:
┌─────────────────┐
│ 初始条件设置    │
├─────────────────┤
│ while(条件判断) │←┐
├─────────────────┤ │
│   循环体执行    │ │
├─────────────────┤ │
│   更新语句      │─┘
└─────────────────┘

循环三要素:
1. 初始值 → 从哪里开始
2. 循环条件 → 什么时候继续
3. 更新语句 → 怎么走向结束

经典模式:
累加:sum = sum + i
计数:count = count + 1
遍历:i = i + 1

五、总结

  1. 能正确说出while循环的三要素
  2. 能独立完成基础练习题
  3. 能分析并解决洛谷入门级循环问题
  4. 代码结构清晰,有适当注释

相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc5 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
l1t5 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
青云计划6 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1236 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗7 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
码说AI7 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
lanhuazui107 小时前
C++ 中什么时候用::(作用域解析运算符)
c++