CC++ & Algorithm

分支与循环综合嵌套

困难16
语言版本:C++Python
概述:在循环中根据条件做不同的事,实现猜数字、输出奇数偶数等有趣程序。

让程序学会选择与重复——分支与循环嵌套的妙用

有时候,程序需要一边重复做某件事,一边在重复的过程中根据情况做出不同的选择。比如你玩“猜数字”游戏:电脑随机想一个数,你每猜一次,它都要判断你是猜大了还是猜小了,直到猜对为止。这个过程既有循环(反复猜),又有分支(每次判断大小)。把分支放在循环里面,就叫“分支与循环综合嵌套”。这种结构能帮我们解决很多有趣的问题,比如统计全班有多少人及格、找出所有能被3整除的数、或者让电脑自动帮你计算零花钱的分配。

为什么要嵌套?——生活中的例子

  • 统计成绩:老师想看看班里50个同学,哪些人及格了(分数≥60),哪些人没及格。就需要循环每个人,对每个人的分数做一次分支判断。
  • 猜数字:你要一直猜,每次猜完电脑都要给你一个提示(大了/小了/对了)。循环负责让你继续猜,分支负责决定提示什么。
  • 游戏里的角色:一个怪物每隔1秒移动一次,每次移动前要判断周围有没有障碍物,有的话就拐弯。循环控制时间,分支控制方向。

总之,循环负责重复,分支负责在每个重复步骤里做出选择

如何在循环里放入分支——基本语法

最常见的写法是:用 forwhiledo-while 循环来遍历或重复,内部用 if-else if-else 进行条件判断。

例子1:输出1到20之间的所有奇数

这段代码就是从1循环到20,每次判断当前数是不是奇数。如果是奇数,就输出它。

#include <iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 20; i++) {   // i从1到20,每次加1
        if (i % 2 == 1) {             // 判断i除以2的余数是否为1(奇数)
            cout << i << " ";         // 是奇数就输出,后面加个空格
        }
    }
    return 0;
}

运行结果: 1 3 5 7 9 11 13 15 17 19

例子2:计算1到100中所有偶数的和

我们可以用循环累加,嵌套分支只加偶数。

#include <iostream>
using namespace std;
int main() {
    int sum = 0;                      // 存放总和,初始为0
    for (int num = 1; num <= 100; num++) {  // num从1到100
        if (num % 2 == 0) {           // 如果是偶数(能被2整除)
            sum = sum + num;          // 把num加进总和
        }
    }
    cout << "1到100所有偶数的和是:" << sum << endl;
    return 0;
}

运行结果: 1到100所有偶数的和是:2550

小窍门:想判断奇数用 num % 2 == 1,判断偶数用 num % 2 == 0

猜数字游戏详解

猜数字是最经典的“循环嵌套分支”应用。下面是一个简化版,假设答案是42。你可以在代码里看到:用 do-while 保证至少猜一次,每次猜完进入 if-else 判断。

#include <iostream>
using namespace std;
int main() {
    int guess;                          // 存放你猜的数
    cout << "猜一个1-100之间的数:";
    do {
        cin >> guess;                   // 输入你的猜测
        if (guess > 42)                 // 比答案大
            cout << "大了,再猜:";
        else if (guess < 42)            // 比答案小
            cout << "小了,再猜:";
        else                            // 等于答案
            cout << "恭喜你猜对了!";
    } while (guess != 42);               // 只要没猜对就继续循环
    return 0;
}

注意:这里的 do-while 循环会先执行一次循环体(让你先猜一次),再检查条件。如果第一次就猜对了,条件 guess != 42 为假,循环结束;如果猜错了,会继续提示并等待下一次输入。

为了让游戏更真实,我们可以加上随机数,让电脑每次自动产生不同的答案。需要引入 <cstdlib><ctime> 两个头文件,用 rand() 生成随机数,srand(time(0)) 设置随机种子。这是扩展内容,感兴趣的同学可以自己试试。

常见错误与陷阱

