分支语句(选择结构)——“C”

news/2023/6/6 4:26:01

各位CSDN的uu们你们好呀,我又来啦,今天,小雅兰给大家介绍的是一个知识点,就是我们的分支语句啦,包括if语句和switch语句,下面,就让我们一起来进入分支语句的世界吧


选择结构和条件判断 

在现实生活中,需要进行判断和选择的情况是很多的

  •   如果你在家,我去拜访你
  •   如果考试不及格,要补考
  •   如果遇到红灯,要停车等待

我们的程序也是一样,在很多情况下,还需要根据某个条件是否满足,来决定是否执行指定的操作。或者从给定的两种或多种操作中选择其一,这就是我们今天要学习的选择结构程序设计。

C语言中有两种选择语句:

  • if语句,比较适合实现两个分支的选择结构(比如上课或者不上课,向左还是向右......)
  • switch语句,比较适合实现多分支的选择结构(比如从多个选修课中选择一门,选择一个最喜欢的科目)

那么,if语句的语法结构是怎么样的呢?

语法结构:

  if(表达式)

      语句;


  if(表达式)

      语句1;

  else

      语句2;


   //多分支

   if(表达式1)

       语句1;

   else if(表达式2)

       语句2;

   else

       语句3;


下面,我来给大家举几个例子,来更加准确地理解if语句

  例1:输入两个实数,按代数值由小到大的顺序输出这两个数

        解题思路:

             只需要做一次比较,然后进行一次交换即可

             用if语句实现条件决断

             想要实现两个变量值的互换,则要定义第三个变量              

      这是这个题目的一段小代码,我们一起来看看

#include<stdio.h>
int main()
{float a=0.0;float b=0.0;float tmp=0.0;scanf("%f %f",&a,&b);if(a>b){tmp=a;a=b;b=tmp;}printf("%.2f,%.2f\n",a,b);return 0;
}

例2:输入3个数a,b,c,要求按由小到大的顺序输出

  解题思路:可以先用伪代码写出算法

       if a>b,a和b对换    (a是a、b中的小者)

       if a>c,a和c对换       (a是三者中的最小者)

       if b>c,b和c对换       (b是三者中次小者)

       顺序输出a,b,c

#include<stdio.h>
int main()
{int a=0;int b=0;int c=0;int tmp=0;scanf("%d %d %d",&a,&b,&c);if(a>b){tmp=a;   a=b;b=tmp;}if(a>c){tmp=a;a=c;c=tmp;}if(b>c){tmp=b;b=c;c=tmp;}printf("%d %d %d",a,b,c);return 0;
}

悬空else

  当你写了这样一个具有迷惑性的代码:

#include<stdio.h>
int main()
{int a=0;int b=2;if(a==1)if(b==2)printf("hehe\n");else printf("haha\n");return 0;
}

一些粗心大意的人,一个不留神,就会出错,会认为这个代码的输出结果是haha,实际上并不是这样,这个代码并无输出结果

其实,我们只要明确地知道:else总是和它离得最近的if匹配

下面,我们把这个代码的格式稍微修改一下

//适当地使用{}可以使代码的逻辑更加清楚
//代码风格很重要
#include<stdio.h>
int main()
{int a=0;int b=2;if(a==1){if(b==2){printf("hehe\n");}}else{printf("haha\n");}return 0;
}

  哈哈,这个代码的输出结果就确确实实为haha了


接下来,就到我们心心念念的switch语句

switch是“开关”的意思,它也是一种选择语句,常常用于多分支的情况

switch和if

  从功能上说,switch语句和if语句完全可以相互替代。但从编程的角度,它们又各有各的特点,所以至今为止,也不能说谁可以完全取代谁。

 当嵌套的if比较少时(三个以内),用if编程程序会比较简洁。但是当选择的分支比较多时,嵌套的if语句层数就会很多,导致程序冗长,可读性下降。因此C语言提供switch语句来处理多分支选择。在很多大型的项目中,多分支选择的情况经常会遇到,所以switch语句用得还是比较多的。


switch语句说明

switch语句的作用是根据表达式的值,使流程跳转到不同的语句

 下面,来给大家举几个例子来深入说明一下switch语句

例3:要求按照用户输入的考试等级输出相应百分制分数段,比如用户输入等级A,则输出85——100,B等为70——84分,C等为60——69分,D等为60分以下。

   解题思路:

       判断出这是一个多分支选择问题

       根据百分制分数将学生成绩分为4个等级

       如果用if语句,至少要用三层嵌套的if,进行3次检查判断

       用switch语句进行一次检查即可得到结果

#include<stdio.h>
int main()
{char grade=0;scanf("%c",&grade);printf("Your score:");switch(grade){case 'A':printf("85——100\n");break;case 'B':printf("70——84\n");break;case 'C':printf("60——69\n");break;case 'D':printf("<60\n");break; default:printf("enter data error!\n");break;}return 0;
}

break语句的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

   在最后一个 case 语句的后面加上一条 break语句。

(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)


default子句

如果表达的值与所有的case标签的值都不匹配怎么办?

其实也没什么,结构就是所有的语句都被跳过而已。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。

但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个 case 标签可以出现的位置。

当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。

但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。


例4:运输公司对用户计算运输费用。路程(s Km)越远,每吨——千米运费越低。

