1、C语言程序设计语言程序设计选择结构什么是选择结构?l 根据所指定的条件是否满足,决定从给定的两组操作中选根据所指定的条件是否满足,决定从给定的两组操作中选择其一。择其一。l 选择结构是程序智能化的基础。选择结构是程序智能化的基础。l C语言的选择结构语法:语言的选择结构语法:if(条件表达式条件表达式)语句语句1 else 语句语句2解释:解释:如果条件满足则执行如果条件满足则执行“语句语句1”,否则执行,否则执行“语句语句2”。注意:注意:当条件满足时,只执行当条件满足时,只执行“语句语句1”1”,不执行,不执行“语句语句2”2”;反之亦然;反之亦然;“语句语句1”1”和和“语句语句2”2”
2、都需要有分号作为结束标志;都需要有分号作为结束标志;“语句语句2”2”后面的分号同时也是后面的分号同时也是if if 语句的结束标志。语句的结束标志。语句语句1语句语句2语句语句1语句语句2例:例:if(a3)b=0;else b=1;if(x0.0)negative=negative+1;else positive=positive+1;#include#include main()float a,b,c,x1,x2,beta;scanf(a=%f,b=%f,c=%f,&a,&b,&c);beta=b*b-4.0*a*c;if(beta=0)x1=(-b+sqrt(flag*beta)/(2
3、.0*a);else x1=-9999;if(beta=0)x2=(-b-sqrt(flag*beta)/(2.0*a);else x2=-9999;printf(x1=%8.3fn,x1);printf(x2=%8.3fn,x2);例:解一元二次方程例:解一元二次方程l 如果判别式小于零,则无法进行开方运算,给出错误提示。如果判别式小于零,则无法进行开方运算,给出错误提示。开始开始定义浮点型变量定义浮点型变量a,b,c定义浮点型变量定义浮点型变量x1,x2,beta用用scanf读入数据读入数据计算判别式,保存在计算判别式,保存在beta中中x1=-9999结束结束beta=0?YN计算计算
4、x1beta=0?YN计算计算x2beta=0?NY输出无解输出无解输出计算结果输出计算结果 if(beta=0)printf(results=%8.3f,%8.3f,x1,x2);else printf(beta大于()大于()高高=大于等于(大于等于()小于()小于()0)p+;else m+;if(x=3.0)ok=1;else ok=0;if(x1!=x2)equal=1;else equal=0;if(-3x-3&xb&xy)num=num+1;else num=num-1;if(f!=a|myif(a+1=b&xy)l 推广,推广,C C语言用非零代表语言用非零代表 真真,用零代表
5、,用零代表 假假。if(bif(b)if(b if(b!=0)!=0)if(aif(a=a+4)=a+4)a=a+4;if(a!=0)a=a+4;if(a!=0)if(3)if(3).条件恒成立条件恒成立l C C语言可能不对整个表达式进行计算。语言可能不对整个表达式进行计算。if(4|a=b)if(4|a=b)if(0&a=b)if(0&a=b)l 实型变量不能进行相等的比较。实型变量不能进行相等的比较。if(piif(pi=3.14)=3.14)if(pi-3.14-1.0e-005)if(pi-3.14-1.0e-005)100注意事项:注意事项:l 优先级优先级a=bc a=(bc)c
6、a+b c(a+b)ab=c (ab)=ca=bc a=(bb-4 (!a)(b-4)a=!b5&!cd a=(!b5)&(!cd)技巧与建议:技巧与建议:如果记不住优先级,就用括号将表达式进行明显的如果记不住优先级,就用括号将表达式进行明显的分隔。实际编程序的时候也建议这样做。分隔。实际编程序的时候也建议这样做。(x-3)*(y-4)=0&x!=0(3)(4)()xxf xx写出:写出:的定义域的定义域if 语句的形式语句的形式l if(表达式表达式)语句语句1;else 语句语句2;l if(表达式表达式)语句语句1;表达式表达式语句语句1语句语句2真真假假if(beta=0)k=1;el
7、se k=0;表达式表达式语句语句1假假真真flag=0;if(beta=0)flag=1;例:输入一个整数例:输入一个整数 a,判断它是偶数还是奇数,判断它是偶数还是奇数?#include void main()int a;printf(input a number:);scanf(%d,&a);if(a%2=0)printf(%d is an evenn,a);else printf(%d is an oddn,a);分析:分析:若若 a 是偶数,是偶数,a%2=0注意:该方法只适用于整数。注意:该方法只适用于整数。if 语句的形式语句的形式l if(表达式表达式1)语句语句1;else
8、if(表达式表达式2)语句语句2;else if(表达式表达式3)语句语句3;else 语句语句n;表达式表达式1语句语句1假假真真表达式表达式2表达式表达式3假假语句语句2真真语句语句3真真假假语句语句n#include main()float income,rate,tax;scanf(%f,&income);if(income800.0)rate=0.05;else if(income1200.0)rate=0.10;else if(income2000.0)rate=0.15;else if(income5000.0)rate=0.20;else rate=0.25;tax=incom
9、e*rate;printf(The tax of%.2f is%.2f,income,tax);例:例:根据收入的不同计算所得税金额。根据收入的不同计算所得税金额。复合语句复合语句l 将多条语句用将多条语句用 包含起来,可以出现在任何允许出现单个包含起来,可以出现在任何允许出现单个语句的地方。语句的地方。例:例:输入输入3个数,按由大到小排列。个数,按由大到小排列。ab?交换交换a,b假假真真ac?假假真真bc?假假真真交换交换a,c交换交换b,ca b t85 8t=a 5a=b 8b=t两个存储单元进行交换一定两个存储单元进行交换一定要引入一个中间变量要引入一个中间变量if(ab)t=a;
10、a=b;b=t;if(ac)t=a;a=c;c=t;if(bc)t=b;b=c;c=t;复合语句复合语句l 将多条语句用将多条语句用 包含起来,可以出现在任何允许出现单个包含起来,可以出现在任何允许出现单个语句的地方。语句的地方。例:例:输入输入3个数,按由大到小排列。个数,按由大到小排列。ab?交换交换a,b假假真真ac?假假真真bc?假假真真交换交换a,c交换交换b,c作业:编写完整的程序,由键盘输入作业:编写完整的程序,由键盘输入4个数,按由大到小的顺序排列并输出结果。个数,按由大到小的顺序排列并输出结果。if(表达式表达式1)if(表达式表达式2)语句语句1 else 语句语句2els
11、e if(表达式表达式3)语句语句3 else 语句语句4else 与最近的与最近的 if 匹配!匹配!if 语句的嵌套语句的嵌套基本基本ifif语句:语句:if(表达式表达式)语句语句1 else 语句语句2例:设平面上一点例:设平面上一点M,其坐标为,其坐标为(x,y),若,若M落在圆心落在圆心在坐标原点的半径为在坐标原点的半径为r的圆上,则置的圆上,则置 key=1,落在圆落在圆外置外置 key=2,落在圆内置,落在圆内置 key=0。分析:分析:1)求点)求点 M 到原点的距离到原点的距离 d2)比较)比较 d 和圆半径和圆半径 r 的大小的大小yM(x,y)x0r从键盘输入从键盘输入
12、x,y计算计算ddr?开始开始结束结束key=0输出结果输出结果key=1真真假假d=r?真真key=2假假#include#include void main()float x,y,d,r;int key;printf(input x,y,r:);scanf(%f,%f,&x,&y,&r);d=sqrt(x*x+y*y);if(d=r)if(d=r)key=1;/在圆上在圆上 else key=2;/*在圆外在圆外*/else key=0;/在圆内在圆内printf(%.1f,%.1f):%dn,x,y,key);注意:1.else 1.else 语句不能单独出现,必须与语句不能单独出现,必
13、须与if if 配对出现,采用就近配对原则;配对出现,采用就近配对原则;2.2.第二个第二个ifif语句是第一个语句是第一个if if 语句的语句的 语句语句11,为明显区分,建议加括号。,为明显区分,建议加括号。例:输入年份,判断是否是闰年例:输入年份,判断是否是闰年l 闰年的条件:闰年的条件:1.年份能被年份能被400整除;整除;2.年份能被年份能被4整除但不能被整除但不能被100整除;整除;条件一条件一?从键盘输入从键盘输入year开始开始结束结束flag=1输出结果输出结果flag=1假假真真真真flag=0假假条件二条件二?#include void main()int year,f
14、lag;printf(Which year?);scanf(%d,&year);if(year%400=0)flag=1;else if(year%4=0&year%100!=0)flag=1;else flag=0;if(flag=1)printf(%d年是闰年年是闰年n,year);else printf(%d年不是闰年年不是闰年n,year);例:给一个不多于例:给一个不多于5 5位的正整数:位的正整数:求出它是几位数;求出它是几位数;分别输出每一位数字;分别输出每一位数字;按逆序输出各位数字。按逆序输出各位数字。真真真真真真真真真真开始开始data99999并且并且data0从键盘输入
15、从键盘输入datalength-wan=0wan=data/10000qian=data%10000/1000length=5length-qian=0且且length=4bai=data%1000/100length-bai=0且且length=3shi=data%100/10length-shi=0且且length=2ge=data%10输出输出lengthlength4输出输出wanlength3输出输出qianlength2输出输出bailength1输出输出shi输出输出ge错误提示错误提示结束结束真真假假真真真真输出输出ge真真真真真真length1输出输出shilength2输出
16、输出bailength3输出输出qianlength4输出输出wan真真逆逆序序输输出出顺顺序序输输出出假假假假假假真真假假假假假假假假假假假假假假假假#include main()int data,length,wan,qian,bai,shi,ge;scanf(%d,&data);if(data99999)printf(错误错误!);elselength=5;wan=data/10000;if(wan=0)length-;qian=data%10000/1000;if(qian=0&length=4)length-;bai=(data%1000)/100;if(bai=0&length=3
17、)length-;shi=(data%100)/10;if(shi=0&length=2)length-;ge=data%10;printf(数字长度为数字长度为:%d位位n,length);printf(顺序数字顺序数字:);if(length4)printf(%1d,wan);if(length3)printf(%1d,qian);if(length2)printf(%1d,bai);if(length1)printf(%1d,shi);printf(%1dn,ge);printf(逆序数字逆序数字:%1d,ge);if(length1)printf(%1d,shi);if(length2
18、)printf(%1d,bai);if(length3)printf(%1d,qian);if(length4)printf(%1d,wan);printf(n,ge);90243 数字长度为:数字长度为:5位位顺序数字:顺序数字:90243逆序数字:逆序数字:34209运行结果:运行结果:作业:作业:书后习题:书后习题:5.55.65.95.10?条件运算符条件运算符l 语法:语法:条件条件?表达式表达式1:表达式表达式2l 含义:含义:先计算先计算条件条件;若若条件条件为真,计算并返回为真,计算并返回表达式表达式1的值;的值;否则,计算并返回否则,计算并返回表达式表达式2的值。的值。max
19、=(ab)?a:b;if(ab)max=a;else max=b;等价于等价于ab?printf(%d,a):printf(%d,b);ab?a:cd?c:d结合方向为结合方向为“自右向左自右向左”!(非非)算数运算符算数运算符关系运算符关系运算符&、|条件运算符条件运算符=(赋值赋值)高高低低max=ab?a:b+1;max=(ab?a:b)+1;max=ab?a:(b+1);switch 语句语句switch(表达式表达式)case 常量值常量值1:语句语句1;break;case 常量值常量值2:语句语句2;break;case 常量值常量值n:语句语句n;break;default:语
20、句语句n+1;语法:语法:1.计算表达式;计算表达式;2.若计算结果若计算结果等于等于常量值常量值1,则执行,则执行语句语句1,然后跳出,然后跳出switch结构;结构;3.若计算结果若计算结果等于等于常量值常量值2,则执行,则执行语句语句2,然后跳出,然后跳出switch结构;结构;4.5.若计算结果若计算结果不等于不等于任何常量值,则任何常量值,则执行执行语句语句n+1,结束,结束switch结构。结构。执行过程:执行过程:表达式表达式语句语句2语句语句1语句语句n语句语句n+1常量值常量值1常量值常量值2常量值常量值ndefault条件条件?语句语句1语句语句2两分支两分支多分支多分支例
21、:用例:用switch语句评价学生成绩语句评价学生成绩60分以下为分以下为“E”;6170分为分为“D”;7180分为分为“C”;8189分为分为“B”;90分以上为分以上为“A”。#include main()int score;printf(input a score:);scanf(%d,&score);switch(score/10)case 10:printf(An);break;case 9:printf(An);break;case 8:printf(Bn);break;case 7:printf(Cn);break;case 6:printf(Dn);break;default
22、:printf(En);关键:关键:如何表示如何表示表达式表达式和和常量常量。注意事项:注意事项:1.case语句只起标号作用,程序语句只起标号作用,程序根据根据表达式表达式的值,转向相应的值,转向相应的的case语句,顺序向下执行。语句,顺序向下执行。2.语法上可以没有语法上可以没有break语句,语句,但一般逻辑上要求存在。但一般逻辑上要求存在。3.表达式的结果可以是任意类型,表达式的结果可以是任意类型,但一般为整型和字符型;但一般为整型和字符型;4.常量表达式的值必须互不相同。常量表达式的值必须互不相同。#include main()char grade;printf(input a g
23、rade:);scanf(%c,&grade);switch(grade)case A:printf(优秀优秀n);break;case B:printf(良好良好n);break;case C:printf(合格合格n);break;case D:printf(及格及格n);break;case E:printf(不及格不及格n);break;default:printf(输入错误!输入错误!n);例:将学生成绩的例:将学生成绩的AE级转换成中文习惯。级转换成中文习惯。A优秀;优秀;B良好;良好;C合格;合格;D及格;及格;E不及格。不及格。#include main()char grade
24、;printf(input a grade:);scanf(%c,&grade);switch(grade)case a:case A:printf(优秀优秀n);break;case b:case B:printf(良好良好n);break;case c:case C:printf(合格合格n);break;case d:case D:printf(及格及格n);break;case e:case E:printf(不及格不及格n);break;default:printf(输入错误!输入错误!n);注意事项:注意事项:1.多个多个case可以共用一组执行语可以共用一组执行语句。句。2.ca
25、se语句应考虑到全部可能的语句应考虑到全部可能的情况;情况;3.可以没有可以没有default语句;语句;4.case后面可以有若干条语句;后面可以有若干条语句;例:将阿拉伯数字的金额转换成中文大写。例:将阿拉伯数字的金额转换成中文大写。如:如:3254.76元元 写为:叁千贰佰伍拾肆圆柒角陆分写为:叁千贰佰伍拾肆圆柒角陆分例:从键盘不断输入数据,计算所有数据的平均例:从键盘不断输入数据,计算所有数据的平均值及均方根值,直至输入值及均方根值,直至输入-9999为止。为止。naaaaSn2232221.1212nanSSn递推公式递推公式:均方根公式均方根公式:naaaaAn.32111nanAAn递推公式:递推公式:平均值公式平均值公式:作业:作业:1.输入小于输入小于5位的数字,要求统计位数,逐个输位的数字,要求统计位数,逐个输出各位数字,逐个逆序输出各位数字。出各位数字,逐个逆序输出各位数字。2.书书P112,5.8题,要求用题,要求用switch结构完成。结构完成。3.解二元一次方程组(需要考虑到系数的各种可能)。解二元一次方程组(需要考虑到系数的各种可能)。111222a XbYca Xb Yc