《第4章-选择结构程序设计-C语言课件.ppt》由会员分享,可在线阅读,更多相关《第4章-选择结构程序设计-C语言课件.ppt(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.1 4.1 4.1 4.1 关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式4.2 4.2 4.2 4.2 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式4.3 if4.3 if4.3 if4.3 if语句语句语句语句4.4 switch4.4 switch4.4 switch4.4 switch语句语句语句语句4.5 4.5 4.5 4.5 程序举例程序举例程序举例程序举例第第4章章选择结构程序设计选择结构程序设计 安 庆 师 范 学 院 计 算 机
2、 与 信 息 学 院 4.1.1 关系运算符关系运算符 小于小于=大于大于=大于或等于大于或等于 =等于等于!=!=不不等于等于 优先级:优先级:、=、=优先级相同优先级相同 =和和!=的优先级相同,低于前四种的优先级相同,低于前四种关系运算符的优先级低于算术运算符,高于逻辑运关系运算符的优先级低于算术运算符,高于逻辑运算符算符&和和|,介于移位与双目位逻辑运算符之间。,介于移位与双目位逻辑运算符之间。结合性:左结合。若有多个关系运算同时进行,按优结合性:左结合。若有多个关系运算同时进行,按优先级从高到低次序运算,优先级相同从左向右计算。先级从高到低次序运算,优先级相同从左向右计算。4.1关系
3、运算符与关系表达式关系运算符与关系表达式 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.1.1关系运算符关系运算符 关系运算符都是双目运算符,要求两个关系运算符都是双目运算符,要求两个操作数是同一种数据类型,其结果为逻辑值操作数是同一种数据类型,其结果为逻辑值(真和假真和假)。在。在C语言中:语言中:逻辑值逻辑值“真真”:运算结果系统用:运算结果系统用1表示表示,参与参与运运 算时用非算时用非0值值(数值类即可数值类即可)表示;表示;逻辑值逻辑值“假假”:用:用0表示。表示。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 关系表达式是用关系运算符连接两个数值表达式关系表达
4、式是用关系运算符连接两个数值表达式形成的式子。例如:。例如:3+2 3+2=2*3 /*2*3 /*判断判断3+23+2和和2*32*3的结果是否相等的结果是否相等*/*/a+=a+=-b /*b /*判断判断a+a+的值是否大于或等于的值是否大于或等于-b*/b*/注:数值表达式一般是算术表达式,也可以是关系注:数值表达式一般是算术表达式,也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式等。表达式、逻辑表达式、赋值表达式、字符表达式等。关系表达式的一般形式为:关系表达式的一般形式为:表达式表达式 关系运算符关系运算符 表达式表达式4.1.2关系表达式关系表达式 安 庆 师 范 学 院
5、计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 逻辑运算的真值表ab!aa&ba|b真真(非非0)0)真真(非非0)0)假假(0)(0)真真(1)(1)真真(1)(1)真真(非非0)0)假假(0)(0)假假(0)(0)假假(0)(0)真真(1)(1)假假(0)(0)真真(非非0)0)真真(1)(1)假假(0)(0)真真(1)(1)假假(0)(0)假假(0)(0)真真(1)(1)假假(0)(0)假假(0)(0)安 庆 师 范 学 院 计 算 机 与 信 息 学 院 逻辑表达式类似于关系表达式,是用逻辑运逻辑表达式类似于关系表达式,是用逻辑运算符把两个表达式
6、连接起来的式子。算符把两个表达式连接起来的式子。例如:例如:a+b&aa+b&a;判断判断a+ba+b和和a a的值是否都为真,若都为真,则的值是否都为真,若都为真,则表达式为真,否则为假。表达式为真,否则为假。逻辑表达式的一般形式为:逻辑表达式的一般形式为:!表达式表达式 表达式表达式&表达式表达式 表达式表达式|表达式表达式4.2.3逻辑表达式逻辑表达式 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例4-1】分析下面程序段的运行结果分析下面程序段的运行结果 main()int a=123,b=456,x;char c=a;x=(a|b)&(cb);printf(a=%d,
7、b=%dn,a,b);printf(x=%dn,x);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 基本规律基本规律(设设a a为一合法表达式,结果为逻辑值为一合法表达式,结果为逻辑值):0&a0&a结果为结果为0(0(不计算不计算a)0|a a)0|a 结果为结果为a(a(计算计算a a逻辑值逻辑值)1&a1&a结果为结果为a(a(计算计算a a逻辑值逻辑值)1|a)1|a 结果为结果为1(1(不计算不计算a)a)a&aa&a结果为结果为a(a(逻辑值逻辑值)a|a)a|a 结果为结果为a(a(逻辑值逻辑值)a|!aa|!a结
8、果为结果为1 a&!a1 a&!a结果为结果为0 !(!a)0 !(!a)结果为结果为a(a(逻辑值逻辑值)【注意】逻辑运算符的【注意】逻辑运算符的“短路短路”现现象象 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 组合规律组合规律(设设a a、b b、c c均为合法表达式均为合法表达式):a&b&c自左向右运算,遇自左向右运算,遇0停止运算,停止运算,表达式值为表达式值为0a|b|c自左向右运算,遇自左向右运算,遇1停止运算,表停止运算,表达式值为达式值为10&a|b不计算不计算a但要计算但要计算b1&a|b计算计算a,a=0要计算要计算b,a=1不计不计算算b0|a&b计算计算a
9、,a=0不计算不计算b,a=1要计要计算算b1|a&b不计算不计算a和和b,表达式值为,表达式值为1 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 单分支单分支ifif语句的基本形式为:语句的基本形式为:if(if(表达式表达式)语句;语句;其语义是:首先判断表达式的值其语义是:首先判断表达式的值是否为真是否为真(非非0),若表达式的值为,若表达式的值为真,则执行其后的语句;真,则执行其后的语句;否则不否则不执行该语句。无论是否执行该语执行该语句。无论是否执行该语句,接着都执行句,接着都执行ifif语句后面的语语句后面的语句。句
10、。4.3.1单分支if语句表达式表达式语句语句非非00 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.3.2双分支双分支ifif语句语句双分支双分支ifif语句是语句是ifif语句基本形式,语句基本形式,即即if-elseif-else形式,语句的结构为:形式,语句的结构为:if(if(表达式表达式)语句语句1 1;else else 语句语句2 2;语义:当表达式的值为真,则执语义:当表达式的值为真,则执行语句行语句1 1,否则执行语句,否则执行语句2 2。然后。然后执行执行ifif语句后面的语句。语句后面的语句。单分支单
11、分支ifif语句相当于双分支语句相当于双分支ifif语语句缺省句缺省elseelse子句。子句。非非0表达表达式式语句语句1语句语句20 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 main()float a,b,max;printf(input the two numbers:);scanf(%f,%f,&a,&b);if(ab)max=a;else max=b;printf(max=%fn,max);【例【例4-3】从键盘输入两个整数,输出其中最大者从键盘输入两个整数,输出其中最大者 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与
12、 信 息 学 院 【注意】【注意】(2)(2)在在ifif语语句句中中,条条件件表表达达式式必必须须用用括括号号括括起起来来。在在每每一个子句之后必须加分号。例如:一个子句之后必须加分号。例如:if(ab)max=a;else max=b;elseelse子子句句是是ifif语语句句的的一一部部分分,和和ifif子子句句配配对对使使用用,不不能单独使用。能单独使用。(3)(3)在在ifif语句的各种形式中,所有的语句应为单个语句,语句的各种形式中,所有的语句应为单个语句,如果想将单个语句换成一组语句,则必须把这一组语句如果想将单个语句换成一组语句,则必须把这一组语句用花括号用花括号“”“”括起
13、来组成一个复合语句。括起来组成一个复合语句。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.3.3多分支选择结构多分支选择结构多分支选择结构的多分支选择结构的if语句语句if(表达式表达式1)语句语句1;else if(表达式表达式2)语句语句2;else if(表达式表达式3)语句语句3;else if(表达式表达式n)语句语句n;else 语句语句n+1;语义语义:依次判断表达式的值,当某个表达式的值为真依次判断表达式的值,当某个表达式的值为真时,时,则执行其对应的语句。然后跳到整个则执行其对应的语句。然后跳到整个if语句之后语句之后继续执行程序。继续执行程序。如果所有的表达式
14、均为假,则执行语如果所有的表达式均为假,则执行语句句n+1。然后继续执行后续程序。然后继续执行后续程序。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 多分支if语句的控制流程 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例4-4】分段函数 输入任意输入任意输入任意输入任意x x,求,求,求,求y y值。值。值。值。main()float x,y;printf(input one number:);scanf(%f,&x);if(x=0|x=2)y=0;else if(x0)y=(x+1)/(x-2);else y=(x-1)/(x-2);printf(y=%fn,y
15、);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例4-5】判别键盘输入字符的类别:控制字符、数字、判别键盘输入字符的类别:控制字符、数字、判别键盘输入字符的类别:控制字符、数字、判别键盘输入字符的类别:控制字符、数字、大写字母、小写字母、其他字符。大写字母、小写字母、其他字符。大写字母、小写字母、其他字符。大写字母、小写字母、其他字符。#includevoidmain(void)charc;printf(Inputacharacter;);c=getchar();if(c=0&c=A&c=a&c=z)printf(Thisisasmalllettern);elseprintf
16、(Thisisanothercharactern);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 嵌套if语句的层次划分问题 由于嵌套的复杂情况,怎么划分嵌套的层由于嵌套的复杂情况,怎么划分嵌套的层次就成了问题。其方法为:寻找次就成了问题。其方法为:寻找ifelse配对。配对。C语言语言ifelse配对的规定:配对的规定:从最前面的从最前面的else开始,使每个开始,使每个else与其前与其前面最近的尚未配对的面最近的尚未配对的 if 匹配。匹配。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 嵌套if语句的层次划分问题
17、 可能存在的问题:当内层为单分支可能存在的问题:当内层为单分支if语句时,可能产生语句时,可能产生ifelse配对错误配对错误(内层内层if语句为双分支时无此问题语句为双分支时无此问题)。例如内层单分支例如内层单分支if语句嵌套在外层语句嵌套在外层if子句中:子句中:按按ifelseifelse配对原则应写成:配对原则应写成:if(if(表达式表达式)if(if(表达式表达式)语句语句11;11;else else 语句语句1212;按原意应该写成:按原意应该写成:if(if(表达式表达式)if(if(表达式表达式)语句语句11;11;else else 语句语句2 2;原意:原意:if(if
18、(表达式表达式)if(if(表达式表达式)语句语句11;11;else else 语句语句2 2;安 庆 师 范 学 院 计 算 机 与 信 息 学 院 嵌套if语句的层次划分问题 然而,单分支内层然而,单分支内层if语句嵌套在外层语句嵌套在外层else子句中子句中 if(表达式表达式)语句语句1;else if(表达式表达式)语句语句21;这种写法内层这种写法内层 if 语句不加花括号也不会出现语句不加花括号也不会出现ifelse配对错误。配对错误。多分支多分支 if 语句其实就是多层嵌套的语句其实就是多层嵌套的 if 语句,其每语句,其每一层都是嵌套在一层都是嵌套在else子句中子句中 安
19、 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例4-6】求符号函数求符号函数的值的值#includemain()intx,y;scanf(”%d”,&x);if(x0)y=-1;elseif(x=0)y=0;elsey=1;printf(”x=%d,y=%dn”,x,y);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.3.5条件运算符和条件表达式条件运算符和条件表达式1 1、条件运算符、条件运算符 条件运算符由条件运算符由“?”和和“:”组合而成,是三组合而成,是三目运算符,要求有目运算符,要求有3 3个操作对
20、象,并且三个操作对个操作对象,并且三个操作对象都是表达式。象都是表达式。优先级优先级:条件运算符的运算优先级低于关系运算符条件运算符的运算优先级低于关系运算符 和和算术运算符,高于赋值运算符算术运算符,高于赋值运算符 结合性结合性:自右至左自右至左 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 3 3、由条件表达式组成的选择结构、由条件表达式组成的选择结构 在在ifif语句中,若各分支都只执行单个赋值语句,语句中,若各分支都只执行单个赋值语句,我们常使用条件运算来表示,如:我们常使用条件运算来表示,如:if(ab)max=a;e
21、lsemax=b;用条件表达式可以表示为:用条件表达式可以表示为:max=(ab)?a:b;安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例例4-7】用用条条件件运运算算符符对对【例例4-34-3】重重新新编编程程,输出两个整数中的最大者输出两个整数中的最大者#includemain()floata,b,max;printf(inputthetwonumbers:);scanf(%f,%f,&a,&b);max=ab?a:b;printf(max=%fn,max);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 例:用条件表达式求例:用条件表达式求x x的绝对值的绝对值 p
22、rintf(|%d|=%dn,x,x=0?a+b:a-b);当当b=0,输出,输出a、b、a+b的值的值当当b0,输出,输出a、b、a-b的值的值 安 庆 师 范 学 院 计 算 机 与 信 息 学 院 floatx,y;scanf(“%f”,&x);y=x0?1.0:(x0?-1.0:0);按运算符的优先级,先计算嵌套的条件表达式然后按运算符的优先级,先计算嵌套的条件表达式然后赋值。由于条件运算符的右结合性,嵌套的条件表达赋值。由于条件运算符的右结合性,嵌套的条件表达式外面的括号可以不用。式外面的括号可以不用。例:用条件表达式的嵌套表示符号函数:例:用条件表达式的嵌套表示符号函数:安 庆 师
23、 范 学 院 计 算 机 与 信 息 学 院 注意:条件表达式的短路现象注意:条件表达式的短路现象例:例:#includemain()inta,b;scanf(“%d,%d”,&a,&b);printf(“%d”,(-a=b+)?-a:b+);printf(“,%d,%dn”,a,b);运行时输入运行时输入5,4 输出输出3,3,5(:后的后的b+没有计算没有计算)运行时输入运行时输入5,5 输出输出6,4,7(:前的前的-a没有计算没有计算)安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【问题】【问题】前面我们所说的前面我们所说的ifif语句通常用于解决分支较少语句通常用于解决分支
24、较少的情况,而日常生活中我们常常要解决多个分支的的情况,而日常生活中我们常常要解决多个分支的问题。例如前面我们所说的,给学生成绩划分问题。例如前面我们所说的,给学生成绩划分A A、B B、C C等等,诸如此类问题。利用嵌套的,诸如此类问题。利用嵌套的ifif语句当然也语句当然也可以解决,但是如果分支太多,可以解决,但是如果分支太多,ifif语句嵌套的层数语句嵌套的层数太多,势必会造成程序的冗长,可读性差。有没有太多,势必会造成程序的冗长,可读性差。有没有什么更好的方法能解决多分支问题呢?什么更好的方法能解决多分支问题呢?4.4switch语句语句 安 庆 师 范 学 院 计 算 机 与 信 息
25、 学 院 switch语句专门用于根据一些分立的条件确定多分语句专门用于根据一些分立的条件确定多分支选择的问题支选择的问题1、一般形式为:、一般形式为:switch(开关表达式开关表达式)case 常量表达式常量表达式1:语句组语句组1;case 常量表达式常量表达式2:语句组语句组2;case 常量表达式常量表达式n:语句组语句组n;default:语句组语句组n+1;安 庆 师 范 学 院 计 算 机 与 信 息 学 院 语义:语义:计算开关表达式的值,并逐个与其后的常量计算开关表达式的值,并逐个与其后的常量表达式值相比较:表达式值相比较:当开关表达式的值与某个常量表达式的值相当开关表达式
26、的值与某个常量表达式的值相等时,等时,即执行其后的语句组,然后不再进行判即执行其后的语句组,然后不再进行判断,继续执行下面所有断,继续执行下面所有casecase后的语句组。后的语句组。如果开关表达式的值与所有如果开关表达式的值与所有casecase后常量表达后常量表达式的值均不相同,则执行式的值均不相同,则执行defaultdefault后的语句组。后的语句组。结论:结论:switch switch语句是一个具有多处入口单出口的语语句是一个具有多处入口单出口的语句结构(还不是多分支选择结构)。句结构(还不是多分支选择结构)。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 2、swit
27、ch语句构成多分支选择结构为:语句构成多分支选择结构为:switch(开关表达式开关表达式)case 常量表达式常量表达式1:语句组语句组1;break;case 常量表达式常量表达式2:语句组语句组2;break;case 常量表达式常量表达式n:语句组语句组n;break;default:语句组语句组n+1;break(中断中断)语语句的作用:句的作用:终终止本止本层层switch语语句的句的执执行,使得行,使得switch语句构成多分支选择结构语句构成多分支选择结构。注:注:break语语句另外的作用是句另外的作用是终终止循止循环环体的体的执执行,行,详见详见第第5章。章。安 庆 师 范
28、 学 院 计 算 机 与 信 息 学 院 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(Thursdayn);break;case 5:printf(Fridayn);break;case 6:printf(Saturdayn);break;case 7:printf(Sundayn);break;default:printf(Errorn);【例【例4-9 4-9
29、】输入一个十进制数,输出所对应的英文星期单输入一个十进制数,输出所对应的英文星期单词,若所输入的数小于词,若所输入的数小于1 1或大于或大于7 7,则输出,则输出“Error”“Error”。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【注意注意】(1)switch后的后的“开关表达式开关表达式”可为任何类型的表达式。可为任何类型的表达式。(2)每一个每一个case后的常量表达式不能相同,否则会出现后的常量表达式不能相同,否则会出现错误。错误。(3)case后的语句组可有多条语句,不必用后的语句组可有多条语句,不必用 括起来。括起来。(4)case和和default子句出现的先后顺
30、序可以变动,有子句出现的先后顺序可以变动,有break语句时不会影响程序执行的结果。语句时不会影响程序执行的结果。default子句子句也可以省略不用。也可以省略不用。(1)(5)多个多个case可以共用一组执行语句。例如:可以共用一组执行语句。例如:case A:case B:case C:printf(60n);break;安 庆 师 范 学 院 计 算 机 与 信 息 学 院 4.5 4.5 程序举例程序举例【例【例4-10】输入一个十进制正整数,判断该数输入一个十进制正整数,判断该数是否是是否是3 3的倍数,若是则输出的倍数,若是则输出Yes!Yes!,否则输,否则输出出“No!No!
31、”【分析】输入一个十进制整数,判断是否为【分析】输入一个十进制整数,判断是否为3 3的倍数,只需考察这个数对的倍数,只需考察这个数对3 3取余数结果是否取余数结果是否为为0 0,为,为0 0就是就是3 3的倍数,否则就不是的倍数,否则就不是3 3的倍数。的倍数。安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()inta;printf(Enteraninteger:);scanf(%d,&a);if(a%3=0)printf(Yes!n);elseprintf(No!n);安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includestdio.hmain
32、()inta,b,c,t;printf(pleaseinputthethreenumber:);scanf(%d,%d,%d,&a,&b,&c);if(ab)t=a;a=b;b=t;/*a和和b的值交换的值交换*/if(ac)t=a;a=c;c=t;/*a和和c的值交换的值交换*/if(b=%d=%dn,a,b,c);【例【例4-114-11】输入输入3 3个数,按从大到小的顺序输出。个数,按从大到小的顺序输出。【分析】设【分析】设3 3个数分别是个数分别是a a、b b和和c c,把它们中最大者存放,把它们中最大者存放在在a a中,把次大者存放在中,把次大者存放在b b中,中,c c中存放最
33、小者,然后依次中存放最小者,然后依次输出输出a a、b b和和c c。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-124-124-124-12】将一个百分制的成绩转化成将一个百分制的成绩转化成将一个百分制的成绩转化成将一个百分制的成绩转化成5 5个等级:个等级:个等级:个等级:9090分以分以分以分以上为上为上为上为AA,80808989分为分为分为分为BB,70707979分为分为分为分为CC,60606969分为分为分为分为DD,6060分以下为分以下为分以下为分以下为EE。例如输入。例如输入。例如输入。例如输入7575,则显示,则显示,则显示,则显示C C
34、。【分析】先判断输入的数据是否在合理的分数范围(【分析】先判断输入的数据是否在合理的分数范围(0100)内,然后再判断是哪个分数段:)内,然后再判断是哪个分数段:90分以上输出分以上输出A,8089分输出分输出B,7079分输出分输出C,6069分输出分输出D,否则显示,否则显示E。安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()inta;printf(inputthescore:);scanf(%d,&a);if(a100)printf(dataerrorn);elseif(a=90)printf(An);elseif(a=80)printf(Bn);els
35、eif(a=70)printf(Cn);elseif(a=60)printf(Dn);elseprintf(En);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-134-134-134-13】用用用用switchcaseswitchcase语语语语句来句来句来句来实现实现实现实现【例【例【例【例4-124-12】【分析】为了使用【分析】为了使用switchswitch语句,必须将分数段和等级语句,必须将分数段和等级字母的对应关系转化为某个常量和等级字母的对应关字母的对应关系转化为某个常量和等级字母的对应关系。经过分析,我们可以把输入的分数十位上的数字系。经过分析,
36、我们可以把输入的分数十位上的数字作为考查对象,只需要将输入的分数除以十,得到的作为考查对象,只需要将输入的分数除以十,得到的数据就是十位上的数值。用这个数据与等级字母的对数据就是十位上的数值。用这个数据与等级字母的对应关系来替代某个分数段与等级字母的对应关系。应关系来替代某个分数段与等级字母的对应关系。安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()inta;scanf(%d,&a);if(a100)printf(dataerrorn);elseswitch(a/10)case10:case9:printf(An);break;case8:printf(Bn)
37、;break;case7:printf(Cn);break;case6:printf(Dn);break;default:printf(En);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-144-144-144-14】输输输输入入入入20082008年的一个月份,年的一个月份,年的一个月份,年的一个月份,输输输输出出出出这这这这个月的天个月的天个月的天个月的天数。数。数。数。(2008(2008年年年年为闰为闰为闰为闰年年年年)【分析】根据输入的月份数判断,当月份为【分析】根据输入的月份数判断,当月份为1、3、5、7、8、10、12时,天数为时,天数为31,当月
38、份为,当月份为4、6、9、11时,时,天数为天数为30,2008年是年是闰闰年,所以,当月份为年,所以,当月份为2时,天数时,天数为为29。安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()intmonth,days;printf(inputthemonthnumber:);scanf(%d,&month);switch(month)case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2:days=29;break
39、;default:days=-1;if(days=-1)printf(inputerror!);elseprintf(2008years%dmonthhas%ddaysn,month,days);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-154-154-154-15】求求求求方程方程方程方程axax2 2+bx+c=0+bx+c=0的实数解。的实数解。的实数解。的实数解。【分析】根据【分析】根据3个系数的不同情况,方程的根有如下几个系数的不同情况,方程的根有如下几种情况。种情况。1.a=0,不是二次方程;,不是二次方程;2.b2-4ac=0,有两个相等的实根,
40、有两个相等的实根x;3.b2-4ac0,有两个不等实根,有两个不等实根,x1和和x2;4.b2-4ac0,没有实数解。,没有实数解。#include#includemain()floata,b,c,x1,x2,disc;printf(“nInputa,b,c:”);scanf(“%f%f%f”,&a,&b,&c);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 if(fabs(a)1e-6)printf(“Theequationisnotaquadratic”);elsedisc=b*b-4*a*c;if(fabs(disc)0)x1=(-b+sqrt(disc)/(2*a);x2=(
41、-b-sqrt(disc)/(2*a);printf(“Theequationhasdistinctrealroots:%8.4f,%8.4f”,x1,x2);elseprintf(“Theequationhasnotrealrootsn”);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-164-164-164-16】输输输输入两个十入两个十入两个十入两个十进进进进制整数,制整数,制整数,制整数,输输输输出出出出这这这这两个数的关两个数的关两个数的关两个数的关系。例如,若系。例如,若系。例如,若系。例如,若输输输输入的数据入的数据入的数据入的数据为为为为2 2,3
42、 3,则输则输则输则输出出出出结结结结果果果果为为为为232232。若。若。若。若输输输输入数据入数据入数据入数据为为为为3 3,3 3,则输则输则输则输出出出出结结结结果果果果为为为为3=33=3。【分析】【分析】两个数的相互关系只有三种:两个数的相互关系只有三种:ab、a=b,因此可以用多分支因此可以用多分支ifif语句解决。语句解决。安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()inta,b;printf(inputtwonumbers:);scanf(%d,%d,&a,&b);if(ab)printf(%d%dn,a,b);elseif(a=b)pr
43、intf(%d=%dn,a,b);elseprintf(%d%dn,a,b);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【例【例【例【例4-174-174-174-17】从从从从键盘输键盘输键盘输键盘输入一个正整数作入一个正整数作入一个正整数作入一个正整数作为为为为年份,年份,年份,年份,编编编编程判程判程判程判断断断断该该该该年是不是年是不是年是不是年是不是闰闰闰闰年。若是年。若是年。若是年。若是则输则输则输则输出出出出“YES”“YES”,否,否,否,否则输则输则输则输出出出出“NO”“NO”。【分析】【分析】闰年的条件是:闰年的条件是:能被能被4整除,但不能被整除,但不能被
44、100整除的年份整除的年份(例如例如2008年年)是闰年;是闰年;能被能被400整除的年份整除的年份(例如例如2000年年)也是闰年。也是闰年。(而而1900年不是闰年年不是闰年)安 庆 师 范 学 院 计 算 机 与 信 息 学 院#includemain()intyear;scanf(%d,&year);if(year%4=0&year%100!=0|year%400=0)printf(YES);elseprintf(NO);安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【本章小结】【本章小结】根根据据某某种种条条件件的的成成立立与与否否而而采采用用不不同同的的程程序序段段进进行
45、行处处理理的的程程序序结结构构称称为为选选择择结结构构。选选择择结结构构是是C C语语言言中中一一种种重重要要的的语语句句结结构构,它它体体现现了了程程序序的的逻逻辑辑判判断断能能力力。选选择择结结构构又又可可分分为为简简单单分分支支(两两个个分分支支)和和多多分分支支两两种种情情况况。一一般般采采用用ifif语语句句实实现现简简单单分分支支结结构构程程序序,用用switchswitch和和breakbreak语语句句实实现现多多分分支支结结构构程程序序。本本章章中中我我们们主主要要给给大大家家介绍了下面内容:介绍了下面内容:(1)(1)选选择择结结构构离离不不开开逻逻辑辑判判断断,关关系系运
46、运算算和和逻逻辑辑运运算算正正体体现现了了这这种种逻逻辑辑判判断断能能力力。选选择择结结构构的的控控制制条条件件通通常常用用关关系系表表达达式式或或逻逻辑辑表表达达式式构构造造,也也可可以以用用一一般般表表达达式式表表示示。因因为为表表达达式式的的值值非非0 0即即为为“真真”,0 0即即为为“假假”。所所以以具具有值的表达式均可作有值的表达式均可作ifif语句的控制条件。语句的控制条件。安 庆 师 范 学 院 计 算 机 与 信 息 学 院 【本章小结【本章小结(续续)】(2)C(2)C语语言言利利用用ifif语语句句来来实实现现选选择择结结构构,ifif语语句句主主要要有有四四种种句句式式
47、,分分别别是是:单单分分支支的的ifif语语句句、双双分分支支的的ifif语语句句、多多分分支支的的ifif语语句句和和嵌嵌套套的的ifif语语句句。在在嵌嵌套套ifif语语句句中,一定要搞清楚中,一定要搞清楚elseelse与哪个与哪个ifif结合的问题。结合的问题。(3)switch(3)switch语句专门用于解决多分支选择问题。语句专门用于解决多分支选择问题。switchswitch语句只有与语句只有与breakbreak语句相结合,才能设计出正语句相结合,才能设计出正确的多分支结构的程序。确的多分支结构的程序。breakbreak语句通常出现在语句通常出现在switchswitch语句或循环语句中,它能终止执行它所在的语句或循环语句中,它能终止执行它所在的switchswitch语句或循环语句。语句或循环语句。安 庆 师 范 学 院 计 算 机 与 信 息 学 院