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

下载本文档

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

文档简介

第六章 循环控制,本章要点 循环的基本概念 三种循环的使用:while、do-while、for 循环控制语句的使用 多重循环,主要内容,6.1 概述 6.2 goto语句及其构成的循环 6.3 用while语句实现循环 6.4 用do-while语句实现循环 6.5 用for 语句实现循环 6.6 循环的嵌套 6.7 循环的比较 6.8 循环控制语句:break和continue 6.9 程序应用举例 小结 练习 提示:预习第十二章,6.1 概述,什么是循环? 为什么要使用循环?,问题1:,问题2:求学生平均成绩 分数相加后除以课程数,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,用goto语句+if语句构成循环 用while 循环 用do-while 循环 用for循环,6.2 goto语句及其构成的循环,一、无条件转向语句goto语句 goto语句和if语句一起使用,可以构成条件循环。一般形式为: goto 语句标号; 语句标号用标识符表示,命名规则与变量名相同,由字母、数字、下划线组成(首字符为字母或下划线),其第一个字符必须为字母或下划线。但要在后面加一个冒号,这样goto语句就能够去执行有此标号的语句。 例如:goto label_1; 合法; goto 123; 不合法.,二、goto语句的用途,1与if语句一起构成条件循环结构。 2从循环体中跳转到循环体外。 由于goto语句不符合结构化原则,破坏结构化程序,C语言中对goto采取限制性使用。规定goto只能用于内部函数,而且只允许用它跳出循环体,而不允许跳进循环体及switch结构。 建议:尽量少用goto,最好不用。只有在从多重循环的某一层次转到循环体外面的任何层次时使用goto语句。其余情况可用break(结束本层循环)、continue(提前结束本次循环)实现。,例6-1用if和goto语句构成循环,求10!,#include void main( ) float p=1; int i=1; loop:p=p*i; i+; if(i=10)goto loop; printf(”%.2fn”,p); ,6.3 while语句,while语句是一种先判断后执行的循环,属于”当循环”。一般形式为: while (表达式) 语句,语句的功能:先计算表达式的值,若该值为非0值,则执行循环体,然后再回头检测表达式的值,决定是再次执行循环还是退出循环;若该值为0,则退出循环,执行循环语句的下一条语句。 表达式后面的语句可以为空语句、简单语句或复合语句 表达式通常为条件表达式或逻辑表达式,也可以为任意表达式。,例6-2求10!,用while语句实现。,方法一: #include void main() float p=1; int i=1; while (i=10) p=p*i; i+; printf(”p=%.2fn”,p); ,方法二: #include void main() float p=1; int i=10; while (i) p=p*i; i-; printf(”p=%.2fn”,p); ,从此例中可以看出: 1循环体中若包含一个以上的语句,用括起来形成复合语句; 2循环体中不能有死循环,即循环体中必须有循环趋于结束的语句。,例6-3编程提示用户输入一系列整数,以0为结束标志,统计正、负数个数。,#include void main( ) int a, m, n; m=0;n=0; printf(”Input integer numbers:n”); scanf(”%d”, ,例6-4求e ,直到最后一项小于 。,#include void main( ) float t=1,p=1,e=0; int n=1; while (t=1e-5) p=p*n; t=1.0/p; e=e+t; n+; printf(”e=%.2fn”,e); ,与while循环不同,do-while循环在循环的尾部检验条件,而不是在头部, 即do-while循环至少执行一次循环。 do-while语句的特点:先执行循环体,然后判断循环条件是否成立。,6.4 do-while循环,二、执行过程 先执行循环体语句,再判断表达式是否成立,当表达式的值为非零时,重新执行循环体的语句,直到表达式值为0。,一、一般形式 do 语句 while (条件); 为避免与循环体为空语句的while语句混淆, do-while中循环体只有一条语句时 通常保留,并且增加程序的易读性。,例6-5用do-while语句求10!,#include void main() float p=1; int i=1; do p=p*i; i+; while(i=10); printf(”p=%.2fn”,p); ,三、do-while和while的比较 例6-6.do-while和while的比较:,#include void main() float p=1; int n; scanf(”%d”, ,运行: 1 3628800 11 11,运行: 1 3628800 11 1,while与do-while比较,识别while语句和do-while语句的方法为: 在do-while语句中,while之前是一个右括号,之后条件后是”;”,而while语句的条件后面一般是一条或多条语句,只有空语句是”;”。,四、用do-while语句实现直到型循环,do-while是先执行循环体,后判断表达式的当型循环,因此它也是当条件满足时执行循环体,用do-while很容易实现直到型循环,只要将条件取”反”,即可实现。 例6-7求200300间同时满足被3除余2,被5除余3,被7除余4 的数的个数。,#include void main() int y,n=0; y=200; do if (y%3=2 ,6.5 for循环,一、一般形式 for(表达式1;表达式2;表达式3) 语句 一般含义:for(初始化;条件;增值)语句 执行过程:求解表达式1的值,再求解表达式2,若值为真,则执行for循环体内的语句,执行完后求解表达式3,再重复求解表达式2,一旦条件没有被满足,则执行for后面的语句。,例6-8用for语句实现求10!,#include void main() float p=1; int i; for (i=1;i=10;i+) p=p*i; printf(”p=%.0fn”,p); ,二、for循环的变体,for循环中允许使用各种变体,但只有三种主要语句: for (初始化;条件;变量增值) 语句 (1)初始化总是一个赋值语句,它用来建立循环控制变量; (2)条件是一个关系表达式,它决定什么时候退出循环; (3)增量定义循环控制变量在每次循环时按什么方法变化。 这三个主要语句之间必须用分号隔开。,for循环的变体,1表达式1可省略,但分号不能省。 i=1; for (;i=10;i+) p=p*i; 也可以用while循环来表示:,2省略表达式2,会构成永真循环(无限循环) for (i=1; ;i+) p=p*i;,3省略表达式3,若在循环体中无循环变量增值表达式,则也会构成无限循环。 for (i=1;i=10; ) p=p*i; i+;,4省略式1和式3 i=1; for (;i=10; ) p=p*i; i+;,由此可见,for语句的功能比while语句强,可以赋初值、循环变量自增等。 5三式均省略构成无限循环(后面介绍),for循环的变体,6用逗号运算符使得两个或两个以上的变量共同实现对循环的控制 #include void main() int x, y, s; for (x=0,y=0; x+y=10; +x,+y) s=x+y; printf(”%3d”,s); 又如:for (i=1,p=1; i=10; i+) p=p*i;,结果:0 2 4 6 8 10,三for循环中的表达式2,表达式2一般为关系表达式或逻辑表达式,也可以为数值或字符表达式(即任意表达式都可以) 如:for (; (c=getchar( )!=n;) printf(”%c”,c); 注意:for循环的条件检验总是在循环的头部进行的,即当开始时条件为false时,循环不被执行。 分析下列程序段的循环次数: (1)x=10; for (y=10; y!=x; +y) printf(”%d”,y); (2)for (x=2,p=1;x2;+x) p=p*x;,由于这两个循环在一开始表达式2就为0,所以循环次数为0,四、无限循环,由于构成for循环的三个表达式都没有被要求,因此可以运用空的条件表达式而使循环无休止地进行下去,成为死循环,但可以使用break语句立即中止循环。例如: ch=0; for (; ; ) ch=getchar(); if (ch=A) break; printf(”you typed an A”);,五、无循环体for循环 在C语言中,一条语句可以是空语句,即for循环体(或其它循环形式)可以是空语句。 这个事实可用来改善某些算法的效率以及产生时间延迟循环。时间延迟循环在编程时常常用到,下面用for循环来产生时间延迟: for (t=0; tSOME-VALUE; t+) ;,例6-9编程实现输入10个学生的成绩,求其平均成绩并统计优秀(=85)、不及格学生人数(60)。,#include void main( ) int i,n,m; float score,sum,aver; n=0;m=0;sum=0; for (i=1;i=85) m+; sum+=score; aver=sum/10.0; printf(”naverage=%5.2f,high:%d,lower:%dn”, aver,m,n); ,6.6 循环的嵌套,当一个循环结构中包含另一个循环结构时,称为循环的嵌套或多重循环,原则上,循环嵌套的深度不受限制。 三种循环(while循环、do-while循环和for循环)可以互相嵌套,但使用时注意层次,不能交叉。 嵌套的内外层循环不能使用同名的循环变量,但并列结构的内层循环允许使用相同的循环变量。,例6-10输出九九乘法表,1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81,#include void main() int i,j; for (i=1;i=9;i+) for (j=1;j=9;j+) printf(”%2d*%d=%2d ”,i,j,i*j); printf(”n”); /* 控制换行 */ ,例6-11利用多重循环,输出以下图形:,1 222 33333 4444444 555555555 66666666666,#include void main() int i, j, a; for (i=1;i=6;i+) for (a=0;a=5-i;a+) printf(“ “); for (j=1;j=i*2-1;j+) printf(“%d“,i); printf(“n“); ,6.7 循环的比较,循环的比较,while、do-while语句的表达式只有一个,只能起到控制循环的作用;for循环有3个表达式,不仅控制循环过程,还兼有初始化和增量的作用。 while语句通过修改循环控制条件可以实现do-while循环语句的功能;for语句通过省略初始化表达式和增量表达式可实现while语句的功能。 for比while、do-while的功能更强。,6.8 循环控制语句:break和continue,一、break语句 1break语句的两种用法 一是中止switch语句中的一个情况; 二是绕过一般的循环条件检验,立即强制性地中止一个循环,当一个循环体内的break语句被执行时,循环立即中断,并转向循环体外的下一条语句。,例6-12break循环示例 #include void main( ) int t; for (t=0;t100;t+) printf(”%4d”,t); if (10=t) break; ,运行结果: 0 1 2 3 4 5 6 7 8 9 10,break语句,2语句的一般形式: break; 3break语句常用于循环体中需要一个特殊的条件来立即中止循环,因而break语句常用于某一个if条件分支语句中,用于实现在循环过程中当某个条件成立时结束循环。例: for (i=1;i40) break; ,运行结果: 0 7 14 21 28 35 42,4注意:break语句只能用于switch语句和循环语句。,二、continue语句,1一般形式: continue; 2作用:该语句不造成强制性的中断循环,而是提前结束本次循环,跳过continue后面的语句,继续执行下一次循环的判断。,8 7 100,例6-14输出1100间能被7整除的数,若大于50,停止输出。,#include void main() int i; for (i=1; i50) break; if (i%7!=0) continue; printf(”%4d”, i); ,输出结果:7 14 21 28 35 42 49,三、break、continue及goto语句的区别,1.break、continue语句的区别 break:结束整个循环过程,执行循环体的下一条语句。如有多重循环,则只退出本层的循环。 continue:提前结束本次循环,进入下一次循环,并非结束整个循环体的执行。 continue语句在使用中应注意其流向,以免在程序逻辑上产生错误,一般来说,尽量少用continue,因为从程序逻辑上看,只要改变if语句中所使用条件,就可以不用continue语句,如例6-14中: if (i%7!=0) continue; printf(”%4d”, i); 可用 if (i%7=0) printf(”%4d”, i); 来代替。,2.break与goto的区别,结果:显示10次1到9的值,下列程序段的运行结果为: for (t=0; t10; t+) count=1; for (; ; ) printf(”%4d”,count); count+; if (10=count) break; ,下列程序段的运行结果为: for (t=0; t10; t+) count=1; for (; ; ) printf(”%4d”,count); count+; if (10=count) goto loop; loop: printf(”end”);,结果:显示1次1到9的值 end,goto语句可以从多重循环的某一层次跳转到任何层次 break语句从内向外跳转一层,跳出并结束本层循环,6.9 程序应用举例,例6-15读程序,写出运行结果。 #include void main() int i; for (i=0;i3;i+) switch(i) case 1:printf(“%d“,i); case 2:printf(“%d“,i); default:printf(“%d“,i); ,运行结果: 011122,#include void main() int i; for (i=0;i3;i+) switch(i) case 1:printf(“%d“,i);break; case 2:printf(“%d“,i);break; default:printf(“%d“,i); ,运行结果: 012,例6-16用公式 求的近似值,直到某项的绝对值小于106为止。,运行结果: pi= 3.141594,#include #include void main() int s=1; float n=1,t=1,pi=0; while (fabs(t)=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(“pi=%10.6fn“,pi); ,例6-17求 (n=20),#include void main() float s, t; int n; for (n=1,s=0,t=1;n=20;n+) t*=n; s+=t; printf(“%en“,s); ,例6-18解百鸡问题,这是我国古代一道数学难题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?,穷举法按问题本身的性质,将求解对象一一列举出来,然后逐一加以分析、处理,并验证结果是否满足给定的条件,穷举完所有对象后才能得出问题的所有解。 穷举法是处理问题的常用方法之一,用人工的方式解决穷举的问题,当需要穷举的次数增多时将无法完成。穷举问题的穷举策略很重要,如何设计恰当的穷举变量及变量穷举范围,如何进行判断减少穷举的次数、提高穷举效率,是一个循序渐进的学习过程。 算法思想: cocks 119 hens 133 chicks 199,流程图,#include void main() int cocks,hens,chicks; for (cocks=1;cocks20;cocks+) for (hens=1;hens=33;hens+) for (chicks=1;chicks100;chicks+) if(100=cocks+hens+chicks ,程序一,运行结果: cocks=4 hens=18 chicks=78 cocks=8 hens=11 chicks=81 cocks=12 hens=4 chicks=84,#include void main() int cocks,hens,chicks; for (cocks=1;cocks20;cocks+) for (hens=1;hens=33;hens+) chicks=100-cocks-hens; if (5*cocks+3*hens+chicks/3.0=100.0) printf(“cocks=%d hens=%d chicks=%dn“, cocks,hens,chicks); ,程序二,例6-19用梯形法求 (a=0,b=1.0),n=1000。,算法思想:定积分区间a,b的上下限为a、b,将它们分为若干个小区间,每个区间长度为:h=(b-a)/n 第一个梯形的面积为:f(a)+f(a+h)/2*h 则第i个梯形的面积为:,#include #include void main() float a,b,h,sum,f1,f2; int i,n; printf(“input a,b,n:n“); scanf(“%f,%f,%d“, ,例6-19 矩形法方法,第一个矩形的面积为:f(a)*h或f(a+h)*h 则第i个矩形的面积为: f(a+(i-1)*h)*h 或 f(a+i*h)*h,例6-20 实现菜单的循环选择,#include “stdio.h“ #include void main() int quit=0; char select; do system(“cls“); printf(“nttDesign of Management“); printf(“nt-“); printf(“ntt1 Add Record“); printf(“ntt2 Delete record“); printf(“ntt3 Search Record“); printf(“ntt4 Update Record“); printf(“ntt5 Sort“); printf(“ntt6 List Record“); printf(“ntt7 Save to File“); printf(“ntt8 Load From File“); printf(“ntt9 Quit“); printf(“nt-“); printf(“nttEnter your choice(1-9):“); select=getchar();,例6-20,switch(select) case 1:printf(“You have chosen “Add Record“n“); getch(); break; case 2:printf(“You have chosen “Delete Record“n“); getch(); break; case 3:printf(“You have chosen “Search Record“n“); getch(); break; case 4:printf(“You have chosen “Update Record“n“); getch(); break; c

温馨提示

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

评论

0/150

提交评论