欢迎光临
我们一直在努力

C语言程序控制结构

C语言程序控制结构:让程序学会思考

一、C语句概述

C程序是由函数构成的,而函数是由语句构成的。C语言中的语句可以分为六类:

  • 表达式语句:表达式后加分号
  • 声明语句:变量和函数的声明
  • 控制语句:控制程序执行顺序
  • 函数调用语句:函数调用
  • 空语句:只有一个分号
  • 复合语句(语句块):用花括号括起来的多条语句
  • 分号是语句结束的标志,每一行语句后面通常都要有分号。

    二、条件判断语句:if语句

    2.1 if语句的基本形式

    if语句用于根据条件选择性地执行代码:

    // 形式1:单分支
    if (条件表达式)
    语句;

    // 形式2:双分支
    if (条件表达式)
    语句1;
    else
    语句2;

    // 形式3:多分支
    if (条件表达式1)
    语句1;
    else if (条件表达式2)
    语句2;
    else if (条件表达式3)
    语句3;
    else
    语句4;

    2.2 if语句示例

    #include <stdio.h>

    int main()
    {
    int age;

    printf("请输入您的年龄:");
    scanf("%d", &age);

    if (age < 0) {
    printf("年龄不能为负数!\\n");
    } else if (age < 18) {
    printf("您是未成年人。\\n");
    } else if (age < 60) {
    printf("您是成年人。\\n");
    } else {
    printf("您是老年人。\\n");
    }

    return 0;
    }

    2.3 注意事项

    1. 条件表达式的值

    if后面的条件表达式最终会被判断为真(非0)或假(0):

    int a = 5;
    if (a) // 等价于 if (a != 0)
    printf("a为真");

    if (!a) // 等价于 if (a == 0)
    printf("a为假");

    2. 悬空else问题

    如果有多个if和else,else会与距离它最近的if配对:

    // 下面的代码实际上是这样理解的:
    int a = 1, b = 2;
    if (a > 1)
    if (b > 2)
    printf("A\\n");
    else // 这个else与第二个if配对!
    printf("B\\n");

    如果想让else与第一个if配对,需要使用花括号:

    if (a > 1) {
    if (b > 2)
    printf("A\\n");
    } else {
    printf("B\\n");
    }

    三、多分支选择:switch语句

    3.1 switch语句的基本形式

    当需要根据一个变量的不同值进行多分支选择时,switch语句比多个if-else更加清晰:

    switch (表达式)
    {
    case 常量1:
    语句1;
    break;
    case 常量2:
    语句2;
    break;
    ...
    default:
    语句n;
    }

    3.2 switch语句示例

    #include <stdio.h>

    int main()
    {
    int day;

    printf("请输入星期几(1-7):");
    scanf("%d", &day);

    switch (day)
    {
    case 1:
    printf("星期一\\n");
    break;
    case 2:
    printf("星期二\\n");
    break;
    case 3:
    printf("星期三\\n");
    break;
    case 4:
    printf("星期四\\n");
    break;
    case 5:
    printf("星期五\\n");
    break;
    case 6:
    printf("星期六\\n");
    break;
    case 7:
    printf("星期日\\n");
    break;
    default:
    printf("输入错误!\\n");
    }

    return 0;
    }

    3.3 break语句的作用

    重要:每个case后面的break语句是必需的。如果缺少break,会发生case穿透:

    switch (score / 10)
    {
    case 9: // 90-99分
    case 10: // 100分
    printf("优秀\\n");
    break;
    case 8: // 80-89分
    printf("良好\\n");
    break;
    case 7: // 70-79分
    printf("中等\\n");
    break;
    default:
    printf("需要努力\\n");
    }

    在上面的例子中,case 9和case 10会执行相同的代码,这就是利用了case穿透的特性。

    3.4 switch注意事项

  • switch后面的表达式必须是整型或字符型
  • case后面的常量必须是常量或常量表达式
  • case的顺序可以任意,不一定按大小顺序
  • default可以省略,也可以放在任意位置
  • 四、循环结构

    4.1 for循环

    for循环是最常用的循环结构:

    for (表达式1; 表达式2; 表达式3)
    {
    循环体语句;
    }

    执行流程:

    表达式1(初始化) → 表达式2(判断) → 循环体 → 表达式3(更新) → 表达式2(判断) → …

    示例:计算1到100的和

    #include <stdio.h>

    int main()
    {
    int sum = 0;

    for (int i = 1; i <= 100; i++)
    {
    sum += i;
    }

    printf("1+2+…+100 = %d\\n", sum);

    return 0;
    }

    for循环的省略形式

    for循环的三个表达式都可以省略:

    // 省略表达式1:在循环前初始化
    int i = 1;
    for (; i <= 100; i++)
    sum += i;

    // 省略表达式2:相当于条件始终为真(死循环)
    for (;;)
    {
    // 无限循环
    }

    // 省略表达式3:在循环体内部更新
    for (int i = 1; i <= 100;)
    {
    sum += i;
    i++;
    }

    4.2 while循环

    while循环在条件为真时重复执行循环体:

    while (条件表达式)
    {
    循环体语句;
    }

    示例:计算1到100的和

    #include <stdio.h>

    int main()
    {
    int sum = 0;
    int i = 1;

    while (i <= 100)
    {
    sum += i;
    i++;
    }

    printf("1+2+…+100 = %d\\n", sum);

    return 0;
    }

    4.3 do-while循环

    do-while循环先执行循环体,再判断条件,因此循环体至少执行一次:

    do
    {
    循环体语句;
    } while (条件表达式);

    示例:菜单程序(至少执行一次)

    #include <stdio.h>

    int main()
    {
    int choice;

    do
    {
    printf("\\n===== 菜单 =====\\n");
    printf("1. 玩游戏\\n");
    printf("2. 看电影\\n");
    printf("3. 听音乐\\n");
    printf("0. 退出\\n");
    printf("请选择:");
    scanf("%d", &choice);

    switch (choice)
    {
    case 1:
    printf("正在进入游戏…\\n");
    break;
    case 2:
    printf("正在播放电影…\\n");
    break;
    case 3:
    printf("正在播放音乐…\\n");
    break;
    case 0:
    printf("再见!\\n");
    break;
    default:
    printf("选择错误!\\n");
    }
    } while (choice != 0);

    return 0;
    }

    4.4 三种循环的比较

    循环类型适用场景
    for 循环次数已知的情况
    while 循环次数未知,条件控制的情况
    do-while 至少需要执行一次的情况

    五、循环控制语句

    5.1 break语句

    break语句用于终止当前循环:

    for (int i = 1; i <= 10; i++)
    {
    if (i == 5)
    break; // 当i等于5时,退出整个循环
    printf("%d ", i);
    }
    // 输出:1 2 3 4

    5.2 continue语句

    continue语句用于跳过本次循环,继续下一次循环:

    for (int i = 1; i <= 10; i++)
    {
    if (i == 5)
    continue; // 当i等于5时,跳过本次循环
    printf("%d ", i);
    }
    // 输出:1 2 3 4 6 7 8 9 10

    应用示例:计算1到100之间所有偶数的和

    int sum = 0;
    for (int i = 1; i <= 100; i++)
    {
    if (i % 2 != 0)
    continue; // 跳过奇数
    sum += i;
    }

    六、循环嵌套

    循环内部可以再包含循环,这就是循环嵌套:

    // 输出9×9乘法表
    for (int i = 1; i <= 9; i++)
    {
    for (int j = 1; j <= i; j++)
    {
    printf("%d×%d=%d\\t", j, i, i*j);
    }
    printf("\\n");
    }

    经典案例:找出100-200之间的所有素数

    #include <stdio.h>
    #include <math.h>

    int main()
    {
    int count = 0;

    for (int n = 100; n <= 200; n++)
    {
    int isPrime = 1;
    for (int i = 2; i <= sqrt(n); i++)
    {
    if (n % i == 0)
    {
    isPrime = 0;
    break;
    }
    }
    if (isPrime)
    {
    printf("%d ", n);
    count++;
    }
    }
    printf("\\n共找到%d个素数\\n", count);

    return 0;
    }

    七、算法思想:打擂算法

    在编程中,经常需要找出一组数中的最大值或最小值。这里介绍一种常用的打擂算法(也称为打靶算法):

    基本思想:

  • 将第一个数设为最大值(擂主)
  • 依次与后面的数比较,如果发现更大的,就更新最大值
  • 遍历完成后,最终的值就是最大值
  • #include <stdio.h>

    int main()
    {
    int arr[] = {5, 8, 2, 9, 1, 7, 3};
    int n = sizeof(arr) / sizeof(arr[0]);

    int max = arr[0]; // 假设第一个是最大值
    int min = arr[0]; // 假设第一个是最小值

    for (int i = 1; i < n; i++)
    {
    if (arr[i] > max)
    max = arr[i];

    if (arr[i] < min)
    min = arr[i];
    }

    printf("最大值:%d\\n", max);
    printf("最小值:%d\\n", min);

    return 0;
    }

    八、本章小结

    本章我们详细介绍了C语言的程序控制结构:

  • if语句:条件分支,根据条件选择执行路径
  • switch语句:多分支选择,适合根据一个变量的不同值进行选择
  • for循环:次数循环,适合循环次数已知的情况
  • while循环:条件循环,适合循环次数未知的情况
  • do-while循环:至少执行一次的循环
  • break和continue:控制循环的break和continue语句
  • 掌握这些控制结构,就能够编写完整的程序了。在后续章节中,我们将学习数组和函数等更高级的主题。


    下一章预告:我们将学习C语言的数组与字符串,这是处理批量数据的基础。

    赞(0)
    未经允许不得转载:171主机测评 » C语言程序控制结构
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址