第6章 程序基本控制结构

第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 为假。只有一条语句时大括号可省略,但强烈建议保留,避免后续加代码出错。

if 分支结构流程图

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 << "不及格";
caution

从上往下判断,遇到第一个成立的条件就执行并跳出整个多分支。因此小范围/苛刻条件要写在前,否则会被大范围覆盖。例如判断成绩,必须先判 >=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;
}

要点:

  1. switch 表达式须为整数类型(int、char);case 后必须是常量且不能重复;
  2. break 用于跳出 switch;漏写 break 会发生"穿透",继续执行下一个 case;
  3. 多个 case 可以共用一段代码:
switch (n % 2)
{
case 0: cout << "偶数"; break;
case 1: cout << "奇数"; break;
}
  1. 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 次)→ ② 判断条件,真则进循环体 → ③ 执行更新 → 回到 ②。

for 循环流程图

// 输出 1 2 3 4 5
for (int i = 1; i <= 5; i++)
{
cout << i << " ";
}
note

三个部分都可省略,但两个分号必须保留。for (;;) 是死循环(无条件永久执行),通常要配合 break 退出。

6.3.2 while 循环(先判断后执行)

while (条件)
{
循环体;
}

适合"不知道循环几次,只知道终止条件"的场景。

while 循环流程图

// 计算 1~10 的和
int sum = 0, i = 1;
while (i <= 10)
{
sum += i;
i++; // 必须修改条件相关变量,否则死循环
}
cout << sum << endl; // 55
danger

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
note

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-2
2-1 2-2
3-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-4
2-1 2-3 2-4
3-1 3-3 3-4
caution

在嵌套循环里,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-5
2-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,输出 1+2+⋯+n1 + 2 + \dots + 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 先执行后判断,至少一次。

SShowball OI知识手册