《{决策管理}判断与决策选择程序设计讲义》由会员分享,可在线阅读,更多相关《{决策管理}判断与决策选择程序设计讲义(53页珍藏版)》请在金锄头文库上搜索。
1、高级语言程序设计,选择程序设计(2),复习,1 判断条件的形式:通常是用关系表达式 2 判断条件的结果:逻辑真 1、逻辑假 0 3 实际上除了关系表达式之外,任何有计算结果的表达式都可以作为判断条件,计算结果不为零的数均转化为逻辑真,计算结果为0即为逻辑假 算术表达式 函数调用表达式 4甚至是简单的变量或常量都可以,选择结构的两种形式:,if ( condition ) if (condition ) else ,注意大括号的使用 ,复合语句块用 括起来 if ( ) .多条语句复合到一起 . 一条语句的时候省略 ,问题3: 按成绩把学生分成多组,问题描述:教师要把参加某次测验的学生按成绩的分
2、数段(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=grade90 ) ,复合判断条件,再分析一下选择结构 if ( 逻辑判断表达式 ) 表达式为真时执行的语句; 整个称为单分支选择结构,也可以看成是一个语句 问? if (逻辑判断表达式 ) ;,?,单分支的嵌套,例如,if (grade=60) if ( gr
3、ade = 60) if ( grade 70 ) printf(“you are passedn”);,if (grade=60) if ( grade =60) if ( grade 70 ) printf(“you are passedn”); ,双分支嵌套,if ( grade = 90 ) printf(“good!in group An”); else if ( grade =80 ) printf ( “ better!in groupn”); else printf( “ ok, in C or D or Fn”);,更好的写法,if ( grade = 90 ) printf
4、(“good!in group An”); else if ( grade =80 ) printf ( “ better!in groupn”); else printf( “ ok, in C or D or Fn”);,注意:,多个if-else嵌套,if else的匹配原则是: else与前面最近的没有被使用的if匹配,算法设计(1),1 求和变量aNum,bNum,cNum,dNum,fNum初始化为0; 2 输入学生成绩; 3 如果输入没有结束则执行(4)否则执行(9); 4 如果成绩大于或等于90,输出分到A组信息,aNum加1,返回到(2); 5 否则如果成绩还大于或等于80,
5、输出分到B组信息,bNum加1,返回到(2); 6 否则如果成绩还大于或等于70,输出分到C组信息,cNum加1,返回到(2); 7 否则如果成绩还大于或等于60,输出分到D组信息,dNum加1,返回到(2); 8 否则输出分到F组信息,fNum加1,返回到(2); 9 输出统计结果,算法实现 见ifelsenest.c,#include int main(void) int aNum = 0, bNum = 0, cNum = 0, dNum = 0, fNum = 0; int grade; while( scanf(%d, ,分析一下该算法的执行情况,你可以运行算法1的代码,看看每个学生
6、成绩要判断几次才能找到它适合的位置。 如果成绩都是90以上会怎样? 如果成绩都是60、70分甚至更低会怎么样? 正常情况下学生的成绩处于中游的比较多,即大多数都在70和80之间,符合客观实际的、更好的结构应该是什么?,算法实现 见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
7、; 3 如果grade大于100或小于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,输出D组信息,dNum加1,返回到(2); 10如果number是5或4或3或2或1或0,输出F组信息,fNum加1,返回到(2); 11 如果number是其它数字,输出错误信息
8、,返回到(2); 12 输出统计结果。,switch case 多分支选择结构,switch (整型表达式) case 常量表达式: 要执行的语句 break; case常量表达式: 要执行的语句 break; default: 默认的执行语句 ,几个组成部分,switch (表达式) 必须是整型值的表达式 switch的主体用一对花括号括起 多个平行的 case 常量表达式: 每个case 里的要执行的语句可以是多条语句,它们不必使用括起来。也可以没有语句 在整个swith主体的最后是一个可选的default :,动作,Case 1,break,Case 2,Case n,default,算
9、法实现(switch case) 见 switchint.c,5分制成绩统计问题,输入的学生成绩是 A/a, B/b, 成绩是一个字符 怎么输入字符呢?字符是什么? 字符可以看成整数(ascii码) 如何判断输入的是什么字符?,字符型,char char c1, c2, c3; c1 = A; c2 = b; c3 = 1;,也可以用整型变量存放字符常量,如 int grade1, grade2; grade1 = A; grade2 = B; 计算机内部接受的是 A , B的ASCII码。,字符比较,两个字符常量或者存放字符常量的变量可以比较大小 ascii码进行比较,字符型数据的输入,可以
10、使用scanf和printf函数对字符型数据进行输入和输出,占位符是%c。,ASCII码是10的字符是回车符。这说明我们输入了一个字符a后输入的回车符被变量a第二次读到了。 这个回车符是没有用的,因此用一个临时变量t把从输入缓冲区中读出。下例的scanf(“%d”, 代替scanf(“%c”,,输出一个字符到屏幕的函数,putchar(a ); 代替 printf(“%c”,a);,算法设计(3),1 求和变量aNum,bNum,cNum, dNum,fNum初始化为0; 2 输入学生成绩grade; 3 如果输入没有结束则执行(4)否则执行(10); 4 如果grade是A, 输出A组信息,
11、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,从键盘获得一个字符的另外两个函数,#include getche( ) ,它能接收键盘输入的任意一个字符,无需回车即可以接受,自动的显示到屏幕上,称之为回显。 getc
12、h( ),它同getche( ) 不同的就是无回显。 这两个与getchar( )比较,getchar( )需要按回车键,变量才能在输入缓冲区中读到一个字符,无回显。,演示三种字符输入函数 观察它们的区别,问题4:判断某年是否为闰年,问题分析: 判断某年是不是闰年的条件“某年能被4整除但不能被100整除或者能被4整除又能被400整除” 某年是闰年的条件为 (1) “year能被4整除”并且“year不能被100整除” 或者 (2) “year能被4整除”并且“year也能被400整除”,并且关系的两个判断如何表示?,int pass = 0; int grade1,grade2; scanf(
13、“%d%d”, 如果 grade1 = 60 且 grade2 = 60 pass=1 用嵌套,或关系的两个判断如何表示?,int nopass = 0; int grade1,grade2; scanf(“%d%d”, 如果 grade1 60 或者 grade2 60 则nopass = 1 顺序判断?,更好的表示方法:逻辑运算,逻辑运算的操作数是逻辑真或逻辑假 逻辑与运算 逻辑非运算 ! : ! 0 = 1,!1 = 0;,逻辑表达式,( grade1 = 60 ) 上式等价于 grade1 = 90 ) 逻辑非是单目运算,它的优先级高于关系运算,因此不可以省略( ),优先级与结合性,算
14、术运算关系运算逻辑与运算逻辑或运算, 它们依次降低, 但逻辑非运算的优先级高于算术运算 逻辑运算是左结合的,逻辑运算的短路性,逻辑运算的操作数是0和1,0和1的运算是有规律的 由“逻辑与”运算组成的表达式,从左至右计算,遇到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 是否为真,如果为真输出是闰年,实现(略),小结,有了算术运算、关系运算、逻辑运算可以表达各种各样的逻辑判断条件, 使用单分支或双分支或者多分支结构以及嵌套技术可以解决各种各样的逻辑判断问题,