第2章 选择结构(C语言程序设计)_第1页
第2章 选择结构(C语言程序设计)_第2页
第2章 选择结构(C语言程序设计)_第3页
第2章 选择结构(C语言程序设计)_第4页
第2章 选择结构(C语言程序设计)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、第2章选择程序结构设计,2.1问题的提出,2.1.1问题从键盘输入3个不同的整数,分别存放到变量x,y,z中,然后通过判断输出3个数中的最大数,最大数存放在变量max中。2.1.2问题分析,输入x,y,z三个数,Xy?,Y,N,Max=x,Max=y,Maxz,Y,N,Max=z,输出max,结束,2.1.3程序的实现,/*程序功能:从3个数中找出最大数*/#include“stdio.h”voidmain()intx,y,z,max;printf(“n从键盘上输入三个整数:”);scanf(“%d%d%d”,程序中变量a和b说明时初始化为3和5,x、y、z是由赋值语句得到值的。,2.2与选择

2、结构有关的运算符符和表达式,.,2.2.1关系运算符和关系表达式用关系运算符将两个运算对象连接起来形成的表达式,称为“关系表达式”。,.,关系运算符的作用是比较左、右两个运算对象,测试它们之间是否具有所要求的关系。关系表达式的最终结果是逻辑值:如果关系成立,则表达式取逻辑值“真”,用数值1表示;如果关系不成立,则表达式取逻辑值“假”,用数值0表示。,关系表达式中的运算对象可以是数值型的,也可以是字符型的。若是字符型的,则是按照它们的ASCII码值来进行比较。,.,.,要特别区分符号“=”和符号“=”。前者是关系运算符,表示检验左右两个量之间是否具有“等于、相等”的关系;后者是赋值运算符,表示把

3、右边的表达式值赋给(或存入)左边的变量。,试分析下面的程序输出。,例:,#includestdio.hmain()inta=3,b=5,x,y,z;x=ab;y=ab;z=a=b;printf(x=%d,y=%d,z=%dn,x,y,z);,(1),(2),现在变量a的值为3,b的值为5,关系ab和a=b不成立,关系ab成立。因此顺序执行3条赋值语句后,分别把值0赋给变量x,值1赋给变量y,值0赋给变量z。printf()最终输出为:x=0,y=1,z=0,逻辑非运算符是一个单目运算符,它作用在其右的运算对象上,运算结果是得到运算对象的“反”。,2.2.2逻辑运算符与逻辑表达式,.,C语言的逻

4、辑运算符及其含义,名称,运算符,运算对象个数,含义,逻辑非,!,单目,真为“假”,假为“真”,逻辑与,。因x不为0,表示逻辑值为1。因此,!x的值为0。另外,x5的值是0,所以,表达式!(x5)的值为1。这就是说,若要将一个条件的含义在原来的基础上“反转”过来,用“!”就能够达到目的。,该运算符作用在左、右两个运算对象上,只有当它们同时为真时,整个逻辑表达式才为真;只要其中有一个为假,整个逻辑表达式就是假。所以,若希望两个条件都为真时才做某事,就应把它们放在“”,那么表达式“ab|a!=b”的结果为真。这是因为虽然关系表达式:ab不成立,但是关系表达式a!=b却成立。,用关系运算符只能形成简单

