您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 判断与决策_选择程序设计(2)
高级语言程序设计选择程序设计(2)复习1判断条件的形式:通常是用关系表达式2判断条件的结果:逻辑真1、逻辑假03实际上除了关系表达式之外,任何有计算结果的表达式都可以作为判断条件,计算结果不为零的数均转化为逻辑真,计算结果为0即为逻辑假算术表达式函数调用表达式4甚至是简单的变量或常量都可以选择结构的两种形式:if(condition)…if(condition)…else…注意大括号的使用{}复合语句块用{}括起来if(){….多条语句复合到一起….}一条语句的时候省略{}问题3:按成绩把学生分成多组问题描述:教师要把参加某次测验的学生按成绩的分数段(90以上,80到89,70到79,60到69,小于60)分成多组,并统计出各组的人数。分析输入:学生成绩grade输出:根据成绩的范围,输出不同的结果A,B,C,D,或者F,和统计结果如何判断grade所在的范围?90以上,80到89,70到79,60到69,小于60if(grade=90)√但是if(89=grade90)×复合判断条件再分析一下选择结构if(逻辑判断表达式)表达式为真时执行的语句;整个称为单分支选择结构,也可以看成是一个语句问?if(逻辑判断表达式);?单分支的嵌套if(表达式2)表达式2为真时执行的语句if(表达式1)例如if(grade=60)if(grade70)printf(“youarepassed\n”);if(grade=60)if(grade70)printf(“youarepassed\n”);if(grade=60){if(grade70)printf(“youarepassed\n”);}if(grade=60){if(grade70)printf(“youarepassed\n”);}双分支嵌套if(表达式2)表达式2为真时执行的语句else表达式2为假时执行的语句if(表达式1)else表达式1为假时执行的语句if(表达式1)else表达式1为真时执行的语句if(表达式2)表达式2为真时执行的语句else表达式2为假时执行的语句图3.12嵌套的选择结构if(grade=90)printf(“good!ingroupA\n”);elseif(grade=80)printf(“better!ingroup\n”);elseprintf(“ok,inCorDorF\n”);更好的写法if(grade=90)printf(“good!ingroupA\n”);elseif(grade=80)printf(“better!ingroup\n”);elseprintf(“ok,inCorDorF\n”);注意:多个if-else嵌套,ifelse的匹配原则是:else与前面最近的没有被使用的if匹配图3.13嵌套的多分支选择结构表达式1表达式2表达式3语句1语句2语句3语句n其它语句TTTFFF算法设计(1)1求和变量aNum,bNum,cNum,dNum,fNum初始化为0;2输入学生成绩;3如果输入没有结束则执行(4)否则执行(9);4如果成绩大于或等于90,输出分到A组信息,aNum加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#includestdio.hintmain(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;}elseif(grade=80){printf(Better!youbelongingroupB\n);bNum=bNum+1;}elseif(grade=70){printf(Middle!youbelongingroupC\n);cNum=cNum+1;}elseif(grade=60){printf(Pass!youbelongingroupD\n);dNum=dNum+1;}else{printf(Sorry,youarefailed,belongingroupF\n);fNum=fNum+1;}}printf(aNum=%d\n,aNum);printf(bNum=%d\n,bNum);printf(cNum=%d\n,cNum);printf(dNum=%d\n,dNum);printf(FNum=%d\n,fNum);return0;}分析一下该算法的执行情况你可以运行算法1的代码,看看每个学生成绩要判断几次才能找到它适合的位置。如果成绩都是90以上会怎样?如果成绩都是60、70分甚至更低会怎么样?正常情况下学生的成绩处于中游的比较多,即大多数都在70和80之间,符合客观实际的、更好的结构应该是什么?grade80grade70grade60grade90F组A组B组D组C组开始NNNNYYYY图3.16嵌套的选择结构举例算法实现见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或小于0,输出错误信息,返回到(2);4如果输入没有结束则执行(5)否则执行(12)5把成绩除以10并取整,得到对应的整型值number6如果number是10或9,输出A组信息,aNum加1,返回(2);7如果number是8,输出B组信息,bNum加1,返回到(2);8如果number是7,输出C组信息,cNum加1,返回到(2);9如果number是6,输出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;]……[default:默认的执行语句]}几个组成部分switch(表达式)必须是整型值的表达式switch的主体用一对花括号括起{}多个平行的case常量表达式:每个case里的要执行的语句可以是多条语句,它们不必使用{}括起来。也可以没有语句在整个swith主体的最后是一个可选的default:动作Case1breakCase2Casendefault算法实现(switchcase)见switchint.c5分制成绩统计问题输入的学生成绩是A/a,B/b,…成绩是一个字符怎么输入字符呢?字符是什么?字符可以看成整数(ascii码)如何判断输入的是什么字符?字符型charcharc1,c2,c3;c1=‘A’;c2=‘b’;c3=‘1’;也可以用整型变量存放字符常量,如intgrade1,grade2;grade1='A';grade2='B';计算机内部接受的是‘A’,‘B’的ASCII码。字符比较两个字符常量或者存放字符常量的变量可以比较大小ascii码进行比较字符型数据的输入可以使用scanf和printf函数对字符型数据进行输入和输出,占位符是%c。图3.19code3-13.cppASCII码是10的字符是回车符。这说明我们输入了一个字符‘a’后输入的回车符被变量a第二次读到了。这个回车符是没有用的,因此用一个临时变量t把从输入缓冲区中读出。下例的scanf(“%d”,&t)就起这个作用。图3.20code3-14.cpp键盘读一个字符的函数getchar()a=getchar();代替scanf(“%c”,&a);getchar();代替scanf(“%c”,&t);输出一个字符到屏幕的函数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’,输出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从键盘获得一个字符的另外两个函数#includeconio.hgetche(),它能接收键盘输入的任意一个字符,无需回车即可以接受,自动的显示到屏幕上,称之为回显。getch(),它同getche()不同的就是无回显。这两个与getchar()比较,getchar()需要按回车键,变量才能在输入缓冲区中读到一个字符,无回显。演示三种字符输入函数观察它们的区别问题4:判断某年是否为闰年问题分析:判断某年是不是闰年的条件“某年能被4整除但不能被100整除或者能被4整除又能被400整除”某年是闰年的条件为(1)“year能被4整除”并且“year不能被100整除”或者(2)“year能被4整除”并且“year也能被400整除”并且关系的两个判断如何表示?intpass=0;intgrade1,grade2;scanf(“%d%d”,&grade1,&grade2);如果grade1=60且grade2=60pass=1用嵌套或关系的两个判断如何表示?intnopass=0;intgrade1,grade2;scanf(“%d%d”,&grade1,&grade2);如果grade160或者grade260则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(grade160)||(grade260)逻辑或的优先级低于关系运算,可以省略();上式等价于grade160||grade260!(grade=90)逻辑非是单目运算,它的优先级高于关系运算,因此不可以省略()优先级与结合性算术运算关系运算逻辑与运算逻辑或运算,它们依次降低,但逻辑非运算的优先级高于算术运算逻辑运算是左结合的逻辑运算的短路性逻辑运算的操作数是0和1,0和1的运算是有规律的由“逻辑与”运算组成的表达式,从左至右计算,遇到0就不
本文标题:判断与决策_选择程序设计(2)
链接地址:https://www.777doc.com/doc-615307 .html