c语言中rue结束本轮循环,C语言程序设计第5章循环结构程序设计.ppt

《C语言程序设计第5章循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第5章循环结构程序设计.ppt(54页珍藏版)》请在人人文库网上搜索。

1、5.1 while语句 5.2 do-while语句 5.3 for 语句 5.4 break、continue和goto语句 5.5 循环的嵌套 5.6 复合结构程序举例,第五章 循环结构程序设计,教学目的和基本要求:,要求学生了解循环结构程序设计,掌握各种循环语句应用的特点及异同点,掌握循环嵌套及复合结构。,教学重点:,各种循环语句应用的特点及异同点。,scanf(“%f”, . 这样重复一百次,然后 输出s的值。,这样写显然非常麻烦。我们注意到程序中的 scanf(“%f”, 两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。。

2、,编程解决这样的一个问题: 从键盘输入一百个学生的成绩,求总成绩。,从前面所学,有两种解决方法。 1.设一百个变量,分别输入学生的成绩,然后求和。 这种方法浪费内存空间,显然不实际。 2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:,C语言有while 、 do - while 、和for语句三种循环结构语句。 前两个称为条件循环,即根据条件来决定是否继续循环; 后一个称为计数循环,即根据设定的执行次数来执行循环。,5.1 while语句,一般形式:while(表达式) 语句,1.计算表达式,2.如果表达式的值为非零,执行语句,3. 返回第一步,重新计算表达式,4. 如。

3、果表达式的值为零,则结束循环,如果表达式的值一开始就为0,则语句一次也不会被执行。,执行流程:,while语句举例,问题: 求学生的平均成绩,以输入负数成绩为结束,算法分析: 1. 定义变量score存储学生成绩,定义s=0存储累加的成绩, 定义n=0统计录入的成绩数目。 2. 输入第一个学生的score 3. 若score=0,执行第4步,否则执行第7步 4. n+ 5. s=s+score 6. 录入下一个score,并返回第3步 7. 如果n0,输出s/n否则输出没有学生成绩,main( ) int n=0 ; float s=0,score; scanf( “%f” , ,程序:,5.。

4、2 dowhile语句,一般形式:do 语句 while (表达式);,1.执行语句,3.表达式的值为非零,返回第1步,4.表达式的值为零,结束循环,语句至少被执行一次。,2.计算表达式,执行流程:,注意: 分号不能丢,表达式,main( ) int n=0 ; float s=0,score; do scanf( “%f” , ,用do-while语句编写统计学生平均成绩的程序:,由于do-while语句至 少要被执行一次,特 别要注意n和s的取值 问题!,想想这样的一段循环语句的执行结果: i=1; while (i=100) putchar(*); i+;,这个循环永远不会结束,因为循环。

5、控制变量i没有在循环体内被改变,i+; 不属于循环体。,应该改为:,i=1; while (i=100) putchar(*); i+; ,循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环。,5.3 for循环语句,for(表达式1;表达式2;表达式3) 循环体语句,一般形式:,1.计算表达式1,通常用于循环开始前设置变量初值。 2.计算表达式2,值为0则结束循环,否则执行第3步。 3.执行循环体语句。 4.计算表达式3,返回第2步。,执行流程,例: 求 1+2 +99,#include main( ) int i,s=0; for(i=1;i=99;i+) s=s+。

6、i; printf(“s=%d”,s); ,分析:用变量i从1到99循环,把i的值累加到变量s中,最后输出s的值。,程序如下:,从上面的程序我们看到,for语句中: 表达式1:通常是给循环变量赋初值 表达式2:循环是否继续执行的判别表达式,这个表达式通常与某一个(或多个)变量的值有关,随着这个(些)变量的值的改变,表达式的结果发生变化,这个(些)变量被称为循环因变量。 表达式3:通常用于改变循环因变量的值。,在某些情况下,for语句中的表达式1、2、3都可以省略,而改用其他的方式来实现这些功能。我们还用上面的例子说明for语句省略表达式的情形。,1.省略表达式1:,#include main(。

7、 ) int i=1,s=0; for(;i=99;i+) s=s+i; printf(“s=%d”,s); ,2.省略表达式3:,#include main( ) int i,s=0; for(i=1;i=99;) s=s+i;i+; printf(“s=%d”,s); ,3. 同时省略表达式1、3,#include main( ) int i=1,s=0; for(;i=99;) s=s+i;i+; printf(“s=%d”,s); ,表达式2也可以省略 但在循环体中要借助 break;语句来实现循 环的结束,我们将在 后面介绍。,注意:表达 式省略,分 号不省略。,for语句中的表达式。

8、可以是一切形式的表达式,逗号运算符参与的表达式也可以运用在for语句中,通常运用于表达式1和表达式3。 如上面的例子可以改写为:,#include main( ) int i,s; for(s=0,i=1;i=99;s=s+i,i+) ; printf(“s=%d”,s); ,注意此处 的分号。,此处,表达式1用逗号表达式的形式,给多个变量赋初值。表达式3用逗号表达式把循环体也写入其中。注意表达式3书写顺序不能交换。,例:求 1/100+2/99+1,分析:用变量i从1开始循环,每次增加1;用变量j从100开始循环,每次减少1。累加i/j的值到s中。当ij时结束循环(即i=j时继续循环)。最后。

9、输出s。,程序如下:,#include main( ) int i,j; float s=0; for( i=1,j=100 ; i=j ; i+,j-) s=s+(float)i/j; printf(“ns=%f”,s); ,for、while、do-while的比较,所有需要用到循环结构的程序,都可以用for、while、do-while中的任何一个来实现,区别只在于某些问题用哪种语句更方便。,比如求1+2+99的问题我们也可以分别用while与do-while语句编写如下:,用while:,#include main( ) int i=1,s=0; while(i=99) s=s+i; 。

10、i+; printf(“ns=%d”,s); ,用do-while:,#include main( ) int i=1,s=0; dos=s+i; i+; while(i=99); printf(“ns=%d”,s); ,例:任意输入一个自然数,把它反序输出。(如:原数为123,输出321)。,分析:此题不确定循环执行的次数,也不涉及一个规律变化的变量,一般用while或do-while来编写。又由于第一次就要判断输入的是否是自然数,通常用while来实现。算法步骤如下:,1. 定义整型变量a用于存储输入的自然数,定义t初值为0用于存放a的反序数,定义i用于依次存放求出的a的每一位的数值。 2。

11、. 输入一个自然数赋值给变量a 3. 若a0,执行第4步,否则执行第7步 4. i=a%10 5. t=t*10+i 6. a=a/10,并返回第3步 7. 输出t,程序:,#include main( ) long a,i,t=0; scanf(“%ld”, ,在这里由于a的值可能 很大所以用到了long型定 义变量a,如果希望取到的 值更大,可以用unsigned long型。 问:如果a用double型,并 把i=a%10改为i=(long)a% 10;把a=a/10改为a=(long)a /10 可以吗?,答:不可以!,例:有数列2/3、4/5、6/9、10/15求此数列前30项的和。。

12、,1. 初值i=2,j=3,s=0; 2. 用n从1到30循环 5.输出s;,3. s=s+ i/j; 4. c=i; i=j+1; j=c+j;,算法分析: 对于数列的题,首先要找出通项公式,或前后项的计算关系公式,根据公式求所需。由于数列的题一般执行次数能确定,用for语句来编写比较方便。 此题,前后项的关系是:后一项的分子是前一项的分母加1,后一项的分母是前一项的分子加分母。解题思路是用循环语句求各项,并把值累加,因为是求前30项的和,循环执行30次。,程序:,#include main( ) int i=2,j=3,n,c; float s=0; for(n=1;n=30;n+) s=。

13、s+(float)i/j; c=i; i=j+1; j=c+j; printf(“n%f”,s); ,此题中的n与循 环体中的执行语句 没有数值上的联系 ,仅仅用做决定循 环执行的次数。,5.4 break、continue、goto语句,此类语句的功能是使程序从其所在的位置转向另一处。 goto语句使程序的结构性和可读性都变差,要求尽量避免使用,此处不做介绍。,5.4.1 break语句,它的作用是把流程转向所在结构之后。 在switch分支结构中,使用break语句可以使流程跳出switch分支结构。 同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的。

14、语句。,一般形式: break;,main( ) int s=0,i=1: for (; ;) if (i99) break; s = s+i; i+; printf(“s=%d”,s);,例:前面讲到的计算1+2+99的程序,可以同时省略for循环的三个表达式,改写成如下形式:,本程序中,当i99时,利用break语句强行终止for循环,继续执行for语句后的下一条语句。,5.4.2 continue语句,该语句被称为继续语句。在循环结构中执行continue语句,使本次循环提前结束,即跳过循环体中continrue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判。

15、别,条件为真,继续进行执行循环语句。,一般形式: continue;,例:下面这个程序,想想它实现的是什么功能?,#include main( ) int i,s=0; for(i=1;i=100;i+) if(i%5=0) continue; s=s+i; printf(“n%d”,s); ,在左边的程序中,i从1到100循环,当i是5的倍数时,直接进入下一个i,当i不是5的倍数时,把i累加到s,最后输出s。 所以,这个程序实现的是求1100中间所有非5的倍数的数之和。,5.5 循环的嵌套,当循环体语句又是一条循环语句,或作为循环体的复合语句中又包含循环语句时称为循环的嵌套。嵌套可以是两层或。

16、多层。While 、do-while、for三种循环都可以互相嵌套。,循环体语句可以是任何形式的语句,简单语句、空语句、复合语句、流程控制语句都可作为循环体语句。,例:输出nm中(0nm)能被3整除,且至少有一个数字是5的所有数。,算法分析: 1. 输入n与m的值 2. 用整型变量a从nm循环,每次值加1 3. 若a能被3整除,执行第4步,否则执行第9步 9. 返回第2步,察看下一个a,6. i=x%10 7. 若i值不为5,执行第8步,否则输出a, 并执行第9步 8. x=x/10,并返回第5步,4. 令整型变量x=a 5. 若x0,执行第6步,否则执行第9步,#include main( 。

17、) long a,x,i,t,n,m; scanf(“%ld%ld”, ,程序:,问: 能把a%3=0也放到 for循环语句的表达 式2中,写成a=m for(a=3;a=150;a+) for(i=2;i=a-1;i+) if(a%i=0) break; if(a=i) s=s+a; printf(“n%d”,s) ,求素数的方法很 多,大同小异。此 题可以做一些改动 。如:i的值可以是 从2取到sqrt(a);可 以不用最后察看i的 值,而是通过在发 现因子时改动标志 变量,最后根据标 志变量的值判断是 否是素数。,在前面的例子中,循环体内不但包含有循环语句,而且还包含有if这样的分支结构。

18、语句,这种循环体包含分支结构的形式,叫做复合结构。 下面,我们再看两个复合结构程序设计的例子。,例:有一个八层高的灯塔,每层所点灯数都等于上一层的两倍,一共有765盏灯,求塔底灯数。,算法分析: 此题的关键在于塔顶的灯数,只要知道了塔顶的灯数,就可知道塔底灯数。这里采取试探的方法来求塔顶灯数。 设塔顶灯数为x,x的初值从1开始循环,每次值加1。求出相应的灯的总数,总数不为765,继续下一个x的循环,直到某次求得灯总数为765时,结束x的循环,输出此时塔底灯数。,x从1开始循环,每次值加 1 出k/2,2. 设s初值为零,用于累加每层灯数;设k初值为x 3. i从1到8循环,每次值加1 5.如果。

19、s=765 ,结束x的循环,4. s=s+ k; k=k*2;,程序:,#include main( ) int x,s,i,k; for(x=1;x+) s=0; k=x; for(i=1;i=8;i+) s=s+k;k=k*2; if(s=765) break; printf(“n%d”,k/2); ,例:已知abc0,a、b、c为整数,且a+b+c100,求满足1/a2+1/b2=1/c2的a、b、c共有多少组?,算法分析: 这是一道典型的三重嵌套循环的题目。a、b、c都是位于1到99之间整数。编程的基本思路是:找出1到99之间的所有a、b、c的排列,察看同时满足abc、a+b+c100。

20、、1/a2+1/b2=1/c2这三个条件的a、b、c有多少组。 值的注意的是, 1/a2+1/b2=1/c2这个条件并不能简单的原样照写,因为在求分数的过程中必然有四舍五入,不能得出真正的准确的结果,必须把条件变形成:c2(a2+b2)=a2b2才能得出正确的结果。,1. a从1到99循环 2. b从1到99循环 3. c从1到99循环 4. 若ab printf(“n%d”,n); ,for(c=1;c=97;c+) for(b=c+1;b=98;b+) for(a=b+1;a=99;a+) if(a+b+c100,此题可做改进,在循 环时确保abc,而不 需要再在if中判断。 改进如左所示。

21、:,for(a=1;ab,#include main( ) long int I,s=0; for(I=10;I=130;I+) s=s+I*I; printf(“n%d”,s); 注意:i一定要是 long int 型。,编程练习,1.10,130之间,所有整数的平方和。,分析:用变量i从10到130循环,用变量s求和,s初值为0,每次循环,s=s+i * i ;,#include main( ) long int I, s=0; for(I=10;I=150;I+) if(I%2!=0) s=s+I*I; printf(“n%ld”,s); ,2. 10,150奇数的平方和。,分析:用变量。

22、s求和,s初值为0。用变量I从10到150循环,如果I是奇数(I%2!=0),则s=s+I*I,#include main( ) long int I,s=0; for( I=10;I=150;I+) if(I%3=0|I%7=0) s=s+I*I; printf(“n%ld”,s); ,3. 10,150之间,能被3或7整除的数的平方和。,分析:用变量s求和,s初值为0。用变量I从10到150循环,如果I能被3或7整除(I%3=0|i%7=0),则s=s+I*I,#include main( ) int I,n=0; for(I=1;I=800;I+) if(I%3=0 ,4.1,800中能。

23、被3和8整除的数的个数。,分析:用变量n求个数,n初值为0。用变量I从1到800循环,如果I能被3和8整除(I%3=0 float s=0; for(I=1;I=50;I+) s=s+1.0/(I*I) printf(“n%.4f”,s); ,5.s=1+1/(2*2)+1/(3*3)+.+1/(m*m),求m=50时的s(结果保留4位小数),分析:用变量s求和,s初值为0。用变量I从1到50循环,s=s+1/(I*I),#include main( ) int n=1,s=0; do s=s+n*n; n=n+1; while(s=5500); printf(“nn=%d”,n-1); ,6。

24、.求100以内最小的自然数n,使1*1+2*2+3*3+n*n5500,分析:用变量s求和,s初值为0。用变量n从1开始循环,每次I增加1,如果s5500,循环结束。,#include main( ) int I; float a=1; for(I=2;I=25;I+) a=1/(1+a); printf(“n%.10f”,a); ,7.a1=1 a2=1/(1+a1) an=1/(1+an-1),求a25(结果保留10位小数),分析:用变量a求项,a初值为1。用变量I从2到25循环,a= 1/(1+a),#include main( ) int I; long int a=1; float 。

25、s=0; for(I=1;I=10;I+) a=a*I; s=s+1.0/a; printf(“n%.10f”,s); ,8.1/1!+1/2!+.+1/10!(结果保留10位小数),分析:用变量s求和,s初值为0。用变量a求阶乘,a初值为1。用变量I从1到10循环,a=a*I,s=s+1/a。,main( ) float s=1; int n; long int a=1,b=1; for(n=1;n=40;n+) a=a*n; b=b*(2*n+1); s=s+(float)a/b; printf(“ns=%.10f”,s); ,9.求s=1+1/3+(1*2)/(3*5)+(1*2*n)/。

26、(3*5*(2*n+1)当n=40时的值。(结果保留10位小数),分析:用变量s求和,s初值为1。用变量a用来求项的分子,变量b求项的分母,a、b初值均为1。用变量n从1到40循环,a=a*n,b=b*(2*n+1),s=s+a/b。,#include main( ) long int f1=1,f2=1,f,n; for( n=3;n=40;n+) f=f1+f2; f1=f2; f2=f; printf(“nf=%ld”,f); 思考:求14万之内的最大的f(n).,10.数列 1,1,2,3,5,8.有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求f(40),分析:。

27、用 变量f1、f2、f作为数列相邻的三项,初值f1=1,f2=1。用变量n从3到40循环,f=f1+f2,f1=f2,f2=f.,#include main( ) int n; float s=0; for( n=1;n=100;n+) if(n%2!=0) s=s+1.0/(2*n-1) else s=s-1.0/(2*n-1); printf(“n%.4f”,s); ,11. Sn=1-1/3+1/5-1/7+1/(2n-1) 求s(100)(保留4位小数),分析:用变量s求和,s初值为0。用变量n从1到100循环,如果n是奇数(n%2!=0),s=s+1/(2*n-1),否则s=s-1/。

28、(2*n-1) 。,main( ) int a,s=0,I=1, j; for( a=1000;a=1;a-) for( j=2;j20) break; printf(“n%d”,s); ,12.求1000以内最大的20个素数之和。,分析:用变量s求和,s初值为0。用变量I统计以求得素数的个数,I初值为1。用变量a从1000到1循环,如果a是素数,并且I值小于等于20,则s=s+a,I+。当i值大于20时,跳出循环。素数求法同上题,用变量j从2到a-1循环。,main( ) int a,b,n=0,I; for(a=200;a=998;a+) for(I=2;Ia;I+) if(a%I=0) 。

29、break; if(a=i) b=a+2; for(I=2;Ib;I+) if(b%I=0) break; if(b=i) n+; printf(“n%d”,n); ,13.200,1000的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。,分析:用变量n统计以求得双胞胎数的对数,n初值为0。用变量a从200到998循环,如果a是素数,则令变量b=a+2,如果b也是素数,则n值增1。素数求法同前,用变量i循环,main( ) int a,c,n=0,I; for( a=10;a=200;a+) c=0; for(I=1;I=a;I+) if( a%I=0) c+; if(a%c=0) n+。

30、; printf(“nn=%d”,n); ,14.求10,200间可以被其因子的个数整除的整数的个数。,分析:用变量n统计所求的整数个数,n初值为0。用变量a从10到200循环,如果a可以被其因子的个数整除,则n值增1。判断a是否可以被其因子的个数整除:用变量c求a的因子的个数,c初值为0,用变量I从1到a循环,如果a%I=0,则c值增1。得出c值后,若a%c=0,则a是所求整数。,main( ) int a,I,s; for(a=1000;a=1;a-) s=0; for(I=1;Ia;I+) If(a%I=0) s=s+I; if(a=s) break; printf(“n%d”,a); 。

31、思考:求1000以内所有完数的和。,15.求1000以内最大的完数。完数就是其真因子的和等于其本身的数。,分析:用变量a从1000到1循环,如果a等于其真因子的和,则循环结束。判断a是否等于其真因子的和:用变量s求a的真因子的和,s初值为0,用变量I从1到a-1循环,如果a%I=0,则s=s+i。得出s值后,若a=s,则a为所求。,#include #include “math.h” main( ) double s,a=0,n; for( n=1;n=50;n+) a=a+log(n); s=sqrt(a); printf(“ns=%.6lf”,s); ,16. S=sqrt(ln(1)+ln(2)+ln(n)n=50(结果保留6位小数),分析:开平方数及自然对数都是math.h函数库中已定义的函数。可用n从1到50循环直接求得。注意函数定义的数据类型。,main( ) int a,b,s=6000,t; for( a=1;a(a+b) s=a+b; t=b; printf(“n%d”,b); ,17.0ab,a*b=2698,且a+b 最小,求b.,分析:用变量a从1到sqrt(2698)-1循环。变量s初值为6000。若2698%a=0,则b=2698/a,若sa+b,则s=a+b,并保存b的值在变量t.,本章结束,再见!,同学们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值