




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 循环控制(Cycle Control)了解了解goto语句和语句和if 语句构成的循环。语句构成的循环。熟练掌握熟练掌握for循环语句、循环语句、while循环语句和循环语句和do-while循环语句,以及循环语句,以及break语句、语句、continue语句的使用。语句的使用。 熟练掌握循环结构程序设计的概念及其熟练掌握循环结构程序设计的概念及其程序编制技术。程序编制技术。void main()int i=1;long int sigma=1; while (i=10) sigma=sigma*i; i+; printf(“10!=%ldn”, sigma);sigma=1*2*3
2、*4*5*6*7*8*9*10;10!=3628800sigma思考:如果不使用long int,还可以使用什么变量类型定义sigma循环结构的程序流程是:循环结构的程序流程是:在满足给定条件时,反复执行某个程序段。在满足给定条件时,反复执行某个程序段。语言中可以用以下语句来实现循环:语言中可以用以下语句来实现循环: 用用goto语句和语句和 if 语句构成循环;语句构成循环; 用用while语句;语句; 用用do_while语句语句; 用用for语句。语句。 6.2 goto语句和goto语句构成的循环一、一、 goto 语句(语句(Goto Sentence) goto 语句为无条件转向语
3、句,其作用为:使程序的执行无条件地转移到指定处。一般形式:一般形式: goto 语句标号; 执行过程:执行过程:执行语句时,程序转移到以标号(定名规则与变量相同)为前缀的语句处继续执行。如:向前跳如:向前跳goto label;goto label;label:label:语句;语句;向后跳向后跳label:label:语句;语句;goto label;goto label;如:如: goto label_1; goto 123;说明: C语言允许在任何语句前加一个语句标号,作为语言允许在任何语句前加一个语句标号,作为goto语句的目标。给语句加标号的形式:语句的目标。给语句加标号的形式: 语
4、句标号:语句语句标号:语句 goto语句是一种非结构化语句,结构化程序设语句是一种非结构化语句,结构化程序设计方法计方法不提倡不提倡使用使用goto语句,因为滥用语句,因为滥用goto语句语句将使程序流程无规律,可读性差。但也不是绝对将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程序效率时才使禁止使用,只有在能够大大提高程序效率时才使用。用。切记:不要从循环体外跳到循环体内切记:不要从循环体外跳到循环体内!二、用二、用goto语句和语句和 if 语句语句构成循环构成循环例:计算例:计算10!并输出结果。!并输出结果。void main()int i=1, sum=1;l
5、oop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum);运行结果:10!=24320本应是:10!=3628800void main()int i=1; long sum=1;loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum);6.3 while循环语句 一般形式:一般形式: while (表达式表达式) 语句语句 执行过程:执行过程: 先计算表达式的值先计算表达式的值 ;若表达式的值为真若表达式的值为真(非非0) 时执行循环体中的语时执行循环体中
6、的语 句,然后重复上面步骤。句,然后重复上面步骤。 若表达式的值为假若表达式的值为假(0) , 则结束循环。则结束循环。例:将上面计算例:将上面计算10!并输出结果的程序用!并输出结果的程序用 while语句写出:语句写出:/用while循环语句void main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); /用goto语句 void main() int i=1; long int sum=1; loop: if (i=10) sum=sum*i; i+; goto loop;
7、printf(“10!=%ldn”,sum); 例:计算例:计算y=xnEnter the value of x and n : 2.5 4x = 2.500000; n = 4; x to power n = 39.062500void main() int count=1,n; float x,y=1.0; printf(“Enter the value of x and n : ”); scanf(“%f %d”,&x,&n); while(count=n)/测试表达式 y=y*x; count+; printf(“nx = %f; n = %d; x to power n = %fn”
8、,x,n,y); 循环结构的术语循环结构的术语 1. 循环条件循环条件: 是循环结构中的测试表达式。是循环结构中的测试表达式。如:while(i=10) 2. 循环体循环体:是在每个循环周期均要执行一次的语是在每个循环周期均要执行一次的语 句。循环体可以是任何语句,简单语句。循环体可以是任何语句,简单语句、复合语句、空语句均可以。句、复合语句、空语句均可以。如:上例while语句中用花括号括起来的复合语句。 3. 循环控制变量循环控制变量:在循环条件中控制测试条件为在循环条件中控制测试条件为真或为假的变量。真或为假的变量。如:上例while语句中使用的变量 i 。注意注意: 循环条件中的表达式
9、一般是循环条件中的表达式一般是逻辑表达式逻辑表达式或或关系关系表达式表达式,也可以是,也可以是算术表达式算术表达式(非(非0为真,为真,0为为假)。一般表达式中应含有循环控制变量。假)。一般表达式中应含有循环控制变量。 while (3)while (0)虽然从程序设计的角度上说是不合理的,但却是虽然从程序设计的角度上说是不合理的,但却是合法的。合法的。while (3) 语句 表示无限循环while (0) 语句 表示不进入循环体 要写出一个正确的循环结构,对控制变量要要写出一个正确的循环结构,对控制变量要做三方面工作:做三方面工作:控制变量赋初值控制变量赋初值;把控制变量写入正确的循环条件
10、(测试表达式);把控制变量写入正确的循环条件(测试表达式);控制变量的更新、调整。控制变量的更新、调整。 int count=1; while(count=n)/测试表达式 y=y*x; count+; 6.4 do-while循环语句 一般形式:一般形式: do 语句语句 while(表达式);表达式);分号不能少 执行过程:执行过程:执行循环体中的语句;执行循环体中的语句;计算表达式,测试循环计算表达式,测试循环 条件,为真条件,为真(非非0)则重复则重复 上面步骤,为假上面步骤,为假(0)结束循结束循 环。环。例:将上面计算例:将上面计算10!并输出结果的程序用!并输出结果的程序用do-
11、while语语句写出:句写出:/用while循环语句void main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); /用do-while循环语句void main() int i=1; long int sum=1; do sum=sum*i; i+; while (i=10); printf(“10!=%ldn”,sum); 将将while和和do-while循环做一下比较循环做一下比较:#includevoid main() int i; long sum=1; scanf(“
12、%d”,&i); while (i=10) sum=sum*i; i+; printf(“%ldn”,sum); #includevoid main() int i; long sum=1; scanf(“%d”,&i); do sum=sum*i; i+; while (i=10); printf(“%ldn”,sum); 输入:9输出:90输入:11输出:1输入:9输出:90输入:11输出:11 比较上面两个程序,虽然结构是相同的,在输比较上面两个程序,虽然结构是相同的,在输入值为有效值时结果相同,但当输入无效值时输出入值为有效值时结果相同,但当输入无效值时输出结果是不同的。为什么?结果是
13、不同的。为什么? 而do-while语句先执行循环体,然后测试循环条件。不管开始的时候测试循环条件是真是假,循环体都要执行一次。 while语句进入循环体之前,先测试循环条件,表达式必须为真;否则while循环不进入循环体,即循环体可能一次也不执行。while与与do-while的主要区别:的主要区别:6.5 forfor循环语句循环语句 一般形式:一般形式: for(表达式表达式1 ;表达式;表达式2 ;表达式;表达式3) 语句语句(循环体循环体)不能省略不能省略不能省略不能省略执行过程:执行过程: 求出表达式求出表达式1的值,若表达式的值,若表达式1是逗号表达式,则依次计算;是逗号表达式,
14、则依次计算; 对对“表达式表达式2”进行判断,为进行判断,为真转,为假则退出循环;真转,为假则退出循环;执行循环体中语句;执行循环体中语句; 执行执行“表达式表达式3”,若表达式,若表达式3是逗号表达式,则依次计算;是逗号表达式,则依次计算; 转向。转向。表达式1:变量初始化表达式2:循环控制条件测试表达式3:控制变量更新 前面已经说明,要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环条件的设置和控制变量的更新。 for语句在书写形式上正好体现了这种紧密的逻辑关系。例:将上面计算例:将上面计算10!的程序用!的程序用 for语句写出:语句写出:main() int i; long
15、sum=1; for(i=1; i=10; i+) sum=sum*i; printf(“10!=%ldn”,sum); main() int i; long sum; for(i=1,sum=1; i=10; sum=sum*i, i+) ; printf(“10!=%ldn”,sum); 空语句说明说明:表达式1:用于进入循环体之前给某些变量赋初值。 若省略,可在for语句前给变量赋初值。main() int i; long sum=1; i=1; for( ; i=10; i+) sum=sum*i; printf(“10!=%ldn”,sum); for 循环的三个表达式起着不同的作用
16、,循环的三个表达式起着不同的作用, 根据需要可以省略。根据需要可以省略。 表达式2:决定循环的条件,若省略,则为无限 循环。 如: for(i0; ;i+) 语句 for( ; ; ) 语句 for(i0;i=10;i-) 语句无限循环(死循环)表达式3:用于循环一次后对某些变量进行修改。 若省略,可在循环体内对变量进行修改。 main() int i; long sum=1; for(i=1 ; i=10 ; ) sum=sum*i; i+; printf(“10!=%ldn”,sum); for语句功能很强,其中表达式语句功能很强,其中表达式1和表达式和表达式3可以可以是逗号表达式,但为增
17、强程序的可读性,一般不要是逗号表达式,但为增强程序的可读性,一般不要把与循环无关的东西放到把与循环无关的东西放到for语句中。语句中。如:sum=1; for(i=1 ; i=10 ; i+) sum=sum*i; for(循环变量赋初值;循环条件;循环变量增值)语句for语句最简单、常用的形式如下:语句最简单、常用的形式如下: for 语句最为灵活,它完全可以代替语句最为灵活,它完全可以代替while语句。语句。如:i=1; while(i=10) sum=sum*i; i+; 等效于for(i=1;i=10;i+) sum=sum*i;6.6 三种循环语句的总结三种循环语句的总结 三种循环
18、语句共同的特点是:当循环控制条件非零时,执行循环体语句,否则终止循环。循环体循环体语句可以是任何语句,简单语句、复合语句、空语句均可以。for(expression 1) Setence 1;Setence 2;Setence 3;if(e1)S1;S2;else if(e2)S3;while和for语句先判断循环控制条件,所以它们的循环体可能一次也不执行;而do-while语句后判断循环控制条件,它至少执行一次循环体。在循环条件中或循环体内必须有使循环趋于结束的语句,否则会出现死循环等异常情况。三种循环可以处理同一问题,一般情况可以互相代替。但在实际应用中,我们要根据具体情况来选用不同的循环
19、语句。选用的一般原则如下: 如果循环次数在执行循环体之前就已确定,一般用如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确语句;如果循环次数是根据循环体的执行情况确定的,一般用定的,一般用while语句或者语句或者do-while语句。语句。 (循环次数确定例)int i,n;long sum=1;scanf(“%d”,n);for(i=1;i=n;i+) sum=sum*i;(循环次数不确定例)char cdo c=getchar(); printf(“%c”,c); while(c!=q&c!=Q);当循环体至少执行一次时,用当循环体至少执行一次时
20、,用do-while语句;反之,语句;反之,如果循环体可能一次也不执行时,用如果循环体可能一次也不执行时,用while语句。语句。 (循环体至少执行一次)/*只有当用户键入q或Q,才结束循环*/char c;do c=getchar(); printf(“%c”,c); while(c!=q&c!=Q);(循环体可能一次不执行)/*只有不是q或Q的字符才被打印*/char c;c=getchar();while (c!=q&c!=Q); printf(“%c”,c); c=getchar(); 注意:!(a&b)=!a|!b !(a|b)=!a&!b所以:c!=q&c!=Q !(c=q|c=Q
21、)6.7 循环的嵌套循环的嵌套 例:在屏幕上打印一个例:在屏幕上打印一个8行行7列的星号矩阵。列的星号矩阵。 #include void main() int i; for( i=0; i7; i+ ) printf(*); /*打印第1行星号*/ printf(n); for( i=0; i7; i+ ) printf(*); /*打印第2行星号*/ printf(n); for( i=0; i7; i+ ) printf(“*”);/*打印第8行星号*/什么叫循环嵌套?什么叫循环嵌套? 一个循环的循环体中套有另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。 一个循环外面包围一层循环称为
22、二重循环二重循环。一个循环外面包围二层循环称为三重循环重循环。一个循环外面包围多层循环称为多重循环多重循环。 while、do-while、for可以互相嵌套,自由组合。 例:将上例(打印例:将上例(打印8行行7列的星号矩形)用二重循环实现。列的星号矩形)用二重循环实现。 #include void main() int i , k; for( i=0; i8; i+ ) for( k=0; k7; k+ ) printf(*); printf(n); 例:在显示器上输出以下图案。例:在显示器上输出以下图案。 #include void main() int i ,j, k; for( i=0
23、; i6; i+ )/i=1;i7或者i=1;i=6 for(j=0;j5-i;j+) printf( ); for( k=0; k2*i+1; k+ ) printf(*); printf(n); 0123456789010 * 1 * 2 * 3 *4 *5*6.8 break 和和continue语句语句 一、break 语句语句一般形式:一般形式: break ;功能:功能:结束当前的循环语句。结束当前的循环语句。 解释:解释:break 语句一般用在循环体的条件语语句一般用在循环体的条件语 句中,其作用是当某个条件满足时用句中,其作用是当某个条件满足时用 break语语句退出句退出当
24、前当前循环语句,不再继续执循环语句,不再继续执 行剩余的几次循环。行剩余的几次循环。例:打印半径为例:打印半径为110的圆的面积,如果面积超过的圆的面积,如果面积超过100,则不再打印。,则不再打印。 #include #define PI=3.14159/符号常量main() int r; float area; for(r=1; r100.0) break;/r=6 printf(r=%2d,area=%fn,r,area); printf(now, r=%dn,r); 错误!错误!注意:注意:在嵌套循环中使用break语句,它只影响包含它的最内层循环,即程序仅跳出包围该break的那层循
25、环。 例:编写程序,输出九九乘法表。编写程序,输出九九乘法表。main( ) int i, j; printf( ); for( j=1; j= 9; j+) printf(“%3d”, j );/打印行乘数打印行乘数 printf(n); for( i=1; i= 9; i+) printf(“%3d”, i ); );/打印列乘数打印列乘数 for( j=1; ji ) break; printf(“%3d”, i*j ); printf(“n”); 运行结果:一般形式:一般形式: continue ;功能:功能:结束本次循环,进入下一个循环周期。结束本次循环,进入下一个循环周期。 解释:
26、解释:一旦执行了一旦执行了continue语句,程序就跳语句,程序就跳过循环体中位于过循环体中位于continue语句后的所有语语句后的所有语 句,句, 提前结束本次循环并开始下一次循提前结束本次循环并开始下一次循 环。环。二、continue语句语句 例:计算用户输入的所有正整数的和,忽略负数,例:计算用户输入的所有正整数的和,忽略负数,用户输入用户输入 0 时结束。时结束。 #include main() long data, sum = 0; do printf(“Please input : data=”); scanf(%ld, &data); if( data =1.e-6)/fa
27、bs()求绝对值的函数 sum=sum+t;n=n+2;sign*= -1;t=sign/n; pi=sum*4; printf(pi=%fn,pi);运行结果:pi=3.141594pi=3.141594第几个月 小兔子对数 中兔子对数 老兔子对数 总数 1 1 0 0 1 2 0 1 0 1 3 1 0 1 2 4 1 1 1 3 5 2 1 2 5 6 3 2 3 8 7 5 3 5 13. 斐波纳契斐波纳契Fibonacci数列:数列:1,1,2,3,5,8例例6.7 求斐波纳契数列:求斐波纳契数列:1,1,2,3,5,8 的前的前20个数。个数。(该数列特点:第(该数列特点:第1、2
28、两个数是两个数是1、1,从第,从第3个数个数 开始,每个数都是其前面两个数之和。)开始,每个数都是其前面两个数之和。)main() int f1=1, f2=1, i; for(i=1;i=10;i+) printf(%6d%6dn,f1,f2); f1=f1+f2; f2=f1+f2; 运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 例例6.7 求斐波纳契数列:求斐波纳契数列:1,1,2,3,5,8 的前的前40个数。个数。#includemain() long int f1=1, f2=1,
29、i; for(i=1;i=20;i+) printf(%12ld %12ld,f1,f2); if(fmod(i,2)=0) printf(n); f1=f1+f2; f2=f1+f2; 运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 2584 4181 6765 例例6.8 判断判断m是否为素数。是否为素数。#includemain() int m, i ,k; scanf(%d,&m); k=sqrt(m);/m=83,1,2,3,4,5,6,7,8,9; 10,8 for(i=2; ik) printf(%d is a prime
30、 number.n,m); else printf(%d is not a prime number.n,m);方法:用方法:用2 (m)1/2 之间的整数作为除数去整除之间的整数作为除数去整除m。例例6.9 错误处理与多次处理错误处理与多次处理tmpt=0;doif (tmpt=0) printf(请输入三角形三边长a,b,c:n);else printf(请重新输入三角形三边长a,b,c:n);scanf(%f,%f,%f,&a,&b,&c);tmpt=a+b=c|a+c=b|b+c=a&c=A& c=w&c=W&c=Z) c=c-22; printf(%c,c); A BCDEFGV W
31、 X Y Z 22 23 24 25 26China!Glmre!(第三版习题第三版习题6.3 ,书书P129;第四版习题;第四版习题5 ,书书P140 )已知:一位数码a 和要组成的最大重码数tn的位数n。 求 :各重码数的累加和sn。算法:对给定的a和n,从i=1 n 依次作:求第i个重码数tntn*10+a。 (其中tn的初值应是0)求累加和 snsn+tn。main() int sn,a,n,i,tn; long sn,tn; printf(na, n=); scanf(%d%d,&a,&n); for(tn=0,sn=0,i=1;i=n;i+) tn=tn*10+a; sn+=tn;
32、 printf(na+aa+.=%ld,sn);(第三版习题第三版习题6.7 ,书书P129 ;第四版习题;第四版习题9 ,书书P141 )已知:正整数 1n1000 求:其中的“完数”,即一个数的所有因子之和等于该数本身的数。算法:对于n=21000的每一个数,进行: 求出该数的所有因子并累加于sum(不保 存这些因子)。 (一个数n的所有因子的求法:只需用2n/2 的所有数去除n,能整除的就是其因子。) 当能满足完数条件时(sum=n),重新求 出该数的所有因子并打印。#includemain() int sum,n,i; for(n=2;n=1000;n+) sum=0; for(i=1
33、;i=n/2;i+) if(fmod(n,i)=0) sum+=i;/求出n的因子,计算其和 if(sum=n) printf(“n%d : ”,n);/打印完数for(i=1;i=n/2;i+) if(fmod(n,i)=0) printf(“%d ”,i);/重新计算n的因子,并打印输出 (第三版习题第三版习题6.11 ,书书P129P130 ;第四版习题;第四版习题13 ,书书P141 )已知:正数a和求a的算术平方根x的公式。 求 :a的算术平方根x。算法: 从键盘上输入a,并假设a的第一个根 为x=a;误差标志变量dx。 重复做: 记下上一个根x0=x; 按公式求下一个根x;x=(x+a/x)/2; 求两个根的误差绝对值dx=fabs(x-x0)。 当两次求得的根之差的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论