11 程序控制语句:顺序控制、分支控制(if-else、switch、嵌套)

news2024/9/21 2:37:22

目录

1 程序控制语句

2 顺序控制语句

3 分支控制语句

3.1 单向分支 if

3.1.1 基本语法

3.1.2 单向分支流程图

3.1.3 案例

3.2 双向分支 if-else

3.2.1 基本语法

3.2.2 双向分支流程图

3.2.3 案例

3.3 多向分支 else if

3.3.1 基本语法

3.3.2 多向分支流程图

3.3.3 案例

3.4 多向分支 switch

3.4.1 基本语法

3.4.2 多向分支流程图

3.4.3 案例:基本用法

3.4.4 案例:穿透 case

3.4.5 switch 和 if else if 的比较

3.5 嵌套分支

3.5.1 基本介绍

3.5.2 基本语法

3.5.3 案例

4 测试题


1 程序控制语句

        在程序中,掌握程序运行的流程控制是确保程序正确执行并实现预期功能的关键能力。主要有三大流程控制语句:

  • 顺序控制
  • 分支控制
  • 循环控制(下一节内容讲解)

2 顺序控制语句

        顺序控制语句保证了程序中各个操作按照预设的顺序依次执行,从上到下逐行进行。在这一过程中,每条语句的执行结果(特别是对变量的修改)会直接影响后续语句的执行。这种直接而明确的执行顺序是理解程序逻辑的基础,也是确保程序按预期运行的关键。

        下面是一个简单的 C 语言程序示例,它展示了顺序控制语句的使用: 

#include <stdio.h>  
  
int main() {  
    int a, b, sum;  
  
    // 初始化变量  
    a = 5;  
    b = 3;  
  
    // 计算两个数的和  
    sum = a + b;  
  
    // 打印结果  
    printf("The sum of %d and %d is %d\n", a, b, sum);  
  
    // 另一个顺序执行的语句  
    printf("This is another sequential statement.\n");  
  
    return 0;  
}

        在这个例子中,程序首先包含了 stdio.h 头文件,它允许程序使用输入输出功能,如 printf 函数。main 函数是程序的入口点。

  • 程序首先声明了三个整型变量 a、b 和 sum。
  • 接着,使用顺序控制语句(即简单地按照书写顺序执行),首先初始化 a 和 b 的值。
  • 然后,计算 a 和 b 的和,并将结果存储在 sum 变量中。
  • 随后,使用 printf 函数打印出 a、b 的和。
  • 最后,再次使用 printf 函数打印出另一条消息,这条消息也是顺序执行的。

        整个程序完全按照代码书写的顺序执行,没有任何条件判断或循环结构。这就是 C 语言中顺序控制语句的基本用法。


3 分支控制语句

3.1 单向分支 if

3.1.1 基本语法

if (条件表达式)
{
    执行代码块;
}

        当条件表达式为真(非 0)时,就会执行代码块语句,条件表达式为假(0)时,不会执行代码块。

        如果 if 语句后面的执行代码块只有一句,那么可以省略大括号 {}

3.1.2 单向分支流程图

3.1.3 案例

        编写一个程序,输入年龄,如果是未成年,则提示 “未成年人请在家长陪同下访问!”

#include <stdio.h>

int main()
{
    int age = 0; // 声明并初始化一个整型变量 age,用于存储用户输入的年龄

    printf("请输入年龄:");
    scanf("%d", &age); // 从标准输入读取一个整数,并将其存储在变量 age 中

    // 使用 if 语句根据 age 的值来进行条件判断
    if (age < 18)
    {
        printf("未成年人请在家长陪同下访问!\n"); // 如果 age 小于 18,则输出提示信息
    }

    // 注意:此处的 printf 语句无论 age 的值如何都会被执行
    // 因为它位于 if 语句的外部,是顺序执行的一部分
    printf("欢迎继续访问!\n");

    return 0;
}

        多次运行程序,输出结果如下所示:

        提示:可以通过打断点来调试程序,能更好的帮助学者掌握程序控制语句。

