1、第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.1 语句概述 语句是程序的重要组成部分,它代表程序执行的步骤,实现着程序的意图。C语言属于过程式语言,在这种语言中,围绕一个程序目标所要采取的每一步行动都必须由语句一一体现出来。简单地说,一个程序中包含了两部分信息,一部分是数据,另一部分是对数据的操作,这些操作是由语句来实现的。C语言中,语句的含义也非常广泛。任何数据成份,只要以分号结尾,就称为语句,甚至只有一个分号也称为语句(空语句)。分号是C语言中的标志。一第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 个语句可分写成多行,只要未遇到分号就认为还在同一个语句中
2、;反之,在一行中也可以写多个语句。也就是说C程序的书写是相当自由的。不过为了醒目起见,最好一行只写一条语句,并且根据不同的语法成份,错落有致地加以排列会更好地增加程序的可读性。本章我们将主要讲述选择和循环语句,这是C语言语句中的重点。在学习一种语句时,要对其使用的语法规则、语义含义等深刻理解,灵活运用。表4.1中先给出C语句的全貌。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.2 4.2 关系运算符和关系表达式关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值
3、进行比较,判断其他的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为“真”(即“条件满足”);如果a的值为2,不满足“a3”条件,则称关系表达式的值为“假”。4.2.1 4.2.1 关系运算符及其优先次序关系运算符及其优先次序C语言提供6种关系运算符:(小于)(大于)=(大于或等于)=(等于)!=(不等于)第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 关于优先次序:(1)前4种关系运算符(,=)的优先级别相同,后两种也相同。前4种高于后2种。例如,”与“a+b 等效于c(a+b)ab=
4、c 等效于(ab)=ca=bc 等效于a=(bc 等效于a=(bc)第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.2.2 4.2.2 关系表达式关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。例如,下面都是合法的关系表达式:ab,a+bb+c,(a=3)(b=5),ab)(b=0”的值为“真”。C语言以1代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1,则:关系表达式“ab”的值为“真”,表达式的值为1。关系表达式“(ab)=c”的值为“真(因为ab的值为第第4 4章章 选择和循
5、环结构程序设计选择和循环结构程序设计 1,等于c的值),表达式的值为1。关系表达式“b+cb d的值为1。f=abc f的值为0(因为“”运算符是自左至右的结合方向,先执行“ab”得值为1,再执行关系运算“1c”,得值0,赋给f)。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.3 4.3 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。如果ab且xy,则上述逻辑表达式的值为“真”。下面介绍C语言中的逻辑运算符和逻辑运算。4.3.1 4.3.1 逻辑运算符及其优先次序逻辑运算符及其优先次序C语言提供三种逻辑运算符:(1
6、)&逻辑与(2)|逻辑或(3)!逻辑非第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 “&”和“|”是“双目(即有两个运算对象)运算符”,如(ab)&(xy),(ab)|(xb)。逻辑运算举例如下:a&b 若a、b为真,则a&b为真(即a、b之一为假,则a&b为假)。a|b 若a、b之一为真,则a|b为真(即a、b都为假,a|b为假)。!a 若a为真,则!a为假(即a 为假,!a为真)。在 一个逻 辑 表达 式 中如 果包含 多个 逻辑运算符,如!a&b|xy&c按以下的优先次序:第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (1)!(非)&(与)|(或),即“!
7、”为三者中最高的。(2)逻辑运算符中的“&”和“|”低于关系运算符,“!”高于算术运算符。4.3.2 4.3.2 逻辑表达式逻辑表达式如前所述逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。例如:(1)若a=-3,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算得“假”,“假”以0代表。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (2)若a=-5,b=-6,则a&b的值为1。因为a和b均为非0,
8、被认为是“真”,因此a&b的值民为“真”,值为1。(3)a、b值同前,a|b的值为1。(4)a、b值同前,!a|b的值为1。(5)-10&0|2的值为1。通过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象(操作数)可以是0(“假”)或任何非0的数值(按“真”对待)。如果在一个表达式中不同位置上出现数值,应区分哪能些是作为数值或关系运算的对象,哪些作为逻辑运算的对象。例如:93&2|83”(因为关系运算符优先于&)。在关系运算符两侧的5和3作为数值参加关系第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 运算,“
9、53”的值为1。再进行“1&84-!0”的运算,8的左侧为“&”,右侧为“”运算符,根据优先规则,应先进行“”的运算,即先进行“84-!0”的运算。现在4的左侧为“”,右侧为“-”运算符,而“-”优先于“”,因此应先进行“4-!0”的运算,由于“!”的级别最高,因此先进行“!0”的运算,得到结果1。然后进行“4-1”的运算,得到结果3,再进行“83”的运算,得0,最后进行“1&0”的运算,得0。实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是任何类型的数据。可以是字符型、实型或指针型等。系统最终以0和非0来判定它们属于“真”或“假”。例如:c&d的值为1(因为c
10、和d的ASCII值都不为0,按“真”处理)。逻辑运算符的结合性:除!是右结合外&和|均为左结合如:!x等于!(!x)a|b|c等于(a|b)|c第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 程序中使用关系运算时要注意返回结果是用0、1来表示真假值不要用常规的数学知识去思考和理解。【例 4.1】#include main()int i=7mn;m=!i;n=(3i6);printf(i=%dm=%dn=%dnimn);return 0;程序运行结果为:i=7m=1n=1虽然经过!i运算但i本身的值并没有改变它返回给m的只是个中间结果.!i=!(!7)=!0=1所以m值是1;3i6
11、即376从数学上看这个不等式的结果应是假的但在C语言中却是这样处理的:第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (3i6)=(3i)6)=(16)=1事实上在这里不论i为何值3i的结果一定是0或1它们都小于6因此最后的结果为1这就是n的值。根据逻辑运算符&和|的功能及结合性对逻辑表达式进行求值的时候常用所谓“懒惰求值法”即只要能判断出逻辑表达式的真假即停止向后进行运算.“懒惰求值法”主要指:(1)a&b&c:当求得a值为假时即停止对b、c的求值因为此时已可断定整个表达式为假了;只有当a为真时才去求b只有当a、b全为真时才去求c。(2)a|b|c:当求得a值为假时即停止对b、
12、c的求值因为此时已可断定整个表达式为真了;只有当a为假时才去求b只有当a、b皆假时才去求c。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 【例4.2】#include main()int abc;a=b=c=1;+a|+b&+c;printf(1)a=%db=%dc=%dnabc);a=b=c=1;+a&+b|+c;printf(2)a=%db=%dc=%dnabc);a=b=c=1;+a&+b&+c;printf(3)a=%db=%dc=%dnabc);第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 a=b=c=-1;+a&+b|+c;printf(4)a=%d
13、b=%dc=%dnabc);a=b=c=-1;+a|+b&+c;printf(5)a=%db=%dc=%dnabc);a=b=c=-1;+a&+b&+c;printf(6)a=%db=%dc=%dnabc);return 0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 注意:输出(4)是求+a&+b|+c+a等于0仅说明不需要求b就可知+a&+b为假但还不能说整个表达式为假还必须对|后面的+c进行运算。因为|和&都是严格地按从左到右的顺序进行运算的即使它们出现在同一个表达式中也是如此当|出现在&之前时也不会因为&的优先级高而先对&的运算对象进行运算因此+a|+b&+c等同于+
14、a|(+b&+c)所以有(1)和(5)的输出结果。由关系运算符和逻辑运算符可以表示复杂的逻辑条件这在程序设计中是经常用到的.比如要表示某一年份year是否为闰年根据天文学知识只要符合下列条件之一即为闰年:(1)年份year能被4整除但不能被100整除;(2)年份year能被400整除。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 据此可以写出逻辑表达式:(year%4=0&year%100!=0)|year%400=0 根据运算符的优先级式中的括号是可以不要的加上是为了清晰。当year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。可以加一个
15、“!”用来判别非闰年:!(year%4=0&year%100!=0)|year%400=0)若表达式值为真(1),year为非闰年。也可以用下面逻辑表达式判别非闰年:(year%4!=0)|(year%100=0&year%400!=0)若表达式值为真year为非闰年。请注意表达式中右面的括弧内的不同运算符(%!=&=)的运算优先次序。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.4 4.4 选择结构的程序设计选择结构的程序设计C语言中用条件语句来设计选择结构的程序。条件语句有两个:双分支的if语句和多分支的switch语句。根据不同情况,恰当地使用它们,可以提高编程效率4
16、.4.1 if4.4.1 if语句语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。C语言提供了三种形式的if语句:1if(表达式)语句例如:if(ab)printf(%da);这种if语句的执行过程是:若表达式的值为真(非0),则执行语句;若表达式为假(0),则不执行语句,继续后面语句的执行。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 2if(表达式)语句1 else 语句2 例如:if(a500)cost=0.15;else if(number300)cost=0.10;else if(number100)cost=0.075
17、;else if(number50)cost=0.5;else cost=0;说明:(1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表 达 式 或 关 系 表 达 式。例 如:if(a=b&x=y)printf(a=bx=y);在执行if语句时先对表达式求解,若表达式值为0,按“假”处理,若表达式的值非0,按“真”处理,执行指定的语句。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 假如有以下if语句:if(10)printf(Just good);是合法的,执行结果输出“Just good”,因为表达式的值为10,按“真”处理。由此可见,表达式的类型不限于逻辑表达
18、式,可以是任意的数据类型(包括整型、实型、字符型、指针型数据)。例如,下面的if语句也是合法的:if(a)printf(%da);执行结果:输出a的ASCII码97。(2)第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。例如:if(x=0)第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 printf(The result is wrong);else printf(The result is right);这是由于分号是C语句中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。如果无此分号,则出现语法错误。但应该注意,不要误认为上面是两个语
19、句(if语句和else语句)。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。(3)在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“”将几个语句括起来成为一个复合语句。如:if(a+bc&b+ca&c+ab)s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area=%6.2fnarea);else printf(it is not a trilateraln);注意在第3行的花括号“”外面不需要再加分号。因为内是一个完整的复合语句,不需另附加
20、分号。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 【例4.3】输入两个实数,按代数值由大到小的次序输出这两个数。这个问题很简单,只需要作一次比较即可。程序如下:#includemain()float abt;scanf(%f%f&a&b);if(ab 则将a和b对换 (a是ab中的小者)如果ac 则将a和c对换 (a是ac中的小者,因此a是三者中最小者)如果bc 则将b和c对换 (b是bc中的小者,也是三者中的次小者)然后顺序输出abc即可。因此程序如下:#includemain()float abct;scanf(%f%f%f&a&b&c);if(ab)t=a;a=b;b=
21、t;/*实现a和b的互换*/第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 if(ac)t=a;a=c;c=t;/*实现a和c的互换*/if(bc)t=b;b=c;c=t;/*实现b和c的互换*/printf(%5.2f%5.2f%5.2fnabc);return 0;程序运行情况如下:9877.008.009.004if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if(表达式1)if(表达式2)语句1 else 语句2第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 elseif(表达式3)语句3 else 语句4应当注意if与e
22、lse的配对关系。else总是与它前面最近的可见的未配对的if进行配对使用。假如写成:if(表达式1)if(表达式2)语句1else if(表达式3)语句2 else 语句3编写者把else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们相距最近。因此最好使内嵌if语句也包含else部分(如嵌套的前一种形式),这样if的数目和else的数目相同,从内层到外层一一对应,不致出错。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 如果if与else的数目不一样,为实现程序设计的企图,可以加花括弧来确定配对关系,使它们不可见
23、。例如:if(表达式1)if(表达式2)语句1 (内嵌if,相对于下面的else不可见)else 语句2这时限定了内嵌if语句的范围,因此else与第一个if配对。【例4.5】有一函数:2x-1 (x0)编写一程序,输入一个x值,输出y值。分析如下:输入x第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 若x0 y=2x+1输出y或:输入x若x0 y=2x+1输出y有以下几个程序,请读者判断哪个是正确的?程序1:main()int xy;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 scanf(%d&x);if(x=0)if(x0)y=2*x+1;else y=0;
24、else y=2*x-1;程序3:将上述if语句改为:y=-1;if(x!=0)if(x0)y=2*x+1;else y=0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 程序4:y=0;if(x=0)if(x0)y=2*x+1;else y=2*x-1;只有程序1和程序2是正确的。程序3和程序4不能实现题目的要求。请注意程序中的else与if的配对关系。程序3中的else子句是和它上一行的内嵌的if语句配对,而不与第2行的if语句配对。程序3是当x不等于0且x小于0时,y等于0,这显然不符题目要求。要纠正只需在第个if语句上加一个花括号即可。为了使逻辑关系清晰,避免出错,一般
25、把内嵌的if语句放在外层的else子句中(如程序1那样),这样由于有外层的else相隔,内嵌的else不会被误认为和外层的if配对,而只能与内嵌的if配对,这样就不会搞混,如像程序3和程序4那样写就很容易出错。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 【例4.6】写程序,判断某一年是否闰年。在上一节已经介绍闰年的类别方法,据此编写程序如下:#includemain()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;第第4
26、4章章 选择和循环结构程序设计选择和循环结构程序设计 else leap=0;if(leap)printf(%d is,year);elseprintf(%d is not,year);printf(a leap year.n);return 0;5if语句中条件表达式的灵活设置因为C语言中是用非0和0来表示真假的,所以条件的表示可以有多种情况:(1)用一个数值表示条件。如:int m;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 scanf(%d&m);if(!m)printf(Yes);其中if(!m)等价于if(m=0)。再有:int m;scanf(%d&m);if(m
27、!=0)printf(Yes);其中if(m!=0)等价于if(m)。(2)将赋值运算和条件判断结合起来。如:char ch;if(ch=getchar()!=n)putchar(ch);这里先调用getchar函数,输入一个字符,赋给ch再判断ch是否为回车符,若不是回车符则将其输出。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (3)用函数调用作为条件。如:if(printf(*)printf(it is a symbaln);(4)用复合的逻辑表达式表示条件。如:if(score70&score80)printf(B);此时常犯的错误是写成数学中的不等式形式:if(70s
28、coreb)max=a;else max=b;可以下面的条件运算符来处理:max=(ab)?a:b;其中“(ab)?a:b”是一个“条件表达式”。它是这样执行的:如果(ab)条件为真,则条件表达式取值a,否则取值b。条件运算符“?:”是C语言中唯一的一个三目运算符也即它有三个运算对象,分别由“?”和“:”把它们连接起来,构成一个条件表达式。条件表达式的一般形式为:表达式1?表达式2:表达式3说明:(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。max
29、=(ab)?a:b;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。(2)条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。条件运算符的优先级别比关系运算符和算术符都低。因此max=(ab)?a:b括号可以不要,可写成max=ab?a:b如果有ab?a:b+1相当于ab?a:(b+1),而不相当于(ab?a:b)+1。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (3)条件运算符的结合方向为“自右至左”。如果有以下条件表达式:ab?a:cd?
30、c:d如果a=1,b=2,c=3,d=4则条件表达式的值等于4。(4)条件表达式还可以写成以下形式:ab?(a=100):(b=100);或ab?printf(%d,a):printf(%d,b);即“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。上面第二个条件表达式相当于以下if-else语句:第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 if(ab)printf(%d,a);else printf(%d,b);(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如x?a:bx是整型变量,若x等于0,则条件表达式的值为b。表达
31、式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如xy?1:1.5如果x则条件表达式的值为1.5,若xy值应为1,由于1.5是实型,比整型高,因此,将1转换成实型值1.0。【例 4.7】输入一个字符判别它是否大写字母如果是将它转换成小写字母;如果不是不转换.然后输出最后得到的字符。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 因为大小写字母之间的ASCII值相差32因此大小写字母之间的转换是:将小写转换成大写只要将小写字母减32即可;将大写转换成小写只需将该大写字母加32即可。可直接编写程序:#includemain()char ch;scanf(%
32、c?&ch);ch=(ch=A&ch=Z)?(ch+32):ch;printf(%c?ch);return 0;程序运行结果如下:Aa第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 【4.8】猜数游戏。程序预置一个常数(称为幻数),让用户猜测,猜对时给出正确信息,否则会给出是大了还是小了的提示。#includemain()int magic=618,guess;printf(input your guess:n);scanf(%d,&guess);if(guess!=magic)guessmagic?printf(High):printf(Low);else printf(*ri
33、ght*n);printf(%d is the magic number.n,magic);return 0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.4.3 switch4.4.3 switch语句语句switch语句是多分支选择语句。if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(85分以上为A等,7084分为B等,6069分为C等);人口统计分类(按年龄分为老、中、青、少、儿童);工资统计分类;银行存款分类。当然这些都可以用嵌套的if语句来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性降低。C语言提供swi
34、tch语句直接处理多分支选择,它的一般形式如下:switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式n:语句n default:语句n+1第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 例如要求按照考试成绩的等级打印出百分制分数段,可以用switch语句实现:switch(grade)case A:printf(85100n);case B:printf(7084n);case C:printf(6069n);case D:printf(60n);default:printf(errorn);说明:(1)switch后面括弧内
35、的“表达式”,ANSI标准允许经为任何类型。(2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (3)每一个case的常量表达式的值必须不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。(4)各个case和default的出现次序不影响执行结果。例如,可以先出现“default:”,再出现“case D:”,然后是“case A”。(5)执行完一个case后面的语句后,流程控
36、制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。例如,上面的例子中,若grade的值等于A,则将连续输出:851007084606960error第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 因此,应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。将上面的switch结构改写如下:switch(grade)case A:printf(851
37、00n);break;case B:printf(7084n);break;case C:printf(6069n);break;case D:printf(60n);break;default:printf(errorn);最后一个分支(default)可以不加break语句。如果grade的值为B,则只输出“7084”。在case后面虽然包含了一个以上执行语句,但可以不必用花括弧括起来,会自动顺序执行本case后面所有的执行语句。当然加上花括号也可以。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 (6)多个case可以共用一组执行语句。【例4.9】用switch语句输出学生
38、的分数等级。高分数小于等于90分者为A等,70分90分为B等(含70),60分70分为C(含60),60分以下为D等,分数为浮点数。编程思路:switch后的表达式必须是有序类型而且求出的结果应当是一个个离散的值,而不是一个数值范围。应该想办法把一个范围转换成一个确定的值,这是使用switch语句的关键。在这里我们可以把分数除以10再取整,即可变成离散的数值,就可以用switch语句解决了。#includemain()int i;float score;printf(input a scoren);scanf(%f,&score);i=(int)score/10;第第4 4章章 选择和循环结构
39、程序设计选择和循环结构程序设计 switch(i)case 9:case 10:printf(A);break;case 7:case 8:printf(B);break;case 6:printf(C);break;default:printf(D);break;return 0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 输入的分数是实数,但通过赋值语句就变成了整型,整型是有序类型,并且i具有有限的离散值。printf(D)语句后面可以不要break,但如果把其他地方的break全去掉,则当输入分数95.9时,会连续地输出ABCD。因此一定要注意break的使用。【例4.
40、10】运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s250km 没有折扣250s500 2%折扣500s1000 5%折扣1000s2000 8%折扣2000s3000 10%折扣3000s 15%折扣第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 设每公里每吨货物的基本运费为p(price的缩写),货物重为w(weight的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为f=p*w*s*(1-d)分析此问题,折扣的变化是有规律的:折扣的“变化点”都是250的倍数(250,500,1000,2000,300
41、0)。利用这一特点,可以设一变量c代表250的倍数,也即c的值为s/250,所以当c1时,表示s250,无折扣;1c2时,表示250s500,折扣d=2%;2c4时,d=5%;4c8时,d=8%;8c12时,d=10%;c12时,d=15%。据此写出程序如下:#includemain()第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 int c,s;float p,w,d,f;scanf(%f,%f,%f,&p,&w,&s);if(s=3000)c=12;else c=(int)s/250;switch(c)case 0:d=0.0;break;case 1:d=0.02;bre
42、ak;case 2:case 3:d=0.05;break;case 4:case 5:case 6:case 7:d=0.08;break;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 case 8:case 9:case 10:case 11:d=0.1;break;case 12:d=0.15;break;f=p*w*s*d printf(feight=%12.4fn,f);return 0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 程序运行情况如下:20,100,1002801600.0000请注意:c、s是整型变量,因此c=s/250为整数。当s3
43、000时,令c=12,而不使c随s增大,这是为了在switch语句中便于处理,用一个case可以处理所有s3000的情况。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.5 4.5 循环结构的程序设计循环结构的程序设计到目前为止我们所遇到的程序都是简单程序,解决的问题都很简单。要解决复杂问题,并充分发挥计算机快速的优势,那么程序中很可能要用到循环语句。其实在许多问题需都要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握
44、选择结构和循环结构和循环结构的概念及使用是程序设计的最基本的要求。C语言提供了三种循环语句:for语句、while语句、do_while语句。下面分别加以讨论4.5.1 while4.5.1 while语句语句while语句的基本形式为:while()第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 含义是:首先计算表达式的值,只要为真就执行循环体语句,直到表达式求值为假,然后退出循环。在循环体中,一定要对循环控制变量进行修改。其特点是:先判断表达式,后执行语句。【例4.11】求1100之间所有偶数之和。#includemain()int sum,i;sum=0;i=2;while
45、(i100”,因此在循环体中应该有使i增值以最终导致i100的语句,今用“i+;”语句来达到此目的。如果无此语句,则i的值始终不改变,循环永不结束。while语句多用在循环次数预先难以确定的循环中,如下例所示。【例4.12】输入并输出一个字符,遇“#”结束。#include main()char c;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 while(c=getchar()!=#)putchar(c);return 0;程序运行时输入:This is a string#则输出为:This is a string程序在执行时并不是输入一个字符后立即把它送到屏幕,而是先放入内
46、存缓冲区中,只有在打了回车符之后才把缓冲区里的内容一块输出。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 【例4.13】爱因斯坦阶阶梯问题。设有阶梯,不知其除数,但知:每步跨两阶最后剩1阶;每步跨3阶最后剩2阶;每步跨5阶最后剩4阶;每步跨6阶最后剩5阶;每步跨7阶正好到楼顶,求共有多少阶。编程思路:本题拟采用穷举法求解:从整数1试起,一旦发现某个整数符合所有条件限制,就算找到了答案。这样逐次加1地测试,虽然是可以的,但这未免也太机械了,我们可以根据条件,找出一个相对快捷的算法。设阶数为n,根据所给的条件有下列关系:n%2=1n%3=2n%5=4n%6=5n%7=0由可知,阶梯
47、数一定是7倍数,所以测试的初值可以从7开始并且在7的倍数14、21、28、35、中测试。第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 由知,阶梯数一定是奇数,则进一步简化测试范围在7,21,35,之中,这个数列的公差为14。对这个数列中的数值再用、式中的条件去检测,对、式全符合的数即为所求。根据上面的分析,可编程如下:#includemain()int n=7;while(n%3!=2|n%5!=4|n%6!=5)n+=14;printf(Total=%dn,n);return 0;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 程序执行输出如下:Total=11
48、9注意:while语句中表达式的写法,|是或运算符,表示只要有一个等式不成立,表达式就为真,就执行循环体,直到三个等式全成立为止。【例4.14】求两个正整数a,b的最大公约数GCD(Greatest Common Divisor)。分析:求最大公约用的是辗转相除法。即要使a除以b的余数等于0为止,若不等于0,则把余数作除数,除数作被除数,继续求余数,直到余数等于0,那么此时的除数为所求。因此写出程序如下:#includemain()第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 int a,b,t;printf(input 2 integers:n);scanf(%d%d,&a,
49、&b);if(ab)t=a;a=b;b=t;/*要使被除数比除数大*/while(b)t=a%b;a=b;第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 b=t;printf(The GCD=%dn,a);return 0;程序中while(b)等价于while(b!=0)。【例4.16】译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母殷实上述规律转换,非字母字符不变。如“China!”转换为“Glmre!”。输
50、入一行字符,要求输出其相应的密码。程序如下:#include第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 main()char c;while(c=getchar()!=n);if(c=a&c=A&cZ&cz)c=c-26;printf(%c,c);return 0;程序运行结果如下:China!Glmre!第第4 4章章 选择和循环结构程序设计选择和循环结构程序设计 4.5.2 do_while4.5.2 do_while语句语句do_while语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为do 循环体语句while(表达式);它是这样执行的:进入do_wh
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100