《c语言程序设计教学资料》第5章-选择控制结构.ppt
第四章选择控制结构第四章选择控制结构第五章选择控制结构第五章选择控制结构 内容提要:内容提要:算法的描述方法选择结构程序设计-if语句实现选择结构-switch语句实现多分支选择结构算法的描述方法p一个程序应包括两个方面的内容:-对数据的描述:在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,即:数据结构(data structure)-对操作的描述:即要求计算机进行操作的步骤,即:算法(algorithm)p 著名计算机科学家沃思(Nikiklaus Wirth)提出:数据结构+算法=程序p 完整的程序设计应该是:数据结构算法程序设计方法语言工具p 算法:为解决一个问题而采取的方法和步骤。p 算法是解决“做什么”和“怎么做”的问题。p 两大类计算机算法:数值运算算法、非数值运算算法算法的描述方法数值解,如:面积、积分等分析推理、逻辑推理,如:查找、分类算法的描述方法p 算法特点:-有穷性:包含有限的操作步骤。-确定性:算法中的每一个步骤都应当是确定的。-有效性:算法中的每一个步骤都应当能有效地执行,并得到 确定的结果。-没有输入或有多个输入:输入是指在执行算法时需要从外界 取得必要的信息。-至少有一个输出:算法的目的是为了求解,“解”就是输出。p对同一个问题,可有不同的解题方法和步骤算法的描述方法例:求方法1:1+2,+3,+4,一直加到100 加99次方法2:100+(1+99)+(2+98)+(49+51)+50 =100+49100+50 加51次为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。希望方法简单,运算步骤少。p常用的有算法描述方法:算法的描述方法-自然语言-传统流程图-NS结构化流程图-伪代码-PAD图-其它常用的有算法描述方法用自然语言表示算法:用自然语言表示算法:p 用自然语言表示通俗易懂,但文字冗长,容易出现歧义性。p 用自然语言描述包含分支和循环的算法,不很方便。p 除了很简单的问题外,一般不用自然语言。用流程图表示算法用流程图表示算法:美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:起止框起止框判断框判断框处理框处理框输入输入/输出输出框框注释框注释框流向线流向线连接点连接点流程图是用一些图框来表示各种操作常用的有算法描述方法x0 x0Y YN N一个入口一个入口两个出口两个出口位置不够位置不够防止交叉防止交叉例:打印50名 学生中成绩在80分以上者的学号和成绩。p流程线不要忘记画箭头,否则难以判定各框的执行次序p流程图是表示算法的较好的工具,直观形象,易于理解p一个流程图包括以下几部分:(1)表示相应操作的框(2)带箭头的流程线(3)框内外必要的文字说明传统流程图的流程可以是:这种如同乱麻一样的算法称为BS型算法,意为一碗面条(A Bowl of Spaghetti),乱无头绪。传统流程图的弊端:-传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。-使用者可以毫不受限制地使流程随意地转来转去,使人难以理解算法的逻辑。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。NS流程图表示算法流程图表示算法:1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。常用的有算法描述方法p比文字描述直观、形象、易于理解;p比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,NS流程图中的上下顺序就是执行时的顺序。p用NS图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。NS图表示算法的优点:常用的有算法描述方法伪代码表示算法伪代码表示算法:p概念概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。p特点特点:它如同一篇文章一样,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。p用处用处:适用于设计过程中需要反复修改时的流程描述。例:求5!。BEGIN 1t 2 i while i5 ti t i+1 i print t END开始 置t的初值为1 置i的初值为2 当i=5,执行下面操作:使t=ti 使i=i+1 循环体到此结束 输出t的值 结束算法的描述方法例:求,写出其算法。自然语言自然语言:流程图流程图:NSNS图图:伪代码伪代码:1.0 S 2.1n3.S+n S4.n+1 n5.判断n100?6.是,转3 否则转67.输出S的值用不同形式表示操作步骤,仅仅是描述了算法,要得到运行结果,必须实现算法,即:将算法描述转换成计算机语言程序。p 结构化程序设计就是将程序的功能分为一个一个的模块,这种程序便于编写、便于阅读、便于修改和维护。p 结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。结构化程序设计方法结构化程序设计方法p采取以下方法保证得到结构化的程序:-自顶向下;-逐步细化;-模块化设计;-结构化编码。结构化程序设计的三种基本结构是:顺序结构、选择结构、循环结构顺序结构、选择结构、循环结构Bohra和Jacopini提出,用这三种基本结构作为表示一个良好算法的基本单元。三种基本结构的图示:三种基本结构的图示:顺序结构顺序结构选择结构选择结构当型当型(While型型)循环结构循环结构 直到型直到型(Until型型)循环循环 顺序结构顺序结构选择结构选择结构While型循环结构型循环结构Until型循环型循环 常用的有算法描述方法p三种基本结构的共同特点:(1)只有一个入口。(2)只有一个出口。(3)结构内的每一部分都有机会被执行到。(4)结构内不存在“死循环”(无终止的循环)。p由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。用三种NS流程图中的基本框,可以组成复杂的NS流程图。图中的A框或B框,可以是一个简单的操作,也可以是三个基本结构之一。A框可以是一个选择结构 B框可以是一个循环结构 顺序程序设计顺序结构,最简单的C语言程序结构,特点是完全按照语句的出现次序执行程序。顺序程序设计例:将用华氏法表示的温度F转换为以摄氏法表示的温度C。输入f的值输出c的值NS流程图算法:#include int main()float f,c;printf(input f:);scanf(%f,&f);c=(5.0/9)*(f-32);printf(f=%.2fnc=%.2fn,f,c);return 0;选择结构程序设计p在现实生活中,需要进行判断和选择的情况是很多的如果你在家,我去拜访你如果考试不及格,要补考如果遇到红灯,要停车等待周末我们去郊游70岁以上的老年人,入公园免票选择结构:解决需要分情况处理的问题选择结构:解决需要分情况处理的问题在进行下一个操作之前先进行条件判断如何用C语言表达式正确描述这些判断条件?关系表达式,逻辑表达式如何用C语句实现这种分情况处理的算法?条件语句选择结构程序设计p C语言有两种选择语句:(1)if语句,实现两个分支的选择结构(2)switch语句,实现多分支的选择结构选择结构程序设计if语句p if语句是用来判断给定的条件是否满足 根据判定结果(真或假)决定执行给出的两种操作之一p C语言提供三种形式的if语句:(1)单分支if语句 (2)双分支if语句 (3)多分支if语句if语句(1)单分支单分支if语句语句 格式格式:if(表达式表达式)语句;语句;表达式语句真(非0)假(0)功能功能:先计算“表达式”的值,如果该值不等于0,条件为真,执行其后语句;否则,不执行其后语句。if语句(2)双分支双分支if语句语句格式:格式:if(表达式表达式)语句语句1 1;else 语句语句2;功能功能:先计算“表达式”的值,如果该值不等于0,条件为真,执行“语句1”;否则,条件为假,执行“语句2”。表达式 语句1 语句2真(非0)假(0)if语句(3)多分支多分支if语句语句格式格式:功能功能:先计算“表达式1”的值,如果真,执行“语句1”;否则,计算“表达式2”的值,如果真,执行“语句2”;,否则,“表达式n”的值,如果真,执行“语句n”;否则,执行“语句n+1”。if(表达式(表达式1)语句)语句1;else if(表达式表达式2)语句语句2;else if(表达式表达式3)语句语句3;else if(表达式表达式n)语句语句n;else 语句语句n+1;表达式1语句1真假表达式2语句2真表达式n语句n真假假语句n+1if语句注意事项(1)if(1)if语句后面的表达式必须用括号括起来语句后面的表达式必须用括号括起来。(2)(2)表达式通常是逻辑表达式或关系表达式,但也可以是表达式通常是逻辑表达式或关系表达式,但也可以是其它任何表达式,如赋值表达式等,甚至也可以是一个变其它任何表达式,如赋值表达式等,甚至也可以是一个变量。只要表达式非零时,表达式的值就为真,否则就是假。量。只要表达式非零时,表达式的值就为真,否则就是假。(3)(3)在在ifif语句的三种形式中,所有的语句应为单个语句,语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组如果要想在满足条件时执行一组(多个多个)语句,则必须把这语句,则必须把这一组语句用一组语句用 括起来组成一个复合语句。但要注意的是括起来组成一个复合语句。但要注意的是在在 之后不能再加分号。之后不能再加分号。(4)(4)在在ifif语句中,如果表达式是一个判断两个数是否相等语句中,如果表达式是一个判断两个数是否相等的关系表达式,要当心不要将的关系表达式,要当心不要将=写成了赋值运算符写成了赋值运算符=。例例例例:if x 0 if x 0 printf(“x 0”);printf(“x 0”);例例例例:if(x 0)if(x 0)printf(“x 0”);printf(“x 0”);if(a=5)语语句;句;/表达式的值永远为非表达式的值永远为非0,所以其后的语句总是要执行的所以其后的语句总是要执行的 if(b)语语句;句;/等价于等价于if(b!=0)语句;语句;例例例例:if(a b)if(a b)a+;a+;b+;b+;else else a=0;a=0;b=1;b=1;例例例例:if(a b)if(a b)a+;a+;b+;b+;else else a=0;a=0;b=1;b=1;例例例例:#include#include void main()void main()int x=0;int x=0;if(if(x=0 x=0)printf(“x=0n”);printf(“x=0n”);else else printf(“x!=0n”);printf(“x!=0n”);例例例例:#include#include void main()void main()int x=0;int x=0;if(if(x=0 x=0)printf(“x=0n”);printf(“x=0n”);else else printf(“x!=0n”);printf(“x!=0n”);运行结果:运行结果:x=0运行结果:运行结果:x!=0If嵌套语句if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;内嵌if-else内嵌if-elseif(表达式1)if(表达式2)语句1;else 语句2;内嵌if-elseif(表达式1)语句1;else if(表达式2)语句3;else 语句4;内嵌if-elseif(表达式1)if(表达式2)语句1;else 语句2;内嵌if例:例:例:例:输入两数并判断其大小关系输入两数并判断其大小关系#include#include void main()void main()int x,y;int x,y;printf(Enter integer x,y:);printf(Enter integer x,y:);scanf(%d,%d,&x,&y);scanf(%d,%d,&x,&y);if(x!=y)if(x!=y)if(x y)printf(X Yn);if(x y)printf(X Yn);else printf(X Yn);else printf(X Yn);else else printf(X=Yn);printf(X=Yn);运行运行运行运行结结结结果:果:果:果:Enter integer x,y:12,23Enter integer x,y:12,23 XY XY XY Enter integer x,y:12,12 Enter integer x,y:12,12 X=Y X=Yif_else 配对原则配对原则 if ()if ()if ()else else else 语言规定,在缺省语言规定,在缺省 时,时,elseelse总是和它上面离它总是和它上面离它最近的未配对的最近的未配对的ifif配对配对 例例:#include void main()int a=1,b=-1;if (a 0)if (b 0)a+;else a-;printf(a=%dn“,a);例例:#include#include void main()void main()int a=1,b=-1;int a=1,b=-1;if (a 0)if (a 0)if (b 0)if (b 0)a+;a+;else else a-;a-;printf(a=%dn“,a);printf(a=%dn“,a);运行结果:运行结果:运行结果:运行结果:a=0a=0运行结果:运行结果:运行结果:运行结果:a=1a=1例:例: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-else 正确配对方法:加正确配对方法:加#includevoid main()float a,b,t;scanf(%f,%f,&a,&b);if(ab)t=a;a=b;b=t;printf(%5.2f,%5.2fn,a,b);例:输入两个实数,按代数值由小到大的顺序输出这两个数。ynabt=aa=bb=t#includevoid main()float a,b;scanf(%f,%f,&a,&b);if(ab)printf(%5.2f,%5.2fn,b,a);else printf(%5.2f,%5.2fn,a,b);方法二:例:输入两个整数,按代数值由小到大的顺序输出这两个数。#includevoid main()int a,b;scanf(%d,%d,&a,&b);if(ab)a=ab;b=ba;a=ab;printf(%5d,%5dn,a,b);例:输入三个数a,b,c,要求按由小到大的顺序输出。解题思路:可以先用伪代码写出算法:if ab,a和b对换 (a是a、b中的小者)if ac,a和c对换 (a是三者中最小者)if bc,b和c对换 (b是三者中次小者)顺序输出a,b,c#include void main()float a,b,c,t;scanf(%f,%f,%f,&a,&b,&c);if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(bc)t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2fn,a,b,c);例:有一个函数 -1 (x0)编一程序,输入一个x值,输出y值。算法1:算法2:输入x 输入x若x0,则y=-1 若x0,则y=1 若x=0,则y=0输出y 若x0,则y=1 输出y#includevoid 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);#includevoid main()int x,y;scanf(%d,&x);if(x0)y=1;printf(x=%d,y=%dn,x,y);条件运算符条件运算符p 格式:表达表达1?表达式表达式2:表达式表达式3p 功能:判断表达式1的值,如果成立就执行表达式2,否则,就执行表达式3p 使用场合:若在if语句中,当被判别的表达式的 值为“真”或“假”时,都执行一个赋值语 句且向同一个变量赋值时,可以用一个 条件运算符来处理。例:If(ab)max=a;else max=b;当ab时将a的值赋给max,当ab时将b的值赋给max,可以看到无论ab是否满足,都是向同一个变量赋值。可以用下面的条件运算符来处理:max=(ab)?a:b;说明:(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。(2)条件运算符优先级高于赋值运算符,低于关系运算符和算术运算符。(3)条件运算符的结合方向为“自右至左”。(4)表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。表达表达1?表达式表达式2:表达式表达式3#include void main()char ch;scanf(%c,&ch);ch=(ch=A&ch=90:printf(A);break;case score=90:printf(A);break;case score=80&score=80&score=70&score=70&score=60&score=60&score 70:printf(“E);break;printf(“E);break;default:printf(“F);break;default:printf(“F);break;case 后面包含变量后面包含变量(5)case(5)case后面的后面的“常量表达式常量表达式”仅起语句标号作用,并不进仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上不再进行标号判断,所以必须加上breakbreak语句,以便结束语句,以便结束switchswitch语句。语句。#include void main()char ch;ch=getchar();switch(ch)case Y:printf(Yesn);break;case N:printf(Non);break;case A:printf(Alln);break;default :printf(Yes,No or Alln);运行结果:运行结果:No/假设输入为:假设输入为:N N#include#include void main()void main()char ch;char ch;ch=getchar();ch=getchar();switch(ch)switch(ch)case Y:printf(Yesn);break;case Y:printf(Yesn);break;case N:printf(Non);case N:printf(Non);case A:printf(Alln);break;case A:printf(Alln);break;default :printf(Yes,No or Alln);default :printf(Yes,No or Alln);/假设输入为:假设输入为:N N运行结果:运行结果:No ALL (6)(6)多个多个casecase子句,可共用同一语句(组)。子句,可共用同一语句(组)。例:当例:当a的值是的值是1、2、3时,将时,将b的值加的值加2,当,当a的值是的值是4、5、6时,将时,将b的值减的值减2。int a,b=4;scanf(%d,&a);switch(a)case 1:case 2:case 3:b+=2;break;case 4:case 5:case 6:b-=2;break;default:b*=2;break;printf(b=%dn,b);(7)(7)case子句和default子句如果都带有break子句,那么它们之间顺序的变化不会影响switch语句的功能。#include void main()char ch;ch=getchar();switch(ch)case Y:printf(Yesn);break;case N:printf(Non);break;case A:printf(Alln);break;default:printf(Yes,No or Alln);break;#include void main()char ch;ch=getchar();switch(ch)case Y:printf(Yesn);break;default:printf(Yes,No or Alln);break;case N:printf(Non);break;case A:printf(Alln);break;(8)case子句和default子句如果有的带有break子句,而有的没有带break子句,那么它们之间顺序的变化可能会影响输出的结果。#include void main()char ch;ch=getchar();switch(ch)case Y:printf(Yesn);break;case N:printf(Non);break;case A:printf(Alln);break;default:printf(Yes,No or Alln);#include void main()char ch;ch=getchar();switch(ch)case Y:printf(Yesn);break;default:printf(Yes,No or Alln);case N:printf(Non);break;case A:printf(Alln);break;/假假设输设输入入为为:B B B B运行结果:运行结果:Yes,No or All运行结果:运行结果:Yes,No or AllNo/假假设输设输入入为为:B B B B (9)switch(9)switch语句可以嵌套。语句可以嵌套。#include void 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(a=%d,b=%dn,a,b);运行结果:运行结果:运行结果:运行结果:a=2a=2,b=1b=1(10)(10)常量和常量和casecase中间至少有一个空格,常量的后面是冒号,中间至少有一个空格,常量的后面是冒号,常量类型应与常量类型应与switchswitch后括号内表达式类型一直。后括号内表达式类型一直。例:例:已知某公司员工的保底薪水为已知某公司员工的保底薪水为500500,某月所接工程的利,某月所接工程的利润润profitprofit(整数)与利润提成的关系如下所示(计量单位:(整数)与利润提成的关系如下所示(计量单位:元)。计算员工的当月薪水。元)。计算员工的当月薪水。工程利工程利润润profit提成比率提成比率profit1000profit1000没有提成没有提成10001000profit2000profit2000提成提成10%10%20002000profit5000profit5000提成提成15%15%50005000profit10000profit10000提成提成20%20%1000010000profitprofit提成提成25%25%程序应该这样来设计:程序应该这样来设计:首先要定义一个变量用来存放员工所接工程的利润;首先要定义一个变量用来存放员工所接工程的利润;其次提示用户输入员工所接工程的利润,并调用其次提示用户输入员工所接工程的利润,并调用scanf函数接受用户输函数接受用户输入员工所接工程的利润;入员工所接工程的利润;然后根据上表的规则,计算该员工当月的提成比率。然后根据上表的规则,计算该员工当月的提成比率。最后计算该员工当月的薪水(保底薪水最后计算该员工当月的薪水(保底薪水+所接工程的利润所接工程的利润*提成比率),提成比率),并输出结果。并输出结果。#include void main()long profit;/所接工程的利所接工程的利润润 float ratio;/提成比率提成比率 float salary=500;/薪水,初始薪水,初始值为值为保底薪水保底薪水500 printf(Input profit:);/提示提示输输入所接工程的利入所接工程的利润润 scanf(%ld,&profit);/输输入所接工程的利入所接工程的利润润 /计计算提成比率算提成比率 if(profit=1000)ratio=0;else if(profit=2000)ratio=0.10;else if(profit=5000)ratio=0.15;else if(profit=10000)ratio=0.20;else ratio=0.25;salary+=profit*ratio;/计计算当月薪水算当月薪水 printf(salary=%.2fn,salary);/输输出出结结果果运行结果:运行结果:Input profit:4000 salary=1100.00方法一:使用方法一:使用if_else if语句语句#include void main()long profit;/所接工程的利所接工程的利润润 float ratio;/提成比率提成比率 float salary=500;/薪水,初始薪水,初始值为值为保底薪水保底薪水500 printf(Input profit:);/提示提示输输入所接工程的利入所接工程的利润润 scanf(%ld,&profit);/输输入所接工程的利入所接工程的利润润 /计计算提成比率算提成比率 if(profit=1000)ratio=0;if(1000 profit&profit=2000)ratio=0.10;if(2000 profit&profit=5000)ratio=0.15;if(5000 profit&profit=10000)ratio=0.20;if(10000 profit)ratio=0.25;salary+=profit*ratio;/计计算当月薪水算当月薪水 printf(salary=%.2fn,salary);/输输出出结结果果运行结果:运行结果:运行结果:运行结果:Input profit:4000 salary=1100.00方法二:使用方法二:使用ifif语句语句方法三:使用方法三:使用switchswitch语句语句算法设计要点:为使用switch语句,必须将利润profit与提成的关系转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、),如果将利润profit整除1000,则当:profit 1000 对应0、1 1000 profit 2000 对应1、2 2000 profit 5000 对应2、3、4、5 5000 profit 10000 对应5、6、7、8、9、10 10000 profit 对应10、11、12、为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可:profit 1000 对应0 1000 profit 2000 对应1 2000 profit 5000 对应2、3、4 5000 profit 10000 对应5、6、7、8、9 10000 profit 对应10、11、12、#include void main()long profit;/所接工程的利所接工程的利润润 int grade;float ratio;/提成比率提成比率 float salary=500;/薪水,初始薪水,初始值为值为保底薪水保底薪水500 printf(Input profit:);/提示提示输输入所接工程的利入所接工程的利润润 scanf(%ld,&profit);/输输入所接工程的利入所接工程的利润润方法三:使用方法三:使用switchswitch语句语句 /将利将利润润-1、再整除、再整除1000,转转化成化成switch语语句中的句中的case标标号号 grade=(profit-1)/1000;switch(grade)/计计算提成比率算提成比率 case 0:ratio=0;break;/profit1000 case 1:ratio=0.10;break;/1000profit2000 case 2:case 3:case 4:ratio=0.15;break;/2000profit5000 case 5:case 6:case 7:case 8:case 9:ratio=0.20;break;/5000profit10000 default:ratio=0.25;/10000profit salary+=profit*ratio;/计计算当月薪水算当月薪水 printf(salary=%.2fn,salary);/输输出出结结果果运行结果:运行结果:Input profit:4000 salary=1100.00例:根据用户输入的百分之成绩,按下面标准转换成五分制成绩并输出。grade=A 90 score 100 B 80 score90C 70 score 80 D 60 score 70 E 0 score 60方法1:else-if条件语句方法2:switch语句#includemain()int score;printf(“please enter score:”);scanf(“%d”,&score);if(score100)printf(“input error!n”);else if(score=90)printf(“%d-An”,score);else if(score=80)printf(“%d-Bn”,score);else if(score=70)printf(“%d-Cn”,score);else if(score=60)printf(“%d-Dn”,score);else printf(“%d-En”,score);#includemain()int score,mark;printf(“please enter score:”);scanf(“%d”,&score);mark=score=0&score=100?score/10:-1;switch(mark)case 10:case 9:printf(“%d-An”,score);break;case 8:printf(“%d-Bn”,score);break;case 7:printf(“%d-Cn”,score);break;case 6:printf(“%d-Dn”,score);break;case 5:case 4:case 3:case 2:case 1:case 0:printf(“%d-En”,score);break;default:printf(“input error!n”);例:运输公司对用户计算运费 路程(s-km)越远,每吨千米运费越低。标准如下:s250km 没有折扣250s500 2折扣500s1000 5折扣1000s2000 8折扣2000s3000 10折扣3000s 15折扣设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:fpws(1-d)分析折扣变化的规律性:折扣的“变化点”都是250的倍数在横轴上加一种坐标c,c的值为s/250。c代表250的倍数。c1,无折扣;1c2,折扣2;2c4,5;4c8,8;8c12,10;c12,15。#includevoid main()int c,s;float p,w,d,f;scanf(%f,%f,%d,&p,&w,&s);if(s=3000)c=12;else c=s/250;switch(c)case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f);结果:10,20,300freight=588000.0000例:写一程序,判断某一年是否闰年。分析:普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)用变量leap代表是否闰年的信息。若闰年,令leap=1;非闰年,leap=0。最后判断leap是否为(真),若是,则输出“闰年”信息#include int main()int year,leap;printf(enter year:);scanf(%d,&year);if(year%4!=0)leap=0;else if(year%100!=0)leap=1;else if(year%400!=0)leap=0;else leap=1;if(leap)printf(%d is,year);else printf(%d is not,year);printf(a leap year.n);return 0;if(year%4!=0)leap=010leap=11leap=0100leap=1if(year%100!=0)if(year%400!=0)本章常见错误 P97本章小结p语言提供了多种形式的条件语句以构成选择结构。if语句主要用于单向选择。if-else语句主要用于双向选择。if-else-if语和switch语句用于多向选择。p 任何一种选择结构都可以用if语句来实现,但并非所有的if语句都有等价的switch语句。switch语句只能用来实现以相等关系作为选择条件的选择结构。习题P995.15.25.35.45.65.75.85.95.10