流程控制之顺序结构教学讲义


1. 顺序结构简介

1.1 顺序结构定义

顺序结构(Sequential Structure):程序按照代码书写的先后顺序,自上而下逐条执行,每条语句执行完毕后自动进入下一条语句,直到程序结束。

这是程序设计的默认控制结构,也是最自然、最基础的程序执行方式。我们编写的绝大多数代码行都属于顺序结构。

图示:顺序执行流程

    ┌──────────────┐
    │   语句 1     │
    └──────┬───────┘
           │ (自动)
           ▼
    ┌──────────────┐
    │   语句 2     │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │   语句 3     │
    └──────┬───────┘
           │
           ▼
         ......

1.2 算法意义

顺序结构体现了算法的有穷性和确定性:每一步操作都有明确的顺序,计算机严格按照这个顺序执行。在解决实际问题时,我们往往需要将解题步骤拆解为一系列先后完成的动作,这正是顺序结构的用武之地。

核心思想:任何复杂算法都可以分解为“先做什么、再做什么、最后做什么”的顺序步骤。

2. 顺序结构的基本要素

在 C++ 中,顺序结构由以下基本语句组成:

语句类型 示例 作用
定义语句 int a, b; 声明/定义变量
赋值语句 a = 5; 给变量赋值
输入语句 cin >> a; 从键盘读取数据
输出语句 cout << a; 向屏幕输出数据
运算表达式语句 sum = a + b; 计算并存储结果
函数调用语句 swap(x, y); 调用已有功能

这些语句按照书写顺序依次执行,构成了程序的主体。

3. 典型代码模型

3.1 基本顺序模型

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 步骤1:定义变量
    int a, b, sum;
    
    // 步骤2:输入数据
    cin >> a >> b;
    
    // 步骤3:处理数据
    sum = a + b;
    
    // 步骤4:输出结果
    cout << sum << endl;
    
    return 0;
}

上述代码演示了“输入 → 处理 → 输出”这一最常见的顺序结构模式。

3.2 变量交换(经典案例)

问题:交换两个变量 a 和 b 的值。例如,交换前 a=3, b=5,交换后 a=5, b=3。

方法一:临时变量法(理解本质)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a = 3, b = 5;
    int temp;          // 临时变量
    
    // 顺序交换三步
    temp = a;          // 1. 将 a 的值暂存到 temp
    a = b;             // 2. 将 b 的值赋给 a
    b = temp;          // 3. 将 temp 中原来的 a 值赋给 b
    
    cout << a << " " << b << endl;  // 输出 5 3
    return 0;
}

图示:变量交换过程

初始:  a=3, b=5, temp=?
      
步骤1: temp = a;  →  temp=3, a=3, b=5
      
步骤2: a = b;     →  a=5, b=5, temp=3
      
步骤3: b = temp;  →  a=5, b=3, temp=3
      
结果:  a=5, b=3

方法二:使用 swap() 函数

C++ 标准库提供了 swap() 函数,可直接交换两个变量的值。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a = 3, b = 5;
    swap(a, b);          // 交换 a 和 b
    cout << a << " " << b << endl;  // 输出 5 3
    return 0;
}

注意:swap() 函数内部也是通过临时变量或位运算实现的,但作为库函数,它使代码更简洁。

4. 课堂例题

例题1:计算圆的周长和面积

题目描述

输入圆的半径 r(浮点数),输出圆的周长和面积,结果保留两位小数。圆周率取 3.14159。

公式:周长 = 2 × π × r,面积 = π × r²。

输入:一行一个浮点数 r。 输出:两行,第一行为周长,第二行为面积,均保留两位小数。

思路解析

本题属于典型的顺序结构应用。解题步骤非常清晰:

  1. 定义变量存储半径、周长、面积。
  2. 从键盘读入半径。
  3. 根据公式计算周长和面积(注意使用浮点类型)。
  4. 按格式输出结果。

重点:浮点数运算、格式化输出。

代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
    const double PI = 3.14159;   // 定义圆周率常量
    double r;                    // 半径
    double circumference, area;  // 周长、面积
    
    // 1. 输入
    cin >> r;
    
    // 2. 计算
    circumference = 2 * PI * r;
    area = PI * r * r;
    
    // 3. 输出(保留两位小数)
    cout << fixed << setprecision(2);
    cout << circumference << endl;
    cout << area << endl;
    
    return 0;
}

