版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章选择结构程序设计4.1if语句4.2switch语句4.3条件运算符和条件表达式4.4选择结构程序实例本章小结 4.1
if语句
用if语句可以构成选择结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种形式。
4.1.1if语句的三种形式
1.基本形式
if(表达式)语句
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为图4-1。图4-1
if语句执行过程
【例4.1】
比较两个整数的大小。
程序如下:
main()
{
inta,b,max;
printf(“\ninputtwonumbers:”);
scanf(“%d%d”,&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
}
说明
本例程序中,输入两个数a、b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
2.if-else形式
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。
其执行过程可表示为图4-2。图4-2
if-else语句执行过程
【例4.2】
输入两个整数,输出其中的大数。
程序如下:
main()
{
inta,b;
printf(“inputtwonumbers:”);
scanf(“%d%d”,&a,&b);
if(a>b)
printf(“max=%d\n”,a);
else
printf("max=%d\n",b);
}
说明
改用if-else语句判别a、b的大小,若a大,则输出a,否则输出b。
3.if-else-if形式
前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为
if(表达式1)
语句1;
elseif(表达式2)
语句2;
elseif(表达式3)
语句3;
elseif(表达式m)
语句m;
else
语句n;其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。
if-else-if语句的执行过程如图4-3所示。图4-3
if-else-if语句执行过程
【例4.3】
判别键盘输入字符的类别。
程序如下:
#include“stdio.h”
main()
{
charc;
printf(“inputacharacter:”);
c=getchar();
if(c<32)
printf(“Thisisacontrolcharacter\n”);
elseif(c>=‘0’&&c<=‘9’)
printf(“Thisisadigit\n”);
elseif(c>=‘A’&&c<=‘Z’)
printf(“Thisisacapitalletter\n”);
elseif(c>=‘a’&&c<=‘z’)
printf(“Thisisasmallletter\n”);
else
printf(“Thisisanothercharacter\n”);
}
说明
键盘输入字符的类别可以根据输入字符的ASCII码来判别。由ASCII码表可知,ASCII值小于32的为控制字符,在“0”和“9”之间的为数字,在“A”和“Z”之间的为大写字母,在“a”和“z”之间的为小写字母,其余则为其他字符。这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。在使用if语句时应注意以下问题:
(1)在if语句的三种形式中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其他表达式,如赋值表达式等,甚至可以是一个变量。
例如:
if(a=5)语句;
if(b)语句;
都是允许的。只要表达式的值为非0,即为“真”。
又如:
if(a=5)…;
其中表达式的值永远为非0,所以其后的语句总是要执行的。当然这种情况在程序中不一定会出现,但在语法上是合法的。再如,有程序段:
if(a=b)
printf(“%d”,a);
else
printf("a=0");
本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
(2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
(3)在if语句的三种形式中,所有的语句应为单个语句,如果要在满足条件时执行一组(多个)语句,则必须把这一组语句用 {} 括起来组成一个复合语句。但要注意的是,在 } 之后不能再加分号。
例如:
if(a>b)
{a++;
b++;}
else
{a=0;
b=10;}4.1.2
if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。
其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
else
if语句;在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
例如:
if(表达式1)
if(表达式2)
语句1;
else
语句2;其中的else究竟与哪一个if配对呢?能否理解为
if(表达式1)
if(表达式2)
语句1;
else
语句2;
为了避免这种二义性,C语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
【例4.4】
比较两个数的大小关系。
程序如下:
main()
{
inta,b;
printf(“pleaseinputA,B:”);
scanf(“%d%d”,&a,&b); /*输入两个整数a,b*/
if(a!=b)
if(a>b) printf(“A>B\n”); /*a>b*/
else printf("A<B\n"); /*a<b*/
elseprintf("A=B\n"); /*a==b*/
}
说明
本例中用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,实际上有三种选择,即A > B、A < B或A = B。这种问题用if-else-if语句也可以完成,而且程序更加清晰。因此,在一般情况下较少使用if语句的嵌套结构,以使程序更便于阅读和理解。
【例4.5】
用if-else-if语句实现比较两个数的大小关系。
程序如下:
main()
{
inta,b;
printf(“pleaseinputA,B:”);
scanf(“%d%d”,&a,&b);
/*输入两个整数a,b*/
if(a==b)printf(“A=B\n”); /*a==b*/
elseif(a>b)printf(“A>B\n”); /*a>b*/
elseprintf("A<B\n"); /*a<b*/
}
说明
用if-else-if语句判别a、b的大小,若a大,则输出a,否则输出b。 4.2
switch语句
C语言还提供了另一种用于多分支选择的switch语句,其一般形式为
switch(表达式){
case常量表达式1:语句1;
case常量表达式2:语句2;
case常量表达式n:语句n;
default:语句n+1;
}…其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句,当表达式的值与所有case后的常量表达式的值均不相等时,则执行default后的语句。
【例4.6】输入一个1~7的整数,然后转换成星期输出。
程序如下:
main()
{
inta;
printf(“inputintegernumber:”);
scanf(“%d”,&a);
switch(a){
case1:printf(“Monday\n”);
case2:printf(“Tuesday\n”);
case3:printf(“Wednesday\n”);
case4:printf(“Thursday\n”);
case5:printf(“Friday\n”);
case6:printf(“Saturday\n”);
case7:printf(“Sunday\n”);
default:printf(“error\n”);
}
}
说明
本程序要求输入一个数字,输出一个英文单词,但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反映了switch语句的一个特点。在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数,在后面将详细介绍。修改本例的程序,在每一case语句之后增加break语句,使每一次执行之后均可跳出switch语句,即可避免输出不应有的结果。
【例4.7】对例4.6进行修改。
程序如下:
main()
{
inta;
printf(“inputintegernumber:”);
scanf(“%d”,&a);
switch(a){
case1:printf(“Monday\n”);break;
case2:printf(“Tuesday\n”);break;
case3:printf(“Wednesday\n”);break;
case4:printf(“Thursday\n”);break;
case5:printf(“Friday\n”);break;
case6:printf(“Saturday\n”);break;
case7:printf(“Sunday\n”);break;
default:printf(“error\n”);
}
}
说明
在使用switch语句时还应注意以下几点:
(1)在case后的各常量表达式的值不能相同,否则会出现错误。
(2)在case后,允许有多个语句,可以不用“{}”括起来。
(3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
(4)default子句可以省略不用。
4.3条件运算符和条件表达式
如果在条件语句中只执行单个赋值语句,则可使用条件表达式来实现。这样不但使程序简洁,也提高了运行效率。
条件运算符为“ ? ”和“ : ”,它是一个三目运算符,即有三个参与运算的量。
由条件运算符组成条件表达式的一般形式为
表达式1?表达式2:表达式3
其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
例如条件语句:
if(a>b)max=a;
elsemax=b;
可用条件表达式写为
max=(a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。使用条件表达式时,还应注意以下几点:
(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此
max=(a>b)?a:b
可以去掉括号而写为
max=a>b?a:b
(2)条件运算符“ ? ”和“ : ”是一对运算符,不能分开单独使用。
(3)条件运算符的结合方向是自右至左。
例如:
a>b?a:c>d?c:d
应理解为
a>b?a:(c>d?c:d)
这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。
【例4.8】
用条件表达式对例4.2重新编程,输出两个数中的大数。
程序如下:
main()
{
inta,b,max;
printf(“\ninputtwonumbers:”);
scanf(“%d%d”,&a,&b);
printf("max=%d",a>b?a:b);/*条件表达式求两个数中的大数*/
} 4.4选择结构程序实例
【例4.9】输入三个整数,输出最大数和最小数。
程序如下:
main()
{
inta,b,c,max,min;
printf(“inputthreenumbers:”);
scanf(“%d%d%d”,&a,&b,&c);
if(a>b)
{max=a;min=b;}
else
{max=b;min=a;}
if(max<c)
max=c;
else
if(min>c)
min=c;
printf("max=%d\nmin=%d",max,min);
}
说明
本程序中,首先比较输入的a、b的大小,并把大数装入max,小数装入min中,然后再与c比较,若max小于c,则把c赋予max,如果c小于min,则把c赋予min,因此max内总是最大数,而min内总是最小数,最后输出max和min的值。
【例4.10】
求一元二次方程ax2+bx+c=0的根。
分析:
例3.16介绍过基本的算法,当时只考虑实根的情况,事实上应该有以下几种可能:
(1)a=0,不是二次方程。
(2)b2-4ac=0,有两个相等的实根。
(3)b2-4ac>0,有两个不等的实根。
(4)b2-4ac<0,有两个共轭复数根。
根据以上分析,N-S图如图4-4所示。图4-4流程图程序如下:
#include<math.h>
#defineFLOATZERO1e-6
main()
{
floata,b,c,d,disc,x1,x2,realpart,imagpart;
scanf(&a,&b,&c);
printf(“Theequation”);
if(fabs(a)<=FLOATZERO) /*a = 0*/
printf(“isnotaquadratic”);
else
{
disc=b*b-4*a*c; /*计算disc*/
if(fabs(disc)<=FLOATZERO) /*disc = 0*/
printf(“hastwoequalroot:%f\n”,-b/(2*a));
elseif(disc>FLOATZERO) /*disc > 0*/
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("hasdistinctrealroots:%f,%f\n",x1,x2);
}
else
/*disc<0*/
{
realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf(“hascomplexroots:\n”);
printf(“%f+%fi\n”,realpart,imagpart);
printf(“%f-%fi\n”,realpart,imagpart);
}
}
}
说明
判断disc是否为0,不能直接用disc==0。
disc是实数,实数在计算机中的存储和计算有微小的误差。“==”(等于运算符)是精确按位比较的。如果使用disc==0比较,则可能导致原来为0的量由于上述误差而被判别为不等于0,导致程序错误。
可以判断disc的绝对值是否小于一个很小的实数,小于此数可以认为等于0。同理,如果需要判断两个浮点数相等也不能使用“==”运算符,而是采用判断两数之差的绝对值小于一个很小的数。
【例4.11】计算器程序。用户输入运算数和四则运算符,输出计算结果。
程序如下:
main()
{
floata,b;
charc;
printf(“inputexpression:a+(-,*,/)b\n”);
scanf(“%f%c%f”,&a,&c,&b);
switch(c){
case‘+’:printf(“%f\n”,a+b);break;
case‘-’:printf(“%f\n”,a-b);break;
case‘*’:printf(“%f\n”,a*b);break;
case‘/’:printf(“%f\n”,a/b);break;
default:printf(“inputerror\n”);
}
}
【例4.12】运输公司对用户计算运费。路程s越远,每公里运费越低。具体标准如表4-1所示。
分析:
设每公里每吨货物的基本运费为p,货物重量为w,距离为s,折扣为d,则总运费f的计算公式为
f = p*w*s*(1 - d)程序如下:
main()
{
intc,s;
floatp,w,d,f;
scanf("%f,%f,%f",&p,&w,&s);
c=s/250; /*c为整数*/
switch(c)
{
case0:d=0;break;
case1:d=2;break;
case2:
case3:d=5;break;
case4:
case5:
case6:
case7:d=8;break;
case8:
case9:【例4.13】已知函数:编写程序,输入x,输出y。算法一:分析:
N-S图如图4-5所示。图4-5N-S图1程序如下:
main()
{
intx,y;
scanf(&x);
if(x<0)y=-1;
if(x=0)y=0;
if(x>0)y=1;
printf(x,y);
}
算法二:
分析:
N-S图如图4-6所示。图4-6N-S图2程序如下:
main()
{
intx,y;
scanf("%d",&x);
if(x<0)y=-1;
elseif(x=0)y=0;
elsey=1;
printf("%d%d",x,y);
}
【例4.14】
输入某学生的成绩,经处理后给出学生的等级,等级分类如下:
90分以上(包括90): A
80至90分(包括80): B
70至80分(包括70): C
60至70分(包括60): D
60分以下: E
算法一:(用if嵌套)
分析:
由题意知,如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分,等级为D;否则,如果成绩小于60分,等级为E。但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息。因此,在用if嵌套前,应先判断输入的成绩是否在0~100之间。程序如下:
#include“stdio.h”
main()
{
intscore;
chargrade;
printf(“\npleaseinputastudentscore:”);
scanf(“%f”,&score);
if(score>100||score<0)
printf(“\ninputerror!”);
else
{
if(score>=90)
grade=‘A’;
else
{
if(score>=80)
grade=‘B’;
else
{if(score>=70)
grade=‘C’;
else
{if(score>=60)
grade=‘D’;
elseg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年内蒙古自治区呼伦贝尔市鄂伦春自治旗八年级下册期末考试数学试题 含答案
- 2026年辽宁省瓦房店市高二生物下册期末考试考试卷附参考答案(轻巧夺冠)
- 2026年湖南省冷水江市高二生物下册期末考试测试卷及参考答案(培优A卷)
- 2026年浙江省龙泉市高二生物下册期末考试检测卷带答案(综合卷)
- 2026年甘肃省合作市高二生物下册期末考试模拟卷含完整答案【典优】
- 2025年黑龙江省海伦市高二生物下册期末考试试卷新版附答案
- 2025年山东省海阳市高二生物下册期末考试检测卷含完整答案(网校专用)
- 2026年河北省南宫市高二生物下册期末考试试卷(综合卷)附答案
- 2026年四川省马尔康市高二生物下册期末考试模拟卷及完整答案(全优)
- 2026年河南省登封市高二生物下册期末考试测试卷带答案(满分必刷)
- 2026年教师职业能力测评题库及答案
- 2026江苏苏州工业园区综合执法系统招聘工作人员20人考试参考试题及答案解析
- 2025年福建省福州市八年级地理生物会考真题试卷(含答案)
- 航空油料化验员职业能力考核复习题库(附答案)
- 2026江苏连云港市东海县事业单位统一招聘15人笔试参考题库及答案解析
- 油品储运调和操作工(技师)职业技能鉴定考试题及答案
- 环保行业财务分析特点报告
- 半导体厂务项目工程管理 课件 项目1 任务1.1半导体厂务项目工程管理概述
- 2025重庆市消防救援总队机关及直属单位政府专职消防员招录113人(公共基础知识)综合能力测试题附答案解析
- 四川省成都市2026届高二上期期末统一调研考试生物答案
- 漂浮式海底锚桩施工方案
评论
0/150
提交评论