3.2 双向分支 if-else

3.2.1 基本语法

if (条件表达式)
{
    执行代码块1;
}
else
{
    执行代码块2;
}

        当条件表达式成立(为真),执行代码块 1,否则执行代码块 2。

        如果 if 或 else 语句后面的执行代码块只有一句,那么可以省略大括号 {}

3.2.2 双向分支流程图

3.2.3 案例

        输入年龄,如果大于18岁,则输出 “你年龄大于18,要对自己的行为负责!”,否则,输出“你的年龄不大,这次放过你了。”


#include <stdio.h>

int main()
{
    int age = 0;
    printf("请输入年龄:");
    scanf("%d", &age);

    // 使用 if-else 语句根据 age 的值来进行条件判断
    if (age > 18)
    {
        // 如果 age 大于18,执行以下语句
        printf("你年龄大于18,要对自己的行为负责!\n");
    }
    else
    {
        // 如果 age 不大于18(即小于或等于 18),执行以下语句
        printf("你的年龄不大,这次放过你了。\n");
    }

    return 0;
}

        多次运行程序,输出结果如下所示:

3.3 多向分支 else if

3.3.1 基本语法

if (条件表达式1)
{
    执行代码块1;
}
else if (条件表达式2)
{
    执行代码块2;
}

... 

else
{
    执行代码块n+1;
}

        当条件表达式 1 成立时,即执行代码块 1,如果表达式 1 不成立,才去判断表达式 2 是否成立,如果表达式 2 成立,就执行代码块 2,以此类推如果所有的表达式都不成立,则执行 else 的代码块

        注意:

  • 确保 if-else if 链的末尾有一个 else 语句来处理所有未明确列出的情况;
  • 如果某些条件比其他条件更可能为真,考虑将这些条件放在前面,以减少不必要的测试;
  • 如果某个条件的结果可以直接导致退出函数或循环,尽量将这个条件放在前面。
  • 如果你的 if-else if 链是基于一个变量的多个离散值进行判断,考虑使用 switch 语句来替代。switch 语句在处理这类情况时通常更清晰、更易于理解。

3.3.2 多向分支流程图

3.3.3 案例

        张三参加考试,他和父亲达成协议,如果成绩不到 60 分没有任何奖励;如果成绩 60分(含)到 80 分,奖励一个肉夹馍;如果成绩 80 分(含)到 90 分,奖励一个 ipad;如果成绩 90 分及以上,奖励一部华为 mate60 pro。

#include <stdio.h>

int main()
{
    // 定义变量 score,用于记录成绩,类型为 double 以支持小数分数
    double score;

    // 提示用户输入成绩
    printf("请输入你的成绩:");

    // 使用 %lf 格式符读取 double 类型的输入到变量 score 中
    // 注意:scanf 的返回值应该被检查以确保输入成功,但这里为了简化示例省略了
    scanf("%lf", &score);

    // 根据成绩进行判断,并给出相应的奖励或提示
    // 首先检查成绩是否在有效范围内(这里假设有效范围是 0 到 100)
    if (score >= 0 && score < 60)
    {
        // 如果成绩不及格(0 到 59.99...),输出相应的提示信息
        printf("你的成绩不及格,没有任何奖励!\n");
    }
    else if (score < 80) // 等价于区间:[60,80),因为前面的 if 已经排除了小于 60 的情况!!!
    {
        // 如果成绩在 60(包括)到80之间,输出奖励信息
        printf("奖励你一个肉夹馍\n");
    }
    else if (score < 90) // 等价于区间:[80,90),因为前面的 if-else 已经排除了小于 80 的情况!!!
    {
        // 如果成绩在 80(包括)到 90 之间,输出奖励信息
        printf("奖励你一个ipad\n");
    }
    else if (score <= 100) // 等价于区间:[90,100],为了确保逻辑完整性
    {
        // 如果成绩达到或超过 90,输出最高奖励信息
        printf("奖励你一部华为 mate60 pro,遥遥领先!\n");
    }
    else
    {
        // 为了代码的健壮性,保留这个分支来处理可能的异常情况
        printf("输入无效!(理论上不应该发生,因为假设了成绩范围是0到100)\n");
    }

    return 0;
}

        注意: 为了代码的健壮性,最好对每种情况都进行判断(包括错误情况),如上面这个实例的错误情况有:数值范围 < 0 或 > 100;非数字类型等。 

