C语言程序设计教程循环结构程序设计(精)_第1页
C语言程序设计教程循环结构程序设计(精)_第2页
C语言程序设计教程循环结构程序设计(精)_第3页
C语言程序设计教程循环结构程序设计(精)_第4页
C语言程序设计教程循环结构程序设计(精)_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 循环结构程序设计 北京科技大学 计算机系C 语言程序设计1本章主要内容while循环控制do-while循环控制for循环控制用goto语句实现循环控制循环结构中的跳转语句循环的嵌套循环结构程序设计举例25.1 while循环控制 语句一般格式 while (表达式) 语句 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分 3功能: 计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后

2、面的语句。 当表达式为真 语句N-S结构图NY流程图表达式非0?语句循环控制条件循环体4例如:【例】编写程序,求100个自然数的和即: s=1+2+3+ +100 思路:寻找加数与求和的规律 加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。 5算法和程序:main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum);运行jc5_1程序输出结果:sum=5050i: 循环控制变量sum: 累加器

3、 i=1,sum=0 当i = 100 sum=sum+i i+输出sum6注意: 如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。 思考程序段的输出? while (i=100) i+; sum=sum+i; 运行后,输出:sum=5150原因是什么? 7注意(续):为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响85.2 do-while语句语句一般格式

4、do 语句 while (表达式); 功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。9 do-while循环的算法 循环体当表达式为真N-S结构图NY循环体表达式非0?流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);用do-while语句求100个自然数的和 10说明: while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构区别:do-

5、while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行dowhile循环体中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。 11do-while语句的简单应用 【例】用辗转相除法求m和n的最大公约数定义m、n、rmnT F m和n交换r=m%nm=nn=r 当r != 0时输出最大公约数m12算法和程序:main( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; do r=m%n; m=n; n=r; while(r!=0); printf(

6、%dn,m); 运行jc5_3程序运行情况如下:24, 6012135.3 for语句 语句一般格式 for (表达式1;表达式2;表达式3) 语句 功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。循环初始条件循环控制条件循环体14for语句的算法N-S结构图for (表达式1;表达式2;表达式3) 语句NY流程图计算表达式1 语句计算表达式3表达式2为真?例如:main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+

7、i; printf(sum=%dn,sum);可部分或全部省略,但“;”不可省略15省略for语句的表达式 表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环)注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行 省略表达式1和表达式3,即: for(;表达式2;) 就等同于:while( 表达式2 ) 省略表达式2,即: for(表达式1; ;表达式3) 就等同于:表达式1; while(1)表达式3;16例如: i=1; for ( ; i100) for (i=1; i100) i+; 17说明:所有用 w

8、hile 语句实现的循环都可以用for 语句实现。 等价于:for(表达式1;表达式2 ;表达式3) 语句;表达式1;while (表达式2) 语句; 表达式3; 18for语句的简单应用【例】求n! ,即计算p=123n的值。 思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。设置:乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器 p ,每次循环令p = p*i19程序:main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) p = p * i; p

9、rintf(p = %ld n,p);思考:如何输出1!, 2!, , n! ?如何求s =1!+ 2!+ + n! ? 运行jc5_420熟悉几个循环语句while (!x) x+; 当 x=0 时,执行循环体x+; while (c=getchar( ) != n) n=n+1; n 称为计数器,作用是统计输入字符的个数while (num+5); 先执行循环体x*=-3,再判断条件(x5) for (n=0; n26; n+) printf(%c , n+A); 作用是输出26个大写字母for (sum=0, i=1; i=100; sum=sum+i, i+=2) ;作用是计算100以

10、内的奇数和 21几种循环语句的比较while和do-while语句的表达式只有一个,for语句有三个。while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况225.4 用goto语句实现循环有兴趣的同学自学不提倡使用goto语句注意:goto语句能实现程序无条件转移,为编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。因此应限制使用。235.5 循环结构中的跳转语句有如下三种语句实现跳转:continue语句break

