第 5 讲:让计算机做复杂的事情——循环结构

一、循环结构概述

1. 为什么需要循环结构

  • 用于处理规律性的重复计算或操作
  • 避免代码冗余,提高代码简洁性和功能性。
  • 例如:输入1000名学生的身高并计算平均身高。

2. 循环结构的四要素

  1. 循环体:重复执行的核心操作。
  2. 循环初始条件:循环控制变量的初始化。
  3. 循环控制条件:决定是否继续循环的表达式。
  4. 循环控制变量的修改:使循环能正常退出,避免死循环。

二、三种循环语句

1. while 循环

  • 语法形式

    while (表达式) {
        循环体;
    }
    
  • 执行流程

    1. 判断表达式是否为真(非0)。
    2. 若为真,执行循环体,返回步骤1;否则退出循环。
  • 特点

    • 先判断后执行。
    • 循环体执行次数:0到多次
    • 循环体可以是空语句、表达式语句、函数调用、控制语句或复合语句。
  • 注意事项

    • 必须有修改循环控制变量的语句。
    • 避免死循环。

2. do-while 循环

  • 语法形式

    do {
        循环体;
    } while (表达式);
    
  • 执行流程

    1. 先执行一次循环体。
    2. 判断表达式是否为真。
    3. 若为真,继续执行;否则退出。
  • 特点

    • 先执行后判断。
    • 循环体至少执行1次
  • 适用场景:适用于初始条件不易确定,且至少需执行一次的情况。

3. for 循环

  • 语法形式

    for (表达式1; 表达式2; 表达式3) {
        循环体;
    }
    
  • 执行流程

    1. 执行表达式1(初始化)。
    2. 判断表达式2(控制条件)。
    3. 若为真,执行循环体,再执行表达式3(更新),返回步骤2;否则退出。
  • 特点

    • 结构紧凑,适合已知循环次数的情况。
    • 循环体执行次数:0到多次
  • 灵活用法

    • 可以省略表达式1、表达式2或表达式3(但分号不能省略)。
    • 表达式1和表达式3可以是逗号表达式。
    • 循环体可为空语句,操作可移至表达式3中。

三、循环嵌套

1. 概念

  • 一个循环体内包含另一个循环,称为循环嵌套
  • 外层循环每执行一次,内层循环从头执行一遍。
  • 常见有二重循环、三重循环等。

2. 嵌套类型

  • 控制变量无交叉:内层循环次数固定。
  • 控制变量有交叉:内层循环次数依赖于外层循环变量。

3. 示例:打印图形

  • 打印5×5星号矩阵:

    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            printf("* ");
        }
        printf("\n");
    }
    
  • 打印右三角形星号:

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
    

四、循环应用实例

1. 累加求和(1到1/100)

  • 使用 whiledo-whilefor 实现。

  • 核心代码:

    sum = 0;
    for (n = 1; n <= 100; n++) {
        sum += 1.0 / n;
    }
    

2. 求最大值与最小值

  • 思路:将第一个输入的数作为初始最大值和最小值,后续输入逐一比较更新。

  • 代码示例:

    max = min = d;  // d为第一个输入的数
    for (i = 2; i <= 10; i++) {
        scanf("%d", &d);
        if (d > max) max = d;
        if (d < min) min = d;
    }
    

3. 计算平均分

  • 循环输入多个成绩并累加,最后计算平均值。

五、重点与难点

重点

  • 循环结构的构建方法。
  • whiledo-whilefor 语句的使用。
  • 循环嵌套的程序设计。

难点

  • 循环条件的正确设置与更新,避免死循环。
  • 嵌套循环的逻辑理解与编写。
  • 循环与选择结构的结合使用。

六、思考题

  1. 选择结构与循环结构的区别是什么?
  2. whiledo-while 如何等价转换?