《C语言程序课件ppt-第4章选择结构.ppt》由会员分享,可在线阅读,更多相关《C语言程序课件ppt-第4章选择结构.ppt(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章 选择结构选择结构内容提要:内容提要:关系运算符和关系表达式关系运算符和关系表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式选择结构控制语句选择结构控制语句ifif语句(单分支、双分语句(单分支、双分支、多分支、支、多分支、if if语句的嵌套)语句的嵌套)选择结构控制语句选择结构控制语句switchswitch语句(多分支)语句(多分支)4.1 关系运算符和关系表达式关系运算符和关系表达式1.1.关系运算符及其优先次序关系运算符及其优先次序 (小于小于)=(大于大于)=(=(大于或等于大于或等于)=(=(等于等于)!=(!=(不等于不等于)优先级相同(高)优先级相同(高)优先级相
2、同(低)优先级相同(低)说明:说明:关系运算符的优先级低于算术运算符关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符关系运算符的优先级高于赋值运算符2.2.关系表达式关系表达式用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符表达式)关系表达式,逻辑表达式,赋值表达式,字符表达式)接起来的式子,称关系表达式接起来的式子,称关系表达式例:例:ab,a+bb+c,(a=3)(b=5),ab)(bb”的值为的值为“真真”,表达式的值为,表达式的值为1。C C语言中没有专用的逻语言中没有专用的逻辑值,辑值,1
3、 1代表真,代表真,0 0代代表假表假 4.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式1.1.逻辑运算符及其优先次序逻辑运算符及其优先次序(1)&(1)&(逻辑与逻辑与)相当于其他语言中的相当于其他语言中的ANDAND(2)|(2)|(逻辑或逻辑或)相当于其他语言中的相当于其他语言中的OROR(3)!(3)!(逻辑非逻辑非)相当于其他语言中的相当于其他语言中的NOTNOT例:例:a&b a&b 若若a,ba,b为真,则为真,则a&ba&b为真。为真。a|b a|b 若若a,ba,b之一为真,则之一为真,则a|ba|b为真。为真。!a a 若若a a为真,则为真,则!a!a为假。为假。优先
4、次序:优先次序:!(非非)-&()-|()逻辑运算符中的逻辑运算符中的“&”和和“|”低于关系运算符,低于关系运算符,“!”高于算高于算术运算符术运算符2.2.逻辑表达式逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。是逻辑表达式。逻辑表达式的值应该是一个逻辑量逻辑表达式的值应该是一个逻辑量“真真”或或“假假”。例:例:设设a=4a=4,b=5b=5:!a!a的值为的值为0 0a&ba&b的值为的值为1 1a|ba|b的值为的值为1 1!a|b!a|b的值为的值为1 14&0|24&0|2的值为的值为1 1任何非零的数值被
5、认作任何非零的数值被认作“真真”例:例:53&83&84-!0 自左向右运算自左向右运算 1&0逻辑值为逻辑值为083逻辑值为逻辑值为1表达式值为表达式值为0在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。(1)a&b&c (1)a&b&c 只有只有a a为真时,才需要判断为真时,才需要判断b b的值,只有的值,只有a a和和b b都为真都为真时,才需要判断时,才需要判断c c的值。的值。(2)a|b|c (2)a|b|c 只要只要a a为真,就不必判断为真,就不必判断b b和和c c的值,只有的值,只有a a为假,为假,才判断才
6、判断b b。a a和和b b都为假才判断都为假才判断c c例:例:(m=ab)&(n=cd)当当a=1,b=2,c=3,d=4,ma=1,b=2,c=3,d=4,m和和n n的原值为的原值为1 1时,由于时,由于“abab”的值的值为为0 0,因此,因此m=0m=0,而,而“n=cdn=cd”不被执行,因此不被执行,因此n n的值不是的值不是0 0而而仍保持原值仍保持原值1 1。例:用逻辑表达式来表示闰年的条件例:用逻辑表达式来表示闰年的条件 能被能被4整除,但不能被整除,但不能被100整除。整除。能被能被4整除,又能被整除,又能被400整除。整除。答答(year%4=0&year%100!=
7、0)|year%400=0案案值为真值为真(1)是闰年,否则为非闰年。是闰年,否则为非闰年。引例:计算函数值引例:计算函数值:当当x=0 x=0时,时,y=1;y=1;当当x x0时时,y=sin(x)/x;y=sin(x)/x;需考虑:需考虑:输入输入x 判断判断x值值 根据根据x值,计算值,计算y值值 输出输出y值值显然显然 顺序程序不能够实现,须引入选择结构程序。顺序程序不能够实现,须引入选择结构程序。输入输入x 真真 x为为0?假假 y=1 y=sin(x)/x 输出输出y#include#include#include#include void main()void main()fl
8、oat x,y;float x,y;printf(Enter x:);printf(Enter x:);scanf(%f,&x);scanf(%f,&x);if(x!=0.0)if(x!=0.0)y=sin(x)/x;y=sin(x)/x;else else y=1;y=1;printf(x=%5.2fty=%7.4fn,x,y);printf(x=%5.2fty=%7.4fn,x,y);结果:结果:Enter x:2Enter x:2 x=2.00 y=0.4546 x=2.00 y=0.45464.3 if 语句语句if语句是用来判定所给定的条件是否满足,根据判语句是用来判定所给定的条件是
9、否满足,根据判定的结果定的结果(真真或或假假)决定执行给出的两种操作之一。决定执行给出的两种操作之一。if语句的三种形式:语句的三种形式:单分支单分支if语句语句、双分支双分支if语句语句和和多分支多分支if语句语句。例如:例如:if(xy)printf(“%d”,x);这种这种if语句的执行过程见图:语句的执行过程见图:假假 真真xyprintf(“%d”,x);可以是一个语句可以是一个语句也可以是复合语也可以是复合语句句一般为逻辑一般为逻辑表达式或关表达式或关系表达式系表达式理论上可以理论上可以是任意数值是任意数值类型类型if(a)printf(“Hello,world”);4.3.1 单
10、分支单分支if语句语句单分支单分支if语句的基本格式为:语句的基本格式为:if(表达式)(表达式)语句;语句;例例4.1 4.1 输入两个整数输入两个整数a a和和b b,如果,如果abab,则把整数,则把整数a a打印出来。打印出来。#include#include void main()void main()int a,b;int a,b;printf(printf(请输入整数请输入整数a a和和b b的值的值:n);:n);scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);if(ab)if(ab)printf(%dn,a);printf(%dn,a);例例4.2
11、 4.2 大小写字母转换大小写字母转换.#include#include void main()void main()char ch;char ch;printf(printf(请输入一个大写字母请输入一个大写字母:n);:n);scanf(%c,&ch);scanf(%c,&ch);if(ch=A&ch=A&ch y)printf(“%d”,x);else printf(“%d”,y);xyprintf(“%d”,x);printf(“%d”,y)真真假假注注意意注意注意例例4.3 读程序读程序#include void main()float x,y;printf(enter x:);sc
12、anf(%f,&x);if(x=0)y=1;else y=(x*5+1)/x;printf(nx=%4.1fty=%4.1fn,x,y);例例4.4 输入一个整数输入一个整数a,判断它是偶数还是奇数?,判断它是偶数还是奇数?分析:偶数:分析:偶数:a%2=0#include void main()int a;printf(t input a number:);scanf(%d,&a);if(a%2=0)printf(nt%d is evenn,a);else printf(nt%d is oddn,a);结果:结果:input a number:125 125 is odd4.3.3 多分支多
13、分支if语句语句基本格式为:基本格式为:if(表达式表达式1)语句块语句块1;elseif(表达式表达式2)语句块语句块2;else if(表达式表达式n)语句块语句块n;else 语句块语句块n+1;真真(非非0)假假(0)假假(0)假假(0)真真(非非0)真(非真(非0)表达式表达式1语句块语句块1表达式表达式2表达式表达式n语句块语句块n+1语句块语句块2语句块语句块n图图4-3 多分支多分支if语句执行流程语句执行流程例例4.5:评价学生的成绩。(:评价学生的成绩。(score90score90优秀优秀,90score80,90score80良好良好,80score7080score7
14、0中中,70score60,70score60及格及格,score60,score60不及格。)不及格。)#include void main()int score;printf(input a score:);scanf(%d,&score);if(score=90)printf(优秀优秀n);else if(score=80)printf(良好良好n);else if(score=70)printf(中中n);else if(score=60)printf(及格及格n);else if(score60)printf(不及格不及格n);结果:结果:input a score:86 良好良好4
15、.3.4 if语句的嵌套语句的嵌套if (表达式表达式)if (表达式表达式)语句块语句块1;else 语句块语句块2;else if (表达式表达式)语句块语句块3;else 语句块语句块4;if (表达式表达式)if (表达式表达式)语句块语句块1;else if (表达式表达式)语句块语句块2;else 语句块语句块3;内嵌内嵌if内嵌内嵌if内嵌内嵌ifif (if (表达式表达式 )if(if(表达式表达式 )语句块语句块1 1;else else if(if(表达式表达式 )语句块语句块2 2;else else 语句块语句块3 3;-1(x0)1.#include void ma
16、in()int x,y;scanf(%d,&x);if(x=0)if(x0)y=1;else y=0;else y=-1;x=0y=-1x0y=1y=0 x0)y=1;else y=0;真真真真假假假假x0y=1y=0 x=0y=-14.y=0;if (x=0)if (x0)y=1;else y=-1;真真真真假假假假x0y=1y=-1X!=0y=0真真真真假假假假x0y=1y=-1x!=0y=0y=-1真真假假假假x0y=1y=0 x=0真真4.4 switch语句语句switchswitch语句是多分支选择语句语句是多分支选择语句一、格式一、格式switchswitch (表达式表达式)c
17、ase case 常量表达式常量表达式1 1:语句语句1 1 case case 常量表达式常量表达式2 2:语句语句2 2 case case 常量表达式常量表达式n n:语句语句n n;default default :语句语句n+1 n+1 其中:表达式其中:表达式可以是整型、字符型、枚举型可以是整型、字符型、枚举型.常量表达式必须与表达式类型一致。常量表达式必须与表达式类型一致。二、执行过程二、执行过程1 1、计算表达式的值、计算表达式的值2 2、若与常量表达式、若与常量表达式i i值一致,则从语句值一致,则从语句i i开始执行,直到遇到开始执行,直到遇到breakbreak语句或语句
18、或switchswitch语句的语句的“”3 3、若与常量表达式值均不一致时,则执行、若与常量表达式值均不一致时,则执行defaultdefault语句或执语句或执行后续语句。行后续语句。注意:(注意:(1 1)常量表达式)常量表达式i i仅起语句标号作用,不做求值判断。仅起语句标号作用,不做求值判断。(2 2)常量表达式的值必须是唯一的,没有先后次序。)常量表达式的值必须是唯一的,没有先后次序。(3 3)多个)多个casecase语句可共用一组执行语句。语句可共用一组执行语句。例例4.7:评价学生的成绩。:评价学生的成绩。#include#include void main()void ma
19、in()int score;int score;printf(input a score:);printf(input a score:);scanf(%d,&score);scanf(%d,&score);switch(score/10)switch(score/10)case 10:case 10:case 9:printf(case 9:printf(优秀优秀n);break;n);break;case 8:printf(case 8:printf(良好良好n);break;n);break;case 7:printf(case 7:printf(中中n);break;n);break;
20、case 6:printf(case 6:printf(及格及格n);break;n);break;default:printf(default:printf(不及格不及格n);n);结果:结果:input a score:86 良好良好例例4.8:生肖程序设计。:生肖程序设计。#include void main()int n;printf(请输入年份请输入年份:);scanf(%d,&n);n=n%12;switch(n)case 0:printf(猴猴n);break;case 1:printf(鸡鸡n);break;case 2:printf(狗狗n);break;case 3:pri
21、ntf(猪猪n);break;case 4:printf(鼠鼠n);break;case 5:printf(牛牛n);break;case 6:printf(虎虎n);break;case 7:printf(兔兔n);break;case 8:printf(龙龙n);break;case 9:printf(蛇蛇n);break;case 10:printf(马马n);break;case 11:printf(羊羊n);break;例例4.9:设计程序程序实现季度判断。季度判断。#include void main()int n;printf(请输入月份入月份:);scanf(%d,&n);sw
22、itch(int)(n-1)/3)case 0:printf(“%d月份是第一季度月份是第一季度!n,n);break;case 1:printf(“%d月份是第二季度月份是第二季度!n,n);break;case 2:printf(“%d月份是第三季度月份是第三季度!n,n);break;case 3:printf(“%d月份是第四季度月份是第四季度!n,n);break;default:printf(您您输入的月份有入的月份有误!n);例例4.10:输入平年的一个月份,输出这个月的天数。:输入平年的一个月份,输出这个月的天数。#include void main()int m,d;prin
23、tf(请输入平年的月份请输入平年的月份:);scanf(%d,&m);switch(m)case 1:case 3:case 5:case 7:case 8:case 10:case 12:d=31;break;case 4:case 6:case 9:case 11:d=30;break;case 2:d=28;break;printf(平年平年%d月份有月份有%d天天n,m,d);例例4.11:任给:任给a,b,c三个数,按从大到小的顺序输出。三个数,按从大到小的顺序输出。分析:分析:1)对任意两个数)对任意两个数a,b,若,若ab,则输出,则输出a,b;否则,输出否则,输出b,a。2)对
24、于三个数,有六种可能:)对于三个数,有六种可能:3)使用判断使用判断-交换法:交换法:若若ab,则交换,则交换a和和b 若若ac,则交换,则交换a和和c,结果,结果a最大最大 若若bbc交换方法:设交换方法:设a=5,b=8,执行,执行a=b;b=a;引入中间变量:引入中间变量:t=a;a=b;b=t;4.5 选择结构程序设计举例选择结构程序设计举例#include void main()int a,b,c,t;printf(input a,b,c:);scanf(%d,%d,%d,&a,&b,&c);if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(bc)t=b;
25、b=c;c=t;printf(%d,%d,%d,a,b,c);结果:结果:input a,b,c:-3,45,0 45 0-3#include void main()int year,leap;scanf(%d,&year);if(year%4=0)if(year%100=0)if(year%400=0)leap=1;else leap=0;else leap=1;else leap=0;if(leap)printf(%d is ,year);else printf(%d is not,year);printf(a leap year.n);Year被被4整除整除YNYear被被100整除整除
26、YNYNYear被被400整除整除leap=1leap=0leap=1leap=0leapYN输出闰年输出闰年输出非闰年输出非闰年例例4 4.1212设计程序,判断某一年是否为闰年设计程序,判断某一年是否为闰年例例4.13 计算运费计算运费S250km没有折扣没有折扣250=s5002%折扣折扣500=s10005%折扣折扣1000=s20008%折扣折扣2000=s300010%折扣折扣3000=s15%折扣折扣p(price),w(weight),s(distance),d(discount)f=p*w*s*(1-d)250100020003000c=s/250c1 无折扣无折扣1c2 2
27、%2c4 5%4c8 8%8c12 15%#include#include void main()void main()int c,s;int c,s;float p,w,f,d;float p,w,f,d;scanf(%f,%f,%d,&p,&w,&s);scanf(%f,%f,%d,&p,&w,&s);if(s=3000)if(s=3000)c=12;c=12;else else c=s/250;c=s/250;switch(c)switch(c)case 0:d=0;break;case 0:d=0;break;case 1:d=2;break;case 1:d=2;break;case
28、 2:case 2:case 3:d=5;break;case 3:d=5;break;case 4:case 4:case 5:case 5:case 6:case 6:case 7:d=8;break;case 7:d=8;break;case 8:case 8:case 9:case 9:case 10:case 10:case 11:d=10;break;case 11:d=10;break;case 12:d=15;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);f=p*w*s*(1-d/100.0);printf(freight=%15.4
29、f,f);printf(freight=%15.4f,f);x1=x2=b2-4ac=0 a=0YN输出输出“非二次非二次方程方程输出输出两相两相等实根等实根-b/2a b2-4ac0YN实部实部 p=虚部虚部q=输出两个实根输出两个实根输出两个复根输出两个复根p+qip-qiNYY例例4.14 解一元二次方程解一元二次方程#include#include#include#include void main()void main()float a,b,c,d,disc,x1,x2,realpart,imagpart;float a,b,c,d,disc,x1,x2,realpart,imagp
30、art;scanf(%f,%f,%f,&a,&b,&c);scanf(%f,%f,%f,&a,&b,&c);printf(The equation);printf(The equation);if(fabs(a)=1e-6)printf(is not a quadratic);if(fabs(a)=1e-6)printf(is not a quadratic);else else disc=b*b-4*a*c;disc=b*b-4*a*c;if(fabs(disc)=1e-6)if(fabs(disc)1e-6)else if(disc1e-6)x1=(-b+sqrt(disc)/(2*a);
31、x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(has distinct real roots:%8.4f and%8.4fn,x1,x2);printf(has distinct real roots:%8.4f and%8.4fn,x1,x2);elseelserealpart=-b/(2*a);realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);imagpart=sqrt(-disc)/(2*a);printf(has complex roots:n);printf(has complex roots:n);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f+%8.4fin,realpart,imagpart);作业:作业:设计一个简单的计算器,完成两个数的加减乘除。设计一个简单的计算器,完成两个数的加减乘除。