C++: 实战:分支循环综合

最后更新:2026-08-26

前面的课程我们分开了讲条件判断和循环,但真实程序里它们往往是混在一起用的。

这一课,我们通过几个综合实例,练习如何让分支和循环协同工作。


1. 实例一:猜数字游戏(完整版)

(1) 1.1 需求分析

我们要做一个完整的猜数字游戏:

  1. 程序随机生成一个 1-100 的数字
  2. 让用户输入猜测的数字
  3. 如果猜大了,提示"大了"
  4. 如果猜小了,提示"小了"
  5. 如果猜对了,恭喜用户,并显示猜了多少次
  6. 用户可以选择再玩一次

▶ 示例 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

谢谢游玩,再见!

代码解析:

  1. 外层 do-while:控制"再玩一次"
  2. 内层 do-while:猜数字的主循环
  3. if-else if-else:判断猜大了/小了/对了
  4. 嵌套 if-else:根据猜测次数给出评价


2. 实例二:简单的通讯录

(1) 2.1 需求分析

做一个简单的通讯录程序:

  1. 显示菜单(添加联系人、显示联系人、退出)
  2. 用户选择操作
  3. 用循环让用户可以连续操作,直到选择退出

▶ 示例 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;
}
逻辑代码 44 行(超过 40 行限制,仅展示)

输出:

TEXT 📖 仅展示
========== 简单通讯录 ==========

1. 添加联系人

2. 显示所有联系人

3. 退出

请选择(1-3):
通讯录已满!
请输入姓名:
请输入电话:
添加成功!
通讯录为空!

========== 联系人列表 ==========

.  - 
================================


再见!
错误:请输入 1-3 之间的数字!

💡 提示: 这个程序用到了数组(第09课会详细讲),你可以先照抄,理解大概思路。



3. 实例三:简单的计算器(扩展版)

(1) 3.1 需求分析

做一个支持多次计算的计算器:

  1. 显示菜单(加减乘除、退出)
  2. 用户选择操作
  3. 输入两个数字,输出结果
  4. 用循环让用户可以连续计算

▶ 示例 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;
}
逻辑代码 51 行(超过 40 行限制,仅展示)

输出:

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;
}
逻辑代码 45 行(超过 40 行限制,仅展示)

输出:

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() 丢弃换行符。

📖 小节


📝 作业

  1. 基础题 (Difficulty ⭐): 编写一个程序,让用户输入一个正整数 n,输出 1-n 的所有偶数。

  2. 进阶题 (Difficulty ⭐⭐): 编写一个程序,实现"石头剪刀布"游戏:

  3. 让用户输入 1(石头)、2(剪刀)、3(布)

  4. 程序随机生成一个选择

  5. 判断胜负并输出结果

  6. 用户可以选"再玩一次"

  7. 挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"简单的学生成绩管理系统":

  8. 功能:添加学生(姓名、成绩)、显示所有学生、计算平均分、退出

  9. 用菜单循环让用户连续操作

  10. (选做)添加"按成绩排序"功能


6. 🚀 下一步

恭喜你!Phase 1(入门)的所有课程都学完了。 接下来我们进入 Phase 2(函数),学习如何把代码封装成可复用的模块,让程序更简洁、更易维护!

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