版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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值增1
2、,逗号表达式语句,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+
3、5;)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
5、,4.1.3 复合语句,复合语句把多个语句用括号括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。 例如: 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语句、 bre
6、ak语句; 5) 无条件转移语句: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/
7、2.0,15,例2. 给定一个三位正整数,输出它的个位、十位和百位数。 数字分离方法: 百位数 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,
8、m1,m2; scanf(%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,
9、d; scanf(%x, 输入:a25d 输出: a25d 5,以十六进制形式输入整数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:voi
10、d main() int a,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; pri
11、ntf(%cn,c);,判断非小写字母情况,判断小写字母情况,只用一个单分支语句实现,23,2、双分支: if-else if(表达式) 语句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) 语
12、句3; else if(表达式m) 语句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;,变量要在最前面定
13、义,28,ab,t=a; a=b; b=t;,ab,t=a;,a=b; b=t;,使用复合语句,不使用复合语句,N,N,Y,Y,29,#includestdio.h void main() 输入:A char c; 输出:This is a capital letter c=getchar(); if(c=0 ,例5,30,4、在使用if语句中应注意以下问题: 1)在三种形式的if语句中,在if之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。 例如: if(a=5) 语句; if(b) 语句; 都是允许的。只要表达式的值为非
14、0,即为“真”。 如在: if(a=5); 中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。,31,又如,有程序段: if(a=b) printf(%d,a); else printf(a=0); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。,=为赋值运算符,比较运算符为=,32,2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。 3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成
15、一个复合语句。但要注意的是在之后不能再加分号。 例如: if(ab) a+;b+; else a=0;b=10;,if(ab) a+;b+;; else a=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;,
16、35,例7:从键盘输入任意的两个实数,按从小到大顺序输出这两个数,请编程实现。 void main( ) float a,b; scanf (”%f%f ”,代替,复合语句可以定义变量,实现a与b的互换,36,a=a+b;b=a-b;a=a-b t=a;a=b;b=t,37,例8:计算,方法一: main( ) float x,y; scanf (”%f ”,1=x 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=
17、3*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(
18、表达式2) 语句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; else if ( ac ) if ( bd ) x=2; el
19、se x=3; else x=6; 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; else if ( 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
20、 (x0) y=1;printf (”x0,y=%dn”,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,le
21、ap=1,leap=1,leap=0,leap,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,输出: Wednesda Thursday Friday Saturday Sunday error,“case 常量表达式”相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch
23、 语句,所以出现了继续执行所有后面case语句的情况。,52,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:pr
24、intf(Saturdayn);break; case 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后,允许有多个语句,可以不用括起来
25、。 3)case和default子句的先后顺序可以变动,而不会影响程序执行结果。 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: pri
26、ntf(”*n”);default : printf(”n”); case 2:printf(”*n”); case 1+2:printf(”*n”); default : printf(”n”);,C,不能为实型,不能为变量,少;和:,不能加分号,56,例14:,先接收从键盘输入的一个等级制成绩,然后输出对应的百分制成绩。转换规则如下: A : 85100 B : 7084 C : 6069 D 60,57,void main( ) char grade; scanf(“%c”, ,58,例15:先接收从键盘输入的一个百分制成绩,然后输出对应的五分制成绩。转换规则如下: 90100 A 80
27、89 B 7079 C 6069 D 60 E,59,#include void 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 A 8089 B 7079 C 6069 D 60 E,方法二,61,例16:计算器程序。用户输入运算数和四则运算符,输出计算结果。,void main() float a,b; char c;
28、printf(input expression: a+(-,*,/)b n); scanf(%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 (
29、”%lf,%lf,%lf”, ,65,例18:输入某年某月某日,判断这一天是这一年的第几天,需考虑闰年的情形。 注:符合以下条件之一是闰年: 能被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
30、,例19:运输公司对用户计算运费。路程(skm)越远,每吨千米运费越低。标准如下: S250 没有折扣 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.
31、10 3000s d=0.15,要根据距离计算折扣d, 关键是构造switch后的 表达式,选择 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
32、8: case 9: case 10: case 11: d=10; break; case 12: 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,输入一个字符,判别该字符
33、是数字、英文大写字母、小写字母还是其它字符。,数字,大写字母,小写字母,其它字符,73,例21: 输入三角形三边长,求三角形面积。 #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)ma
34、x=a;min=b else max=b;min=a;,75,循环条件,4.4 循环控制概述,循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。 语言提供的循环结构类型如下: 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)
35、void main( ) int i=1; while(i=3) ; printf(”%dn”,i);i+ ; ,结果 1 2 3,结果 死循环,循环体,空语句,若把上面 、 去掉也死循环,复合语句 作为循环 体语句,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
36、”,sum) ; ,改为while(k=1) 死循环,0,1,1,2,3,3,6,4,10,结果: sum=10,写出下面程序的运行结果,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,运行结果:
37、5050,sum=0+1 sum=1+2 sum=99+100,83,例:计算 p=123 n void main( ) 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 ;
38、 s+=t ; i+ + ; ,85,例:统计从键盘输入一行字符的个数。,#include void main() int 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/
39、(2*2)+1.0/(3*3); i=4,i=3不满足,停止循环,改为1/(i*i) 出错,为什么?,输入3,87,例:求,#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语句中的
40、表达式一般是关系表达或逻辑表达式,也可以是其它表达式,只要表达式的值为真(非0)即可继续循环。 例: void main() int a=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-w
41、hile循环,在循环体内必须要有能够改变循环条件的语句,否则将构成死循环。 4、循环条件设置要合理,否则也将构成死循环。 5、不管是while循环还是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 +1
42、0,92,4.4.3 用for 语句实现循环,语法格式: for (表达式1;表达式2;表达式3) 语句 要正确表达循环结构应注意三方面要求: 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)循环结束
43、,执行for语句下面的一个语句。,94,95,例:求 void main() int i,sum=0; i=1; do sum+=i; 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+);,
44、97,例:计算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t; scanf(”%d”,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(循环变量赋初值;循环条件;循环变量增量) 语句,总是一个赋值语句, 它用来给循环控制变量赋初值,总是一个表达式, 它用来判别循环是否终止,定义循环控制变量每
45、循环一次后按什么方式变化,这三个部分之间用“;”分开,99,对于for循环中语句的一般形式, for(表达式1;表达式2 ;表达式3) 语句 就是如下的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()
46、int n; char c; printf(Input a string: n); for(n=0; (c=getchar()!=n ;n+) ; printf(%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
47、 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 ”,104,4)省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 例如: for(i=1;i=100; ) sum=sum+i; i+ ;,105,5)省略了“表达式1”和“表达式3”。 例如: for(;i=1
48、00;) sum=sum+i; i+; 相当于: while(i=100) sum=sum+i; i+;,106,6)3个表达式都可以省略。 例如: for(;)语句 相当于: while(1)语句 7)表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如: for(sum=0;i=100;i+)sum=sum+i;,107,8)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。 for(sum=0,i=1;i=100;i+)sum=sum+i; 或: for(i=0,j=100;i=100;i+,j-)k=i+j; 9)表达式2一般是关系表达式或逻辑表达式,但也可
49、是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如: for(i=0;(c=getchar()!=n;i+=c); 又如: for(;(c=getchar()!=n;) printf(“%c”,c);,108,例:“斐波那契数列”是意大利中世纪数学家列昂纳多斐波那契以兔子繁殖为例子而引入的:兔子在出生两个月后,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?经过分析: 经过月份:-0-1-2-3-4-5-6-7- 兔子对数:-1-1-2-3-5-8-13-21- 数字1,1,2,3,5,8,13, 构成了一个数列。,109,数字1,1,2,3,5
50、,8,13,有明显的特点: 前面相邻两项之和,构成了后一项。 我们可以得到递推公式如下: 程序运行结果为: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,110,递推过程如下: 1 1 2 3 5 第一次 x1 + x2 x1 第二次 x2 + x1 x2 第三次 x1 + x2 x1,111,void main() int i,x1=1,x2=1; for(i=1;i=10;i+) printf(”%10d %10d ”,x1,x2); if(i%2=0)printf(”n”); x1=x1+x2; x2
51、=x2+x1; ,每次生成并输出两项,所以循环10次,当i为偶数时换行,即每四个数换行,112,4.4.4 break语句和continue语句,switch 结构中的 break:提前结束该结构 循环结构中的break:提前结束该结构 (while循环、do-while循环、for循环) 循环结构中的continue:提前结束本次循环,若在多层嵌套中使用break或continue,它只影响包含它的最内层结构,113,114,break语句可以用终止循环结构,也可以终止switch结构。而continue语句只能用于循环语句中,与switch语句没有关系。 void main( ) int
52、i,a=0,b=0,c=0,d=0; for(i=1;i=4;i+) switch(i) case 1:a=1;continue; case 2:b=2; case 3:c=3; break; case 4:d=4; printf(%d%d%d%dn,a,b,c,d) ,1,1,2,2,0,0,0,3,输出:1230,0,3,3,输出:1230,0,4,4,输出:1234,1,1,2,1,2,3,115,例: 写出以下程序的运行结果: void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0)break;printf(“%4d”,n); printf(“
53、!n”); void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0) cotinue;printf(“%4d”,n); printf(“!n”);,结果:1 2!,结果:1 2 4 5 7 8 10!,116,例:输出100200之间所有能够被7或9整除的数。 。 #include void main( ) int n; for(n=100;n=200;n+) if(n%7!=0) ,不能被7或9整除,则进行下一次循环,for(i=100;i=200;i+) if(i%7=0)|(i%9=0) printf(%d n,i);,这样写逻辑更清晰,117,
54、例:将数字512表示成两个数的和,这两个数分别为15和13的倍数。 #include void main() int i; for(i=1;i+) if(!(512-i*15)%13)break; printf(%d+%d=512n,i*15,512-i*15); ,结果:135+377=512,设第一个数为i*15 则第二个数为512-i*15。设定一个循环,使i从1开始递增,直到使得512-i*15能够被13整除。,118,4.4.5 循环的嵌套,1、各种循环结构的循环体中可以包含任一种完整的循环结构、选择结构, 2、选择结构的任一分支中也可以包含任一种完整的循环结构、选择结构, 3、且它
55、们可多层嵌套。,119,例1.while (xy+z) for(k=1;k2;k+ +) if ( a5) w=1; else if ( a=5 ) switch 结构 else for (s=0,n=0;n3;n+) s+=n; ,120,例: 输出所有由1、2、3组成的三位数,111 211 311 112 212 312 113 213 313 121 221 321 122 222 322 123 223 323 131 231 331 132 231 332 133 233 333,121,void main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) printf(“%d%d%d ”,i,j,k); %d%d%d没有空格和逗号,起分隔符作用,122,改为不出现重复数字的三位数 void main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) if(i!=j ,123,改为不出现重复字母 的由X、Y、Z组成的三个子符的字符串 void main() int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年CPA《会计》模拟考试题(真题风格+答案解析)
- 设备投标项目突发疫情封控人员隔离应急预案
- 焊接与热切割作业火灾事故应急演练方案
- 动火作业监护人岗位职责及应急处置方案
- 2026年抗菌药物管理专员考核试题附带解析
- 咖啡店合作供应商管理手册
- 招商引资项目评审与落地手册
- 可降解吸管PLA挤出成型工艺
- 5.4 制作小乐器(分层作业)科学大象版四年级上册2026秋
- 2025-2026年自然灾害防范与自救测试题
- 2026年机关事业单位工勤人员计算机操作员高级工考试试题及答案
- 4、《走进新能源汽车》教案 第四章 新能源汽车的未来不是梦 4课时
- 2026年老河口市清源供水有限公司招聘9人考试备考试题及答案详解
- 急性肺栓塞诊断和治疗指南(2025 版)
- 2025年计算机一级考试操作题题库及答案
- 2026年秋季学期苏教版一年级上册数学教学计划含进度表
- 社会工作者礼仪基础培训社工培训讲座课件
- 信息系统适配验证师创新方法测试考核试卷含答案
- 2026年上半年教师资格证考试信息技术学科真题及解析附答案
- 世界十大最著名建筑师惊艳绝伦的经典作品
- 模拟政协提案范文
评论
0/150
提交评论