循环结构与选择结构相互嵌套

一、循环与选择嵌套的概念

循环结构与选择结构互相嵌套可以实现复杂的算法逻辑。在实际编程中,这种组合非常常见:循环负责重复执行,选择负责在每次重复中决定不同的执行路径。

两种嵌套方式:

  • 选择结构嵌套在循环结构内:在循环体中根据条件执行不同操作。
  • 循环结构嵌套在选择结构内:在某个条件成立时执行一段循环。

本节重点讲解第一种——选择结构嵌套在循环结构内。

二、示例1:求100~200之间不被3整除的数

需求:输出 100 到 200 之间所有不能被 3 整除的整数。

思路:用 for 循环遍历 100~200,在循环体内用 if 语句判断该数是否能被 3 整除。如果不能(i % 3 != 0),则输出。

for (int i = 100; i <= 200; i++)
{
    if (i % 3 != 0)       // 不被3整除
    {
        cout << i << " ";
    }
}Code language: JavaScript (javascript)

分析:i % 3 != 0 时执行输出,i % 3 == 0 时什么也不做(跳过)。

注意:原讲义中的代码写的是 if (i % 3 == 0) 然后输出,那样输出的是能被 3 整除的数。根据文字描述”不被3整除”,应取反。

三、示例2:读入一系列整数,统计正数和负数个数

需求:读入一系列整数,个数不定,每次读入后判断正负并统计。输入 0 则结束。

思路:使用 while 循环,循环条件为 input != 0。在循环体内用 if-else 判断 input 的正负,分别计数,然后继续读入下一个数。

int z = 0, f = 0;       // z 统计正数,f 统计负数
int input;
cin >> input;           // 先读入第一个数
while (input != 0)
{
    if (input > 0)
    {
        z++;
    }
    else
    {
        f++;
    }
    cin >> input;       // 继续读入下一个数
}
cout << "正数个数:" << z << " 负数个数:" << f;Code language: JavaScript (javascript)

分析:循环前先读入第一个数,循环体内判断并计数,然后再读入下一个数。当输入 0 时,循环条件不成立,退出循环并输出统计结果。

四、代码示例

以下代码演示了循环与选择嵌套的更多应用场景:

#include <iostream>
using namespace std;

int main()
{
    // 示例1:求100~200之间不被3整除的数
    cout << "100~200之间不被3整除的数:" << endl;
    for (int i = 100; i <= 200; i++)
    {
        if (i % 3 != 0)
        {
            cout << i << " ";
        }
    }
    cout << endl;

    // 示例2:统计正负数个数(输入0结束)
    cout << "请输入一系列整数(输入0结束):" << endl;
    int z = 0, f = 0;
    int input;
    cin >> input;
    while (input != 0)
    {
        if (input > 0)
            z++;
        else
            f++;
        cin >> input;
    }
    cout << "正数个数:" << z << " 负数个数:" << f << endl;

    // 示例3:求1~100中所有偶数的和
    int evenSum = 0;
    for (int i = 1; i <= 100; i++)
    {
        if (i % 2 == 0)
        {
            evenSum += i;
        }
    }
    cout << "1~100中偶数之和:" << evenSum << endl;

    // 示例4:输入一批成绩,统计各等级人数
    cout << "请输入成绩(输入-1结束):" << endl;
    int score;
    int excellent = 0, good = 0, pass = 0, fail = 0;
    cin >> score;
    while (score != -1)
    {
        if (score >= 90)
            excellent++;
        else if (score >= 80)
            good++;
        else if (score >= 60)
            pass++;
        else
            fail++;
        cin >> score;
    }
    cout << "优秀:" << excellent << " 良好:" << good
         << " 及格:" << pass << " 不及格:" << fail << endl;

    // 示例5:找出1~100中的素数(嵌套选择)
    cout << "1~100中的素数:" << endl;
    for (int n = 2; n <= 100; n++)
    {
        bool isPrime = true;
        for (int d = 2; d * d <= n; d++)
        {
            if (n % d == 0)
            {
                isPrime = false;
                break;
            }
        }
        if (isPrime)
            cout << n << " ";
    }
    cout << endl;

    // 示例6:选择结构嵌套循环(条件成立时执行循环)
    int choice;
    cout << "输入1打印1~5,输入2打印A~E,输入0退出:";
    cin >> choice;
    if (choice == 1)
    {
        for (int i = 1; i <= 5; i++)
            cout << i << " ";
        cout << endl;
    }
    else if (choice == 2)
    {
        char ch = 'A';
        while (ch <= 'E')
        {
            cout << ch << " ";
            ch++;
        }
        cout << endl;
    }
    else if (choice == 0)
    {
        cout << "退出" << endl;
    }
    else
    {
        cout << "无效选择" << endl;
    }

    return 0;
}Code language: PHP (php)

五、注意事项

  • 循环与选择嵌套时,注意大括号的范围。if 语句如果只有一条语句,可以省略大括号,但为了代码清晰,建议始终加上。
  • 在循环内使用 break 可以提前终止整个循环;使用 continue 可以跳过本次循环剩余部分,直接进入下一次循环判断。
  • 示例2中,输入语句出现了两次(循环前一次,循环内末尾一次),这是处理”未知个数输入”的常见模式。也可以用一个 do-while 循环来简化,只需写一次输入语句。
  • 当嵌套层次较多时,注意缩进,保持代码结构清晰。

六、常见错误

1. 在循环条件中直接读入但忘记在循环内再次读入
while (cin >> input && input != 0)   // 这种写法每次判断都读入
{
    if (input > 0)
        z++;
    else
        f++;
    // 循环体内没有再次 cin,但条件中的 cin 已经读了下一个值
}Code language: JavaScript (javascript)

这种写法是正确的,但逻辑较隐晦。初学者建议用示例2的写法,清晰明了。

2. if 语句缺少大括号导致逻辑错误
for (int i = 100; i <= 200; i++)
    if (i % 3 != 0)
        cout << i << " ";
        cout << "(" << i << ")";   // 这行不在if内,总会执行Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注