




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章语 句4.1.1表达式语句 表达式语句是指任何一种表达式末尾加上分号;)所组成的语句。在C语言程序中,表达式语句出现得最多,因此,有人说C语言是表达式语言。 表达式语句与表达式之间虽然只差一个分号(;),但二者是截然不同的。在程序中,有的地方需要用表达式,则不能写成表达式语句。例如,在if语句或循环语句的条件中,要求用表达式作为条件,如果写成表达式语句(即末尾加了分号),则是错误的。同样,在要求用表达式语句的地方,写成表达式(即少写一个分号),也是错误的。所以,读者一定要搞清楚何时用表达式,何时用表达式语句,二者不要搞混了。 例如, b=a+3 是一个表达式;而 b=a十3; 便是一个表达式语句,这是一个赋值表达式语句。类似地,表达式语句还有: +i; (算术表达式语句) mn7m:n; (条件表达式语句) b=5 (比较表达式语句) x&+y|Z; (逻辑表达式语); printf(0n!n) (函数调用也是表达式语句) i=a,j=5,k=7; (逗号表达式语句) 等等。 有些表达式语句虽然是合法的,例如, m n? m;n; 但是,它并没有实际意义,需要将其表达式的值赋给某个变量才有意义。例如, x=mn? m:n; 这是一个有意义的表达式语句,它将一个表达式mn? m ; n的值赋给了变量x. 虽然任何一个表达式加上分号都构成表达式语句,但在程序中要出现的是有意义的表达式语句。4.1.2 空语句 空语句是一种只有分号而没有表达式的特殊语句。空语句是c语句中最简单的语句,因为它只由一个分号(;)组成。 空语句是一种不执行任何操作的语句。说它是特殊语句是指它是一种不做事情的语句。 空语句在编程中也是有用的,它主要被用在需要一条不做事情的语句的地方。例如,它可用来作循环体,则该循环是空循环。下面是一个为了延迟一段时间的循环,其循环体可用空语句。 fori=0: i) (语句1) else if(条件2) (语句2 else if(条件3) (语句3) else if(条件N) (语句N) else (语句N+1 这是if语句的完整的格式,其中,if和。lse都是关键字。(条件1)至条件N)都是任一表达式,用来指出条件的表达式多是关系表达式和逻辑表达式,也可用其他表达式。,接着计算条件2)中表达式的值。如果其值为非零,则执行(语句2),然后执行该if语句后边语句;如果其值为零,则不执行语句2),接,计算条件3)中表达式的值,再判断,依次类推。如果N个条件对应的表达式的值全都为零,则执行语句N+1)然后执行该if语句后边的语句。如果N个条件对应的表达式中某个值不为零,则执行该条件后边的语句,然后退出if语句,即执行该if语句后边的语句。 if语句的功能可用下图所示: 2. if语句的应用 if语句在具体应用中要注意:一个if语句中只能有一个。Ise短语,也可以没有。lse短语,而且在多重嵌套的if语句中,else短语总是与它前面最近的if相匹配的。 下面通过L个具体例子说明if语句的使用。 例4.1输入两个整数,按其值由大到小顺序输出这两个数。 Main() int a,b,t, pcintf(Input a,b;), scanf (%d%d&a,&b), if(ab) t=a a=b, b=t, printf (%d,dn,a,b); 执行该程序后,屏幕显示如下提示信息: Inputa,b, 3u5 输入3和5后,按回车键3与5之间用空格符分隔,屏幕显示如下结果: 5.3 说明:该程序中使用了最简单的if语句的格式。仅有if短语和一个if体,该if体用一个复合语句,它由3条斌值表达式语句组成,其功能是实现变量a和b之间的内容的交换。交换方法是通过第3个变量t,先将a的值斌给t,再将b的值赋给a,最后将t的值赋给b.其关系如下所示: 通过上述方法使得变量a和b的值进行了交换。这是一种有用的算法,以后还会用到。 如果要求将两个整数按由小到大的顺序输出时,只需将程序中 if (ab) 改写为 if b) 其余不变。这时上例中输出结果如下: 3,5 例4.幻假设有一个物品其价格规定如下:低于5公斤(含5公斤),每公斤a元,大于5公斤不足10公斤,每公斤b元,IO公斤以上(含10公斤),每公斤。元。编程计算该物品为m公斤的价格。 main ( ) float x,p,a,b,c; printf(Input weight x:); scant( %f,&x) prints(Input price a,b,c:), scanf (%f%f%f%f,&a,&b,&c); if (x5&xb) printf (a bn); else printf (abn ); else printf (a=bn; 执行该程序输入两个lilt型数: Input a,b:-3 5 ab为。,则执行printf (abn ) ;语句,屏幕上显示ab) printf (abn). else printf (a,bn 还可以写成如下形式, if (a=b) printf (a=bn); else if (ab) printf (abn); ease printf (a=b) if(a=b prinrf (a=bn); e1Se printf ( abn); else printf(ac,hn): 还有很多其他的等价写法,这里不再一一列举。 在if语句嵌套时,如果if体或else if体或else体是一个if语句时,则应该被完全包含在体内。一般形式如下: if(条件1) if(条件23) (语句1) else 语句2) else if(条件33) (语句3) else 语句4) 这是一个if-eis.语句,该语句中if体和else体又是一个if-els.语句,应按上述形式书写。 在使用if语句时应该特别注意的是if和else的配对关系。其原则如下: 一个if语句中最多只能有一个else短语(可以没有);以最内层开始(如有嵌套),else总是与它前面最近的未曾配对的if配对。 例4.4分析下列程序输出结果。 main() int a.b; a=b=2; if b=1) if(b=i) printf (%dn,a=b); else printf(%dn ,:a-=b); printf(%dn,n+b); 该程序从表面分析看好像是一个if-else语句,而if体是一个if语句,这样分析输出结果是4.因为首先a!一l为非零,又b=1为零,则退出整个if语句,执行printf (%dn ,a+b);输出结果为4.而实际上,按照else的配对原则,该例中else应该与第二个if配对,if语句应书 写如下: if (a 1=1) if (b=1) printf( %dn,a+=b); else printf ( %dn,a一=b); 这实际上是一个简单的if语句,该if语句的if体是一个if-else语句。按这种情况,分析输出结果为: 由此可见,书写的对齐格式往往会产生误导,一定要注意书写格式正确性,同时应该牢记else的配对规则,这样可以避免误导. 如果该程序中,确要else短语与第一个if配对,那么该段程序作如下修改: if (al=1) if (b=1) printf ( %dn,a+=b); eles printf (%dn , a一=b); 这里通过加上一对花括号来改变其配对关系。4.3.2开关语句 开关语句也是一种根据条件来判断的多路分支选择语句。开关语句又称为switch语句。 1.开关语句的格式和功能 开关语句的格式如下: switch(整型表达式) case整常型表达式1):(程序段1) case(整常型表达式2):程序段2) case整常型表达式3):程序段3) case整常型表达式N):程序段N1 default:至(程序段N十1分别是由0条、1条或多条语句组成的语句序列。一般情况下,按其需要非空程序段的最后一条语句用break ;,表示退出该开关语句,执行其后面语句。如果该程序段中没有break;语句,则表示继续执行下面的程序段,直到遇到break;语句或所有程序段都执行完再退出该开关语句。 开关语句执行过程如下: 先计算switch关键字后面的整型表达式)的值,并转换成int型数。然后用该值依次顺序地与花括号内的case关键字后面的整常型表达式的值进行比较。先与的值进行比较,如果相等,则执行(程序段),其方法同于执行(程序段1;如果不等,再将整型表达式)的值与(整常型表达式3)的值进行比较,依次类推。总之,将switch语句开头的整型表达式的值依次与花括号内。ase后边的整常型表达式的值进行比较,哪个整常型表达式的值与其相等,便开始执行该整常型表达式之后对应的程序段,如果都不相等,则执行关键字default后面的程序段,如果没有default,则什么都不做,退出该switch语句。当一旦开始执行某个程序段时,当遇到break语句后,则立即退出该,witch语句,如果在整个程序段中没有break语句,则继续执行该程序段下面的程序段,同样是遇到break语句退出该、witch语句,否则再继续执行下面的程序段,直到执行完最后一个程序段遇到右花括号为止,这时退出该switch语句,这便是break语句在开关语句中的作用。 2.开关语句的应用和说明 开关语句是一个很好的多路分支选择语句,常用它来实现较为复杂的多路分支程序。下面将诵付一些佃子讲休开羊语句的具体府用。 例4.5编写一个程序,实现两个浮点数的四则运算。程序中,用d1和d2表示两个浮点数,用oP表示四则运算的运算符:+,-,*,/ 程序内容如下: main() float dl,d2; char op, printf(Input dl ,op ,d2,); scant(%f,%c,%r &d1,&op,&d2); switchCop) case+:printf (%.2f%c2%,2f=n,dl,op,d2,d1十d2); break; case-:printf (%2f%o,2f=%,2fn,dl,op,d2,d1一d2); break; case*:printf (%2f%c,0.2f -%.2fn,dl,op,d2,d1 * d2); break; case/:printf%(2f%o,2f=%,2fn,dl,op,d2,d1*d2), break; default:printf ( op is error ! n); 执行该程序出现下列提示信息: Input, dl, ap, d2.3. 5 ,4 按要求键入数据后,执行程序输出结果为: 3.50*4.00=14.00 说明:该例中使用了switch语句,共有S个分支,除了十,一,x,/外。还有一个不可识别的表达式,每个分支对应着一个程序段,除最后一个程序段外,其余4个程序段中都有break语句,这意味着执行完某个程序段后都退出switch语句,最后一个程序段没有break语句,实际上执行完该程序段后遇上了右花括号,也有退出switch语句的作用,因此最后一个程序段可以省略break语句。例4.6编写一个程序用来统计从健盘上输入的字符流中,每种数字字符、空白字符和其他字符出现的个数。 程序中将每种数字字符统计的个数存放在一个int型数组动igit中,该数组共IO个元素,用ndigit 0, ndigit 1,二分别存放数字字符0,1的个数。空白字符(包含空格符、换行符和水平制表符)个数存放在变量nwhite中,其他字符的个数存放在变量nothe,中。 程序内容如下: #irniude main() int i,c,ndigitl0,nwhite,nother, nwhite =mother=O for(i=O;i10;i+) ndigiti=0; while( e=getchar()I=EOF) switch(c) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:+nwhit; break; case u,: case t: case n:-+nwhite x break; default:十十nother printf (digiter=; for(i=O;i一&c=9) +ndigitc-0; else if(c= ) +十nwhite; else if(c=t) +nwhite; else if (c=n) +一nwhite; else +一nother; 请读者试一下,这样替代后看其结果是否相同。 switch语句中要求case短语后面是一个整常型表达式,一般只能用整数值或字符,而不允许使用关系表达式或逻辑表达式。因此,在有些情况下,需要将某种较复杂的关系转换为简单的数字,以便使用switch语句来编程,下面便是一个这方面的例子。例4.7有商场为了促销对某商品实行打折销售。具体办法如下:(假设购买商品的个数为x) x5 没折扣 5x10 1.%折扣 10x20 2%折扣 20x30) a=6; else a=x/5; switch (a ) case O:d=0. 0; break; case 1;d0.Ola break case 2: case 3:d=0, 02; break; case 4: case 5:d=0.04; break; case 6:d-O.O6; p=m*x*(1一d); printf(%.2fn,p); 执行该程序,显示如下提示信息: Input m, x:25. 5 u 28 输出结果如下: 685. 44 说明:分析题意,可看出折扣的变化是有规律的。其变化点是5的倍数,利用这一特点将购买的商品数目除以5,则分出不同折扣的档次,于是可以使用switch语句了。 本例中所用的switch语句共7不分支,5个程序段,无default短语。 在开关语句中,default短语可以有,也可以没有。如果有default短语,它可以放在开关语句的花括号内的任一位置,无论放在何处它的功能都是不变的。default后面的程序段只有在所有的整常型表达式的值都与前面的整型表达式的值不相等时才被执行。这一功能与default的位置无关。例4. 8分析下列程序的输出结果。 #include main() char c: int x,y,z; x=y=z=0 while ( (c=-getchar()=n) switch (c ) case a: case b: case c: x+ break case A: case B: case C: y+ printf(x=%d,x=%d,z=%dn,x,y,z); 当输入如下信息时, aBcDeF了 输出结果如下: x = 2,y=l,z=3 说明:该程序的,witch语句中有defauat短语,它没有放在开关语句的最后,而是放在case短语的中间,即前后各有3个case短语。读者可以验证一下,该程序中switct语句的形式与下述两种形式是等价的。 形式一: switch (c ) csse a: case h: case c:x+ break; case A case B case c:y+ break: default;z+-; 形式二: switch (c ) default:z+ break; case a case b case c:x+ break; caseA: case B case C:Y+ 可见这几种不同形式的SW1tCh语句只是区别在default短语的位置上。另外,凡是最后的一个程序段都可以省去break语句。4.4.I while循环语句1. while循环语句的格式和功能 while循环语句的格式如下: while(条件) (语句 其中,while是关键字,条件)是通过一种表达式给出的是否执行循环体的判断条件,当表达式的值为非零时,执行循环体;否则不执行循环体,退出循环,执行该循环后面的语句。常用的作为条件的表达式是关系表达式或逻辑表达式,也可以用其他表达式或常量。当使用赋值表达式时,有些编译出现警告错。语句)是循环体,它可以是一条语句,也可以是复合语句。如果在while循环头下面有花括号,则循环体将是由花括号括起的复合语句。如果在while循环头下面无花括号,则循环体将是一条语句,其余语句是循环语句后面的语句。 while循环语句执行过程如下: 先计算由条件给出的表达式的值,如果该表达式的值为非零,则执行循环体的语句;否则退出循环,不执行循环体,而执行该循环语句后面的语句。while语句的执行过程可由下图表示: 可见,该种循环可能由于条件不满足一次循环体都不执行。2. while循环语句的应用和说明 下面通过具体实例进一步说明二hile循环语句的应用。 例4.编程计算1-100自然数之和。 main() tnt i一1,sum一O While(i=100) Sun+一i; i+ printf (%dn , sum ); 执行该程序输出结果如下: 5050 说明:该程序中,循环条件是一个关系表达式i=100,当该表达式值为1时,执行循环体,当表达式值为。时。退出循环,执行循环语句后面的printf ( )语句。该循环的循环体是一个复合语句,因为它是由两条语句组成的。该循环体可以进一步简化为由一条语句组成,即可写成如下形式: while (I=100) sum十=i+; 请读者验证一下,这种形式是正确的。4.4.2 do-while循环语句 1. do-vVhile循环语句的格式和功能 do while循环语句的格式如下; do(语句) while(是循环体,它可以是一条语句,也可以是复合语句。条件)将由任一表达式给出,常用的是关系表达式或逻辑表达式,也可以是其他表达式和常量。如果是赋值表达式,有些编译会发生警告错。 do-while语句的执行过程如下: 先执行一次循环体的语句,再计算条件所指定的表达式的值,如果表达式值为非零,则再执行循环体,否则退出循环,执行该循环语句后面的语句。该种循环不管条件如何,总是要执行一次循环体的,这便是do-while循环语句的特点:该语句的执行过程由下图所示: do-while循环语句可以用前面讲过的while循环语句表示,具体格式如下: while(条件) 2. do-while语句的应用和说明 下面举例说明do-while语句的应用。 例4.10们编程计算1-10.自然数之和。 main ( ) int i=l,sum=0; do Sum+-=i+; wliile(i=100), printf (%dn ,sum, 执行该程序输出结果与例4. 9程序的输出结果相同。 说明:使用o-while语句时,为了提高可读性,在书写时总是习惯于将循环体用一对花括号括起来,whit.关键字写在右花括号的后面,就是单条语句作循环体也加上花括号,本例就是如此。另外,需要注意的是在while关键字后面的(条件)后面要加一个分号,该分号不可省去。 该例中do-while循环语句可写成如下的while语句的格式: sum十=i+ while (i0) do( printf ( % 4d ,i一一); while(i2); i+ printf (n), 执行该程序输出结果如下: 4 3 2 1 0 说明:本例程序中,while循环语句的循环体中有一个do-while语句,这便是循环语句的嵌套。执行该程序,作while循环时,i一一.为1,则执行循环体,再执行do-while语句时,先作循环体,输出i-一的值为4,同时i变成3,判断循环条件时,ii2为1,又执行一次do-while循环体,输出i_-一的值为3,同时i变成4再判断循环条件时,i2值为7退出do-while循环,执行i十+;语句,这时i的值为3,再判断whsle的循环条件时,i一一0值为1,这时i变成2,再作do-while循杯的循环体,输出i一一的值为2,而i变成1,判断do-while循环条件时,i32值为0,接着执行1十十后,1变成2.再判断While循环条件时,1一一o值为1,这时i变成1,再作do-while循环的循环体,输出i一一的值为1,而i变成。,判断do-while循环条件时,i2值为d,接着再执行i十+后,i变成1.再判断while循环条件时,i一一0为1,i变成。,再作do-while循环的循环体,输出i一一的值为。,而i变成一1,判断do-while循环条件时,i2值为0,接着执行i十十后,i变成为再判断while循环条件时,i一一0的值为。,则退出while循环语句,结束该程序。所以,多次循环输出结果为4 3 2 1 0这里,while语句共循环4次,do-while循环语句除了第一次while循环时执行2次循环体(输出4和3)外,以后3次while循环时,它每次仅执行一次循环体,分别输出2 1和04.4.3 for循环语句 1. for循环语句的格式和功能 for循环语句的格式如下: for((表达式1);(表达式2);表达式3) (语句) 其中,for是关键字。(表达式f),表达式2)和(表达式3)是任意表达式,也可以是逗号表达式;语句)为循环体,它可以是一条语句,也可以是复合语句,还可以是空语句。 for循环语句的执行过程如下: 先计算表达式1)的值,再计算的值。然后再计算表达式2i的值,再进行判断是退出循环还是继续执行循环体,重复上述操作,直到退出循环语句为止ofo:循环语句执行过程如下图所示; for循环语句也可以写书成while循环语句的形式。下面便是由while循环语句写成的for循环语句形式: dl; whitel(d2) (语句) d3; 因此,任一的for循环语句格式都可用while循环语句来替代。反之,也可以。 2.for循环语句的应用和说明 for:循环语句具有以下特点: (1)已知循环次数的循环使用该语句比较方便,对于事先难以确定循环次数的循环用此语句有时不方便。 (2)该种循环语句格式比较灵活,丈表达式1,表达式2和可以移出for循环语句循环头后面的圆括号,而放到其他合适位置。表达式移出后,其分号仍然保留,不得省去。在一般情况下,(表达式I)给出循环变量的初始值,它只计算一次,有时可放在for循环语句之前。给出循环变量的改变量,即增量,每次执行完循环体后,都要计算该表达式,改变循环变量的值。另外,这三个表达式都可以是逗号表达式。 下面通过具体实例来说明for循环语句的特点。例4. 12 编程计算110自然数之和。下面给出5种不同格式的for循环语句,各程序执行结果都是相同的。 程序一: main) int i,sum二0; for(i=l:i=10:i+) sum+=i; printf ( 0 0 din ,sum), 程序二: main() int i=l,sum=0. for t;iC=10:i+) sum十=i; printf( %dn,sum); ) 程序三: main ( ) int i=1 sum=0 for(;i10) break, printf ( %dn ,sum); 程序五 main() int i,sum; for (i=l,sum=O;i=10;sum+=i.i+) printf( %dn,sum); 说明;从该例中可以看出for循环的各种不同的格式,使用中可以灵活选择。(1) far语句一般形式中的若表达式1)可以省略。此时可以省略,即将循环变量增量的操作放在循环体内进行,本例中程序三便属于此类情况。 (4)(表达式1不仅可以设置循环变量的初值,同时还可以通过逗号表达式设置一些其他值。类似地,(表达式2)和(表达式3)都可以这样,正如本例中程序五所示。 for循环可以与其他循环嵌套,它自身也可以嵌套,下面举例说明。例4.13编程求出下列式子中M和N的值。 程序内容如下: main ( ) int m,n.k; for(m=1;m10;m+) for(n=l;n10,n+) k= (10*m+n),(lo*n+m): if(k=6786) printf(M= %d,N=%dn,m,n); 执行该程序输出结果如下: M=7,N=8 MT8,N=7 说明:该程序中使用了for循环语句的嵌套,即用for循环语句作为for循环的循环体。这称为双重for循环。前边一个称为外重循环,后面一个称为内重循环。例4. 14编程打印出下列图案。 程序内容如下: main() int i,j; for (i=l;printf(n),i=5;i+) for(j=1;ji+7;j+) if(j=1;i一一) for(j=1;j=i+6ilj+) if (j=7一i) printf (); ease printf(); printf(n ); 说明:该程序中出现了两次for的双重循环,第一次far的双重循环打印出5行图案的上部分,第二次for的双重循环打印出4行图案的下部分。另外,在最前面的一个for循环语句中,(表达式2)是一个逗号表达式,其中printf (n );语句用来实现每行换行的,在打印图案下半部分时,printf (协灼;语句放在外重循环的循环体内来实现每行换行的。 例4.15 编程求出50至lO0之间的全部素数。 所谓素数是只能被1和本身整除的数。求解方法很多,这里仅选用一种算法简单、效率较低的方法。 程序内容如下: main() int i,j,n=0; for(i=51;i=l00;i+) j=2; while i%j!=0) j+- if(j=i) if(n%6=0) printf ( n); n+ printf (%6d,i) ; ) printf ( n). 执行该程序输出如下结果: 53 59 61 fi7 71 73 79 83 $9 97 说明:该程序中for循环体内出现了while循环,这也是循环的嵌套。 求素数的方法很多,下面再给出一种比该程序中所使用的方法效率要高些的求素数方法,将上述程序重写如下: #include main() int i,j,k,n=0; for(i=51;i=100;i+=2) k= sqrt ( (double )i ); for(j=2;j=k+1) if(n%6=0) printf (n); n+, pxintf (%6d , i ); ptintf(n); 读者可以与前面程序比较一下,后一种方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中小学教师招聘考试预测题及答题技巧
- 2025年中央空调系统中级操作员考试模拟试题大全
- 抢救车核对课件
- 抢救药物速记讲解课件
- 2025年城市管道天然气项目建议书
- 抗震安全培训通知课件
- 2025年检重秤项目发展计划
- 2025年坦克玻璃系列项目合作计划书
- 2025年抗重症肌无力药项目建议书
- 黑龙江省鹤岗市绥滨县2025-2026学年八年级上学期开学考试生物试题 (含答案)
- 甲状腺癌根治术护理查房
- ttt培训课件 肯德基
- 防汛应急培训课件
- 职工小家日常管理制度
- 新生儿呼吸暂停及处理
- 校园欺凌案件管理制度
- 2025至2030年中国消防工程行业发展动态及未来前景规划报告
- 2025至2030年中国民用采暖炉行业市场行情动态及发展前景研判报告
- “十五五”城镇住房发展规划
- 药品网络交易服务三方平台质量管理体系文件-B2B平台(完整版)
- 儿童心理发展课件
评论
0/150
提交评论