5、的比较条件。要把多个简单的条件组合成复杂的条件,就必须利用逻辑运算符。,通过逻辑运算符组成复杂的条件,4.,.,要表示“x大于a小于b”的数学关系“aam=n=a=b=10;x=(m=ab),输出结果应该是:x=0,m=0,n=10,(2),(3),计算该表达式值时,左边的关系表达式ab不成立,因此变量m的值为0。既然scanf(%d,(2),只当x是偶数时,x%2的余数才为0,即“x%2=0”才成立。所以该条件表达式的含义是:若输入的是偶数,那就把0赋给变量y;否则,就把值1赋给变量y。,编写程序,从键盘输入字符。如果字符是英文小写字母,则将其转换成大写后输出,否则输出原字符。,例:,#in

6、cludestdio.hmain()charx;printf(Enteracaracter!);scanf(%c,(1),程序实现,(2),分析与讨论,判断一个字母是否是小写的条件是:x=a,当执行中遇到if时,若圆括号里的取值为非0(即条件成立),则执行;否则(即取值为0,条件不成立)就不执行if中的,而去执行该单分支选择语句的后续语句。,比如两次运行该程序,第1次输入242,第2次输入108,其结果如图所示。,例:,编写程序,从键盘输入一个整数,然后输出其绝对值。,(1),程序实现,#includestdio.hmain()intnum;printf(Inputyourinteger:n)

7、;scanf(%d,(2),分析与讨论,.,程序中,条件num0成立时,就执行单分支语句:“num=num;”。这样,在变量num里,总保持是一个正数,即它的里面存放的是输入数据的绝对值。,.,打印语句:printf(Theabsolutevalueis%dn,num);是单分支语句的后续语句,无论“num=num;”是否做,这条打印语句总是要执行的。,在具体编写程序时,常用printf()给出提示信息。比如程序一开始给出语句:printf(Inputyourinteger:n);即是提示用户输入数据。这样的做法,使得编写的程序具有人性化,界面更为显友好。,.,.,#includestdio.

8、hmain()intx,y,swap;charch;printf(Inputtwointegers.n);scanf(%d%d,例:,编写一个程序,输入两个整数,随之输出。然后,再输入一个字符,如果字符是y或Y,则将两个整数交换后输出。,(1),程序实现,(2),分析与讨论,复合语句,实现数据交换,.,判断ch里输入的是小写y或大写Y时,其条件应该写成:ch=y|ch=Y不能写成:ch=y|ch=Y,.,两个变量间内容的交换,不能写成:x=y;y=x;因为x、y对应的都是内存单元,执行“x=y;”后,原来x里的值就没有了。再做“y=x;”,达不到交换的目的。,.,为实现单元内容的交换,应设一临

9、时变量swap,以它为中介,分三步完成变量间的交换。,swap=x,x=y,y=swap,x,y,swap,#includestdio.hmain()intfir,sec;printf(Pleaseentertwonumbers:);scanf(%d%d,编写程序,输入两个整数,若第1个大于第2个,显示信息firstisgreaterthansecond!,否则显示信息:firstisnotgreaterthansecond!。最后显示信息:Alldone!。,2.3.2,ifelse两路选择结构,.,ifelse双分支选择语句的一般形式是:,例:,(1),程序实现,(2),分析与讨论,.,这

10、是典型的双分支选择结构,可根据条件“firsec”(第1个整数是否大于第2个)作为判断条件。,条件,语句1,真,假,(后续语句),语句2,ifelse双分支选择语句的执行流程图。,.,if();else;,ifelseif多分支选择语句的执行流程图。,2.3.3ifelseif多路选择结构,.,ifelseif多分支选择语句的一般形式是:,执行中遇到if时,若圆括号里的取值为非0,则执行;否则去判定elseif后面圆括号里,如果值为非0,则执行;否则去判定下一个elseif后面圆括号里的值,如果值为非0,则执行;如此等等。如果、都为0,那么执行else后面的。在执行了或或或后,去执行后续语句。

11、,.,条件1,语句1,真,假,(后续语句),.,条件2,语句2,真,假,条件3,语句3,真,假,语句n,假,if();elseif();elseif();elseif();else;,输入一个字符。若是数字,打印出:Itisanumber!;若是小写字母,打印出:Itisasmallletter!;若是大写字母,打印出:Itisacapitalletter!。否则打印出:Itisaothercharacter!。,例:,(1),程序实现,(2),分析与讨论,.,#includestdio.hmain()charch;printf(Pleaseenteracharacter:);scanf(%c

12、,各判定条件分别是:是数字?是小写字母?是大写字母?是其他字符?根据输入的不同情况,打印出不同的信息。,.,单分支和双分支的语句结构都只根据一个条件来进行选择,而多分支语句结构则是根据多个不同的条件来做选择。在程序中无论使用哪种选择结构,编程者都必须构造恰当的条件,必须清楚谁是整个结构的后续语句。,分别输入数字64、字符、小写字母f以及大写字母M后,运行4次的输出结果。,.,3.2.4if语句的嵌套结构,.,在各种if选择结构里,其分支语句本身也可是一个if选择结构语句,这就是所谓的“if语句的嵌套结构”。,.,嵌套结构中,可能会出现许多if和else。原则上,else总是与它最近的if配对。

13、但在一个if的嵌套结构中,if和else的个数可能不等。为使结构清晰,避免配对错误,编程人员应多用花括号来形成复合语句,以正确地表达自己的设计意图。,例:,有程序段如下:,if(y=8)if(x=5)printf(n);elseprintf(#n);printf($n);printf(,给出的程序段中,有两个if,一个else。只有安插花括号改变if和else的配对,才能达到目的。,if(y=8)if(x=5)printf(n);elseprintf(#n);printf($n);printf(,.,.,具体做法如下:,假定x=5、y=8,如何用安插花括号的方法,使上述程序段输出结果:$bre

14、ak;case常量值2:;break;case常量值n1:;break;default:;break;,.,switch语句的功能是求出圆括号内表达式的值,与case后的常量值逐一比较。找到匹配者时,就执行其后以及后面case里的语句。若所有case后的常量值都不匹配,才去执行default(如果有的话)后的语句。但在执行匹配的case后的语句时,若遇到break语句,则立即跳去执行switch的后续语句。,.,switch的执行流程图:,表达式,语句1,Y,switch,有break?,N,常量值1,语句2,Y,有break?,常量值2,N,语句3,Y,有break?,常量值3,N,语句n,

15、default,(后续语句),把所给的ifelseif多分支语句程序段改写成switch多分支语句程序段。,如果switch语句中有default,通常都把它放在语句的最后。但这并不是强求的,它在语句里出现的位置,不会影响程序的执行结果。,执行完匹配case后的语句,如果没有遇到break,那就自动去执行下一个case后的语句,而不再判别与其常量值是否匹配。,.,有关switch语句的几点注意,(1),switch后的表达式必须用圆括号括住,取值只能是整型或字符型的。,(2),各case后的常量必须是整数或字符常量,它们不应该相同。,(3),(4),(5),case后的语句也可以是switch

16、语句,从而形成switch语句的嵌套形式。,例:,if(ivalue=1)ncount1+;elseif(ivalue=2)ncount2+;elseif(ivalue=3)ncount3+;elsencount4+;,switch(ivalue)case1:ncount1+;break;case2:ncount2+;break;case3:ncount3+;break;default:ncount4+;break;,改写结果,.,输入1时,做“case1:”后的语句printf(“x=1n”);。由于有break,就结束switvh的执行。所以,整个程序的输出结果是:x=1。,输入2时,先做

17、“case2:”下的x=1。但因为没有跟随break语句,所以继续做case3后的x+=2和printf(“x=%dn”,x),在遇break时结束switvh的执行。于是输出3。,例:,#includestdio.hmain()intx;printf(Enteranumber:n);scanf(%d,运行所给程序4次,分别输入数据1、2、3和4。试问每次的输出结果是什么?,case4:printf(x=%d,x+);printf(x=%dn,x);break;,(1),(2),(3),输入3时,输出的结果是:x=5。,(4),输入4时,输出的结果是:x=4,x=5。这是因为在做printf(x=%d,x+)时,x值为4,将4输出后才对x进行+操作。所以紧接着由printf(x=%dn,x)输出x=5。,例:,编写一个程序,它从键盘接收一个算术运算符和两个整数。根据运算符的不同,求出相应的算术运算结果,打印输出。,#includestdio.hmain()intx1,x2;charo

温馨提示

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

评论

0/150

提交评论