计讲稿4——关系运算符、逻辑运算符.doc
程序设计讲稿4本讲涉及的单词:1、if 如果 2、else 否则 3、switch 开关 4、case 案例、事例 5、default 缺省、默认 6、break 打断一、关系运算符及其优先级1、关系运算符:程序中经常需要比较两个量的大小关系,以决定程序的下一步工作,比较两个量的大小关系的运算符称为关系运算符,C/C+中有以下关系运算符:> 大于 < 小于 = 等于 >= 大于等于 <= 小于等于 != 不等于关系运算符都是双目运算符,其结合性为左结合型。关系运算符的优先级低于算术运算符,高于赋值运算符。六个关系运算符中,>、<、>=、<=的优先级相同,=和!=的优先级相同,但前者高于后者。2、关系表达式关系表达式的一般形式:表达式 关系运算符 表达式例如:a+b>c+d、 x<=3/2、a<(b>c)、a!=(c=d)关系表达式运算的结果只有两种:真或假(正确或错误,成立或不成立),用数字1和0表示。例如:5>3 的运算结果是1(正确),而3<5的结果是0(错误)int main() char c='k' int i=1,j=2,k=3; float x=3e+5,y=0.85; printf("%d,%dn",'a'+5<c,-i-2*j>=k+1); printf("%d,%dn",1<j<5,x-5.25<=x+y); printf("%d,%dn",i+j+k=-2*j,k=j=i+5); return 0;程序的输出结果是:解释: (1) char c=k,实质是c=107;因为字符k的ASCII码是107。 (2)'a'+5 相当于 97+5,因为字符a的ASCII码是97。(3) 1<j<5 因为关系运算符的左结合性,所以先计算1<j,1<j成立,值为1。再计算1<5,成立,值为1。故表达式值为1(4)k=j=i+5,先计算k=j,不成立,其值为0,再计算0=i+5,也不成立,值为0,故表达式值为0二、逻辑运算符及其优先级1、逻辑运算符&& 逻辑与(and)| 逻辑或(or)! 逻辑非(not) &&和|均为双目运算符,具有左结合性,其优先级低于算术运算符和关系运算符,&&的优先级高于|。!是单目运算符,具有右结合性,其优先级高于所有的算术运算符关系运算符,也高于&&和|。 a && b ,只有在a和b都为正确的时候,结果才“正确”,其他情况都为“错误” 例如:如果x=4,那么 (x>4 && x<10) 的结果就是“错误”; 而(x>=2 && x<10) 的结果就是“正确”; a | b ,只有在a和b都“错误”的时候,结果才“错误”,其他情况都为“正确”例如:如果x=4,那么 (x>4 | x<10) 的结果就是“正确”; 而(x<=2 | x>10) 的结果就是“错误”; !a,表示将a的值取反,如果a为正确,则 !a 为错误,如果a为错误,则!a为正确 例如:!(4>5)的结果为正确,而!(4<5)的结果为错误。2、逻辑表达式用逻辑运算符、关系运算符构成的式子,成为逻辑表达式: 举例: 数学表达式 -2 <= x < 10 的C语言条件表达式: x是奇数的条件表达式: x是偶数的条件表达式: x能被11整除的条件表达式: x能被4整除但不能被100整除,或者能被400整除的C语言表达式: 条件表达式: m % 2=1 && m<=20 | m>10 在m=5的时候,表达式的值为: 在m=8的时候,表达式的值为: 在m=13的时候,表达式的值为: 在m=16的时候,表达式的值为: 在m=23的时候,表达式的值为: 在m=30的时候,表达式的值为: 三、分支语句格式:if(条件) 语句1; else 语句2; 功能:如果 条件成立 则执行语句1,否则执行语句2; 其中,上面的格式中 ”else 语句2;” 可以省略,上面的格式写成了两行,其实可以写成一行的,这样做只是为了程序更加美观。例7、编程输入两个整数,输出其中的大数。解答程序1解答程序2int main() int a,b,MAX;scanf("%d%d",&a,&b); MAX=a; if(MAX<b) MAX=b; printf("MAX=%dn",MAX); return 0;int main() int a,b,MAX;scanf("%d%d",&a,&b); if(a>b) MAX=a; else MAX=b; printf("MAX=%dn",MAX); return 0;解答程序1中,先把a的值赋给变量MAX,再用if语句判别MAX和b的大小,如果MAX<b,则把b赋给MAX,这样MAX的值就是a,b中将大的一个。解答程序2中,如果a>b,则把a的值赋给MAX,否则把b赋给b。这里的否则相当于a<=b。 思考:能否写成下面的形式,如果不能,该怎样修改? if(a>b) MAX=a; if(a<b) MAX=b;例8、编程判断键盘输入的字符的类别:如果是数字字符,则输出“Digit”;如果是大写字母,则输出“Capital”、如果是小写字母,则输出“Small”;如果不是上面三类,则输出“Other”int main() char c; scanf("%c",&c); if(c>='0' && c<='9') printf("Digitn"); else if(c>='A' && c<='Z') printf("Capitaln"); else if(c>='a' && c<='z') printf("Smalln"); else printf("Othern"); return 0;如果c是数字字符则输出”digit”否则如果c是大写字母则输出”Capital”否则如果c是小写字母则输出"Small"否则输出" Other "四、条件运算符 C/C+中有一个与if else 类似的运算符”? :”,它是三目运算符,其格式为: 表达式1?表达式2:表达式3 其含义是:如果表达式1成立,则以表达式2作为条件表达式的结果,否则以表达式3作为条件表达式的结果。例如:if(a>b) MAX=a; else MAX=b; 可以改写为:MAX = a>b? a: b;条件运算符的优先级高于赋值运算符,低于算术运算符、关系运算符和逻辑运算符。请用关系运算符改写例7的程序。五、开关语句 C/C+语言还提供了另一种用于多分支选择的语句switch语句,其一般形式如下:形式: switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式n:语句n default:语句n1其含义是:计算表达式的值,然后依次与case后面的常量表达式的值比较。当与某个常量表达式的值相等时,即执行其后面的语句,然后不再判断,转而执行后面的所有case后的语句(包括default语句)。当表达式的值与所有case后面常量表达式的值都不相等时,则执行default后的语句。例9、编程输入一个数字,输出与这个数字对应星期几的英语单词,比如输入1,则应是星期一,输出“Monday”,7则应是星期日,输出“Sunday”。解答程序1int main() int a; scanf("%d",&a); switch(a) case 1 : printf("Mondayn"); case 2 : printf("Tuesdayn"); case 3 : printf("Wednesdayn"); case 4 : printf("Tursdayn"); case 5 : printf("Fridayn"); case 6 : printf("Saturdayn"); case 7 : printf("Sundayn"); default : printf("errorn"); return 0;int main() int a; scanf("%d",&a); switch(a) case 1 : printf("Mondayn"); break; case 2 : printf("Tuesdayn");break; case 3 : printf("Wednesdayn");break; case 4 : printf("Tursdayn");break; case 5 : printf("Fridayn");break; case 6 : printf("Saturdayn");break; case 7 : printf("Sundayn");break; default : printf("errorn");break; return 0;解答程序1:当输入4后,则程序输出: Tursday Friday Saturday Sunday error 由此看来,整数上面对switch语句含义的解释,当表达式与某个常量值相等时,则从这里开始所有的case后面的语句都会执行。解答程序2:当输入4后,程序输出: Tursday 因为在每条case后面的语句后加上了一个break;这里的break表示中断switch语句的执行。所以当输出Tursday后,再执行break;这时,跳出的switch语句,所以后面case语句再不会被执行。使用switch语句的要注意以下几点:1) case语句后的常量表达式的值不能有相同的;2) case后可以有多条语句,他们不必用括起来3) default可以省略。 思考:请用if语句改写上面的程序。六、编程实例例10、打折(P1013) 一件衣服950元,若消费满3000元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。 【输入】 一个整数N,表示顾客购买衣服数量。 【输出】 一个实数,表示需要支付的金额。保留两位小数。 【样例】 43230.0021900.00【数据范围】 0 <= N <= 10000000【分析】1、 先计算买n件衣服的钱数:p=950*n;2、 在判断:如果p>=3000 则输出p*0.85;否则输出p (保留两位小数)例11、三整数排序(P1015) 输入三个整数a,b,c,从小到大排序后输出。 【输入】 一行三个整数a,b,c。【输出】 由小到大输出这三个数。整数之间用一个空格分开。【样例】 20 7 337 20 33解法程序:int main() int a,b,c; scanf("%d%d%d",&a,&b,&c); / 输入a,b,c的值 if(a>b) t=a; a=b; b=t; /如果a>b,则交换a,b的值;if(a>c) t=a; a=c; c=t; /如果a>c,则交换a,c的值; if(a>c) t=a; a=c; c=t; /如果b>c,则交换b,c的值; printf("%d %d %dn",a,b,c); /输出答案:输出a,b,c的只值 return 0;关于程序的一点解释:语句:if(a>b) t=a; a=b; b=t; 因为如果满足条件a>b要执行三句话,t=a; a=b; b=t;如果条件不满足,这三句话就不会执行。所以用把这三句括起来,这样的语句称为复合语句。如果写成这样:if(a>b) t=a; a=b; b=t; 则满足条件a>b,就只会执行t=a;而不满足,则a=b和b=t;还会照样执行。例12、三角形 (P1017) 输入三角形三边长度值a,b,c(均为正整数),完成下列任务:(1)、如果这三边根本无法构成三角形,则输出“not a triangle”。(2)、如果能构成三角形,则计算这个三角形的面积并输出。(3)、然后再判断这个三角形是否是直角三角形,如果是则输出“yes”,否则输出“no”。 【输入】 一行三个正整数a,b,c。 【输出】 如果a,b,c不能构成三角形,则输出一行“not a triangle”。 如果能构成一个三角形,则: 第 1 行:一个保留2位小数的实数,表示三角形面积; 第 2 行:如果这个三角形是一个直角三角形,则输出“yes”,否则输出“no”。 【样例输入】 3 4 56.00yes2 2 21.73no4 2 7not a triangle【数据范围】 1<=a,b,c<=10000【样例解释】 构成三角形的条件:“任意两边之和大于第三边。” 已知三角形三边,计算面积用海伦公式: p=(a+b+c)/2; 面积S=sqrt(p*(p-a)*(p-b)*(p-c)。例13、 鸡兔同笼(P1016) 已知鸡和兔的总量为n,总腿数为m,输入n和m,依次输出鸡的数目和兔的数目。 样例输入1:14 32 样例输出1:12 2 样例输入2:10 16 样例输出2:No answer分析:按照程序解答问题的三段论:1、输入数据:n和m;2、解答方法:设鸡有x只,兔有y只,则列方程: 解方程得: , 这里,x和y必须为正整数。 3、输出答案:如果“m是偶数,且x>0,且y>0”,则该题目解是x和y,否则输出No answer。 x和y必须为正整数 程序的语言描述用c语言补充完整定义n,m,x,y四个整数变量;输入变量n,m的值;x=(4n-m)/2;y=(m-2n)/2;如果m是偶数且x>0且y>0 输出x和y的值,中间隔一个空格否则 输出No answerint main() if(m % 2=0 && x>0 && y>0) else return 0; 课后作业:题库:P1013P1035