11、语句goto语句在循环语句的循环体中使用,可以进行循环的流程控制24后续语句continue; YN表达式?后续语句continue;表达式?YN5.5.1 continue语句及应用 功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。while语句do-while语句后续语句计算表达式3计算表达式1continue;表达式2?YNfor语句25例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) continue; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (

12、x0) continue; s+=x; n+; while (n10); for (n=0,s=0; n10; n+) scanf(%d,&x); if (x0) continue; s+=x; 26应用举例 【例】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。 for (n=100; n=200; n+) n能被7整除 T F 终止本次循环 输出n 输出10个数 T F 换行27算法和程序main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; printf(%6d,n); j+; i

13、f (j%10=0) printf(n); printf( n j=%dn,j); 运行jc5_728后续语句break;YN表达式?后续语句break;表达式?YN5.5.2 循环中break的应用功能:利用break语句能够强迫终止本层循环,转到后续语句执行。while语句do-while语句后续语句计算表达式3计算表达式1break;表达式2?YNfor语句29例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) break

14、; s+=x; n+; while (n10); for (n=0,s=0; n10; n+ ) scanf(%d,&x); if (x0) break; s+=x; 305.6 循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?%4dn:%4d,i*j); 运行jc5_a外循环语句内循环语句31注意:while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。多重

15、循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。例如:for(a=1;a=10;a+) for (b=0;b2)fn= 设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项;将f1f2, f2f3,再求f3=f1+f2得到第4项;依此类推求第5项、第6项这是一种递推算法应采用循环实现33算法和程序#define N 20main( ) int i,f1,f2,f3; f1=f2=1; printf(n%8d%8d,f1,f2); for (i=3; i=N; i+) f3=f1+f2; f1=f2; f2=f3; printf(%8d,f3); if (

16、i%5=0) printf(n); f1=1,f2=1并输出for (i=3; i=20; i+) f3=f2+f1 f1=f2,f2=f3 输出f3 输出5个数 T F 换行运行jc5_534举例2【例】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。 思路:素数是指只能被1和它本身整除的数,如5、7、11、17、等。 分别用2、3、,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。这是一种穷举算法设除数为j,从2循环到m-135算法和程序:#include math.hmain( ) int j,m,k; printf(Enter an int

17、eger number: ); scanf(%d,&m); for (j=2; j=m) printf(YESn); else printf(NOn); 输入一个数mfor (j=2; j=m T F输出YES“ 输出NO运行jc5_1236程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次数。#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); k=sqrt(m); for (j=2; j=k+1) printf(YESn); else printf(NOn);思考:如何

18、输出100200中所有的素数 37举例3【例】用牛顿迭代法求方程 2x3+4x2-7x-6=0 在附近的根。 思路:设xn为一个接近xa的近似根,过(xn, f(xn) 点做切线,切线方程为:即:xnxn+1xy0f(x)(xn, f(xn)(xn+1, f(xn+1) xa 方程的根牛顿迭代公式 38算法基本步骤: 先设一个方程近似根x0,求出方程f的值和方程导数f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7 用迭代公式x=x0-f/f1进行迭代,求出x比x0要接近方程真实的根; 当|x-x0|大于某个很小的数时(如10-6),认为未找到,此时将xx0,再次求f、f1

19、,并迭代,又求出一个新的更接近方程根的x; 一直到 |x-x0|10-6时得到方程近似根:x或x0。这是一种迭代算法用循环实现39算法和程序:#include math.hmain( ) float x,x0,f,f1; ; do x0=x; f=2*x0*x0*x0+4*x0*x0-7*x0-6; f1=6*x0*x0+8*x0-7; x=x0-f/f1; while(fabs(x-x0)1e-6); printf(%fn,x);x赋初值x0=x计算f计算f1 计算x=x0-f/f1当 |x-x0|10-6时输出x运行jc5_1340举例4【例】编程序求210000以内的完全数。 完全数:一个数的因子(除了这个数本身)之和等于该数本身。思路:设定i从2变到10000,对每个i找到其因子和s;判定 is?若相等,则i为完全数,否则不是。 例如

温馨提示

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

评论

0/150

提交评论