《(精品)第4章 选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《(精品)第4章 选择结构程序设计.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4 4章章 选择结构程序设计选择结构程序设计 北京科技大学北京科技大学 计算机系计算机系C C 语言程序设计语言程序设计提出问题:提出问题:l l自然语言:自然语言:如果如果 则则 否则否则l lC语言:语言:分支语句分支语句问题问题1 1:如何根据收入,确定他的纳税比例及纳税额?如何根据收入,确定他的纳税比例及纳税额?如何根据收入,确定他的纳税比例及纳税额?如何根据收入,确定他的纳税比例及纳税额?问题问题2 2如何根据学生的分数判断是否及格?如何根据学生的分数判断是否及格?如何根据学生的分数判断是否及格?如何根据学生的分数判断是否及格?202本章主要内容本章主要内容4.1 if语句语句4
2、.1.1 if语句的一般形式语句的一般形式4.1.2 if语句的嵌套语句的嵌套4.2 switch语句语句4.2.1 switch语句的一般形式语句的一般形式4.2.2 break语句语句4.3 选择结构程序设计举例选择结构程序设计举例203简单分支语句简单分支语句l l语句一般格式语句一般格式 if(表达式表达式)语句语句l l功能:功能:计算计算计算计算表达式的值表达式的值表达式的值表达式的值,如果如果如果如果是一个非是一个非是一个非是一个非0 0值(即值(即值(即值(即逻辑真),就执行内嵌语句,逻辑真),就执行内嵌语句,逻辑真),就执行内嵌语句,逻辑真),就执行内嵌语句,否则否则否则否则
3、(即逻(即逻(即逻(即逻辑假)跳过内嵌语句,顺序执行后续语句。辑假)跳过内嵌语句,顺序执行后续语句。辑假)跳过内嵌语句,顺序执行后续语句。辑假)跳过内嵌语句,顺序执行后续语句。内嵌语句,可为:内嵌语句,可为:赋值语句赋值语句函数调用语句函数调用语句控制语句控制语句复合语句复合语句空语句空语句可为算术、关系、逻辑、赋值可为算术、关系、逻辑、赋值等合法的表达式等合法的表达式204简单分支语句的算法:简单分支语句的算法:l l例如:例如:if(x0)m+;if(ab)c=a;a=b;b=c;表达式非表达式非0 T F 语句语句N-S结构图结构图语句语句流程图流程图NY表达式非表达式非0?205双重分
4、支语句双重分支语句 l l语句一般格式语句一般格式if(表达式表达式)语句语句1 else 语句语句2 l l功能:功能:计算计算计算计算表达式的值表达式的值表达式的值表达式的值,如果如果如果如果它的值是一个非它的值是一个非它的值是一个非它的值是一个非0 0值值值值(逻辑真),就执行内嵌语句(逻辑真),就执行内嵌语句(逻辑真),就执行内嵌语句(逻辑真),就执行内嵌语句1 1,之后跳过内,之后跳过内,之后跳过内,之后跳过内嵌语句嵌语句嵌语句嵌语句2 2,执行后续语句;,执行后续语句;,执行后续语句;,执行后续语句;否则否则否则否则跳过内嵌语句跳过内嵌语句跳过内嵌语句跳过内嵌语句1 1,执行内嵌语
5、句,执行内嵌语句,执行内嵌语句,执行内嵌语句2 2,之后执行后续语句。,之后执行后续语句。,之后执行后续语句。,之后执行后续语句。206双重分支语句的算法:双重分支语句的算法:l l例如:例如:if if(x0)m+;elseelse m-;if if(ch=a&ch=z)ch=ch-32;printf(%cn,chcn,ch);else else printf(%cn,chcn,ch);表达式非表达式非0 T F 语句语句1 语句语句2N-S结构图结构图 语句语句1 语句语句2流程图流程图NY表达式非表达式非0?207多重分支语句多重分支语句 l l语句一般格式语句一般格式if(表达式表达式
6、1)语句语句1 else if(表达式表达式2)语句语句2 else if(表达式表达式m)语句语句m else 语句语句 nl l功能:功能:依次计算并判断表达式依次计算并判断表达式依次计算并判断表达式依次计算并判断表达式i i,为非为非为非为非0 0时执行后面的时执行后面的时执行后面的时执行后面的语句,都为语句,都为语句,都为语句,都为0 0时,执行语句时,执行语句时,执行语句时,执行语句n n 无论执行完哪个语句分支,都转到后续语句无论执行完哪个语句分支,都转到后续语句无论执行完哪个语句分支,都转到后续语句无论执行完哪个语句分支,都转到后续语句208多重分支语句的算法多重分支语句的算法l
7、 l流程图流程图表达式表达式表达式表达式2?2?表达式表达式表达式表达式1?1?语句语句语句语句n n 语句语句语句语句1 1 语句语句语句语句2 2 语句语句语句语句mmY YN NY YN NN NY Y表达式表达式表达式表达式m?m?209多重分支语句的算法多重分支语句的算法l lN-S结构图结构图 表达式表达式表达式表达式1 1?T FT F 表达式表达式表达式表达式2 2?语句语句语句语句1 1 T FT F 语句语句语句语句2 2 表达式表达式表达式表达式mm?T F T F 语句语句语句语句m m 语句语句语句语句n nl l例如:例如:if if(a0)x=-1;(a=A&=A
8、&chch=Z=65&=65&chch=90=A&ch=A&ch=Z?ch+32:ch);putchar(n)20124.1.2 if语句的嵌套语句的嵌套l l如果如果if的内嵌语句中又使用了一个的内嵌语句中又使用了一个if语句,语句,则构成则构成if语句的嵌套。语句的嵌套。【例【例4.a】比较两个整数的关系。比较两个整数的关系。#include main()int x,y;printf(Enter integer X and Y:);scanf(%d%d,&x,&y);if(x!=y)if(x y)printf(XYn);else printf(X y)printf(XYn);else pr
9、intf(XYn);else printf(X=Yn);提倡缩格书写提倡缩格书写提倡缩格书写提倡缩格书写有利于阅读程序有利于阅读程序2013l l双重(或多重)分支双重(或多重)分支if语句的嵌套形式语句的嵌套形式 if(表达式表达式)if 语句语句 else if 语句语句 if语句嵌套的形式语句嵌套的形式l l简单简单if语句的嵌套形式语句的嵌套形式 if(表达式表达式)if 语句语句 可以是各种形式的可以是各种形式的if语句语句可以是各种形式的可以是各种形式的if语句语句如果是简单如果是简单if语句,语句,必须用必须用“”括起括起2014 if(c=50)printf(50=c=100n
10、);else printf(c50n);else if(c=150)printf(100c150n);if(c=50)printf(50=c=100n);else printf(c50n);例如:例如:if(c=50)printf(50=c=100n);与与哪哪个个if 配配对对?匹配规则匹配规则:在在嵌套的嵌套的ififelseelse语句语句中,中,elseelse总是与总是与上面的上面的、离它最近的离它最近的、在同一复合语在同一复合语句中还没有配对的句中还没有配对的ifif配对。配对。else printf(cb)if(ac)if (ad)flag=1;else flag=2;else
11、flag=3;if(ab)if(ac)if(ad)flag=1;else flag=2;else flag=3;flag=3flag=3的条件:的条件:的条件:的条件:flag=3 flag=3 的条件:的条件:的条件:的条件:当当当当 c ca ab b 时时时时当当当当 a a b b 时时时时例如:例如:2016举例举例【例【例4.4】输入一个数,判断它是奇数还是】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断偶数,如果是奇数则进一步判断它是否为它是否为5的倍数。的倍数。定义变量定义变量x输入输入x的值的值 x是奇数是奇数 T F 输出输出“odd”x是是5的的倍倍数数 输输出
12、出“even”T F是是5的倍数的倍数x%2!=0?x%5等于等于0?2017程序:程序:main()int x;scanf(%d,&x);if if(x%2!=0 x%2!=0)printf(%d is an odd n,x);if if(x%5=0 x%5=0)printf(%d is the times of 5 n,x);elseelse printf(%d is an even n,x);等价于等价于等价于等价于if(if(x%2x%2).).等价于等价于等价于等价于if(if(!(x%5)!(x%5).).运行运行jc4_4思考:如果没有思考:如果没有 ,算法和输出如何?,算法和输
13、出如何?2018学习学习if语句的难点语句的难点l l正确用表达式描述条件正确用表达式描述条件例如:当例如:当x大于大于5小于小于10时令时令x自增自增 if(5x10 )x+;l lif else 语句的配对语句的配对l l正确判断内嵌语句正确判断内嵌语句例如:例如:if(x5&x 0d 0时,方程有时,方程有时,方程有时,方程有两个不相等的实根两个不相等的实根两个不相等的实根两个不相等的实根:x1=(x1=(-b+sqrt(d)/(2*a)b+sqrt(d)/(2*a)x2=(x2=(-b-sqrt(d)/(2*a)b-sqrt(d)/(2*a)当当当当d 0d 0 d 0 计算重根计算重
14、根计算重根计算重根 T FT F 输出重根输出重根输出重根输出重根 计算实根计算实根计算实根计算实根 计算虚根计算虚根计算虚根计算虚根 输出实根输出实根输出实根输出实根 输出虚根输出虚根输出虚根输出虚根2028程序:程序:#include math.hmain()float a,b,c,d,x1,x2,lp,ip;scanf(%f%f%f,&a,&b,&c);printf(the equation);if if(fabs(a)1e-6)printf(is is not quadratic not quadratic);elseelse d=b*b-4*a*c;if if(fabs(d)1e-6
15、)/*/*不相等的实根不相等的实根不相等的实根不相等的实根 */*/x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(has two real roots:n);printf(x1=%8.4f,2=%8.4fn,x1,x2);elseelse /*/*虚根虚根虚根虚根 */*/lp=-b/(2*a);ip=sqrt(-d)/(2*a);printf(has two complex roots:n);printf(x1=%8.4f+%8.4fin,lp,ip);printf(x2=%8.4f-%8.4fin,lp,ip);运行运行jc4_62030
16、举例(续):举例(续):【例【例4.b】输入年份,判别该年是否为闰年。输入年份,判别该年是否为闰年。思路:思路:思路:思路:年份年份年份年份yearyear为闰年的条件为为闰年的条件为为闰年的条件为为闰年的条件为 能够被能够被能够被能够被4 4整除,但不能被整除,但不能被整除,但不能被整除,但不能被100100整除的年份;整除的年份;整除的年份;整除的年份;能够被能够被能够被能够被400400整除的年份。整除的年份。整除的年份。整除的年份。只要满足任意一个就可以确定它是闰年。只要满足任意一个就可以确定它是闰年。只要满足任意一个就可以确定它是闰年。只要满足任意一个就可以确定它是闰年。例如:例如:
17、例如:例如:19961996年、年、年、年、20002000年是闰年年是闰年年是闰年年是闰年19981998年、年、年、年、19001900年不是闰年年不是闰年年不是闰年年不是闰年设定标志变量设定标志变量leapleap,只要符合其中一个条件的就是只要符合其中一个条件的就是闰年,令闰年,令 leap=1leap=1;否则令否则令 leap=0leap=0 2031算法:算法:定义变量定义变量year、leap 输入年份输入年份year 能被能被能被能被4 4整除且整除且整除且整除且 不能被不能被不能被不能被100100整除?整除?整除?整除?T F 能被能被能被能被400400整除?整除?整除
18、?整除?leap=1 T F leap=1 leap=0 leap=1?T F 是闰年是闰年 不是闰年不是闰年year%400=0year%400=0year%4=0&year%4=0&year%100!=0year%100!=02032程序:程序:main()int year,leap;scanf(%d,&year);if if(year%4=0&year%100!=0)leap=1;else ifelse if(year%400=0)leap=1;elseelse leap=0;if(leap=1)printf(%d is a leap year n,year);else printf(%
19、d is not a leap year n,year);运行运行jc4_b2033举例(续):举例(续):【例【例【例【例4.4.C C C C】已知银行整存整取存款月息利率分别为:已知银行整存整取存款月息利率分别为:已知银行整存整取存款月息利率分别为:已知银行整存整取存款月息利率分别为:0.225%0.225%0.225%0.225%期限一年期限一年期限一年期限一年 0.292%0.292%0.292%0.292%期限三年期限三年期限三年期限三年 0.315%0.315%0.315%0.315%期限五年期限五年期限五年期限五年 0.408%0.408%0.408%0.408%期限八年期限八
20、年期限八年期限八年 0.192 0.192 0.192 0.192 其他(视为活期)其他(视为活期)其他(视为活期)其他(视为活期)输入存款金额和期限,求到期时利息与本金合计。输入存款金额和期限,求到期时利息与本金合计。输入存款金额和期限,求到期时利息与本金合计。输入存款金额和期限,求到期时利息与本金合计。可以用可以用if语句语句或或switch语句实现语句实现银行到期利息计算公式:银行到期利息计算公式:银行到期利息计算公式:银行到期利息计算公式:利息利息本金本金月息利率月息利率1212存款年限存款年限 程序中应当根据存款的年限(程序中应当根据存款的年限(程序中应当根据存款的年限(程序中应当根
21、据存款的年限(多种多种多种多种)确定利率)确定利率)确定利率)确定利率2034程序:程序:main()float money,rate,total,year;printf(Input money and year:);scanf(%f%f,&money,&year);switch(year)switch(year)case 1:rate=0.00225;break;case 3:rate=0.00292;break;case 5:rate=0.00315;break;case 8:rate=0.00408;break;default:rate=0.00192;total=money+money
22、*rate*12*yearmoney*rate*12*year;printf(Rate=%.3f%,%,rate*100);printf(Total=%.2fn,total);运行运行jc4_c问题:问题:问题:问题:是否允许是否允许是否允许是否允许yearyear为为为为floatfloat型?型?型?型?当存款期限为当存款期限为当存款期限为当存款期限为2 2年、年、年、年、4 4年年年年等等等等如何处理?如何处理?如何处理?如何处理?改进改进改进改进2035改进:改进:switch(year)switch(year)case 7:case 6:case 5:rate=0.00315;break;case 4:case 3:rate=0.00292;break;case 2:case 1:rate=0.00225;break;default:if(year=8)rate=0.00408;else rate=0.00192;运行运行jc4_c1能自动转换为能自动转换为int型型思考:如何用思考:如何用 if 语句实现?语句实现?2036l l下周交作业下周交作业实验实验4 选择结构程序设计选择结构程序设计 第第5题题2037