




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章分支语句
§4.1if结构
§4.2Switch语句
§4.3程序范例
1/11/20251问题:判断数字的奇偶性要求输入1个整数,判断该数是奇数还是偶数。number%2==01/11/20252§4.1if结构
顺序结构的程序只能以顺序的方式处理数据,但实际问题要求计算机能够对问题进行判断,根据判断的结果,选择不同的处理方式,这就要求程序本身具有判断和选择能力,分支结构正是为解决这类问题而设定的。
C语言用于实现分支有if结构和switch结构。§4.1.1if语句if结构是一种常用的分支结构,是最简单的一种单分支结构
。1/11/20253一般形式为:if(<表达式>)
<语句A><表达式>:一般为关系表达式或逻辑表达式。功能:先判断<表达式>的逻辑值,若该逻辑值为“真”,则执行<语句A>,否则,什么也不执行。注意:if语句中的<语句A>一般情况下都是以复合语句的形式出现,即用一对花括号将语句括起来。if结构的流程图:1/11/20254【例4-1】
从键盘任意输入两个实数,然后按其代数值从小到大输出这两个数。先制定算法的流程图,如图所示,虚线框为if结构。根据流程图可以很方便地写出解决这个问题的程序1/11/20255/*exam4_1.c按升序输出两个数*/#include<stdio.h>main(){ floata,b,t; scanf("%f,%f",&a,&b); if(a>b) { t=a; a=b; b=t; } printf("%5.2f,%5.2f\n",a,b);}1/11/20256【例4-2】:从键盘输入一个整数,求该数的绝对值。
该问题算法的流程图:1/11/20257根据流程图写出的程序如下:/*exam4_2.c求整数的绝对值*/#include<stdio.h>main(){ intnum; scanf("%d",&num); if(num<0) num=-num; printf("Theabsolutevalueis:%d\n",num);}
1/11/20258§4.1.2if_else语句
if_else语句是一种双分支结构,其一般形式为:if(<表达式>)
<语句A>else<语句B><表达式>:一般为关系表达式或逻辑表达式。功能是:先判断<表达式>的值,若其值为“真”,则执行<语句A>,否则执行<语句B>。if_else结构的流程图:1/11/20259例-判断数字的奇偶性#include<stdio.h>int
main(void){intnumber;
printf("Enteranumber:");
scanf("%d",&number);
if(number%2==0){
printf("Tnenumberiseven.\n");}else{
printf("Tnenumberisodd.\n");}return0;}Enteranumber:329
Tnenumberisodd.Enteranumber:1028Tnenumberiseven.1/11/202510条件的表示例3-2写出满足下列条件的C表达式。ch
是空格或者回车。ch==''||ch=='\n'number是偶数。number%2==0year是闰年,即year能被4整除但不能被100整除,或year能被400整除。
(year%4==0&&year%100!=0)||(year%400==0)1/11/202511【例4-3】设计一个猜数游戏,由计算机产生一个随机数magic,从键盘输入一个数guess,若输入的数guess的大小等于随机数magic,则输出“Youareright!”。否则,输出“Youarewrong!”。1/11/202512根据流程图可写出程序如下:/*exam4_3.c猜数游戏的程序*/#include<stdio.h>#include<stdlib.h>main(){intguess,magic;magic=rand();scanf("%d",&guess);
if(guess==magic) printf("YouAreRight");
else printf("YouAreWrong");}1/11/202513二分支结构和基本的if语句if(表达式)
语句1else
语句2if(表达式)
语句1语句1表达式语句2真假语句1表达式真假1/11/202514§4.1.3if语句的嵌套
if语句的嵌套:是指在if或else的分支下又可以包含另一个if语句或if_else语句,嵌套的形式有规则嵌套和任意嵌套两种。if语句的规则嵌套形式如下:if(<表达式1>)
<语句1>elseif(<表达式2>)
<语句2>elseif(<表达式3>)
<语句3>…elseif(<表达式n>)<语句n>else<语句n+1>1/11/202515if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n-1)语句n-1else语句n假表达式1表达式2语句1语句2语句n-1语句n真
表达式n-1假真
假假真
if语句规则嵌套n个分支需要n-1次比较1/11/202516【例4-4】从键盘输入+、-、*、/中的任一个,输出对应的英文单词:plus、minus、mutiply、divide,若输入的不是这四个字符中的任一个,则输出“error”。算法的流程图如图所示,虚线框所示为if_else的规则嵌套:1/11/202517#include<stdio.h>main(){charch;ch=getchar();if(ch=='+')printf("plus\n");elseif(ch=='-')printf("minus\n");elseif(ch=='*') printf("multiply\n");elseif(ch=='/') printf("divide\n"); else printf("error\n");}
1/11/202518if–else任意嵌套if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4表达式1表达式3语句4真假表达式2语句3语句1语句2真真假假1/11/202519注意:if与else的匹配关系,else总是与离它最近的上一个if配对。将每一对if_else结构采用缩进对齐方式,可以增加程序的可读性,良好的程序书写风格有助于对程序的理解。【例4-5】计算阶跃函数y的值:1/11/202520算法的流程图如图,两个虚线框均为if_else结构。1/11/202521根据流程图写出的程序如下:/*exam4_5.c计算阶跃函数y的值*/#include<stdio.h>main(){ floatx,y; printf("inputx:\n"); scanf("%f",&x);
if(x>=0)
if(x>0) y=1;
else y=0;
else y=-1; printf("y=%-4.0f\n",y);}对多重if,最容易犯的错误是if与else配对错误,else总是与离它最近的上一个还没有配对的if配对。
1/11/202522if(x<0)y=-1;elseif(x==0)y=0;elsey=1;if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;
x>=0x>0y=1y=0真
假真
y=-1假假x<0x==0y=-1y=0真
假真
y=12种嵌套if语句的比较1/11/202523§
4.2Switch结构
当嵌套if分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。§4.2.1switch语句
switch语句的一般形式为:switch(<表达式>){case<常量表达式1>:语句序列1;
case<常量表达式2>:语句序列2;
case<常量表达式n>:语句序列n;
default:语句序列(n+1);}1/11/202524常量表达式:值必须是整型、字符型或者枚举类型语句序列:允许有多条语句<表达式>:可以为任何表达式功能:先计算<表达式>的值,再从上到下地判断与哪一个<常量表达式>的值相等,如果<表达式>的值等于<常量表达式i>的值,则从语句序列i开始执行,直到语句序列(n+1)为止;若<表达式>的值不等于任何一个<常量表达式>的值,是执行default后面的语句序列(n+1)。1/11/202525
switch语句一般形式的流程图:?1/11/202526【例4-6】根据下面表所示的天气情况,决定活动的场所。
分别用整数0、1、2和3代表下雨、下雪、晴天和有风无雨天气。采用switch语句的一般形式.1/11/202527例4-6switch语句一般形式的流程图1/11/202528根据图所示的流程图写出的程序如下所示:/*exam4_6.c根据天气情况决定活动场所*/#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather){ case0:printf("rain----atpalaestra\n");case1:printf("snow----atplayground\n");case2:printf("fine----athill\n");case3:printf("wind----tooutskirt\n");default:printf("other----athome\n");}}1/11/202529程序运行结果:输入:2输出:fine----athillwind----tooutskirtother----athome
发现,如果输入的天气值为0,即天气情况为下雨,则活动场所为所有地方,显然这是与题意不相符合的,程序是错误的。
解决这个问题必须要用到分支语句:break。1/11/202530§4.2.2break语句在switch语句中的作用
如果是一个条件对应着一组独立的操作,那么在switch语句的一般形式中,每一个<语句序列>完成后都要加上一条分支语句:break;switch条件分支互相独立的形式:switch(<表达式>){case<常量表达式1>:<语句序列1>;break;case<常量表达式2>:<语句序列2>;
break;case<常量表达式i>:<语句序列i>;
break;……case<常量表达式n>:<语句序列n>;
break;default:<语句序列n+1>;}1/11/202531Switch结构实现了完全地独立分支功能:
先计算<表达式>的值,再从上到下地判断与哪一个<常量表达式>的值相等,如果<表达式>的值等于<常量表达式>i的值,则执行<语句序列>i,执行完后,跳出switch结构,执行switch结构外的下一条语句.1/11/202532【例4-7】将例4-6改写成具有独立分支的switch结构。#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather) { case0:printf("rain----atpalaestra\n");
break; case1:printf("snow----atplayground\n");
break; case2:printf("fine----athill\n");
break; case3:printf("wind----tooutskirt\n");
break; default:printf("other----athome\n"); }
}
程序运行时,任何一种天气情况都只会对应出现一种运动场所.1/11/202533【例4-8】从键盘输入一个字符,判断其是否为a(可代表abort)或r(可代表retry)或f(可代表fail),并输出相应信息。(输入时不区分大小写)。采用switch结构,其算法流程图如图:1/11/202534/*exam4_8.c字符输入判断*/#include<stdio.h>main(){charch;printf("Abort,Retry,Fail?\n");ch=getchar();/*字符输入*/switch(ch){ case'a':
case'A':printf("\nAbort\n"); break;/*退出switch结构*/case'r': case'R':printf("\nRetry\n"); break; case'f': case'F':printf("\nFail\n"); break; default:printf("\nerror\n");}}1/11/202535§4.3程序范例
【例4-9】求解任意的一元二次方程ax2+bx+c=0的根,a、b、c的值由键盘输入。分析:对系数a、b、c考虑以下情形1)a==0:
方程无解2)a<>0;①b2-4ac>0,有两个不等的实根;②b2-4ac=0,有两个相等的实根;③b2-4ac<0,有两个共轭复根。采用嵌套的if结构,考虑算法流程图?1/11/202536/*exam4_9.c求一元二次方程的根*/#include<math.h>#include<stdio.h>main(){floata,b,c,s,x1,x2;doublet;/*变量定义*/printf("pleaseinputa,b,c:\n");scanf(“%f%f%f”,&a,&b,&c);/*变量输入*/if(a==0.0)printf(“errorinput!!
”);1/11/202537else/*a!=0的情况*/{s=b*b-4*a*c;if(s>=0.0) if(s>0.0)/*if语句任意嵌套*/ { t=sqrt(s); x1=-0.5*(b+t)/a; x2=-0.5*(b-t)/a; printf("Therearetwodifferentroots:\n%5.2fand%5.2f\n",x1,x2); }1/11/202538
else/*s=0的情况*/ printf("Therearetwoequalroots:\n%5.2f\n",-0.5*b/a); else/*s<0的情况*/ { t=sqrt(-s); x1=-0.5*b/a; x2=abs(0.5*t/a); printf("Therearetwovirtualroots:\n"); printf("%5.2f+%5.2fi\t\t%5.2f-%5.2fi\n",x1,x2,x1,x2); }}}1/11/202539【例4-10】运输费用的计算问题。距离S越远,每公里的运费越低。设每公里每吨货物的基本运费为P,货物重量为W(吨),距离为S,折扣为d,则总运输费用f的计算公式为:f=P*W*S*(1-d)。其中折扣数d与距离有关,具体标准如下:0<S<250km没有折扣250
S<500折扣2%500
S<1000折扣5%1000
S<2000折扣8%2000
S<3000折扣10%3000
S折扣15%分析:折扣点的变化处都发生在距离为250的倍数上,如表所示。1/11/202540流程图简图如左图1/11/202541/*exam4_10.c运输费用的计算*/#include<stdio.h>main(){ intc,s; floatp,w,d,f; printf("pleaseinputp,w,s:\n"); scanf("%f,%f,%d",&p,&w,&s); if(s>=3000) c=12; else c=s/250; switch(c) {1/11/202542
case0:d=0;break; case1:d=2;break; case2: case3:d=5;break; case4: case5: case6: case7:d=8;break; case8: case9: case10: case11:d=10;break; case12:d=15;break; } f=p*w*s*(1-d/100); printf("Totalfreightis:%10.2f\n",f);}1/11/202543小结:本章主要介绍了程序分支结构的几种形式,它包括有if语句,if_else语句,if嵌套语句和switch语句。共同特点是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论