1、1,第四章 程序控制结构,4.1 C语言的执行语句 4.2 顺序结构 4.3 选择结构 4.4 循环结构,2,4.1 语言的执行语句,程序的结构:,3,C语句可分为以下五类: 1)表达式语句 2)函数调用语句(一般包含在表达式语句中) 3)控制语句 4)复合语句 5)空语句,程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。,4,4.1.1 表达式语句,表达式语句由表达式加上分号“;”组成。执行表达式语句就是计算表达式的值。 其一般形式为: 表达式; 例如: x=y+z; y+z; i+; x=0,y=1;,赋值语句,加法运算语句,但计算结果不能保留,无实际意义,自增1语句,i值
2、增1,逗号表达式语句,5,1、赋值语句:,由赋值表达式加上分号“;”构成的表达式语。 语法格式:变量 = 表达式; (1)赋值运算符除“=”外,还包含复合赋值运 算符。例如:a-=a*a; (2)赋值运算符右侧的表达式可以又是一个赋值表达式。例如:a=b=5*3;,等价,a=a-a*a;,等价,a=(b=5*3);,等价,b=5*3; a=b;,6,(3)赋值语句的功能与赋值表达式相同,但性质不同。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句不能出现在表达式中。例如:if (x=y+5) z=x; 语句的功能是,若表达式x=y+5大于0则z=x。if (x=y+5;
3、)0) z=x; 因为x=y+5;是语句,不能出现在表达式中。,合法,不合法,7,(4)赋值表达式的嵌套: 赋值符右边的表达式又是一个赋值表达式: 变量=(变量=表达式); 展开之后的一般形式为:变量=变量=表达式; 例如:a=b=c=d=e=5; 按照赋值运算符的右接合性,等效于:e=5; d=e; c=d; b=c; a=b;,8,(5)变量说明中给变量赋初值和赋值语句的区别: 给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。 例如:int a=5,b,c; (6)在变量说明中,不允许连续给多个变量赋初值: 如下述说明是错
4、误的:int a=b=c=5; 而赋值语句允许连续赋值: int a,b,c;a=b=c=5;,9,2、函数调用语句:,函数调用语句由函数名、实际参数加上分号“;”组成。执行函数语句就是调用函数体。 一般形式为: 函数名(实际参数表); 例如: printf(“C Program“); z=x+sin(y);,调用库函数,输出字符串,赋值语句(表达式中包含函数调用),10,4.1.2 空语句,空语句只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。 例如while(getchar()!=n);,空语句,本语句的功能是,只要从键盘输入的字符不是回车则重新输入。,11,4.1.3 复
5、合语句,复合语句把多个语句用括号括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。 例如: x=y+z;a=b+c;printf(“%d%d”,x,a);,是一条复合语句。,复合语句内的各条语句都必须以分号“;”结尾,在括号“”外不能加分号。,12,4.1.4 控制语句,控制语句用于控制程序的流程,以实现程序的各种结构方式。可分成以下三类: 1)条件判断语句:if else语句; 2)开关分支语句: switch语句; 3)循环执行语句:do while语句、while语句、for语句; 4)中止循环语句: continue语句、 break语句; 5) 无条
6、件转移语句:goto语句; 6)函数返回语句: return语句。,13,4.2 顺序结构,按照解决问题的顺序编写相应的语句,程序运行时自上而下依次执行语句 。,14,例1. 输入任意两个整数,求它们的和及平均值。#include void main( ) int num1,num2,sum;float aver;printf(“Please input two integers: n“);scanf(“%d,%d“, 输入: 30000,5005 输出:sum=35005,aver=17502.50,变量定义,输入提示,数据输入,求累计和,求平均值,输出结果,?,sum/2.0,15,例2.
7、 给定一个三位正整数,输出它的个位、十位和百位数。 数字分离方法: 百位数 m2=m/100 十位数 m1=(m-m2*100)/10 个位数 m0=m-m2*100-m1*10个位数 m0=m%10 十位数 m1=(m/10)%10 百位数 m2=m/100,百位:123/100 =1 十位:(123-1*100)/10=2 个位:123-1*100-2*10=3,个位:123%10=3 十位:(123/10)%10=2 百位:123/100=1,16,例2. 给定一个三位正整数,输出它的个位、十位和百位数。 #include void main() int m,m0,m1,m2;scanf
8、(“%d“, 输入:123 输出:1,2,3,个位:m0=123%10=3 十位:m1=(123/10)%10=2 百位:m2=123/100=1,17,例3.取一个16位的二进制数a的7、6、5、4四个位。 如16进制数: a=(a25d)16(1010001001011101)2,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,a4,(04),0000000000000000,1111111111111111,1111111111110000,0000000000001111,18,#include void main() unsigned a,b,c,d;scanf(“%
9、x“, 输入:a25d 输出: a25d5,以十六进制形式输入整数a,以十六进制形式输出a和结果d,右移4位,求低4位,19,表达式可以是任意合法表达式,后面不能加;,4.3 选择结构(if 语句),4.3.1 if语句1、单分支if: if(表达式) 语句语义:如果表达式的值为真,则执行其后的语句,否则不执行该语句。,20,例1:void main()int a,b,max;printf(“n input two numbers: “);scanf(“%d %d“,输入:23 46输出:max=46,此语句用于提示输入,max=23,max=46,21,例2:void main()int a
10、,b,c,t;printf(“n input two numbers: “);scanf(“%d %d %d “ ,输入:1,6,2输出:6 2 1,实现数的互换,功能:输入三个数,按照从大到小顺序输出,22,例3:从键盘输入一个字符,判断它是否小写字母。若是,将其转换成大写字母,否则不进行转换,作后输出该字母。 #include main() char c,a;c=getchar(); if(cz )a=c; if(c=a) a=c-32; printf(“%cn“,a); ,main() char c;c=getchar(); if(c=a)c-=32; printf(“%cn“,c);,
11、判断非小写字母情况,判断小写字母情况,只用一个单分支语句实现,23,2、双分支: if-elseif(表达式) 语句1; else 语句2; 语义:如果表达式的值为真,则执行语句1,否则执行语句2 。,后面不能加;,24,void main()int a, b;printf(“input two numbers: “);scanf(“%d %d“,输入:23 46输出:max=46,输入两个整数,输出其中大数,例4. 例1的改写,25,3、多分支if-else if : if(表达式1)语句1;else if(表达式2) 语句2;else if(表达式3) 语句3; else if(表达式m)
12、 语句m;else 语句n;,语义:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。,后面不能加;,26,此为真,做语句1,其它语句都不做,27,上面的语句为以下三种格式: 1、空语句 2、一个语句(不引起转移) 3、前后加大括号的语句(复合语句),也叫程序段,如: int a;float b;a=3;b=7.0;,;,允许在复合语句前部定义变量,只能在复合语句中使用,int a; a=3;float b;b=7.0;,变量要在最前面定义,28,ab,t=a; a=b; b=t;,a
13、b,t=a;,a=b; b=t;,使用复合语句,不使用复合语句,N,N,Y,Y,29,#include“stdio.h“void main() 输入:Achar c; 输出:This is a capital letterc=getchar();if(c=0,例5,30,4、在使用if语句中应注意以下问题: 1)在三种形式的if语句中,在if之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。 例如: if(a=5) 语句;if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。 如在: if(a=5);中表达式的值永
14、远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。,31,又如,有程序段:if(a=b)printf(“%d“,a);elseprintf(“a=0“);本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。,=为赋值运算符,比较运算符为=,32,2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。 3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在之后不能再加分号。 例如:if(
15、ab)a+;b+;elsea=0;b=10;,if(ab)a+;b+;;elsea=0;b=10;;,不能写成,33,例如条件语句:if(ab) max=a; else max=b; 可用条件表达式写为: max=(ab)?a:b;,(ab)?max=a:max=b;,(ab)?(max=a): (max=b);,用条件语句实现分支语句功能:,34,例6:计算,方法一: void main( ) float x,y;scanf (”%f ”, ,表达式,成立值为1,y=x3 ? x*x+2 : 3*x+7*x*x;,35,例7:从键盘输入任意的两个实数,按从小到大顺序输出这两个数,请编程实现。
16、 void main( ) float a,b;scanf (”%f%f ”,代替,复合语句可以定义变量,实现a与b的互换,36,a=a+b;b=a-b;a=a-bt=a;a=b;b=t,37,例8:计算,方法一: main( ) float x,y;scanf (”%f ”,1=x &可省略吗?,可以,38,方法二:,void main( ) float x,y;scanf (”%f ”, , 、 可省略,y= x1? x :( x10 ? 2*x-1 : 3*x-11);,(、)可省略,39,方法三:,if (x10) if (x1) y=x;else y=2*x-1; else y=3*
17、x-11;, 后不能加;, 、 可省略,y= x10? ( x1 ? x :2*x-1 ): 3*x-11;,(、) 可省略,40,4.3.4 if语句的嵌套,当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。 其一般形式可表示如下:if(表达式) 或 if(表达式) if 语句; if 语句; else if 语句;在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。,加;,41,其中的else究竟是与哪一个if配对呢? 是if(表达式1) 还是 if(表达式1) if(表达式2) if(表达式2
18、) 语句1; 语句1;else else语句2; 语句2; 注意:if 与else的配对关系 else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。,42,例9:写出下面两程序的输出结果,1 void main( ) int x=2,y=-1,z=2;if ( xy )if ( y0 ) z=0; else z=1;printf (”%dn”,z); 结果:,一个语句,2,43,void main( ) int a=1,b=3,c=5,d=4;if ( ab )if ( cd ) x=1;elseif ( ac )if ( bd ) x=2;else x=3;else x=6
19、;else x=7;printf (”%dn”,x);结果:,2,44,为了使逻辑关系清晰: (1)按下面所示书写程序:,void main( ) int a=1,b=3,c=5,d=4;if ( ab )if ( cd ) x=1;elseif ( ac )if ( bd ) x=2;else x=3;else x=6;else x=7;printf (”%dn”,x); ,45,(2)适当地加大括号:,x=-3;if (x0) y=1; printf (”x0,y=%dn”,y); 把上面与下面比较 x=-3; if (x=0) if (x0) y=1;printf (”x0,y=%dn”
20、,y); else y=-1;printf (”x0,y=%dn”,y); ,结果:x0,y=-1,无结果,46,例10: void main()int a,b;printf(“please input A,B: “);scanf(“%d%d“, 输入: 输出:,if(a!=b)if(ab) printf(“ABn“);else printf(“ABn“); else printf(“A=Bn“);,23 46,AB,47,例11:输入一年份,判别是否闰年。,year被4整除,真,真,真,真,假,假,假,假,year被100整除,leap=0,leap=1,leap=1,leap=0,leap
21、,year被400整除,输出闰年,输出非闰年,48,void main() int year,leap; scanf(“%d”, ,根据leap输出结果,49,4.3.2 switch语句(另一种分支语句),格式:switch(任意类型表达式) case 常量表达式1: 语句1;case 常量表达式2: 语句2; case 常量表达式n: 语句n;default: 语句n+1; 注:常量表达式中运算对象只能为常量或符号常量(整型或字符型),各个值必须互不相同 default 允许出现在前面或中间 switch(任意类型表达式) 后不带分号,任意类型表达式的计算结果取整。,不要忘 记空格,不带;
22、,50,功能:若switch后面表达式值的整数(字符常量)部分与某个case后面表达式值相等,则就执行该case后面的语句,否则就执行default后面的语句,51,例12:,void main() int a;printf(“input integer number: “);scanf(“%d“, ,输入:3,输出:WednesdaThursdayFridaySaturdaySundayerror,“case 常量表达式”相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。,5
23、2,break语句:专用于跳出switch语句,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。void main() 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;ca
24、se 7:printf(“Sundayn“);break;default:printf(“errorn“); ,53,Switch语句常用形式:,switch (任意类型表达式) case 整型或字符型常量表达式1 :语句1; break;case 整型或字符型常量表达式2 :语句2; break;case 整型或字符型常量表达式n:语句n; break;default : 语句n+1;,default后面不加 break,54,注意:,1)case后的各常量表达式的值不能相同,否则会出现错误。2)case后,允许有多个语句,可以不用括起来。3)case和default子句的先后顺序可以变动,
25、而不会影响程序执行结果。4)default子句可以省略不用。,55,例13:若有宏定义:#define k 2和定义:float w; int a=2,b;则合法的switch语句是 Aswitch (w) Bswitch (a+b) case 1.0:printf(”*n”); case 1 printf(”*n”); case 2.0:printf(”*n”); case a printf(”*n”):Cswitch (w+1) Dswitch (a) ;case k-1 :printf(”*n”); case 1: printf(”*n”);default : printf(”n”);
26、case 2:printf(”*n”);case 1+2:printf(”*n”); default : printf(”n”);,C,不能为实型,不能为变量,少;和:,不能加分号,56,例14:,先接收从键盘输入的一个等级制成绩,然后输出对应的百分制成绩。转换规则如下: A : 85100 B : 7084C : 6069D 60,57,void main( ) char grade;scanf(“%c”, ,58,例15:先接收从键盘输入的一个百分制成绩,然后输出对应的五分制成绩。转换规则如下: 90100 A8089 B7079 C6069 D60 E,59,#include void
27、main ( ) int score;printf(“nPlease input the score(0-100):“);scanf(“%d“, ,方法一,60,void main( ) int cj;printf(”Input a integer number(0-100)n”);scanf(“%d”, ,90100 A8089 B7079 C6069 D60 E,方法二,61,例16:计算器程序。用户输入运算数和四则运算符,输出计算结果。,void main()float a,b;char c;printf(“input expression: a+(-,*,/)b n“);scanf(“
28、%f%c%f“,字符常量,输入:12 + 13 输出:25.000000,62,例17:求方程ax2+bx+c=0的两个实根 #include void main( ) double a,b,c,x1,x2,disc;scanf (”%lf%lf%lf ”, ,b*b-4*a*c0, 有解,63,题目改为:求二次方程ax2+bx+c=0的两个根,a!=0, 一定有解 要认真分析题目,达到题目要求,64,void main( ) double a,b,c,x1,x2,disc,p,q; scanf (”%lf,%lf,%lf”, ,65,例18:输入某年某月某日,判断这一天是这一年的第几天,需考
29、虑闰年的情形。 注:符合以下条件之一是闰年: 能被4整除,但不能被100整除; 能被400整除。 算法分析: 以5月4日为例,先把14月份的天数加起来,然后再加上本月的4天即本年的第几天。 闰年情形只需当输入月份大于3时需要考虑。若是闰年,2月份应是29天。,66,void main ( ) int day,month,year,sum=0; scanf(“%d,%d,%d“, /*加上3月份31天*/,计算某月以前月份的总天数,67,case 3: /*判断是否闰年*/if(year%4=0 ,68,例19:运输公司对用户计算运费。路程(skm)越远,每吨千米运费越低。标准如下: S250
30、没有折扣 250s500 2%折扣 500s1000 5%折扣 1000s2000 8%折扣 2000s3000 10%折扣 3000s0 15%折扣 设每吨千米运费为p,货物重量为w,距离为s,折扣为d,则总运费为:f=pws(1-d) 输入:p、w、s,计算运费,69,用公式f=p*w*s*(1-d)计算运输费。,吨公里运价,运输距离,折扣,货重,s250(公里) d=0 250s500 d=0.02 500s1000 d=0.05 1000s2000 d=0.08 2000s3000 d=0.10 3000s d=0.15,要根据距离计算折扣d, 关键是构造switch后的 表达式,选择
31、 c=s/250来求c的值。if (s=3000) c=12;else c=s/250;,70,void main ( ) int c,s; float p,w,d,f; scanf(“%f,%f,%s“,折扣变化都是250的倍数,s250则: S250 1 250s500 1, 2) 500s1000 2,4) 1000s2000 4,8) 2000s3000 8,12) 3000s0 12,71,case 4: case 5: case 6: case 7: d=8; break; case 8: case 9: case 10: case 11: d=10; break; case 12
32、: d=15; break; f=p*w*s*(1-d/100.0) printf(“f=%f=”,f);,s250则: S250 1 250s500 1, 2) 500s1000 2,4) 1000s2000 4,8) 2000s3000 8,12) 3000s0 12,运费,72,例20:判断以下程序实现的功能: #include void main() char c;printf(“input a character: “);c=getchar();if (c=0,输入一个字符,判别该字符是数字、英文大写字母、小写字母还是其它字符。,数字,大写字母,小写字母,其它字符,73,例21: 输
33、入三角形三边长,求三角形面积。 #include #include void main() float a,b,c,s,area;scanf(“%f,%f,%f“, ,判断条件是否满足,74,例22:输入a、b、c三个整数,输出最大数和最小数。 #include void main() int a,b,c,max,min;scanf(“%d,%d,%d“, ,比较a、b两数的大小,大数赋给max,小数赋给min,若c大于max,则把c赋给max,若c比min更小则把c赋给min。,if( ab)max=a;min=b else max=b;min=a;,75,循环条件,4.4 循环控制概述,循
34、环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。语言提供的循环结构类型如下: 1)用goto语句和if语句构成循环; 2)用while语句; 3)用do-while语句; 4)用for语句;,循环体,76,语法格式: while (表达式)语句表达式值为零时,立即停止循环,4.4.1 用while语句实现循环,没有分号,77,写出下面程序的运行结果,(1) void main( ) int i=1; while(i=3) printf(”%dn”,i);i+ ; (2) void main( ) int i=1; while(i=3) ; printf(”%dn”,i);
35、i+ ;,结果 123,结果 死循环,循环体,空语句,若把上面 、 去掉也死循环,复合语句 作为循环 体语句,78,语法格式: do 语句while (表达式) ;表达式值为零时,立即停止循环,至少执行一次循环语句。,4.4.2 用do-while语句实现循环,分号,79,void main ( ) int k=1 , n=1 , sum=0 ; do sum+=n ; n+ + ; if ( sum=10 ) k=0; while ( k=1);printf ( ”sum=%dn”,sum) ; ,改为while(k=1) 死循环,0,1,1,2,3,3,6,4,10,结果: sum=10,
36、写出下面程序的运行结果,80,例:用while语句和do-while语句求,传统流程图表示算法,81,N-S图表示算法,100,82,void main() int i,sum=0;i=1; while(i=100)sum+=i; i+; printf(“%dn“,sum);void main() int i,sum=0;i=1;do sum+=i; i+; while(i=100);printf(“%dn“,sum); ,i、sum的初值为1、0 i的终值为101,运行结果:5050,sum=0+1 sum=1+2 sum=99+100,83,例:计算 p=123 n void main(
37、) int i,n;long p;scanf(”%d”, ,不用long会溢出,i、p的初值为1 i的终值为n+1,p=1*1 p=1*2 p=*n,递推 算法,dop*=i;i+; while (i=n);,i=n等价于in+1,84,例:计算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t;scanf(”%d”,保证达到计算n次,t=11 2 3 S=1+1 2+1 2 3+ ,while (i=n) t*= i ; s+=t ; i+ + ; ,85,例:统计从键盘输入一行字符的个数。,#include void main() int
38、 n=0;printf(“input a string:n“);while(getchar()!=n) n+;printf(“%d“,n);,只要从键盘输入的字符不是回车就继续循环,完成对输入字符个数计数。,输入:ascdf 输出:5,86,例:计算: #include #include void main() int i=1,n;double pi;scanf(“%d“,i=1,pi=1.0; i=2,pi=1.0+1.0/(2*2); i=3,pi=1.0+1.0/(2*2)+1.0/(3*3); i=4,i=3不满足,停止循环,改为1/(i*i) 出错,为什么?,输入3,87,例:求,#
39、include void main() int s;float n,t,pi=0;t=1;pi=0;n=1.0;s=1;do pi=pi+t;n=n+2;s=-s; t=s/n; while(fabs(t)1e-6);pi=pi*4; printf(“pi=%10.6fn“,pi);,分母每次增加2 单项的符号变化 单项的值t=s/n,循环结束条件是运行某一个精度:最后一项的值小于10-6,fabs(t)1e-6来控制循环是否结束。,88,1、while语句中的表达式一般是关系表达或逻辑表达式,也可以是其它表达式,只要表达式的值为真(非0)即可继续循环。 例:void main() int a
40、=0,n; printf(“n input n: ”); scanf(“%d“,执行n次,每执行1次,n减1。,(a*2;a+),输入: 8,输出: 0 2 4 6 8 10 12 14,89,2、while和do-while循环比较: void main() int sum=0,i;scanf(“%d”, ,do sum=sum+i; i+; while(i=10);,输入:8,输入:11,sum=0,sum=11,90,3、不管是while循环,还是do-while循环,在循环体内必须要有能够改变循环条件的语句,否则将构成死循环。 4、循环条件设置要合理,否则也将构成死循环。 5、不管是w
41、hile循环还是do-while循环,循环体如果包含一个以上的语句,都应以复合语句的形式出现。,91,i=1; sum=0; while(i=10)sum+=I;i=1;sum=0; while(i=10)sum+=I;i+; i=100; sum=0; while(i=10)sum+=I;i+;,i为循环变量,没有改变循环i的语句 ,条件一直满足,死循环,循环体,复合语句,执行到 i=11 停止,条件不满足,循环体语句不执行,sum为: 0+1 1+2 3+3 +10,92,4.4.3 用for 语句实现循环,语法格式:for (表达式1;表达式2;表达式3) 语句 要正确表达循环结构应注意
42、三方面要求: 1、循环控制变量的初始化。 2、循环的条件。 3、循环控制变量的值的更新,for语句在书写形式上集中体现了这三方面要求,93,功能:,for语句完全可以取代 while 语句。for(表达式1;表达式2 ;表达式3) 语句 执行过程: 1)先求解表达式1。 2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行第3)步;若其值为假(0),则结束循环,转到第5)步。 3)求解表达式3。 4)转回第2)步继续执行。 5)循环结束,执行for语句下面的一个语句。,94,95,例:求 void main() int i,sum=0;i=1;do sum+=i;
43、i+; while(i=100);printf(“%dn“,sum); void main() int i,sum=0;for(i=1;i=100;i+)sum+=i; printf(“%dn“,sum); ,96,例:计算 p=123 n void main( ) int i,n;long p;scanf(”%d”, ,for(i=1 , p=1 ; i=n ; i+)P*=i;,中间用逗号,for(i=1 , p=1 ; i=n ; P*=i, i+);,97,例:计算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t;scanf(”%d
44、”,for (i=1, t=1, s=0 ; i=n ; i+)t*= i ; s+=t;,i=1;t=1; s=0; for (; i=n ; i+)t*= i ; s+=t;,i=1;t=1; s=0; for (; i=n ; t*= i , s+=t,i+);,98,for语句形式: for(循环变量赋初值;循环条件;循环变量增量) 语句,总是一个赋值语句, 它用来给循环控制变量赋初值,总是一个表达式, 它用来判别循环是否终止,定义循环控制变量每循环一次后按什么方式变化,这三个部分之间用“;”分开,99,对于for循环中语句的一般形式,for(表达式1;表达式2 ;表达式3) 语句 就
45、是如下的while循环形式: 表达式1;while(表达式2)语句表达式3;,100,例:写出下面程序的输出结果 #include void main ( ) char c; for ( ; (c=getchar() -#; ) putchar( c ); ,c为#,值为0,结束,可以是任意表达式,输入: a56*3h#hj$,输出: a56*3h,101,例:统计从键盘输入一行字符的个数,以回车结束。 #include void main() int n;char c;printf(“Input a string: n“);for(n=0; (c=getchar()!=n ;n+) ;pri
46、ntf(“%d“,n); ,意义是:从键盘输入一个字符并赋值给变量c,将c与字符n比较,不一样就继续循环。,完成对输入字符个数计数,循环体是空语句,输入:Abg23bs 输出:7,102,例:下面程序的输出结果是 void main ( ) int x=10,y=10,i; for ( i=0;x 8;y= +i ) printf (”%3d%3d” ,x-,y) ; A 10 1 9 2 B 9 8 7 6 C 10 10 9 1 D 10 9 9 0,表达式1只做一次,9,1,8,C,2,103,注意:,1)for循环中的“表达式1”、“表达式2(循环条件)”和“表达式3” 可以缺省,但“;”不能缺省。 2)省略了“表达式1”, 表示不对循环控制变量赋初值,可在for循环里面或外面对其赋初值。例如: i=1; for(;i=20;i+)scanf (”%f ”,