循环结构程序设计_第1页
循环结构程序设计_第2页
循环结构程序设计_第3页
循环结构程序设计_第4页
循环结构程序设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,C语言程序设计(电子教案),滕永晨 Tyc_T 兰州理工大学计通学院,chap04 循环结构程序设计, if与goto构成循环 while构成循环 dowhile构成循环 for构成循环 循环辅助控制语句(break和continue) 循环的嵌套结构,本章主要内容,C语言中,除了可用if与goto构成循环外,还提供while、dowhile和for三种循环语句,下面将分别介绍。,if与goto构成的循环,无条件转向语句:goto,goto语句为无条件转向语句,它使用起来十分方便,但决不可滥用。,功能:将程序控制转移到“语句标号”标识的语句执行。,格式:goto 语句标号,main( )

2、int i=1,s=0; L1: if(i=100) s=s+i; i+ ; goto L1; printf(s=%dn,s); ,零,非零,【例4-1】用if与goto语句求 。,while语句用来实现“当型”循环结构。,功能:首先求解表达式,若为真(非0)则执行循环体语句,然后,再次求解表达式,并重复前面的工作,直到表达式的值为假(0)时退出循环。,格式: while(表达式) 循环体语句; ,while 语句,【例4-2】 用while语句求 。,main( ) int i=1, sum=0; while(i=100) sum=sum+i; i=i+1; printf(sum=%dn,s

3、um); ,【例4-3 】 使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于104。 4.3.1 程序解析 4.3.2 while语句,#include #include int main(void) int denominator, flag; double item, pi; flag = 1; denominator = 1 ; item = 1.0; pi = 0; while(fabs (item) = 0.0001) item = flag * 1.0 / denominator; pi = pi + item; flag = -flag; denominator = d

4、enominator +2; pi = pi * 4; printf (pi = %.4fn, pi); return 0; ,4.3.1 程序解析求的近似值,pi = 3.141613,item=0.0 ?,fabs(item) 0.0001,【例4-4】从键盘输入一批学生的成绩,计算平均成绩,并统计不及格学生的人数。 分析: 求累加和 确定循环条件 不知道输入数据的个数,无法事先确定循环次数 用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。 循环的三种常见的控制方式(计数控制的循环、条件控制的循环、标记控制的循环),#include int main(void)

5、int num,count=0; double grade, total; num = 0; total = 0; printf(Enter grades: n); scanf(%lf, ,Enter grades: 67 88 73 54 82 -1 Grade average is 72.80 Number of failures is 1,do while 语句用来实现“直到型”循环结构,格式:do,循环体语句;,功能:如右图所示,while(表达式);,dowhile 语句,【例4-5】用dowhile语句求 。,main( ) int i,sum=0; i=1; do sum=sum

6、+i; i=i+1; while(i=100); printf(sum=%dn,sum); ,while和do-while循环的比较。,#includestdio.h main( ) int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(sum=%dn,sum); ,#includestdio.h main( ) int i,sum=0; i=1; do sum=sum+i; i=i+1; while(i=100); printf(sum=%dn,sum); ,【例4-6】编写程序求这样一个数,这个数用3除余2,用5除余3,用7除余2。(从0

7、开始测试),非0,非0,非0,非0,0,main( ) int i,flag; i=0; flag=0; do i+; if(i%3=2 ,程序为:,运行结果为: i=23,应用dowhile语句需要注意:,(1)dowhile语句是先执行循环体,后求解while中的表达式,所以即使while中的表达式值开始就为假(0),循环体也会执行一次; (2)除循环体一次都不执行的情况外,while和dowhile语句是可以互相转换的。 (3)在dowhile语句中,while (表达式);后的分号决不可少。 (4) 在设计dowhile循环时,同样要考虑循环的有限终止问题,即也要在循环体中安排改变循环

8、变量值的语句,或用条件语句控制的break语句。,for 循环语句,格式:for (表达式1;表达式2;表达式3) 循环体语句; ,功能:,设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值执行,循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环,作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的,【例4-7】用for语句求,i=1; for(;i=100;i+) sum=sum+i;,for(i=1 ; i=100; ) sum=sum+i; i+;,i=1; for( ;i=100; ) sum=sum+i; i+;,fo

9、r(i=1; ;i+) if(i100) break; sum=sum+i;,i=1; for( ; ; ) sum=sum+i; i+; if(i100) break;,for(i=1, sum=0; i=100; sum=sum+i, i+) ;,【例4-8】编写程序,判断一个给定的数 是否为素数。 素数定义:除了1和m,不能被其它数整除。 算法分析: i 取值 2, m-1 2, m/2 2, ,非0,i=x1,非0,main( ) int i,x,flag=0; scanf(%d,程序如下:,输入:31 显示:31 is a prime number. 再次运行,输入51 显示:51

10、isnt a prime number.,# include math.h,for(i=2;i= x-1; i+) if(x%i=0) flag=1;,printf (flag=0)?(%d is a prime number.n): (%d isnt a prime number.n),x);,main( ) int i,x,flag=0; scanf(%d,# include math.h,for(i=2;i= x-1 ; i+) if(x%i=0)flag=1; break; /*提前结束循环*/ ,printf (flag=0)?(%d is a prime number.n) : (

11、%d isnt a prime number.n),x);,利用break语句修改上述程序为:,continue 语句,功能:提前结束本次循环,即跳过循环体continue语句下面尚未执行的语句,接着进行下一次循环。,格式: continue;,【例4-9】打印出199之间不能被5整除的数,每10个数为一行。,程序如下:,#includestdio.h main( ) int i, j=0; for(i=1 ; i=99;) if(i%5=0) i+; continue; printf(%4d,i); i+; j+; if(j%10=0) printf(n); ,小结:,为了更清楚地了解bre

