一、循环与选择嵌套的概念
循环结构与选择结构互相嵌套可以实现复杂的算法逻辑。在实际编程中,这种组合非常常见:循环负责重复执行,选择负责在每次重复中决定不同的执行路径。
两种嵌套方式:
- 选择结构嵌套在循环结构内:在循环体中根据条件执行不同操作。
- 循环结构嵌套在选择结构内:在某个条件成立时执行一段循环。
本节重点讲解第一种——选择结构嵌套在循环结构内。
二、示例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)