版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、选择结构程序设计理论和要求关系运算符和关系表达式逻辑运算符和逻辑表达式if语句switch语句回顾printf() 和 scanf() 函数属于格式输入输出函数getchar() 和 putchar() 函数用来输入输出单个字符的函数赋值语句的概念和作用顺序结构编程思想目标 熟练使用关系运算符熟练使用逻辑运算符掌握简单的条件语句的使用熟练使用多重 if 结构熟练使用printf和scanf函数熟练使用嵌套 if 结构熟练使用 switch 结构理解条件运算符的用法一、关系运算符和关系表达式符号种类: = !=结合方向:自左向右优先级别:关系表达式的值:是逻辑值“真”或“假”, 用1和0表示例
2、ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc /a=(bc)例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc= =!=优先级6(高)优先级7(低)/表达式值1/表达式值1/表达式值0/d=1/f=0返回运算符的优先级 优先级运算符1()函数运算符, 数组运算符, 2! , ,+,- ,*(间接运算符),&(地址运算符) size of, +(单目),- (单目)3*(乘法),/,% 4+,-56,= size of:给出它右边的操作数的字节大小。优先级运算符7 =,!= 8&(按位AND) 9 10| 11& 12|13?
3、:14=,+=,-=,*=,/=,%=,&=,=,|=,= 15,练习1,假设num1=3,num2=4,num3=5,则: (1)num1num2的值。 (2)(num1num2)!=num3的值。 (3)num1num2num3的值。=0=1=1二、逻辑运算符和逻辑表达式ab!a!ba&ba|b真假真假假假真真c语言 运算量: 0表示“假”,非0表示“真” 运算结果: 0表示“假”,1表示“真”假假真真假假真真真假假假真假真真逻辑运算符 !& |运算优先级 !& |返回注意:关于True和False请记住,0被视为false,其他任何值都被视为true,包括负数。 ! (2)& (11)|
4、 (12)高低! : 从右向左&: 从左向右| : 从左向右例 a=x & xb & xy a=b | x=y !a | ab 53 & 80 ? 1:(xb ? a:cd ? c:d ab ? a:(cd ? c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型例 if (ab) printf(“%d”,a); else printf(“%d”,b);printf(“%d”,ab?a:b);返回例 x?a:b /x=0,表达式值为b; x0,表达式值为a xy?1:1.5 /xy ,值为1.0; x0?a+b:a-b);例 (a=b)?Y:N (x%2=1)?1:0 (
5、x=0)?x:-x (c=a & c=A & chy) printf(“%d”,x);exprstatement1statement2非0=0 形式二:格式:if (expression) statement1 else statement2执行过程:例:if(xy) max=x; else max=y;四、选择结构程序设计if语句(条件选择语句)if语句的三种形式 形式一: 格式:if(expression) Statement 执行过程: 形式三:格式:if ( expr1 ) statement1else if (expr2 ) statement2else if (expr3 ) st
6、atement3. else statement n expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0例:if (salary1000) index=0.4; else if (salary800) index=0.3; else if (salary600) index=0.2; else if (salary400) index=0.1; else index=0; 执行过程:如:if(a=b&x=y) printf(“a=b,x=y”); if(3) printf(“OK”); if(a) printf(“%d
7、”,a);说明:if后面的表达式类型任意语句可以是复合语句 if(x) if(x!=0) if(!x) if(x=0)例5.1 考虑下面程序的输出结果: #include main() int x,y; scanf(“%d,%d”,&x,&y); if(xy) x=y; y=x; else x+; y+; printf(“%d,%dn”,x,y);Compile Error!if语句嵌套:一般形式:if (expr1) if (expr2) statement1 else statement2else if(expr3) statement3 else statement4内嵌if内嵌ifif
8、 (expr1) if (expr2) statement1 else statement2内嵌ifif (expr1) if (expr2) statement1else statement3 内嵌ifif (expr1) statement1else if(expr3) statement3 else statement4内嵌ifif (expr2) statement1例 输入两数并判断其大小关系/*ch5_2.c*/#include main() int x,y; printf(Enter integer x,y:); scanf(%d,%d,&x,&y); if(x!=y) if(x
9、y) printf(XYn); else printf(XYn); else printf(X=Yn);运行:Enter integer x,y:12,23 XY Enter integer x,y:12,12 X=Yif else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对if()if()if()else.else.else.例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现if els
10、e 正确配对方法:加 main() int x=100,a=10,b=20; int v1=5,v2=0; if(ab) if(b!=15) if(!v1) x=1; else if(v2) x=10; x=-1; printf(“%d”,x);结果:-1例5.3 考虑下面程序输出结果:例5.4 有一函数y=1 (x0)编一程序,输入一个x值,输出y值。有以下几种写法,请判断哪些是正确的?main ( ) int x, y;scanf(d, &x); if (x0) y= 1;else if (x= =0) y=0; else y=1; printf (x=%d, y=%dn, x, y);x
11、=0Ny=-1Yx0y=1YNy=0程序2:if (x=0) if (x0) y=1; else y=0; else y= 1;语句改为: x!=0Ny=0Yx0y=1Y程序3:y=-1错误!y= 1; if (x! =0) if (x0) y=1; else y=0;语句改为: x=0Ny=-1Yx0y=1Y程序4:y=0错误!y=0; if (x=0) if (x0) y=1;else y= 1;例 键盘输入三个数,并取出最大值。/*功能:说明if 语句的格式。*/ main()int num1,num2,num3,max;printf(Please input three numbers
12、:);scanf(%d,%d,%d,&num1,&num2,&num3); if (num1num2) max=num1;else max=num2;if (num3max) max=num3;printf(The three numbers are:%d,%d,%dn,num1,num2,num3);printf(max=%dn,max);程序运行情况如下: 本案例中的第1个if语句,可优化为如下不带else子句的形式: 这种优化形式的基本思想是:首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max
13、中的数就是最大值。这种方法,对从3个或3个以上的数中找最大值的处理,非常有效。请各位仔细体会。Please input three numbers:11,22,18The three numbers are:11,22,18max=22max=num1;if(num2max) max=num2;例输入任意三个数num1、num2、num3,按从小到大的顺序排序输出。main()int num1,num2,num3,temp; printf(Please input three numbers:); scanf(%d,%d,%d,&num1,&num2,&num3); if (num1num2)
14、 temp=num1;num1=num2;num2=temp; if (num2num3) temp=num2;num2=num3;num3=temp; if (num1num2) temp=num1;num1=num2;num2=temp; printf(Three numbers after sorted: %d,%d,%dn,num1,num2,num3); 1if语句的一般格式 if(表达式) 语句组1; else 语句组2; (1)if语句中的“表达式”必须用“(”和“)”括起来。(2)else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。(3)当if和else下
15、面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。 2if语句的执行过程(1)缺省else子句时 当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条。如图P45,要点:(2)指定else子句时当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。如图4-1(b)所示。 3if语句的嵌套与嵌套匹配原则 if语句允许嵌套。所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。 if语句嵌套时,else子句与if的匹配原则:与在它上面、距它最近、且尚未匹配的
16、if配对。为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。案例5.7 写一程序,从键盘上输入1年份year(4位十进制数),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。算法设计要点:如果能被整除,则余数为,即如果的值等于,则表示能被整除!首先将是否闰年的标志leap预置为0(非闰年),这样仅当year为闰年时将leap置为1即可。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请读者仔细体会。参考程序如下:/*功能:说明if语句的嵌套格式和用法。*/ 设用变量year表示年号,leap为待置值变量,当year为闰
17、年:leap1, 否则leap0。输入yearyear%4=0year%100=0leap0leap1yesANoNoyes流程图leap%400=0leap1leap=0打印非闰年打印是闰年结束leap0yesNoyesNoA3. 程序1:main ( )int year, leap;scanf(%d, &year);if (year%4= =0)if (year%100= =0)if (year%400= =0) leap=1;elseleap=0; else leap=1;else leap=0;if (leap) printf(%d is, year);else printf(%d i
18、s not, year); printf (a leap yearn); main()int year,leap=0;/* leap=0:预置为非闰年*/printf(Please input the year:);scanf(%d,&year);if (year % 4=0) if (year % 100 != 0) leap=1;else if (year%400=0) leap=1; if (leap) printf(%d is a leap year.n,year);else printf(%d is not a leap year.n,year);3. 程序2: 当(year%4!=
19、0) (year%100= =0& year%400!=0) 为1时, year为非润年。设用变量year表示年号 当(year%4= =0 & year% 100 !=0) year%400= =0)为1时,year为润年,否则为非润年。如果要判别非润年可在上述表达式前加非(!)运算符。 当!( (year%4= =0 & year%100!=0) year% 400= = 0) 为1时,year为非润年。或者:即:则:1.设a=3,b=4,c=5,则逻辑表达式!(a+b)+c-1 & b+c/2的值为 0B. 1 C. 2 D. -1 2.设有说明语句int x,a,b,c;则以下不合法的
20、if语句是 。A if(a= =b) x+; B if(a=b) x+;C if(ab) x+; D if(a=b) x+;四、switch语句(开关分支语句)一般形式:switch( 表达式) case E1: 语句组 1; break; case E2: 语句组 2; break; . case En: 语句组 n; break; default: 语句组 ; 执行过程:breakbreakbreakdefaultswitch表达式语句组1语句组2语句组语句组.E 1E 2Endefaultcase1、一般形式:返回2、执行过程(1)当switch后面“表达式”的值,与某个case后面的“
21、常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。(2)如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default 后面的语句(组)。然后,再执行switch语句的下一条。3、说明(1)switch后面的“表达式”,可以是int、char和枚举型中的一种(有限的个数)。(2)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。(3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦
22、找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。(4)各case及default子句的先后次序,不影响程序执行结果。(5)多个case子句,可共用同一语句(组)。例如,在案例4.5中的“case 10: ”和“case 9: ”共用语句“printf(grade=An); break;”,“case 5: ”“case 0: ”共用语句“printf(grade=En); break;”。(6)用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。如: case A: case B: case C: prin
23、tf(“score60n”); break; .说明:E1,E2,En是常量表达式,且值必须互不相同case语句标号作用,必须用break跳出case后可包含多个可执行语句,且不必加 switch可嵌套,break只能跳出一层嵌套多个case可共用一组执行语句default可放在任意case后,相当case作用,default不要再加break。总结: 1、常表值必须互不相等,否则二异性。2、case顺序无关紧要。3、不一定非用break不可,有时几种情况合并执行一组语句。switch(score) case 5: printf(“Very good!”); case 4: printf(“G
24、ood!”); case 3: printf(“Pass!”); case 2: printf(“Fail!”); default : printf(“data error!”); 运行结果:score为5时,输出: Very good! Good! Pass! Fail! data error!例5.8void main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(“na=
25、%d,b=%d”,a,b); 运行结果:a=2,b=1例 其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。/*ch5_10.c*/#include main() int c; printf(Enter m or n or h or other:); c=getchar(); switch(c) case m: printf(nGood morning!n);break; case n: pri
26、ntf(nGood night!n); break; case h: printf(nHello!n); break; default : printf(n?n); break; 例 根据输入字母输出字符串。返回程序举例案例 求一元二次方程ax2+bx+c=0的解(a0)。分析:真a=0假输出“非二次方程”真b*b-4*a*c=0假输出二个相等实根:-b/2ab*b-4*a*c0计算复根的实部和虚部:实部p=-b/2a虚部输出两个实根输出两个复根p+qi; p-qi#include main()float a,b,c,disc,x1,x2,p,q;scanf(%f,%f,%f, &a, &b,
27、 &c);printf(The equation );if( fabs(a) = 1e-6 )printf(is not quadratic );elsedisc = b*b-4*a*c;if ( fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(x1=%7.2f,x2=%7.2fn, x1, x2);elsep=-b/(2*a);q=sqrt(fabs(disc)/(2*a);printf(x1=%7.2f + %7.2f in, p, q);printf(x2=%7.2f - %7.2f in,
28、 p, q);案例5.12 已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元): profit 1000没有提成; 1000 profit 2000提成10%; 2000 profit 5000提成15%; 5000 profit 10000提成20%;10000 profit提成25%。 为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、100000)。如果将利润profit整除1000后再取整,则当: profit 1
29、000 对应0 1000 profit 2000 对应1 2000 profit 5000 对应2、3、4 5000 profit 10000 对应5、6、7、8、910000 profit 对应10、11、12、main()long profit;int grade; float salary=500; printf(Input profit: ); scanf(%ld, &profit); grade= profit / 1000;switch(grade) case 0: break; case 1: salary += profit*0.1; break; case 2: case 3: case 4: salary += p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030绿氢合成氨工艺碳足迹核算与国际认证标准对标分析报告
- 2025-2030细胞免疫治疗商业化路径与投资风险评估报告
- 湖北襄阳安全员c证题库及答案解析
- 2025-2030纳米材料技术突破与未来市场需求分析报告
- 2025-2030纳米材料产业竞争格局与未来发展预测报告
- 安全c2题库大全及答案解析
- 2025-2030红木原材料价格波动与替代材料研发进展报告
- 2025-2030精酿啤酒行业检测认证体系完善与质量追溯平台建设方案
- 2025-2030精酿啤酒小型酿造许可证获取路径与政策合规要点解析报告
- 南京考安全员证试题题库及答案解析
- 重症患者睡眠管理护理
- 教学设计-1.4 极限存在准则与两个重要极限
- 新疆地区历年中考语文文言文阅读试题42篇(含答案与翻译)(截至2024年)
- 晚秋和值谜字谜
- 英语-山西省太原市2024-2025学年高一上学期11月期中考试试题和答案
- 陕西省咸阳市永寿县御家宫中学2024-2025学年九年级上学期11月期中学业水平测试化学试题(含答案)
- 食品生产企业食品安全管理人员监督抽查考试题及答案
- 公司保密室建设方案
- 《平利绞股蓝》认证编制说明
- 压力容器使用单位安全员题库
- NBA球星库里课件
评论
0/150
提交评论