版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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*4*5*6*7*8*9*10;,10!=3628800,sigma,思考:如果不使用long int,还可 以使用什么
2、变量类型定义sigma,循环结构的程序流程是: 在满足给定条件时,反复执行某个程序段。,语言中可以用以下语句来实现循环: 用goto语句和 if 语句构成循环; 用while语句; 用do_while语句; 用for语句。,6.2 goto语句和goto语句构成的循环,一、 goto 语句(Goto Sentence),goto 语句为无条件转向语句,其作用为:使程序的执行无条件地转移到指定处。,执行过程:执行语句时,程序转移到以标号(定名规则与变量相同)为前缀的语句处继续执行。,如:向前跳 goto label; label:语句; 向后跳 label:语句; goto label;,如:
3、goto label_1; goto 123;,说明:, goto语句是一种非结构化语句,结构化程序设计方法不提倡使用goto语句,因为滥用goto语句将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程序效率时才使用。,切记:不要从循环体外跳到循环体内!,二、用goto语句和 if 语句构成循环,例:计算10!并输出结果。,void main() int i=1, sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum); ,运行结果:10!=24320,本应是:10!=3628800,v
4、oid main() int i=1; long sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); ,6.3 while循环语句,例:将上面计算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
5、 (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); ,例:计算y=xn,Enter the value of x and n : 2.5 4 x = 2.500000; n = 4; x to power n = 39.062500,void main() int count=1,n; float x,y=1.0; printf(“Enter the value of x and n : ”); scanf(“%f %d”, ,循环结构的术语,1. 循环条件: 是循环结构中的测试表达式。,如:while(i=10),2. 循环体:
6、是在每个循环周期均要执行一次的语 句。循环体可以是任何语句,简单语 句、复合语句、空语句均可以。,如:上例while语句中用花括号括起来的复合语句。,3. 循环控制变量:在循环条件中控制测试条件为 真或为假的变量。,如:上例while语句中使用的变量 i 。,注意: 循环条件中的表达式一般是逻辑表达式或关系表达式,也可以是算术表达式(非0为真,0为假)。一般表达式中应含有循环控制变量。 while (3) while (0) 虽然从程序设计的角度上说是不合理的,但却是合法的。,while (3) 语句 表示无限循环 while (0) 语句 表示不进入循环体,要写出一个正确的循环结构,对控制变
7、量要做三方面工作: 控制变量赋初值; 把控制变量写入正确的循环条件(测试表达式); 控制变量的更新、调整。,6.4 do-while循环语句,分号不能少,例:将上面计算10!并输出结果的程序用do-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); prin
8、tf(“10!=%ldn”,sum); ,将while和do-while循环做一下比较:,#include void main() int i; long sum=1; scanf(“%d”, ,#include void main() int i; long sum=1; scanf(“%d”, ,输入:9 输出:90,输入:11 输出:1,输入:9 输出:90,输入:11 输出:11,比较上面两个程序,虽然结构是相同的,在输入值为有效值时结果相同,但当输入无效值时输出结果是不同的。为什么?,while与do-while的主要区别:,6.5 for循环语句,一般形式:,for(表达式1 ;表
9、达式2 ;表达式3) 语句(循环体),表达式1:变量初始化 表达式2:循环控制条件测试 表达式3:控制变量更新,前面已经说明,要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环条件的设置和控制变量的更新。 for语句在书写形式上正好体现了这种紧密的逻辑关系。,执行过程:, 求出表达式1的值,若表达式1是逗号表达式,则依次计算; 对“表达式2”进行判断,为真转,为假则退出循环; 执行循环体中语句; 执行“表达式3”,若表达式3是逗号表达式,则依次计算; 转向。,例:将上面计算10!的程序用 for语句写出:,main() int i; long sum=1; for(i=1; i=10
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 循环的三个表达式起着不同的作用, 根据需要可以省略。,表达式
11、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可以是逗号表达式,但为增强程序的可读性,一般不要把与循环无关的东西放到for语句中。,如:sum=1; for(i=1 ; i=1
12、0 ; i+) sum=sum*i;, for 语句最为灵活,它完全可以代替while语句。,如:i=1; while(i=10) sum=sum*i; i+; ,等效于,for(i=1;i=10;i+) sum=sum*i;,6.6 三种循环语句的总结,三种循环语句共同的特点是:当循环控制条件非零时,执行循环体语句,否则终止循环。,循环体语句可以是任何语句,简单语句、复合语句、空语句均可以。,for(expression 1) Setence 1; Setence 2; Setence 3; ,if(e1) S1; S2; else if(e2) S3;,while和for语句先判断循环控制
13、条件,所以它们的循环体可能一次也不执行;而do-while语句后判断循环控制条件,它至少执行一次循环体。 在循环条件中或循环体内必须有使循环趋于结束的语句,否则会出现死循环等异常情况。 三种循环可以处理同一问题,一般情况可以互相代替。但在实际应用中,我们要根据具体情况来选用不同的循环语句。选用的一般原则如下:,如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do-while语句。,(循环次数确定例) int i,n; long sum=1; scanf(“%d”,n); for(i=1;i=n;i+) sum=sum*i
14、;,(循环次数不确定例) char c do c=getchar(); printf(“%c”,c); while(c!=q,当循环体至少执行一次时,用do-while语句;反之,如果循环体可能一次也不执行时,用while语句。,(循环体至少执行一次) /*只有当用户键入q或Q,才结束循环*/ char c do c=getchar(); printf(“%c”,c); while(c!=q,(循环体可能一次不执行) /*只有不是q或Q的字符才被打印*/ char c; c=getchar(); while (c!=q ,注意:!(a for( i=0; i7; i+ ) printf(*);
15、 /*打印第1行星号*/ printf(n); for( i=0; i7; i+ ) printf(*); /*打印第2行星号*/ printf(n); for( i=0; i7; i+ ) printf(“*”);/*打印第8行星号*/ ,什么叫循环嵌套?,一个循环的循环体中套有另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。,一个循环外面包围一层循环称为二重循环。 一个循环外面包围二层循环称为三重循环。 一个循环外面包围多层循环称为多重循环。,while、do-while、for可以互相嵌套,自由组合。,例:将上例(打印8行7列的星号矩形)用二重循环实现。,#include main(
16、) int i , k; for( i=0; i8; i+ ) for( k=0; k7; k+ ) printf(*); printf(n); ,例:在显示器上输出以下图案。,#include main() int i ,j, k; for( i=0; 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); ,0 * 1 * 2 * 3 * 4 * 5*,6.8 break 和continue语句,一、break 语句,功能:结束当前的循环语句。,解释:
17、break 语句一般用在循环体的条件语 句中,其作用是当某个条件满足时用 break语句退出当前循环,不再继续执 行剩余的几次循环。,例:打印半径为110的圆的面积,如果面积超过100,则不再打印。,#include #define PI=3.14159/符号常量 main() int r; float area; for(r=1; r100.0) break;/r=6 printf(area=%fn,area); printf(now, r=%dn,r); ,注意:在嵌套循环中使用break语句,它只影响包含它的最内层循环,即程序仅跳出包围该break的那层循环。,例:编写程序,输出九九乘法
18、表。 main( ) int i, j; for( i=1; ii ) break; printf(“%3d”, i*j ); printf(“n”); ,运行结果: 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81,功能:结束本次循环,进入下一个循环周期。,解释:一旦执行了continue语句,程序就跳 过循环体中位于该语句后的所有语句, 提前结束本次循环并开始下一次循环。,二、continue语句,
19、例:计算用户输入的所有正整数的和,忽略负数,用户输入 0 时结束。,#include main() long data, sum = 0; do printf(“Please input : data=”); scanf(%ld, ,注意continue语句用于各种循环语句的情况,a) while(test-condition) - if(-) continue; - - c) for(初始化; 测试表达式;增量表达式) - if(-) continue; - - b) do - if(-) continue; - - while(test-condition);,注意break语句用于各种循
20、环语句的情况,a) while(test-condition) - if(-) break; - - c) for(初始化; 测试表达式;增量表达式) - if(-) break; - - b) do - if(-) break; - - while(test-condition); - d) for(-) - for(-) - if(-) break; - - ,6.9 程序举例,例6.6 用/41-1/ 3+1/5-1/7+1/9 求的近似值。 直到最后一项的绝对值小于10-6为止。,#include math.h main() int sign=1; float n=1,t=1,sum=
21、0, pi; while(fabs(t)=1.e-6)/fabs()求绝对值的函数 sum=sum+t; n=n+2; sign*= -1; t=sign/n; pi=sum*4; printf(pi=%fn,pi); ,运行结果: pi=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
22、两个数是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个数。,#include main() long int f1=1, f2=1, i; for(i=1;i=20;i+) printf(%12ld %12l
23、d,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是否为素数。,#include main() int m, i ,k; scanf(%d, ,方法:用2 (m)1/2 之间的整数作为除数去整除m。,例6.9 求出100200以内的所有素数。,main() int m , k,i ,n=0; for(m=101;m=k+1) printf( %d,m); n=n+1; if(
24、n%10=0) printf(n); printf(n); ,例6.10 译密码。密码规律为每个字母用其后 第四个字母代替,26个字母循环排列。,#include stdio.h main() char c,c1; while(c=getchar()!=n) if(c=a ,A BCDEFGV W X Y Z 22 23 24 25 26,China! Glmre!,习题6.3 (看书P120),已知:一位数码a 和要组成的最大重码数tn的位数n。 求 :各重码数的累加和sn。,算法:对给定的a和n,从i=1 n 依次作: 求第i个重码数tntn*10+a。 (其中tn的初值应是0) 求累加和
25、 snsn+tn。,main() int sn,a,n,i,tn; long sn,tn; printf(na, n=); scanf(%d%d,for(tn=0,sn=0,i=1;i=n;i+) tn=tn*10+a; sn+=tn; printf(na+aa+.=%ld,sn); ,习题6.7 (看书P120),已知:正整数 1n1000 求:其中的“完数”,即一个数的所有因子之和等于该数本身的数。,算法:对于n=21000的每一个数,进行: 求出该数的所有因子并累加于sum(不保 存这些因子)。 (一个数n的所有因子的求法:只需用2n/2 的所有数去除n,能整除的就是其因子。) 当能满足
26、完数条件时(sum=n),重新求 出该数的所有因子并打印。,#include main() int sum,n,i; for(n=2;n=1000;n+) sum=0; for(i=1;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 (看书P120P121),已知:正数a和求a的算术平方根x的公式。 求 :a的算术平方根x。 算法: 从键盘上输入a,并假设a的第一个根 为x=a;误差标志变量dx。 重复做: 记下上一个根x0=x; 按公式求下一个根x;x=(x+a/x)/2; 求两个根的误差绝对值dx=fabs(x-x0)。 当两次求得的根之差的绝对值(精度) dx=0.00001时停止。X即为所求平方根。,#include “math.h” main() float a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海市普陀区2024-2025学年(五四学制)七年级上学期语文期末试卷(含答案)
- 沂水五年级英语天上王城冲刺押题卷
- 2026年价格鉴证师《鉴证理论与实务》试题及答案(卷八)
- 护理质量与效果评价
- 2026年光伏发电项目租赁合同二篇
- 护理课件宝库让你的护理知识不断增长
- 护理干预对高血压肾病进展的影响
- 护理目标管理中的科研创新
- 护理目标管理与临床决策
- 护理实践中的职业防护
- 【基于Aspen Plus的环氧丙烷生产工艺流程模拟分析案例3000字】
- 2024人教版七年级英语上册知识点总结梳理
- 2024年广东省高州市事业单位公开招聘医疗卫生岗笔试题带答案
- 防撞伤安全教育
- 《移动通信发展趋势》课件
- 小学一年级数学两位数加减一位数过关练习题大全附答案
- 疾病预防控制机构业务档案管理规范
- 《内部审计学》课件:公司治理审计
- 中国糖尿病防治指南(2024版)解读
- 血管通道管理制度内容
- 2024届高考英语高频词汇分类识记清单
评论
0/150
提交评论