3.4 多向分支 switch

3.4.1 基本语法

switch (表达式)     // 表达式是整型或枚举
{
    case 常量值1:  // case 后面是常量
       语句块1;
        break;    // 预防穿透
    case 常量值2:
       语句块2;
        break;

   …… 

    case 常量值n:
        语句块n;
        break;

    default:    // 其他情况的处理,可选
       语句块n + 1;
}

        switch 后面表达式的值必须是一个整型(char、short、int、long等)或枚举类型。在 C99 及以后的版本中,还可以是 _Bool 类型或 bool 类型(通过 #include <stdbool.h> 引入)。从 C11 开始,支持字符串字面量作为 switch 的条件(通过隐式转换为整数常量表达式)。

        case 后面的值必须是常量,而不能是变量。因为 switch 语句在编译时就需要确定每个 case 标签的值,以便编译器能够生成相应的跳转表(如果可能的话)或条件分支。

        default 是可选,当没有匹配的 case 时,执行 default。添加一个 default 分支来处理所有未明确列出的 case。这有助于捕获意外的值,并提供一种错误处理或日志记录的方式。

        break 语句可以使程序跳出 switch 语句块,switch 语句的 case 块默认具有穿透性,即如果没有遇到 break 语句,控制流将 “穿透” 到下一个 case 块。这是 switch 语句的一个特性,但也可能导致意外的行为。为了避免穿透性导致的错误,确保每个 case 块的末尾都有一个 break 语句(除非有意利用穿透性)。

3.4.2 多向分支流程图

3.4.3 案例:基本用法

        编写一个程序,该程序可以接收一个字符,比如:a、b、c、d,其中 a 表示星期一,b 表示星期二…,根据用户的输入显示相应的信息,要求使用 switch 语句。

        流程分析:

#include <stdio.h>

int main()
{
    // 定义一个字符变量 c,用于存储用户输入的字符
    char c;

    // 提示用户输入一个字符(a,b,c,d)
    printf("请输入一个字符(a,b,c,d):");

    // 使用 scanf 函数读取用户输入的字符,并存储在变量 c 中
    scanf("%c", &c);

    // 使用 switch 语句根据变量 c 的值进行不同的操作
    switch (c)
    {
    // 如果用户输入的是'a'
    case 'a':
        printf("今天星期一, 猴子穿新衣\n"); // 输出对应的星期和描述
        break;                              // 跳出 switch 语句

    // 如果用户输入的是'b'
    case 'b':
        printf("今天星期二, 猴子当小二\n"); // 输出对应的星期和描述
        break;                              // 跳出 switch 语句

    // 如果用户输入的是'c'
    case 'c':
        printf("今天星期三, 猴子爬雪山\n"); // 输出对应的星期和描述
        break;                              // 跳出 switch 语句

    // 如果用户输入的是'd'
    case 'd':
        printf("今天星期四, 猴子有急事\n"); // 输出对应的星期和描述
        break;                              // 跳出 switch 语句

    // 如果用户输入的不是'a'、'b'、'c'、'd'中的任何一个
    default:
        printf("没有匹配到任何值~\n"); // 输出提示信息
    }

    // switch 语句执行完毕后,输出提示信息
    printf("switch 结束~\n");

    return 0;
}

3.4.4 案例:穿透 case

        编写程序,输入月份,输出该月份有多少天。说明:1月、3月、5月、7月、8月、10月、12月有 31 天,4月、6月、9月、11月有 30 天,2月有 28 天或 29 天。

#include <stdio.h>

int main()
{
    // 定义变量 month 用于记录用户输入的月份
    int month;

    // 提示用户输入月份
    printf("请输入月份:");
    // 使用 scanf 函数读取用户输入的整数并存储在变量 month 中
    scanf("%d", &month);

    // 使用 switch 语句根据月份的不同进行不同的处理
    switch (month)
    {
    // 处理 31 天的月份
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        printf("%d 月有 31 天!\n", month); // 输出该月份有 31 天
        break;                              // 跳出 switch语句

    // 处理 30 天的月份
    case 4:
    case 6:
    case 9:
    case 11:
        printf("%d 月有 30 天!\n", month); // 输出该月份有 30 天
        break;                              // 跳出 switch 语句

    // 处理 2 月
    case 2:
        // 闰年的判断后续学习 
        printf("%d 月有 28 天或 29 天!(闰年时有29天)\n", month); // 输出 2 月的天数情况
        break;

    // 默认情况,用于处理非月份数字的输入
    default:
        printf("请输入正确的月份!\n");
    }

    return 0;
}

3.4.5 switch 和 if else if 的比较

        当判断条件为判等,且数据类型为整型或枚举时,推荐使用 switch 语句,因为它更简洁、直观。

        当需要进行区间判断、大小比较等复杂条件判断时使用 if-else if 语句更为合适,因为它提供了更高的灵活性。

        提示:switch 语句最适合用于基于少量离散值的简单选择逻辑,而 if-else if 语句则更灵活,可以处理更复杂的条件逻辑。

3.5 嵌套分支

3.5.1 基本介绍

        嵌套分支是指,在一个分支结构中又嵌套了另一个分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支嵌套分支层数不宜过多,建议最多不要超过 3 层

3.5.2 基本语法

// 没有固定的语法,就是套娃

if ()
{
    if ()
    {
    }
    else
    {
        switch ()
        {
        case …
        }
    }
}

3.5.3 案例

        输入油号(92 或 95)和油量,计算需要支付的金额。92 号汽油每升 4 元,如果油量大于等于 40 升,每升 3.5 元;95 号汽油每升 5 元,如果油量大于等于 40 升,每升 4.5 元。

        流程分析:

#include <stdio.h>

int main()
{
    // 声明变量用于存储用户输入的油号和油量
    int oilN, oilL;

    // 提示用户输入油号
    printf("请输入油号(如92、95等):");
    scanf("%d", &oilN);

    // 提示用户输入油量
    printf("请输入油量(升):");
    scanf("%d", &oilL);

    // 声明变量用于存储油的单价
    double price;

    // 使用 switch 语句根据油号进行不同的价格计算
    switch (oilN)
    {
    case 92:
        // 初始设置 92 号油的价格为 4 元/升
        price = 4;
        // 如果油量大于等于 40 升,则享受优惠价 3.5 元/升
        if (oilL >= 40)
        {
            price = 3.5;
        }
        // 计算并输出总价
        printf("您本次加油(%d号油,%d升)需支付:%.2f元\n", oilN, oilL, price * oilL);
        break;

    case 95:
        // 初始设置 95 号油的价格为 5 元/升
        price = 5;
        // 如果油量大于等于 40 升,则享受优惠价 4.5 元/升
        if (oilL >= 40)
        {
            price = 4.5;
        }
        // 计算并输出总价
        printf("您本次加油(%d号油,%d升)需支付:%.2f元\n", oilN, oilL, price * oilL);
        break;

    default:
        // 如果输入的油号不是 92 或 95,则提示本加油站没有该油号
        printf("本加油站没有您所需油号(%d)!\n", oilN);
        // 在这种情况下,不需要计算价格,因此没有 price 的使用
        break;
    }

    return 0;
}

4 测试题

1. 写出下列代码的运算结果:

int num = 100;
switch (num % 6)
{
case 2:
    num += 10;
case 4:
    num += 20;
case 6:
    num += 60;
}
printf("%d", num);

【答案】180

【解析】
        (1)num 的值是 100,num % 100 的结果是 4。
        (2)case 4: 被匹配,执行 num += 20;,将 num 增加为 120。
        (3)由于没有 break;,控制流继续向下执行到 case 6:,执行 num += 60;,将 num 增加为 180。

        因此,printf("%d", num); 将输出 180。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光储充能源站微电网及其控制综述入门研究笔记

1. 关于微电网 微电网&#xff08;Micro-Grid&#xff09;&#xff0c;也译为微网&#xff0c;是一个由分布式电源、储能装置、能量转换装置、负荷、监控和保护装置等组成的小型发配电系统。微电网的提出旨在实现分布式电源的灵活、高效应用&#xff0c;解决数量庞大、形式多样…

巴西服务器租用市场:中国企业出海布局的新热点

近年来&#xff0c;巴西市场以其独特的地理位置、庞大的市场潜力、丰富的资源以及友好的营商环境&#xff0c;吸引了众多中国企业的目光。在众多合作领域中&#xff0c;巴西服务器租用成为了中国企业出海布局的重要一环。本文将深入探讨巴西市场为何受广大中国企业青睐&#xf…

数字孪生技术在交通领域的应用现状和展望

数字孪生仿真建模技术是近年来引起广泛关注的一种创新技术&#xff0c;它通过将物理系统的数字化模型与数字孪生仿真建模现实系统进行实时同步&#xff0c;实现了对系统运行状态的准确模拟和预测。在交通领域&#xff0c; 被广泛应用于交通网络规划、交通流优化、智能交通管理等…

地埋电缆防损坏预警装置的工作原理是什么?

答&#xff1a;Hey&#xff0c;各位贴吧的小伙伴们&#xff0c;今天来给大家揭秘一下我们城市地下安全的守护者——地埋电缆防损坏预警装置TLKS-PMG-AGN的工作原理&#xff01;智能地钉内置了高精度定位传感器&#xff0c;这些传感器就像是地下世界的“眼睛”和“耳朵”&#x…

基于Springboot + vue + mysql 致远汽车租赁管理系统 设计实现

目录 &#x1f4da; 前言 &#x1f4d1;摘要 1.1 研究背景 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 4.2.2物理模型设计 系统功能模块 系统首页 用户注册 ​编辑 汽车租赁 个人中心 管理员功能模块 管理…

数据仓库实战:详解维度建模事实表

每个数据仓库都包含一个或者多个事实数据表。其中可能包含业务销售数据&#xff0c;如现金登记事务所产生的数据&#xff0c;通常包含大量的行。事实数据表的主要特点是包含数字数据&#xff08;事实&#xff09;&#xff0c;并且这些数字信息可以汇总&#xff0c;以提供有关单…

Lumos学习王佩丰Excel第十三讲:邮件合并

一、简单的邮件合并 1、批量生成多个文档 预览效果&#xff1a; 批量生成多个文档&#xff1a; 2、利用word发送邮件 &#xff08;1&#xff09;选择收件人并编写邮件内容 &#xff08;2&#xff09;发送邮件 3、每页显示多条记录 将表格形式的选择题转换成word格式。 效果展…

公司内网监控软件是什么?有哪些好用的推荐?精准安排!

企业内网作为公司运营和管理的核心载体&#xff0c;其安全性与效率性直接关系到企业的生死存亡。 如何精准地掌握内网动态&#xff0c;确保信息安全&#xff0c;提升工作效率&#xff1f; 公司内网监控软件&#xff0c;正是这一需求的产物&#xff0c;它如同一位无形的守护者&…

HiPER Calc Pro-高效、强大的数学计算工具

在数字化时代&#xff0c;无论是学生、教师还是科研工作者&#xff0c;准确高效的数学计算都是不可或缺的一环。HiPER Calc Pro&#xff08;原名HiPER Scientific Calculator高级版&#xff09;是一款收费的方程式图形计算器应用&#xff0c;它以无广告、多功能的特性&#xff…

第六版页面

基本 明确定义 站点网关mqtt服务器 多个柜子使用的是主从模式 下发一个设备组其他的柜子跟着设置 具体的让后端进行详细管理 前端规范 字体规范 弹出框定义什么应该弹出什么不应该弹出 页面 主页 屏幕宽度有的没设置好 平面地图模式有的没重合好 日志改为告警在上面 日志…

使用 Python 爬虫进行网站流量分析:Referer 头的利用

在互联网时代&#xff0c;网站流量分析是了解用户行为、优化网站结构和提升用户体验的重要手段。本文将介绍如何使用 Python 爬虫技术结合 HTTP Referer 头进行网站流量分析&#xff0c;以及如何实现这一过程。 什么是 HTTP Referer 头&#xff1f; HTTP Referer 头是一个请求…

ubuntu 22.04下载安装及相关配置

一、ubuntu 22.04下载 1.1、官网下载 Get Ubuntu | Download | Ubuntu 官网下载速度比较慢&#xff0c;不是很推荐。 1.2、清华镜像网站下载 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 该方式下载很快&#xff0c;推荐使用。下载方式如下&#xff1a; 1.2.…

WEB渗透免杀篇-Golang免杀

往期文章 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀-CSDN博客 WEB渗透免杀篇-Bypass-AMSI-…

协同过滤图书推荐管理系统图书购物网站设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

vcruntime140.dll找不到咋办?vcruntime140.dll文件缺失详细解决方案

在运行基于Visual C的软件时&#xff0c;用户常常遭遇“vcruntime140.dll文件缺失”的提示。这个问题主要是因为系统中缺乏必须的Visual C运行库文件。如果你正面临这一问题&#xff0c;本文将提供几种简洁有效的解决方案&#xff0c;确保你的应用程序能够顺利运行。这些方法简…

基于Java+SpringBoot+Vue的IT技术交流和分享平台

基于JavaSpringBootVue的IT技术交流和分享平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f3…

Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换

技术背景 我们在做Android端同屏的时候&#xff0c;开发者希望可以高版本的Android系统上&#xff0c;在设备支持的前提下&#xff0c;可以采集到扬声器输出的audio&#xff0c;并支持和麦克风采集的audio相互切换&#xff0c;实现无纸化|智慧教室同屏不同audio模式的输出。An…

Scrapy框架妙用:如何添加代理IP让数据采集更顺畅

什么是Scrapy框架&#xff1f; Scrapy框架是Python编写的一个强大、快速的网络爬虫和网页抓取框架。它能帮助开发者轻松地从网站上提取数据&#xff0c;并进行数据处理和存储。Scrapy的设计灵活且功能强大&#xff0c;适用于各种数据采集任务。 为何需要在Scrapy中添加代理IP…

【fastapi框架:jinja2模板、ORM操作、中间件与CORS】

## 五、jinja2模板要了解jinja2&#xff0c;那么需要先理解模板的概念。模板在Python的web开发中⼴泛使⽤&#xff0c;它能够有效的将业务逻辑和页⾯逻辑分开&#xff0c;使代码可读性增强、并且更加容易理解和维护。 模板简单来说就是⼀个其中包涵占位变量表⽰动态的部分的⽂件…

百元蓝牙耳机哪个品牌性价比最高?四大高质量耳机爆肝推荐

蓝牙耳机的日常使用非常简便&#xff0c;而且充电也方便。但如今市场中的蓝牙耳机有的质量与价格不匹配&#xff0c;耳机的使用体验不佳&#xff0c;那百元蓝牙耳机哪个品牌性价比最高&#xff1f;关于这一点&#xff0c;作为资深的蓝牙耳机测评师&#xff0c;下面就给大家带来…