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

下载本文档

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

文档简介

第四章 循环结构程序设计 学习目标 l掌握while语句的语法规则、执行过程和使用方法; l掌握dowhile语句的语法规则、执行过程和使用方法; l掌握for语句的语法规则、执行过程和使用方法; l理解循环结构的嵌套; l掌握循环的中途退出的表示方法; l掌握循环结构程序设计方法及典型算法。 1 本章要点 l三种循环语句的基本形式 l循环语句的使用规则 l循环程序设计常用的算法 2 4.1 循环结构概述 循环结构是结构化程序设计中一种很重要的结构, 它和顺序结构、选择结构共同作为各种复杂程序的基本 结构。其特点是:在给定条件成立时,反复执行某程序 段,直到条件不成立为止。给定的条件称为循环条件, 反复执行的程序段称为循环体。C语言提供了多种循环 语句,可以组成各种不同形式的循环结构。 3 4.1 循环结构概述 【例4-1】从键盘上随机的输入10个数,输出其中最 大数。 #include void main(void) int a, b, c,d,e,f,g,h,i,j ,max; printf(“输输入10个数: “); scanf(“%d%d%d%d%d%d%d%d%d%d%“, max=a; if(bmax) max=b; if(cmax) max=c; if(dmax) max=d; if(emax) max=e; if(fmax) max=f; if(gmax) max=g; if(hmax) max=h; if(imax) max=i; if(jmax) max=j; printf(“%d 是最大数n“, max); 4 4.1 循环结构概述 用循环程序实现: #include void main() int x , max,n=1; /*变变量max中存放最 大数 ,n记录读记录读入数据的个 数*/ scanf(“%d“, max=x; loop: scanf(“%d“, n+; if(xmax) max=x; if(n void main() int i=1, sum=0, n; printf(“输入一个整数n:“); scanf(“%d“, while(in时循环停止。 (2)i的初值为1,这一点很重要它保证循环正常 开始。 (3)在循环体内,每次循环都执行i+;语句,所 以保证每循环一次i的值增加为1,当i的值大于n时循环 结束。这一点也很重要,我们看到如果没有该语句,i 的值不会发生变化,循环将无限的执行下去,这种情况 称为死循环,结构化程序设计中是不允许发生的。 i的值可以从1到n,也可以从n到1,该例可以写成 如下程序: 10 4.1 while循环语句 #include void main() int sum=0, n; printf(“输入一个整数n:“); scanf(“%d“, while(n0) sum = sum + n*n; n-; printf(“n=%d, sum=%dn“, n, sum); 输入一个整数n:5 n=0, sum=55 Press any key to continue 输入一个整数n:0 n=0, sum=0 Press any key to continue 11 4.1 while循环语句 while语句的使用规则: (1)while语句中的表达式一般是关系表达或逻辑 表达式,只要表达式的值为真(非0)即可继续循环。 (2)循环体如果由多条语句构成,则必须用括 起来,组成复合语句。 (3)注意循环条件的定义,以避免死循环。 12 4.2.2 猴子吃桃子问题 【例4-3】猴子吃桃子问题:猴子第一天摘下若干个桃子,当 即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的 桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 求第一天共摘了多少个桃子。 程序分析: (1)这是一个递推问题,猴子第一天摘下桃子个数是一个未 知数,但我们知道第10天剩下的桃子数,每天吃掉桃子的方法相 同,即每天都吃掉前一天剩下的桃子的一半零一个。 (2)设x1表示前一天的桃子数,x2表示后一天的桃子数,则 x1 = (x2 + 1)*2,我们知道第10天只剩一个桃子设x2=1,由此我 们得到第9天的桃子数x1=(1+1)*2=4。我们再由第9天的桃子数 ,推出第8天的桃子数,即x2=x1,继续求x1。 (3)该过程重复9次,即从第10天开始往前递推了9天,即求 得了第一天猴子摘下的桃子数。 13 4.2.2 猴子吃桃子问题 /* 计算猴子第一天摘的桃子的个数 */ #include void main() /* x1表示前一天的桃子数,x2表示后一天的桃子 数 */ int day,x1,x2; day = 9; x2 = 1; while(day 0) /* 第一天的桃子数是第2天桃子数加1后的2倍 */ x1 = (x2 + 1)*2; x2 = x1; day-; printf(“The total is %dn“,x1); 14 4.2.2 猴子吃桃子问题 循环程序设计的三要素: (1)循环体。 (2)循环的结束条件 (3)循环的初值 (1)循环体:是循环程序设计的主体。我们首先分析题目找 出要反复执行部分,在该程序中猴子吃桃子的规律即是对数据反 复处理的过程,其处理过程为: 每次循环都根据当天的桃子数反推出前一天的的桃子数,在 这里利用两个变量x1,x2, x2代表当天的桃子数,x1代表前一天 的桃子数。x2为已知值,通过x1 = (x2 + 1)*2求得x1。 我们再把求得的x1作为已知值继续求前一天的桃子数。其具 体做法为将x1作为x2,即新的当天桃子数,继续求新的x1,即前 一天的桃子数。 我们可以看到x1,x2这两个变量是交替变化、反复使用,这 正是循环程序设计的关键,要正确的设计循环体就是要找到这样 的数学关系。 15 4.2.2 猴子吃桃子问题 (2)循环的结束条件: 在结构化程序设计中,任何循环都必须是有限的循环,绝不 允许出现死循环。因此要设计好循环程序循环的结束条件很重要 。在该程序中猴子第10天只剩下一个桃子,我们要反推9天即求得 第一天猴子摘下的桃子数。设计过程中要把握好以下两个方面: 设变量day代表前一天的天数,程序开始我们首先求的第9天 的桃子数,直到求得第1天的桃子数,因此循环控制条件为为day 0。通常我们将day称为循环控制变量,因为它的值的大小将决 定循环是否继续执行。 另外我们还要注意在循环体中要有修改循环控制变量的值的 语句,这一点很重要,如果没有该语句,那么循环控制条件的值 不会发生变化,循环将无限的执行下去,这就是死循环,这也是 初学者常犯的错误。在该程序中day- 即为修改循环控制变量的 语句。 16 4.2.2 猴子吃桃子问题 (3)循环的初值:要保证循环能得到一个正确的 结果,我们要给循环一个正确的开始。这一点也很重要 ,如果循环的初值错误,结果必然错误。在本程序中初 始条件涉及到两个变量x2和day,其初始化语句为day=9 ;x2=1;这两条语句即定义了循环的初值。 17 4.2.3 求两个数的最大公约数 【例4-4】输入两个正整数a和b,求其最大公约数。 题目分析:若已知整数a和b的最大公约数为k。下面介绍求两 个整数最大公约数的三种方法。 1辗转相除法 用较大的数做被除数m,用较小的数做除数n,求m除以n的余 数r,若余数r为0,则除数n就是这两个数的最大公约数。若余数r 不为0,则以除数作为新的被除数,以余数作为新的除数,继续相 除,直到余数为0,除数即为两数的最大公约数。 具体步骤:设有m和n两个数,当n为0时,m就是最大公约数, 否则进行辗转相除。 (1)求n整除m取余数,r=m%n;若r=0,n就是这两个数的最 大公约数;否则执行(2)。 (2)除数作为新的被除数,即把n赋给m,m=n ; (3)以余数作为新的除数,即把r赋给n, n=r; (4)重复(1)(3)直到r为0为止。 18 4.2.3 求两个数的最大公约数 #include void main() int m,n,r; printf(“请输入2个数: “); scanf(“%d,%d“, if(mn,当m- n=n时,n就是最大公约数,否则用大数减小数求差,继 续求解。具体步骤是: (1)判断m是否等于n?如相等,此时的n即为所求 ; (2)否则,当mn时,求m=m-n;当m void main() int m,n; printf(“请输入2个数: “); scanf(“%d%d“, while(m!=n)/* m和n不相等,大数减小数,直到相等 为止 */ if(mn) m=m-n; else n=n-m; printf(“最大公约数: %dn“,n); 请输入2个数:32 12 最大公约数:4 Press any key to continue 21 4.2.3 求两个数的最大公约数 3定义法 我们知道几个自然数公有的约数,叫做这几个数的 公约数。其中最大的就是最大公约数。为求最大公约数 ,我们首先用几个数中的最小数作为除数去除这几个数 ,如果能整除所有的数,该除数即为最大公约数;否这 将除数减1,继续除这几个数,直到能整除所有的数为 止。 具体步骤: (1)从键盘上输入m,n,求k=m void main() int k,m,n; printf(“请输入2个数: “); scanf(“%d%d“, k=m void main() int n,i=2; printf(“please input a number:“); scanf(“%d“, printf(“%d=“,n); while(n!=i) if(n%i=0) printf(“%d*“,i); n=n/i; else i+; printf(“%dn“,n); 25 1形式 do 语句 while (表达式); 循环体语句 条件表达式 真 假 2作用 实现“直到型”循环。 当条件满足时,执行语句. 3特点 先执行语句,后判断表达式 4.3 dowhile循环语句 4.3.1 dowhile循环语环语句概述 26 4.3.1 dowhile循环语句概述 while语句和dowhile语句一般都可以相互替换。如 例4-2可以改写为: /* 用while循环计环计算前n个数的平方和 */ #include void main() int i=1, sum=0, n; printf(“输输入一个整数n:“); scanf(“%d“, do sum = sum + n*n; while(-n0); printf(“ n=%d, sum=%dn“, n, sum); 输入一个整数n:5 n=0, sum=55 Press any key to continue 输入一个整数n:0 n=-1, sum=0 Press any key to continue 27 4.3.1 dowhile循环语句概述 程序说明: (1)我们可以看到当n=5时,使用while循环和 dowhile循环其运行结果相同。 (2)当n=0时,因为while循环是先判断循环条件 是否成立,若不成立则循环一次也不执行,所以程序的 执行结果为n=0, sum=0;而dowhile循环是先执行循环 体,然后再判断循环条件,所以在循环条件不满足时, 至少也要执行一次循环体。故程序的执行结果为n=-1, sum=0。 (3)要想两个程序完全等价,即在任何情况下都 得到相同的结果,在本程序的dowhile语句之前增加一 条if语句事先判断循环条件是否成立。请读者自行改写 本程序。 28 4.3.1 dowhile循环语句概述 dowhile语句的使用规则: (1)在if语句,while语句中,表达式后面都不能 加分号,而在dowhile语句的表达式后面则必须加分号 。 (2)在do和while之间的循环体由多个语句组成时 ,也必须用 括起来组成一个复合语句。 (3)dowhile和while语句相互替换时,要注意修 改循环控制条件。 29 4.3.2 求整数的数据位数 【例4-6】从键盘输入一个整数,计算它的位数。 例如输入12345,输出5;输入-123,输出3,输入0,输 出1。 题目分析: 一个整数由多位数字组成,计算位数的过程需要一 位一位地进行,因此是一个循环的过程,循环次数由整 数本身的位数决定的。由于需要计算的整数有待输入, 故无法事先知道循环的次数,但任何一个整数至少是一 位的,也就是说至少需要循环一次。因此可选用 dowhile循环来处理。程序如下: 30 4.3.2 求整数的数据位数 #include void main(void) long number; int count = 0; printf(“ Please enter a number: “); scanf(“%ld”, if(number #include void main() double pi=0, item; int a=1, flag=1; do item=flag*1.0/a; pi=pi+item; a=a+2; flag=-flag; while(fabs(item)1e- 5); pi=pi*4; printf(“pi=%lfn“, pi); 33 1. 一般形式: for (表达式1; 表达式2; 表达式3) 语句 for 的循环体 括号不可少 分号不可少 4.4 for循环语句 4.4.1 for循环语环语句基本形式 34 4.4.1 for循环语句基本形式 for循环的执行过程 求解表达式1 循环体语句 求解表达式3 for语句的下一语句 表达式 2 假 真 35 4.4.1 for循环语句基本形式 【例4-8】计算s=1+2+3+.+99+100 。 程序分析: 该题目也是一个累加和的问题,其算法如下: (1)循环初值:s=0 , i=1; (2)循环体:s=s+i ; i=i+1; (3)循环控制条件:i void main() int i,s=0; for(i=1; i void main() int a=0,n; printf(“input n: “); scanf(“%d“, for(; n0; a+, n-) printf(“%d “, a*2); printf(“n“); 37 4.4.2 水仙花数问题 【例4-10】打印出所有的“水仙花数”。所谓“水 仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=13 5333。 题目分析: 利用for循环检验100-999个数,对于每个数首先分 解出个位、十位、百位数,然后判断它是否为“水仙花 数”。 38 4.4.2 水仙花数问题 #include void main() int i,j,k,n; printf(“water flower number is:“); for(n=100; n void main() int n, t, number = 20; float a = 2,b = 1,s = 0; for(n = 1; n void main( ) int i, j, k; printf(“i j kn“); for (i=0; i void main() char i,j,k; /*i是a的对手,j是b的对手,k是c的对手*/ for(i=x;i void main() int n,i; printf(“please input a number:“); scanf(“%d“, for( i=2;in-1) printf(“%d is a prime number!n “,n); else printf(“%d is not a prime number!n“,n); 54 4.6.1 break语句 程序说明: 为了提高程序的执行效率,我们可以用i=2, 3, , n/2去检验 ,其检验区间缩小一半,这是因为能够整除n的最大的整数即为n/2 。 实际上检验区间还可以继续缩小,因为整数相乘满足交换率, 例如2*6=12,同样6*2=12,所以我们只需用i=2, 3, , 去检验, 即循环终止条件不需要到n/2,只需到sqrt(n),即可验证n是否为素 数。 以上程序可以改写成如下形式: 55 4.6.1 break语句 #include #include void main() int n,i; printf(“please input a number:“); scanf(“%d“, for( i=2;isqrt(n) printf(“%d is a prime number!n“,n); else printf(“%d is not a prime number!n“,n); 56 4.6.1 break语句 break语句的使用规则: (1)break语句不能用于循环语句和switch语句之 外的任何其他语句中。 (2)break语句在循环体中,一般与if语句配合使 用。 (3)在多层循环中,一个break语句只向外跳一层 ,跳转到最外层需要多次设置break。 57 4.6.1 break语句 break在三种循环中的跳转流程如图所示。 break; 表达 式 真(非0) while 假(0) break; 表达 式 真(非0) 假(0) while do break; 表达式 2 真(非0) 假(0) for 表达式1 表达式3 58 4.6.2 continue语句 continue语句的作用是跳过循环本中剩余的语句而强行执行 下一次循环。continue语句只用在for、while、dowhile等循环 体中,通常与if条件语句一起使用,用来加速循环。continue语句 和break语句的区别是:continue语句只结束本次循环,继续进行 下一次循环,而不是终止整个循环的执行;而break语句则是结束 整个循环的执行。 59 4.6.2 continue语句 程序(1)的流程图如图4-5所示,而程序(2)的流程图如图4-6所 示。请注意图4-5和图4-6中当“表达式2”为真时流程的转向。 表达式1 表达式2 真 假 真 假 break While语句的 下一条语句 表达式1 表达式2 真 假 真 假 continue While语句的 下一条语句 60 4.6.2 continue语句 continue在3种循环中,使流程的转向是不一样的,如图4-7所示。 continue ; 表达 式 真(非0) while 假(0) continue; 表达 式 真(非0 ) 假(0) while do continue; 表达式 2 真(非0 ) 假(0) for 表达式1 表达式3 61 4.6.2 continue语句 【例4-17】输出能被3和7整除的三位正整数。 #include void main() int i; for(i=100;i void main() int x,y,z,n=0; printf(“序号 公鸡 母鸡 小鸡n“); for(x=0; x void main() int i,fact,n; printf(“请输入n:“); scanf(“%d“, for(fact=1,i=1;i=3) 我们由已知的前两项推导出以后的各项。其程序如下: 69 4.7.2 递推法 #include void main() int f1=1, f2=1, f3, i; printf(“%10d%

温馨提示

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

最新文档

评论

0/150

提交评论