第6章 程序基本控制结构
程序的三大基本结构:顺序、分支、循环。本章先讲分支(根据条件走不同路),再讲循环(重复做一件事),最后讲 break/continue 对循环的控制。
6.1 顺序结构
代码从上到下依次执行,是最基本的结构。
int a = 3, b = 5;
int c = a + b; // 先算
cout << c << endl; // 再输出
6.2 分支结构(选择)
6.2.1 if 语句
if (条件表达式)
{
条件为真时执行;
}
条件非 0 即为真,0 为假。只有一条语句时大括号可省略,但强烈建议保留,避免后续加代码出错。
6.2.2 if - else
if (条件)
{
// 真
}
else
{
// 假
}
两个分支只会执行其中一个。
6.2.3 if - else if - else 多分支
if (score >= 90)
cout << "优秀";
else if (score >= 60)
cout << "及格";
else
cout << "不及格";
从上往下判断,遇到第一个成立的条件就执行并跳出整个多分支。因此小范围/苛刻条件要写在前,否则会被大范围覆盖。例如判断成绩,必须先判 >=90 再判 >=60,反过来就错了。
6.2.4 switch 多分支
适合"表达式等于若干整数常量"的场景。
int day = 3;
switch (day)
{
case 1: cout << "周一"; break;
case 2: cout << "周二"; break;
case 3: cout << "周三"; break;
default: cout << "其它"; break;
}
要点:
switch表达式须为整数类型(int、char);case后必须是常量且不能重复;break用于跳出switch;漏写break会发生"穿透",继续执行下一个case;- 多个
case可以共用一段代码:
switch (n % 2)
{
case 0: cout << "偶数"; break;
case 1: cout << "奇数"; break;
}
default处理"都不匹配"的情况,位置任意,习惯放最后。
6.2.5 分支嵌套
在 if 内部再写 if,靠缩进区分层级。
int a = 5, b = 3;
if (a > b)
{
if (a - b > 2)
cout << "a 比 b 大很多";
else
cout << "a 比 b 大一点";
}
6.3 循环结构(重复)
6.3.1 for 循环(适合已知次数)
for (初始化; 条件; 更新)
{
循环体;
}
执行顺序:① 初始化(只执行 1 次)→ ② 判断条件,真则进循环体 → ③ 执行更新 → 回到 ②。
// 输出 1 2 3 4 5
for (int i = 1; i <= 5; i++)
{
cout << i << " ";
}
三个部分都可省略,但两个分号必须保留。for (;;) 是死循环(无条件永久执行),通常要配合 break 退出。
6.3.2 while 循环(先判断后执行)
while (条件)
{
循环体;
}
适合"不知道循环几次,只知道终止条件"的场景。
// 计算 1~10 的和
int sum = 0, i = 1;
while (i <= 10)
{
sum += i;
i++; // 必须修改条件相关变量,否则死循环
}
cout << sum << endl; // 55
while 循环体内务必修改能影响条件的变量,否则会变成死循环,程序卡死。
6.3.3 do - while 循环(先执行一次再判断)
do
{
循环体;
} while (条件);
循环体至少执行 1 次;注意末尾的分号不能丢。
int num;
do
{
cout << "请输入正整数:";
cin >> num;
} while (num <= 0); // 输入非法就一直要你重输
6.4 循环控制:break 与 continue
| 语句 | 作用 |
|---|---|
break | 立刻结束整个当前(最内层)循环,跳出 |
continue | 跳过本次循环剩余语句,直接进入下一轮判断 |
6.4.1 单层循环中的 break
// break:找到 1~10 中第一个 3 的倍数
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
cout << "第一个3的倍数是 " << i << endl;
break; // 找到就结束整个循环
}
}
运行输出:
第一个3的倍数是 3
6.4.2 单层循环中的 continue
// continue:只输出 1~10 中的奇数
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
continue; // 偶数跳过后面,直接进入 i++ 的下一轮
cout << i << " ";
}
运行输出:
1 3 5 7 9
break 与 continue 都只作用于最内层的那一层循环;若有多层嵌套,它们不会跳出外层(见 6.4.3)。
6.4.3 双(嵌套)循环中的 break 与 continue
内层 break 只结束内层循环,外层继续:
// 外层 i=1..3,内层 j=1..5;内层遇到 j==3 就 break
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 5; j++)
{
if (j == 3)
break; // 只跳出内层 for,外层不受影响
cout << i << "-" << j << " ";
}
cout << endl; // 每结束一行换行
}
运行输出:
1-1 1-22-1 2-23-1 3-2
内层 continue 只跳过内层当次,内层继续、外层继续:
// 外层 i=1..3,内层 j=1..4;内层遇到 j==2 就 continue
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 4; j++)
{
if (j == 2)
continue; // 只跳过本次内层,进入 j++ 的下一轮
cout << i << "-" << j << " ";
}
cout << endl;
}
运行输出:
1-1 1-3 1-42-1 2-3 2-43-1 3-3 3-4
在嵌套循环里,break 永远只跳出"直接包住它的那一层"。如果某条件成立时要同时结束内外两层,GESP 一级还不会用到 goto 或带标签的 break,正确做法是用一个标志变量控制外层:
// 找到 i==2 且 j==4 时,一次性结束两层循环
bool found = false;
for (int i = 1; i <= 3 && !found; i++)
{
for (int j = 1; j <= 5; j++)
{
if (i == 2 && j == 4)
{
found = true; // 置标志,让外层条件失效
break; // 跳出内层
}
cout << i << "-" << j << " ";
}
cout << endl;
}
运行输出:
1-1 1-2 1-3 1-4 1-52-1 2-2 2-3
6.5 嵌套循环
循环里再放循环,常用来处理二维问题(如打印矩形、乘法表)。
// 打印 3 行 5 列的星号矩形
for (int i = 1; i <= 3; i++) // 外层控制行
{
for (int j = 1; j <= 5; j++) // 内层控制列
cout << "* ";
cout << endl; // 一行结束换行
}
6.6 真题风格示例
【示例】输入一个整数 n,判断它是正数、负数还是零。
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if (n > 0)
cout << "positive";
else if (n < 0)
cout << "negative";
else
cout << "zero";
return 0;
}
【示例】输入 n,输出 的和。
#include <iostream>
using namespace std;
int main()
{
int n, sum = 0;
cin >> n;
for (int i = 1; i <= n; i++)
sum += i;
cout << sum << endl;
return 0;
}
【示例】输出 1~100 中能被 7 整除的数(每行一个)。
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 7 == 0)
cout << i << endl;
}
return 0;
}
6.7 随堂检测
1. 关于 if - else if 多分支,正确的是( )。
- A. 所有条件都会依次判断一遍
- B. 遇到第一个成立的条件就执行并跳出
- C.
else if必须写在else之后 - D. 每个分支一定都会执行
查看答案
答案:B。多分支从上往下,命中第一个成立条件即执行并跳出。
2. switch 中漏写 break 会导致( )。
- A. 编译错误
- B. 程序崩溃
- C. 穿透到下一个 case 继续执行
- D. 只执行 default
查看答案
答案:C。漏写 break 会发生 case 穿透。
3. 下列循环体至少执行一次的是( )。
- A.
for - B.
while - C.
do - while - D. 都一样
查看答案
答案:C。do-while 先执行后判断,至少一次。