初学嵌套时,容易犯以下错误:

  1. 忘记用花括号{}
    如果 ifelse 后面只有一条语句,花括号可以省略,但强烈建议永远加上花括号,避免后面添加语句时出错。
    ❌ 错误示例:

    if (guess > 42)
        cout << "大了";
        cout << "再猜";  // 这一行不在if里面,会无条件执行
    

    ✅ 正确:

    if (guess > 42) {
        cout << "大了";
        cout << "再猜";
    }
    
  2. 条件写反

    • 判断奇数用 % 2 == 1,判断偶数用 % 2 == 0。不要混淆。
  3. 循环条件导致无限循环
    比如猜数字中,如果漏掉了输入语句,或者 while 条件写成了 guess == 42(应该是不等于),就会无限循环或者一次都不执行。

  4. 变量未初始化
    sum 在累加之前必须赋初值0,否则会得到随机值。

  5. 混淆 ===

    • = 是赋值,比如 guess = 42 是把42赋给guess
    • == 是判断相等,比如 guess == 42 是判断guess是否等于42。
      if 的条件里一定要用 ==

完整示例:猜数字游戏(随机答案,带猜数次数统计)

下面是一个完整的程序,它包含:

  • 随机生成一个1~100之间的整数
  • 循环让用户猜
  • 每次提示“大了”“小了”或“猜对了”
  • 记录并显示猜了多少次
#include <iostream>
#include <cstdlib>    // 用于 rand() 和 srand()
#include <ctime>      // 用于 time()
using namespace std;

int main() {
    // 初始化随机种子,让每次运行答案不一样
    srand(time(0));
    int secret = rand() % 100 + 1;   // 随机1~100之间的整数
    int guess;                        // 存放用户每次猜的数
    int count = 0;                    // 记录猜的次数,初始为0

    cout << "欢迎来到猜数字游戏!答案在1~100之间。" << endl;

    do {
        cout << "请输入你的猜测:";
        cin >> guess;
        count = count + 1;            // 每猜一次,次数加1

        if (guess > secret) {
            cout << "大了!" << endl;
        } else if (guess < secret) {
            cout << "小了!" << endl;
        } else {
            cout << "恭喜你猜对了!" << endl;
            cout << "你一共猜了 " << count << " 次。" << endl;
        }
    } while (guess != secret);         // 没猜对就继续

    return 0;
}

运行示例:

欢迎来到猜数字游戏!答案在1~100之间。
请输入你的猜测:50
小了!
请输入你的猜测:75
大了!
请输入你的猜测:63
大了!
请输入你的猜测:57
恭喜你猜对了!
你一共猜了 4 次。

这个程序把循环、分支、输入输出、变量累加都用上了,是“嵌套结构”的经典代表。

相关知识点指引

如果你想更深入地理解这类程序,可以继续学习以下内容:

  • 条件语句ifelse ifelse 的区别和用法。
  • 循环语句forwhiledo-while 三种循环各自适合什么场景。
  • 随机数rand()srand(),以及如何控制范围。
  • 布尔表达式truefalse,以及 &&(与)、||(或)、!(非)的运用。
  • 累加器和计数器:比如统计总和、统计次数,是变量使用的常见技巧。

掌握分支与循环嵌套,你就能写出更有“智商”的程序,解决日常生活中的许多小问题。动手试试吧!

例题精讲

1单选题

执行以下程序段,输出结果是: for(int i=1; i<=5; i++){ if(i%2==0) cout << i << " "; }

A2 4
B1 3 5
C2 4 6
D1 2 3 4 5
2判断题

在while循环中可以使用break语句提前终止循环,但break只能出现在循环或switch语句中。

3填空题
猜数字游戏:随机数target=42,用户循环输入猜测,猜对则退出。请填空。
#include <iostream>
using namespace std;
int main(){
    int target=42, guess;
    while(___1___){
        cin >> guess;
        if(guess == target) ___2___;
        else if(guess > target) cout << "大了" << endl;
        else cout << "小了" << endl;
    }
    cout << "恭喜" << endl;
    return 0;
}
4单选题

读取一个整数x=5,执行以下代码,输出结果是: int x; cin >> x; for(int i=1; i<=x; i++){ if(i==3) continue; cout << i << " "; }

A1 2 3 4 5
B1 2 4 5
C1 2 3
D1 2 4
5填空题
输出1到100中所有能被3或5整除的数。请填空。
#include <iostream>
using namespace std;
int main(){
    for(int i=1; i<=100; ___1___){
        if(___2___){
            cout << i << " ";
        }
    }
    return 0;
}