C++: 实战:分支循环综合
最后更新:2026-08-26
前面的课程我们分开了讲条件判断和循环,但真实程序里它们往往是混在一起用的。
这一课,我们通过几个综合实例,练习如何让分支和循环协同工作。
1. 实例一:猜数字游戏(完整版)
(1) 1.1 需求分析
我们要做一个完整的猜数字游戏:
- 程序随机生成一个 1-100 的数字
- 让用户输入猜测的数字
- 如果猜大了,提示"大了"
- 如果猜小了,提示"小了"
- 如果猜对了,恭喜用户,并显示猜了多少次
- 用户可以选择再玩一次
▶ 示例 1:完整版猜数字游戏(难度⭐⭐)
CPP
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
char playAgain;
do {
int secretNumber = std::rand() % 100 + 1;
int guess;
int attempts = 0;
std::cout << "========== 猜数字游戏 ==========\n";
std::cout << "我想了一个 1-100 的数字,你来猜!\n\n";
do {
std::cout << "请输入你的猜测:";
std::cin >> guess;
attempts++;
if (guess > secretNumber) {
std::cout << "大了!再试试。\n";
} else if (guess < secretNumber) {
std::cout << "小了!再试试。\n";
} else {
std::cout << "\n🎉 恭喜你!猜对了!\n";
std::cout << "你一共猜了 " << attempts << " 次。\n";
if (attempts <= 5) {
std::cout << "你太厉害了!\n";
} else if (attempts <= 10) {
std::cout << "不错不错!\n";
} else {
std::cout << "加油,下次争取更少次数!\n";
}
}
} while (guess != secretNumber);
std::cout << "\n想再玩一次吗?(y/n):";
std::cin >> playAgain;
std::cout << std::endl;
} while (playAgain == 'y' || playAgain == 'Y');
std::cout << "谢谢游玩,再见!" << std::endl;
return 0;
}
输出:
TEXT
📖 仅展示
========== 猜数字游戏 ==========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:
大了!再试试。
小了!再试试。
🎉 恭喜你!猜对了!
你一共猜了 次。
你太厉害了!
不错不错!
加油,下次争取更少次数!
想再玩一次吗?(y/n):
谢谢游玩,再见!
运行效果:
TEXT
📖 仅展示
========== 猜数字游戏 ==========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:50
大了!再试试。
请输入你的猜测:25
小了!再试试。
请输入你的猜测:37
大了!再试试。
请输入你的猜测:31
🎉 恭喜你!猜对了!
你一共猜了 4 次。
你太厉害了!
想再玩一次吗?(y/n):n
谢谢游玩,再见!
代码解析:
- 外层
do-while:控制"再玩一次" - 内层
do-while:猜数字的主循环 if-else if-else:判断猜大了/小了/对了- 嵌套
if-else:根据猜测次数给出评价
2. 实例二:简单的通讯录
(1) 2.1 需求分析
做一个简单的通讯录程序:
- 显示菜单(添加联系人、显示联系人、退出)
- 用户选择操作
- 用循环让用户可以连续操作,直到选择退出
▶ 示例 2:简单通讯录(难度⭐⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <string>
int main() {
const int MAX_CONTACTS = 100;
std::string names[MAX_CONTACTS];
std::string phones[MAX_CONTACTS];
int count = 0;
int choice;
do {
// 显示菜单
std::cout << "========== 简单通讯录 ==========\n";
std::cout << "1. 添加联系人\n";
std::cout << "2. 显示所有联系人\n";
std::cout << "3. 退出\n";
std::cout << "请选择(1-3):";
std::cin >> choice;
if (choice == 1) {
// 添加联系人
if (count >= MAX_CONTACTS) {
std::cout << "通讯录已满!" << std::endl;
} else {
std::cout << "请输入姓名:";
std::cin.ignore(); // 丢弃换行符
std::getline(std::cin, names[count]);
std::cout << "请输入电话:";
std::getline(std::cin, phones[count]);
count++;
std::cout << "添加成功!" << std::endl;
}
} else if (choice == 2) {
// 显示联系人
if (count == 0) {
std::cout << "通讯录为空!" << std::endl;
} else {
std::cout << "\n========== 联系人列表 ==========\n";
for (int i = 0; i < count; i++) {
std::cout << i + 1 << ". " << names[i] << " - " << phones[i] << std::endl;
}
std::cout << "================================\n\n";
}
} else if (choice == 3) {
std::cout << "再见!" << std::endl;
} else {
std::cout << "错误:请输入 1-3 之间的数字!" << std::endl;
}
std::cout << std::endl;
} while (choice != 3);
return 0;
}
输出:
TEXT
📖 仅展示
========== 简单通讯录 ==========
1. 添加联系人
2. 显示所有联系人
3. 退出
请选择(1-3):
通讯录已满!
请输入姓名:
请输入电话:
添加成功!
通讯录为空!
========== 联系人列表 ==========
. -
================================
再见!
错误:请输入 1-3 之间的数字!
💡 提示: 这个程序用到了数组(第09课会详细讲),你可以先照抄,理解大概思路。
3. 实例三:简单的计算器(扩展版)
(1) 3.1 需求分析
做一个支持多次计算的计算器:
- 显示菜单(加减乘除、退出)
- 用户选择操作
- 输入两个数字,输出结果
- 用循环让用户可以连续计算
▶ 示例 3:扩展版计算器(难度⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <iomanip>
int main() {
int choice;
do {
// 显示菜单
std::cout << "========== 简单计算器 ==========\n";
std::cout << "1. 加法\n";
std::cout << "2. 减法\n";
std::cout << "3. 乘法\n";
std::cout << "4. 除法\n";
std::cout << "5. 退出\n";
std::cout << "请选择(1-5):";
std::cin >> choice;
if (choice >= 1 && choice <= 4) {
double num1, num2;
std::cout << "请输入第一个数字:";
std::cin >> num1;
std::cout << "请输入第二个数字:";
std::cin >> num2;
double result;
bool valid = true;
switch (choice) {
case 1:
result = num1 + num2;
break;
case 2:
result = num1 - num2;
break;
case 3:
result = num1 * num2;
break;
case 4:
if (num2 != 0) {
result = num1 / num2;
} else {
std::cout << "错误:除数不能为 0!" << std::endl;
valid = false;
}
break;
}
if (valid) {
std::cout << std::fixed << std::setprecision(2);
std::cout << "结果:" << result << std::endl;
}
} else if (choice == 5) {
std::cout << "再见!" << std::endl;
} else {
std::cout << "错误:请输入 1-5 之间的数字!" << std::endl;
}
std::cout << std::endl;
} while (choice != 5);
return 0;
}
输出:
TEXT
📖 仅展示
========== 简单计算器 ==========
1. 加法
2. 减法
3. 乘法
4. 除法
5. 退出
请选择(1-5):
请输入第一个数字:
请输入第二个数字:
错误:除数不能为 0!
结果:
再见!
错误:请输入 1-5 之间的数字!
4. 常见错误与调试
(1) 4.1 死循环
错误示例:
CPP
int i = 1;
while (i <= 10) {
std::cout << i << " ";
// ❌ 忘记写 i++,i 永远是 1,循环永远不会结束
}
调试技巧: 在循环里加输出,看看循环变量的值:
CPP
int i = 1;
while (i <= 10) {
std::cout << "[DEBUG] i = " << i << std::endl;
std::cout << i << " ";
i++; // ✅ 记得更新循环变量
}
(2) 4.2 循环条件写错
错误示例:
CPP
// ❌ 想输出 1-10,但条件写成了 i < 10,只会输出 1-9
for (int i = 1; i < 10; i++) {
std::cout << i << " ";
}
调试技巧: 在循环开始前,输出循环变量的初始值和条件:
CPP
int i = 1;
std::cout << "[DEBUG] 初始值 i = " << i << ", 条件 i <= 10" << std::endl;
while (i <= 10) {
std::cout << i << " ";
i++;
}
5. 实战练习: ATM 模拟器
▶ 示例 4:简单的 ATM 模拟器(难度⭐⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <iomanip>
int main() {
double balance = 1000.00; // 初始余额
int choice;
do {
// 显示菜单
std::cout << "========== ATM 模拟器 ==========\n";
std::cout << "1. 查询余额\n";
std::cout << "2. 存款\n";
std::cout << "3. 取款\n";
std::cout << "4. 退出\n";
std::cout << "请选择(1-4):";
std::cin >> choice;
if (choice == 1) {
// 查询余额
std::cout << std::fixed << std::setprecision(2);
std::cout << "当前余额:" << balance << " 元" << std::endl;
} else if (choice == 2) {
// 存款
double amount;
std::cout << "请输入存款金额:";
std::cin >> amount;
if (amount > 0) {
balance += amount;
std::cout << "存款成功!" << std::endl;
} else {
std::cout << "错误:存款金额必须大于 0!" << std::endl;
}
} else if (choice == 3) {
// 取款
double amount;
std::cout << "请输入取款金额:";
std::cin >> amount;
if (amount > 0 && amount <= balance) {
balance -= amount;
std::cout << "取款成功!" << std::endl;
} else if (amount <= 0) {
std::cout << "错误:取款金额必须大于 0!" << std::endl;
} else {
std::cout << "错误:余额不足!" << std::endl;
}
} else if (choice == 4) {
std::cout << "谢谢使用,再见!" << std::endl;
} else {
std::cout << "错误:请输入 1-4 之间的数字!" << std::endl;
}
std::cout << std::endl;
} while (choice != 4);
return 0;
}
输出:
TEXT
📖 仅展示
========== ATM 模拟器 ==========
1. 查询余额
2. 存款
3. 取款
4. 退出
请选择(1-4):
当前余额: 元
请输入存款金额:
存款成功!
错误:存款金额必须大于 0!
请输入取款金额:
取款成功!
错误:取款金额必须大于 0!
错误:余额不足!
谢谢使用,再见!
错误:请输入 1-4 之间的数字!
运行效果:
TEXT
📖 仅展示
========== ATM 模拟器 ==========
1. 查询余额
2. 存款
3. 取款
4. 退出
请选择(1-4):1
当前余额:1000.00 元
请选择(1-4):2
请输入存款金额:500
存款成功!
请选择(1-4):1
当前余额:1500.00 元
请选择(1-4):4
谢谢使用,再见!
❓ 常见问题
Q 什么时候用 for,什么时候用 while?
A 知道循环次数用
for(如输出100次);不知道次数但知道条件用 while(如猜数字直到猜对);至少要执行一次用 do-while。Q 如何在循环里同时用 break 和 continue?
A
break 跳出整个循环,continue 跳过本次循环进入下一轮。可混用但要理清逻辑——break 彻底终止,continue 只是跳过当前迭代。Q 为什么我的程序在循环里输入字符串会出问题?
A 通常是
cin >> 和 getline 混用的问题。解决:在 cin >> 后面加 cin.ignore() 丢弃换行符。📖 小节
- 真实程序往往是分支和循环混用的
do-while适合"至少要执行一次"的场景(如菜单)switch-case适合"多选一"的场景(如菜单选择)- 调试循环时,在循环里加输出(如
[DEBUG] i = ...) - 注意避免死循环(记得更新循环变量)
📝 作业
-
基础题 (Difficulty ⭐): 编写一个程序,让用户输入一个正整数 n,输出 1-n 的所有偶数。
-
进阶题 (Difficulty ⭐⭐): 编写一个程序,实现"石头剪刀布"游戏:
-
让用户输入 1(石头)、2(剪刀)、3(布)
-
程序随机生成一个选择
-
判断胜负并输出结果
-
用户可以选"再玩一次"
-
挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"简单的学生成绩管理系统":
-
功能:添加学生(姓名、成绩)、显示所有学生、计算平均分、退出
-
用菜单循环让用户连续操作
-
(选做)添加"按成绩排序"功能
- 真实程序是分支和循环的混合使用
- do-while 适合至少执行一次的场景(如菜单)
- switch-case 适合多选一场景
- 多层循环中 break 只跳出当前层
- 调试循环时用 cout 输出变量值跟踪执行
6. 🚀 下一步
恭喜你!Phase 1(入门)的所有课程都学完了。 接下来我们进入 Phase 2(函数),学习如何把代码封装成可复用的模块,让程序更简洁、更易维护!