例题2:三位数各位数字之和

题目描述

输入一个三位正整数 n(100 ≤ n ≤ 999),求其各位数字之和。

输入:一行一个整数 n。 输出:一个整数,表示各位数字之和。

思路解析

此题需要将一个三位数的百位、十位、个位分别提取出来,然后相加。提取方法:

  • 个位:n % 10
  • 十位:n / 10 % 10
  • 百位:n / 100

这些操作通过整数除法和取模实现,属于顺序结构中的运算步骤。

代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    // 提取各位数字
    int ge = n % 10;          // 个位
    int shi = n / 10 % 10;    // 十位
    int bai = n / 100;        // 百位
    
    // 计算和
    int sum = ge + shi + bai;
    
    // 输出
    cout << sum << endl;
    
    return 0;
}

例题3:温度转换

题目描述

输入华氏温度 f,将其转换为摄氏温度 c,公式为:c = 5 × (f - 32) / 9。结果保留两位小数。

输入:一行一个浮点数 f。 输出:一行一个浮点数,表示摄氏温度。

思路解析

本题直接套用公式计算即可,但需要注意运算顺序:先计算 f - 32,再乘以 5,最后除以 9。由于乘除优先级相同且从左到右结合,不加括号也能正确计算,但为了清晰,可以加括号。另外,使用浮点数避免整数除法截断。

代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
    double f, c;
    cin >> f;
    
    // 按照公式计算
    c = 5 * (f - 32) / 9;
    
    cout << fixed << setprecision(2) << c << endl;
    
    return 0;
}

5. 常见错误与注意事项

  1. 变量未初始化:使用变量前必须赋予确定的值(输入或赋值)。

    int sum;       // 未初始化
    sum = sum + a; // 错误!sum 是垃圾值
    
  2. 整数除法截断:两个整数相除会舍弃小数部分。

    int a = 5, b = 2;
    double c = a / b;   // c = 2.0,不是 2.5
    // 应改为:double c = 1.0 * a / b;
    
  3. 语句顺序错误:交换变量时若顺序写错,会导致数据丢失。

    // 错误示例
    a = b;
    b = a;   // 此时 a 已经是 b 的值,b 无法获得原 a 的值
    
  4. 输入/输出格式不匹配:cin 和 cout 自动识别类型,但 scanf/printf 需严格匹配格式符。

6. 顺序结构的局限与扩展

顺序结构虽然简单,但只能解决“直线型”问题。当程序需要根据不同情况执行不同代码时(如判断成绩是否及格),就需要引入分支结构;当需要重复执行某段代码时(如计算 1+2+...+100),就需要引入循环结构。

顺序结构是后两者的基础,任何分支和循环内部都是由顺序语句组成的。

7. 课后练习

  • P1000 超级玛丽游戏(洛谷) —— 纯输出,练习顺序输出语句。
  • P5703 【深基2.例5】苹果采购 —— 输入两个整数,输出乘积。
  • P5704 【深基2.例6】字母转换 —— 输入小写字母,输出大写字母(利用 ASCII 码运算)。
  • P5705 【深基2.例7】数字反转 —— 输入一个三位数,反转后输出(提示:使用取模和除法)。
  • P5706 【深基2.例8】再分肥宅水 —— 计算平均分,浮点数输出。

8. 总结

知识点 要点
顺序结构定义 程序按书写顺序逐条执行
核心操作 输入、赋值、运算、输出
典型应用 数据交换、简单计算、单位换算、数字分解
时间复杂度 所有语句依次执行一次,总时间与语句数量成正比(O(1))
注意事项 变量初始化、整数除法、语句顺序、格式化输出

教练寄语:顺序结构看似简单,却是构建复杂算法的基石。务必熟练掌握变量、输入输出、基本运算,做到“不假思索”地写出正确的顺序代码。当你能够流畅地将一个自然语言描述的步骤转化为 C++ 语句时,你就迈出了信息学竞赛的第一步。

参考资料

  • 【书籍】《信息学奥赛一本通》第1章:顺序结构程序设计
  • 【书籍】《C++ Primer Plus》第2章:开始学习 C++
  • 【在线资源】洛谷 - 顺序结构题目集