C++ while循环
while循环详解
一、课程大纲
第一部分:循环概念引入
- 什么是循环?生活中的循环实例
- 为什么需要循环?
- 循环的三种类型:while、do-while、for
第二部分:while循环详解
- while循环的基本语法
- 循环三要素:初始条件、循环条件、更新语句
- 执行流程分析
- 常见错误与调试技巧
第三部分:实战演练
- 基础练习:数字累加、计数问题
- 洛谷/一本通真题解析
- 综合应用案例
第四部分:扩展与总结
无限循环与循环控制
二、详细内容
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;
}
基础作业:
- 使用while循环计算1~100所有奇数的和
- 输入一个正整数n,输出n的阶乘(n!)
- 输入一个整数,逆序输出它的各位数字(如输入123,输出321)
提高作业(洛谷题目):
- P1420 最长连号(难度:入门)
- P1424 小鱼的航程(难度:入门)
- P1307 [NOIP2011 普及组] 数字反转(难度:入门)
常见问题解答(FAQ):
-
Q:while和for循环有什么区别?
A:for循环更适合已知循环次数的情况,while更适合条件控制的情况。下节课会详细讲解。
-
Q:如何避免无限循环?
A:确保循环条件最终会变为false,检查更新语句是否正确。
-
Q:什么时候用while,什么时候用do-while?
A:如果循环体至少要执行一次,用do-while;否则用while。
四、板书
while循环结构:
┌─────────────────┐
│ 初始条件设置 │
├─────────────────┤
│ while(条件判断) │←┐
├─────────────────┤ │
│ 循环体执行 │ │
├─────────────────┤ │
│ 更新语句 │─┘
└─────────────────┘
循环三要素:
1. 初始值 → 从哪里开始
2. 循环条件 → 什么时候继续
3. 更新语句 → 怎么走向结束
经典模式:
累加:sum = sum + i
计数:count = count + 1
遍历:i = i + 1
五、总结
- 能正确说出while循环的三要素
- 能独立完成基础练习题
- 能分析并解决洛谷入门级循环问题
- 代码结构清晰,有适当注释