标准如下:

s<250没有折扣
250=<s<5002%折扣
500=<s<10005%折扣
1000=<s<20008%折扣
2000=<s<300010%折扣
s>=300015%折扣

该题要求程序能依据用户输入的单价、货物重量以及距离,自动得出折扣,并计算出运费。

  解题思路:

     设每吨每千米货物的基本运费为p,货物重量为w,距离为s,折扣为d

     总运费的计算公式为f=p*w*s*(1-d)

     计算等式中p、w、s为用户输入,所以关键是要找到折扣d的变化规律,由题可知折扣d与输入距离s有关,而且“变化点”都是250的倍数,故引入一折扣变量c,令c的值为s/250,即c代表250的倍数。

     即当c<1时,表示s<250,无折扣

     1=<c<2时,表示250=<s<500,折扣d=2%

     2=<c<4时,表示500=<s<1000,折扣d=5%

     4=<c<8时,表示1000=<s<2000,折扣d=8%

     8=<c<12时,表示2000=<s<3000,折扣d=10%

     c>=12时,表示s>=3000,折扣d=15%

#include<stdio.h>
int main()
{int c=0;//倍数int s=0;//距离float p=0.0;//每吨每千米货物的基本运费float w=0.0;//货物的重量float d=0.0;//折扣float f=0.0;//总运费printf("please enter price,weight,distance:");scanf("%f %f %d",&p,&w,&s);if(s>=3000){c=12;}else {c=s/250;}switch(c){case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;}f=p*w*s*(1-d/100);printf("freight=%10.2f\n",f);return 0;
}

好啦,今天的内容就到这里噢,从这篇文章中小雅兰还是学到了很多的,复习了if语句和switch语句,知道了其中的一些小细节。人们常说:“小细节,大进步。

相信各位uu们看了这篇文章之后也能收获颇多,我们一起加油进步努力呀!!!

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

MSDN的下载和使用

很多同学在初学C语言时&#xff0c;面对C语言中如此多的关键字、操作符、库函数感到非常头大。 利用MSDN这个工具可以帮助我们快速了解它们。 目录 MSDN的下载 MSDN的使用 索引 函数介绍 函数结构 头文件 返回值介绍 示例 MSDN的下载 完整版的MSDN非常大&#xff0c…

运算放大器:运放的平衡电阻

1&#xff0e;主要运放参数 集成运放的基本参数很多&#xff0c;包括静态技术指标&#xff08;直流参数&#xff09;和动态技术指标&#xff08;交流参数&#xff09;。。例如&#xff0c;输入失调电压、输入失调电流、输入偏置电流、输入失调电压温漂、最大差模输入电压、最大…

链路聚合(动态捆绑链路)、负载均衡详解、全双工与半双工区别、LACP优先级详解(附图)

目录 一、链路捆绑优点&#xff1a; 二、链路聚合方式&#xff1a; &#xff08;1&#xff09;手工静态绑定&#xff1a; &#xff08;2&#xff09;动态协商&#xff1a; 全双工模式&#xff1a; 半双工模式&#xff1a; 三、链路聚合——负载均衡&#xff1a; 负载均衡…

平衡二叉树的插入与删除

定义 AVL树是带有平衡条件的二叉查找树。它要求在AVL树中任何节点的两个子树的高度(高度是指节点到一片树叶的最长路径的长) 最大差别为1,如下图所示: 为什么有AVL树 大多数BST操作&#xff0c;例如查找&#xff0c;找最大&#xff0c;最小值&#xff0c;插入&#xff0c;删除…

再论颜色校正-白平衡之动态阈值 Python和c#实现

理论我就不写了&#xff0c;可以参考<一种动态阈值白平衡算法实现>&#xff0c;公式部分写的还比较详细&#xff0c;我就不赘述了。只是网上我搜到的这个算法的实现只有java和c版本的&#xff0c;所以就自己写了python版本的&#xff0c;只是对于理论上说的把图像分块计算…

手动链路聚合 动态链路聚合(LACP-static)

手动链路聚合& 动态链路聚合&#xff08;LACP-static&#xff09; 一、手动链路聚合 实验1&#xff1a; 手动链路聚合 [SW1]INT Eth-Trunk 1 [SW1-Eth-Trunk1]trunkport G 0/0/1 [SW1-Eth-Trunk1]trunkport G 0/0/2 [SW1-Eth-Trunk1]trunkport G 0/0/3 手动链路聚合 [S…

二叉排序树和平衡二叉树

二叉排序树 定义 二叉排序树或者是空树&#xff0c;或者是满足以下性质的二叉树&#xff1a; 1&#xff09;左子树不为空&#xff0c;则左子树上所有关键字的值均小于根关键字的值。 2&#xff09;右子树不为空&#xff0c;则右子树上所有关键字的值均大于根关键字的值。 3&a…

模电之半导体基础篇2(PN结)

文章目录一、PN结的形成二、PN结的动态平衡三、PN结的正反偏置四、电流的估算、PN结的击穿性五、PN结的电容一、PN结的形成 1、过程 使用工艺&#xff0c;将P区域N区分散在左右两边&#xff0c;在浓度差作用下&#xff1a;电子从N取向P区扩散&#xff0c;空穴从P区向N区扩散 …