12、ak语句和continue语句的区别,用下面的流程图表示:,(1)break语句 while(表达式1) if(表达式2)break; ,(2) continue语句 while(表达1) if(表达式2)continue; ,作 业,1、打印出如下图案(菱形) * * * * * * *,2、将一个正整数分解质因数。例如:输入90,打印出 90=2*3*3*5。 3、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=123。编程找出1000以内的所有完数。4、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的前20项之和。,作 业,#include

13、 main( ) int i=1; while (i=8) if(+i%3!=2)continue; else printf(%d,i); printf(n); ,分析下列程序的运行结果:,#include main( )int i,k=19; while(i=k-1)k-=3; if(k%5=0)i+;continue; else if(k5)break; i+; printf(i=%d,k=%dn, i , k);,分析下列程序的运行结果:,分析下列程序的运行结果:,#include main( ) int a,y; a=10;y=0; do a+=2; y+=a; if(y50)brea

14、k; while(a=14); printf(“a=%d y=%dn”,a,y); ,注意:, break语句只能用在循环语句和switch语句中;, break语句只能跳出当前循环语句和当前switch语句;, continue语句只能用在循环语句中。,我们用下表对几种循环语句进行比较:,语 句 适 用 范 围 说 明,ifgoto,while,dowhile,for,尽可能少用,“ 当型” 循环 先判断后执行,“ 直到型” 循环 先执行后判断,“ 步长型” 循环 先判断后执行,完全可替代while,所构成的循环不能用break和continue语句控制,循环变量的初始化应在这两个语句之前完

15、成,可以用break跳出循环,用continue结束本次循环,表达式3中可以包括使循环趋于结束的操作,甚至包括循环体中全部操作,在这两个语句后面应指定循环条件,循环体中应包括能使循环结束的语句,goto语句可能破坏结构化原则,应限制使用,表达式3中可以包括使循环趋于结束的操作,甚至包括循环体中全部操作,可以用break跳出循环,用continue结束本次循环,可在表达式1中实现循环变量的初始化,例1 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(编程求Fibonacci数列的前40个数。),循环应

16、用举例,迭代与递推,一遍又一遍, 麦子磨成面。,迭代就是不断用变量的新值替代其旧值。例如,一笔存款每年自动转存,就形成利滚利的情况,本金每年不同,不断迭代。 递推是由一个变量的值推出另外变量的值。例如,若每代人之间的年龄相差25岁,则由一个人的年龄推出其父亲年龄、爷爷年龄的过程,就称为递推。,迭代或递推三要素:,迭代或递推初始状态,即迭代或递推比变量的初始值。,迭代或递推关系,即一个问题中某个状态的前项与后项之间的关系。,迭代或递推的终止条件。,1. 问题描述 意大利数学家昂纳多斐波那契(Leonardo Fibonacci,11701240)在他1202年出版的珠算原理一书中提出一个问题:假

17、定一对新出生的兔子一个月后成熟,并且再过一个月开始生出一对小兔子。按此规律,在没有兔子死亡的情形下,一对初生的兔子,到一年头上,可以繁殖成多少对兔子?这是一个典型的递推问题。,Fibonacci函数的定义为:,F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n3),2. 算法分析,#include int main() int f1=1,f2=1,f3; int i; printf(%12dn%12dn,f1,f2); for(i=1; i=38; i+) f3=f1+f2; printf(%12dn,f3); f1=f2; f2=f3; return 0; ,#inc

18、lude int main() int f1=1,f2=1; int i; for(i=1; i=20; i+) printf(%12d %12d ,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f2+f1; return 0; ,改为while语句: #includestdio.h main( ) int f1=1, f2=1,f; int i=2; printf(%12d%12d,f1,f2); while(i40) f=f1+f2; i+; printf(%12d,f); if (i%4=0) printf(n); f1=f2;f2=f; ,1. 问

19、题描述 一天一只小猴子摘下一堆桃子,当即吃去一半,还觉得不过瘾,又多吃了一个。第2天接着吃了前一天剩下的一半,馋不忍罢又多吃了一个。以后每天如此。到第10天小猴子去吃时,只剩下一个桃子了。问小猴子最初共摘了多少桃子?,例1思考:猴子吃桃子,2. 算法分析,首先看一下用代数方法如何求解此题。 设小猴子当初共摘了x个桃子。则根据题意,有:,3. 采用while结构的参考代码,#include int main(void) int peachNumber=1,days=10; while(days 1) peachNumber=(peachNumber + 1) * 2; -days; printf(第%d天的桃子数为:%d个。n, days, peachNumber); return 0; ,例2:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。 例如:153是一个“水仙花数”,因为153=1的三次方5的三次方3的三次方。程序分析:利用for循环控制1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论