判断与决策_选择程序设计教材



《判断与决策_选择程序设计教材》由会员分享,可在线阅读,更多相关《判断与决策_选择程序设计教材(54页珍藏版)》请在装配图网上搜索。
1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2021/2/8,,‹#›,高级语言程序设计,选择程序设计(2),,复习,1 判断条件的形式:通常是用关系表达式,,2 判断条件的结果:逻辑真 1、逻辑假 0,,3 实际上除了关系表达式之外,,任何有计算结果的表达式都可以作为,判断条件,,计算结果不为零的数均转化为逻辑真,计算结果为0即为逻辑假,算术表达式,函数调用表达式,,4甚至是简单的变量或常量都可以,,,,选择结构的两种形式:,,if ( condition ),…,,,,if (,condition,),…,else,…,,,注意大括号的使用{ },复
2、合语句块用{ }括起来,,if ( ),{,….多条语句复合到一起,….,},,一条语句的时候省略{ },,问题3: 按成绩把学生分成多组,问题描述:教师要把参加某次测验的学生按成绩的分数段(90以上,80到89,70到79,60到69,小于60)分成多组,并统计出各组的人数。,,分析,输入:,学生成绩grade,输出:根据成绩的范围,输出不同的结果,A,B,C,D,或者F,和统计结果,,如何判断grade所在的范围?,90以上,,80到89,70到79,60到69,,小于60,if (grade>=90),√,但是 if( 89<=grade<90 ),×,,复合判断条件,再分析一下
3、选择结构,if ( 逻辑判断表达式 ),表达式为真时执行的语句;,整个称为单分支选择结构,也可以看成是一个语句,,问?,if (逻辑判断表达式 ),;,,,?,,单分支的嵌套,,,例如,if (grade>=60),,if ( grade < 70 ),printf(“you are passed\n”);,,if ( grade >= 60),if ( grade < 70 ),printf(“you are passed\n”);,,if (grade>=60) {,if ( grade < 70 ),{,printf(“you are passed\n”);\,},},,if (grad
4、e>=60),{,if ( grade < 70 ),printf(“you are passed\n”);,},,,,双分支,嵌,嵌套,,,,if( grade >= 90 ),printf(“good,!,!ingroupA\n”);,else,if( grade >=80),printf(,“,“ better!ingroup\n”);,else,printf( “ok, in CorDorF\n,”,”);,,更好的,写,写法,if( grade >= 90 ),printf(“good,!,!ingroupA\n”);,elseif( grade >=80),printf(,“,“
5、better!ingroup\n”);,else,printf( “ok, in CorDorF\n,”,”);,,,注意:,多个if-else,嵌,嵌套,ifelse的匹,配,配原则,是,是:,else与前,面,面最近,的,的没有,被,被使用,的,的if,匹,匹配,,,,,算法设,计,计(1,),),1 求,和,和变量aNum,bNum,,,,cNum,dNum,fNum,初,初始化,为,为0;,2 输,入,入学生,成,成绩;,3 如,果,果输入,没,没有结,束,束则执,行,行(4)否则,执,执行(9);,4 如,果,果成绩,大,大于或,等,等于90,输,出,出分到A组信,息,息,aNum,
6、加,加1,返回到,(,(2),;,;,5 否,则,则如果,成,成绩还,大,大于或,等,等于80,输,出,出分到B组信,息,息,bNum,加,加1,返回到,(,(2);,6 否,则,则如果,成,成绩还,大,大于或,等,等于70,输,出,出分到C组信,息,息,cNum,加,加1,返回到,(,(2);,7 否,则,则如果,成,成绩还,大,大于或,等,等于60,输,出,出分到D组信,息,息,dNum,加,加1,返回到,(,(2);,8 否,则,则输出,分,分到F,组,组信息,,,,fNum加1,返回到,(,(2);,9 输,出,出统计,结,结果,,算法实,现,现 见ifelsenest.c,,,#in
7、clude,intmain(void),{,intaNum= 0, bNum=0,cNum =0,dNum= 0, fNum=0;,intgrade;,while(scanf("%d",&grade) != EOF),{,if( grade >= 90 ){,printf("Good! youbelongingroupA\n");,aNum =aNum+ 1;,},else if( grade >= 80 ){,printf("Better!you belongingroupB\n");,bNum =bNum+ 1;,},else if( grade >= 70 ){,printf("Midd
8、le!you belongingroupC\n");,cNum =cNum+ 1;,},else if( grade >= 60 ){,printf("Pass! youbelongingroupD\n");,dNum =dNum+ 1;,},else{,printf("Sorry,youare failed,belong in group F\n");,fNum =fNum+ 1;,},},printf("aNum=%d\n",aNum);,printf("bNum=%d\n",bNum);,printf("cNum=%d\n",cNum);,printf("dNum=%d\n",dNum)
9、;,printf("FNum=%d\n",fNum);,,return0;,},,,分析一,下,下该算,法,法的执,行,行情况,你可以,运,运行算,法,法1的,代,代码,,看,看看每,个,个学生,成,成绩要,判,判断几,次,次才能,找,找到它,适,适合的,位,位置。,如果成,绩,绩都是90以,上,上会怎,样,样?,如果成,绩,绩都是60、70分,甚,甚至更,低,低会怎,么,么样?,正常情,况,况下学,生,生的成,绩,绩处于,中,中游的,比,比较多,,,,即大,多,多数都,在,在70,和,和80,之,之间,符合客,观,观实际,的,的、更,好,好的结,构,构应该,是,是什么,?,?,,,,,算法实
10、,现,现 见ifelsebetter.c,,,重新分,析,析一下,问,问题,如果把,成,成绩除,以,以10,取,取整,,可,可以发,现,现,100分,对,对应10,90,到,到99,分,分对应9,80,到,到89,分,分对应8,依此,类,类推,0到9,分,分的对,应,应0,依据整,型,型常量10,9,8,7,6,5,4,3,2,1,0可断定,该,该同学,应,应该分,到,到哪一,组,组,,算法设,计,计(2,),),1,求和变,量,量aNum,bNum,cNum,,,,dNum,fNum初始,化,化为0,;,;,2 输,入,入学生,成,成绩grade;,3 如,果,果grade,大,大于100或
11、,小,小于0,,,,输出,错,错误信,息,息,返,回,回到(2);,4 如,果,果输入,没,没有结,束,束则执,行,行(5)否则,执,执行(12),5 把,成,成绩除,以,以10,并,并取整,,,,得到,对,对应的,整,整型值number,6 如,果,果number是10或9,,,,输出A组信,息,息,aNum,加,加1,,返,返回(2);,7 如,果,果number是8,输,出,出B组,信,信息,bNum加1,,,,返回,到,到(2,),);,8 如,果,果number是7,,,,输出C组信,息,息,cNum,加,加1,,返,返回到,(,(2),;,;,9 如,果,果number是6,,,,
12、输出D组信,息,息,dNum,加,加1,,返,返回到,(,(2),;,;,10如,果,果number是5,或,或4或3或2,或,或1或0,输,出,出F组,信,信息,fNum加1,,,,返回,到,到(2,),);,11,如,如果number是,其,其它数,字,字,输,出,出错误,信,信息,,返,返回到,(,(2),;,;,12,输,输出统,计,计结果,。,。,,switchcase,多,多分支,选,选择结,构,构,switch(整型,表,表达式,),){,case常量表,达,达式:,要执行,的,的语句,[break;],case常量表,达,达式:,要执行,的,的语句,[break;],……,[d
13、efault:,默认的,执,执行语,句,句,],},,几个组,成,成部分,switch(表,达,达式)必须是,整,整型值,的,的表达,式,式,switch,的,的主体,用,用一对,花,花括号,括,括起{ },多个平,行,行的case 常,量,量表达,式,式:,每个case,里,里的,要,要执行,的,的语句,可,可以是,多,多条语,句,句,它,们,们不必,使,使用{}括起,来,来。也,可,可以没,有,有语句,在整个swith主,体,体的最,后,后是一,个,个可选,的,的default :,,,动作,Case 1,break,Case 2,Case n,default,,算法实现(switch c
14、ase),见 switchint.c,,,5分制成绩,统,统计问题,输入的学生,成,成绩是 A/a, B/b,…,成绩是一个,字,字符,,怎么输入字,符,符呢?字符,是,是什么?,字符可以看,成,成整数(ascii码,),),如何判断输,入,入的是什么,字,字符?,,,,字符型,char,charc1, c2, c3;,c1 =,‘,‘A’;,c2 =,‘,‘b’;,c3 =,‘,‘1’;,,,也可以用整,型,型变量存放,字,字符常量,,如,如,int grade1, grade2;,grade1 = 'A';,grade2 = 'B';,计算机内部,接,接受的是,‘,‘A’ ,,‘,‘B’的
15、ASCII,码,码。,,字符比较,两个字符常,量,量或者存放,字,字符常量的,变,变量可以比,较,较大小,ascii,码,码进行比较,,字符型数据,的,的输入,可以使用scanf和printf函数对字,符,符型数据进,行,行输入和输,出,出,占位符,是,是%c。,,,ASCII,码,码是10的,字,字符是回车,符,符。这说明,我,我们输入了,一,一个字符‘a’后输入,的,的回车符被,变,变量a第二,次,次读到了。,这个回车符,是,是没有用的,,,,因此用一,个,个临时变量t把从输入,缓,缓冲区中读,出,出。下例的scanf(“%d”,&t)就,起,起这个作用,。,。,,,键盘读一个,字,字符的
16、函数,getchar( ),,a = getchar( );代替scanf(“%c”,&a,),);,,getchar( );代替 scanf(“%c”,,,输出一个字,符,符到屏幕的,函,函数,putchar(a);,代替,printf(“%c,”,”,a);,,,算法设计(3),1,求和变量aNum,bNum,cNum,,dNum,fNum初,始,始化为0;,2 输入学,生,生成绩grade;,3 如果输,入,入没有结束,则,则执行(4)否则执行(10);,4 如果grade是,‘,‘A’,,输,输出A组信,息,息,aNum加1,返,回,回到(2),;,;,5 如果grade是,‘,‘B’
17、,,输,输出B组信,息,息,bNum加1,返,回,回到(2),;,;,6 如果grade是,‘,‘C’,,输,输出C组信,息,息,cNum加1,返,回,回到(2),;,;,7 如果grade是,‘,‘D’,输,出,出D组信息,,,,dNum,加,加1,返回,到,到(2);,8 如果grade是,‘,‘F’,,输,输出F组信,息,息,fNum加1,返,回,回到(2),;,;,9 如果grade是,其,其它字符,,输,输出错误信,息,息,返回到,(,(2);,10 输出,统,统计结果。,,算法实现,见,见switch5grade.c,,,从键盘获得,一,一个字符的,另,另外两个函,数,数,#inc
18、lude,getche( ),它能接收,键,键盘输入的,任,任意一个字,符,符,无需回车即,可,可以接受,自动的显,示,示到屏幕上,,,,称之为回显。,,getch( ),它同getche() 不同,的,的就是无回显。,,这两个与getchar( )比,较,较,getchar( ),需,需要按回车,键,键,变量才能,在,在输入缓冲,区,区中读到一,个,个字符,无回显。,,演示三种字,符,符输入函数,观察它们的,区,区别,,问题4:判,断,断某年是否,为,为闰年,问题分析:,判断某年是,不,不是闰年的,条,条件“某年能被4整除但不,能,能被100,整,整除或者能被4整除,又,又能被400整除”,
19、,某年是闰年,的,的条件为,(1) “year能,被,被4整除”并且“year,不,不能被100整除”,或者,(2) “year能,被,被4整除”,并,并且“year也能被400整除,”,”,,并且关系的两个判断,如,如何表示?,int pass =0;,int grade1,grade2;,scanf(“%d%d”,,,如果 grade1>= 60,且,且 grade2>= 60 pass=1,,用嵌套,,,,,或关系的两个判断,如,如何表示?,int nopass= 0;,int grade1,grade2;,scanf(“%d%d”,,,如果 grade1< 60,或,或者grade
20、2 < 60 则nopass= 1,,顺序判断?,,,,更好的表示,方,方法:逻辑,运,运算,逻辑运算的,操,操作数是逻,辑,辑真或逻辑,假,假,逻辑与运算&&:,1 &&1 = 1,;,;,1 &&0=0 &&1=0 &&0=0;,逻辑或运算||:,0 ||1=1 ||0=1 ||1=1;,0 ||0 = 0;,逻辑非运算!:,! 0= 1,!1= 0;,,,逻辑表达式,( grade1 >= 60) &&( grade2>= 60 ),逻辑与的优,先,先级低于关,系,系运算,可,以,以省略(),上式等价于grade1 >=60 && grade2>= 60,,( grade1 <60
21、 )||( grade2< 60),逻辑或的优,先,先级低于关,系,系运算,可,以,以省略 () ;,上式等价于grade1 <60 ||grade2 <60,,! ( grade>= 90),逻辑非是单,目,目运算,它,的,的优先级高,于,于关系运算,,,,因此不可,以,以省略(),,优先级与结,合,合性,算术运算>,关,关系运算>,逻,逻辑与运算>逻辑或运,算,算, 它们,依,依次降低,,但逻辑非运,算,算的优先级,高,高于算术运,算,算,,逻辑运算是,左,左结合的,,逻辑运算的短路性,逻辑运算的,操,操作数是0,和,和1,0和1的运算是,有,有规律的,由“逻辑与”运算组成,的,的表达式,
22、从左至右计,算,算,遇到0就不用再向,右,右计算了,因这时逻,辑,辑表达式的,值,值必为假,,只,只有都是真,的,的时候向右,计,计算才有意,义,义。,,( i != 0 )&& (j / i>0 ),,由“逻辑或”构成的逻,辑,辑表达式也,是,是从左向右,计,计算,如果遇到有一个,操,操作数的表,达,达式的值是1就不用再向,右,右计算了,因这时整个,逻,逻辑表达式,的,的值必为真,。,。,,( grade1 <60 )||( grade2< 60),,,,,利用短路性,某年是闰年,的,的条件为,(1) “year能,被,被4整除”并且“year,不,不能被100整除”,或者,(2) “year能,被,被4整除”,并,并且“year也能被400整除,”,”,,闰年判断表,达,达式为:,,(year%4 == 0&&year%100!= 0)||year%400== 0,,算法设计,1 输入年,份,份,2 判断,(year%4 == 0&&year%100!= 0)||year%400== 0,是,是否为真,,如,如果为真输,出,出是闰年,,,,实现(略),,小结,有了算术运,算,算、关系运,算,算、逻辑运,算,算可以表达,各,各种各样的逻辑判断条,件,件,,使用单分支,或,或双分支或,者,者多分支结,构,构以及嵌套,技,技术可以解,决,决各种各样,的,的逻辑判断,问,问题,,,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。