C语言第四章分支语句.ppt_第1页
C语言第四章分支语句.ppt_第2页
C语言第四章分支语句.ppt_第3页
C语言第四章分支语句.ppt_第4页
C语言第四章分支语句.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

00:47,1/39,第四章 分支语句, 4.1 if 结构, 4.2 Switch语句, 4.3 程序范例,00:47,2/39, 4.1 if 结构,顺序结构的程序只能以顺序的方式处理数据 ,但实际问题要求计算机能够对问题进行判断,根据判断的结果,选择不同的处理方式,这就要求程序本身具有判断和选择能力,分支结构正是为解决这类问题而设定的。 C语言用于实现分支有if结构和switch结构。, 4.1.1 if语句 if结构是一种常用的分支结构,是最简单的一种单分支结构 。,00:47,3/39,一般形式为:,if() ,:一般为条件表达式或逻辑表达式。 功能:先判断的逻辑值,若该逻辑值为“真”,则执行,否则,什么也不执行。 注意:if语句中的一般情况下都是以复合语句的形式出现,即用一对花括号将语句括起来。 if结构的流程图 :,00:47,4/39,【例4-1】 从键盘任意输入两个实数,然后按其代数值从小到大输出这两个数。,16,a,b,16,9,16,9,t,00:47,5/39,先制定算法的流程图,如图所示,虚线框为if结构。,根据流程图可以很方便地写出解决这个问题的程序,00:47,6/39,/*exam4_1.c 按升序输出两个数*/ #include main() float a,b,t; scanf(“%f,%f“, ,00:47,7/39,例: 输入三个实数,按从小到大的顺序输出。 main( ) float a,b,c,t; scanf(“%f,%f,%f ”, ,00:47,8/39,【例4-2】:从键盘输入一个整数,求该数的绝对值。 该问题算法 的流程图 :,00:47,9/39,根据流程图写出的程序如下: /*exam4_2.c 求整数的绝对值*/ #include main() int num; scanf(“%d“, ,00:47,10/39, 4.1.2 if_else语句,if_else语句是一种双分支结构,其一般形式为: if() else ,:一般为条件表达式或逻辑表达式。 功能是:先判断的值,若其值为“真”,则执行,否则执行。,if_else结构的流程图 :,00:47,11/39,【例4-3】 设计一个猜数游戏,由计算机产生一个随机数magic,从键盘输入一个数guess,若输入的数guess的大小等于随机数magic,则输出“You are right!”。否则,输出“You are wrong!”。,00:47,12/39,根据流程图可写出程序如下:,/*exam4_3.c 猜数游戏的程序*/ #include #include main() int guess,magic; magic = rand(); scanf(“%d“, ,00:47,13/39, 4.1.3 if语句的嵌套,if语句的嵌套 :是指在if或else的分支下又可以包含另一个if语句或if_else语句,嵌套的形式有规则嵌套和任意嵌套两种。,if语句的规则嵌套形式如下:,if() else if() else if () else if () else ,从最内层开始,else总是与它前面最近的未曾配对的if 配对,除非用花括号改变其配对关系。,00:47,14/39,if_else的规则嵌套流程图,00:47,15/39,【例4-4】 从键盘输入+、-、*、/中的任一个,输出对应的英文单词:plus 、minus、mutiply、divide,若输入的不是这四个字符中的任一个,则输出“error”。,算法的流程图如图所示,虚线框所示为if_else的规则嵌套:,00:47,16/39,#include main() char ch; ch=getchar(); if (ch=+) printf(“plusn“); else if (ch=-) printf(“minusn“); else if(ch=*) printf(“multiplyn“); else if (ch=/) printf(“dividen“); else printf(“errorn“); ,00:47,17/39,注意:if与else的匹配关系,else总是与其之前最近且不带else的if配对。将每一对if_else 结构采用缩进对齐方式,可以增加程序的可读性,良好的程序书写风格有助于对程序的理解。,【例4-5】 计算阶跃函数y的值:,00:47,18/39,算法的流程图如图,两个虚线框均为if_else结构。,00:47,19/39,根据流程图写出的程序如下:,/*exam4_5.c 计算阶跃函数y的值*/ #include main( ) float x,y; printf(“input x:n“); scanf(“%f“, ,对多重if,最容易犯的错误是if与else配对错误, else总是与离它最近的上一个if配对。,00:47,20/39,main( ) int x,y; scanf(“%d”, ,例4.3 另解,“语句1”部分,00:47,21/39,例: 编程判断某一年是否为闰年。,year被4整除,T,F,year被100整除,T,F,year被400整除,T,F,leap=1,leap=0,leap=1,leap=0,leap,T,F,输出”闰年”,输出”非闰年”,00:47,22/39,main( ) int year,leap; scanf(“%d”,if (year%4=0,00:47,23/39,if (leap) printf(“%d is”,year); else printf(“%d is not”,year); printf(“ a leap yearn”); ,00:47,24/39,例:if (ab) max=a; else max=b; max=(ab) ? a : b; /*三目运算符*/ 例:if (ab) printf(“%d”,a); else printf(“%d”,b); printf(“%d”,ab ? a : b);,补充: 条件运算符 ? :,00:47,25/39,优先级别: 算术关系 条件 赋值 ab?a:b+1; ab?a:(b+1) 结合方向: “自右至左” 如:ab?a:cd?c:d ab?a:(cd?c:d) x?a:b 当x = 0时,条件表达式的值为b 条件表达式中的操作对象类型可以不同,结果取较高类型。 如: xy?1:1.5 当x y时,值为 1.0。,00:47,26/39, 4.2 Switch结构,当嵌套if分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。, 4.2.1 switch语句 switch语句的一般形式为:,switch (表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n; default : 语句n+1; ,常量表达式的值必须是整型、字符型或枚举型,值必须互不相同,default 语句可以省略。,语句序列: 允许有多条语句,: 可以为任何表达式,00:47,27/39,功能:,先计算的值,再从上到下地判断与哪一个的值相等,如果的值等于的值,则从语句序列i开始执行,直到语句序列(n+1)为止;若的值不等于任何一个的值,是执行default后面的语句序列(n+1)。,00:47,28/39,switch语句一般形式的流程图:,?,00:47,29/39,【例4-6】根据下面表所示的天气情况,决定活动的场所。,分别用整数0、1、2和3代表下雨、下雪、晴天和有风无雨天气。采用switch语句的一般形式.,00:47,30/39,例46 switch语句一般形式的流程图,00:47,31/39,根据图所示的流程图写出的程序如下所示:,/*exam4_6.c 根据天气情况决定活动场所*/ #include main( ) int weather; scanf(“%d“, ,00:47,32/39,程序运行结果: 输入:2 输出:fine-at hill wind-to outskirt other-at home,发现,如果输入的天气值为0,即天气情况为下雨,则活动场所为所有地方,显然这是与题意不相符合的,程序是错误的。 解决这个问题必须要用到分支语句:break。,00:47,33/39,4.2.2 break语句在switch语句中的作用,如果是一个条件对应着一组独立的操作,那么在switch语句的一般形式中,每一个完成后都要加上一条分支语句:break;,switch条件分支互相独立的形式:,switch () case : ; break; case : ; break; case :; break; case : ; break; default: ; ,00:47,34/39,先计算的值,再从上到下地判断与哪一个的值相等,如果的值等于i的值,则执行i,执行完后,跳出switch结构,执行switch结构外的下一条语句.,功能:,00:47,35/39,【例4-7】将例46改写成具有独立分支的switch结构。,#include main( ) int weather; scanf(“%d“, ,程序运行时,任何一种天气情况都只会对应出现一种运动场所.,00:47,36/39,例: 求两个数的运算结果(和/差/积/商) 。,输入数据a b 和运算符号operate,switch (operate),+,-,*,/,w=a+b,w=a-b,w=a*b,w=a/b,printf(“%f%c%f=%f”,a, operate , b , w),00:47,37/39,main( ) float a ,b, w ; char operate; scanf(“%f%c%f”, ,00:47,38/39,【例4-8】从键盘输入一个字符,判断其是否为a(可代表abort)或r(可代表retry)或f(可代表fail),并输出相应信息。(输入时不区分大小写)。,采用switch 结构,其算法流程图如图 :,00:47,39/39,/*exam4_8.c 字符输入判断*/ #include main( ) char ch; printf(“Abort,Retry,Fail?n“); ch=getchar(); switch (ch) case a: case A:printf (“nAbortn“); break; case r: case R:printf (“nRetryn“); break; case f: case F:printf (“nFailn“); break; default: printf (“nerrorn“); ,多个case可以共用一组执行语句,case后面若有多个语句,可以不用 ,00:47,40/39, 4.3 程序范例,【例4-9】求解任意的一元二次方程ax2+bx+c=0的根,a、b、c的值由键盘输入。,分析:对系数a、b、c考虑以下情形 1)a=0: b0,则x= -c/b; b=0,则:若 c=0, 则x无定根; 若c0,则x无解。 2)a0; b2-4ac0,有两个不等的实根; b2-4ac=0,有两个相等的实根; b2-4ac0,有两个共轭复根。,采用嵌套的if结构,考虑算法流程图 ?,00:47,41/39,00:47,42/39,/*exam4_9.c 求一元二次方程的根*/ #include #include main() float a,b,c,s,x1,x2; double t; printf(“please input a,b,c:n“); scanf(“%f%f%f“,00:47,43/39,else printf(“no root!n“); else s=b*b-4*a*c; if(s=0.0) if(s0.0) t=sqrt(s); x1=-0.5*(b+t)/a; x2=-0.5*(b-t)/a; printf(“There are two different roots:n%5.2f and%5.2fn“ ,x1,x2); ,00:47,44/39,else printf(“There are two equal roots:n%5.2fn“,-0.5*b/a); else t=sqrt(-s); x1=-0.5*b/a; x2=abs(0.5*t/a); printf(“There are two virtual roots:n“); printf(“%5.2f+%5.2fitt%5.2f-%5.2fin“,x1,x2,x1,x2 ); ,00:47,45/39,【例4-10】运输费用的计算问题。距离S越远,每公里的运费越低。设每公里每吨货物的基本运费为P,货物重量为W(吨),距离为S,折扣为d,则总运输费用f的计算公式为:f=P*W*S*(1-d)。其中折扣数d与距离有关,具体标准如下:,0S250km 没有折扣 250S500 折扣2 500S1000 折扣5 1000S2000 折扣8 2000S3000 折扣10 3000S 折扣

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论