第5章循环结构程序设计.ppt

上传人:文库蛋蛋多 文档编号:2566450 上传时间:2023-02-20 格式:PPT 页数:61 大小:699.50KB
返回 下载 相关 举报
第5章循环结构程序设计.ppt_第1页
第1页 / 共61页
第5章循环结构程序设计.ppt_第2页
第2页 / 共61页
第5章循环结构程序设计.ppt_第3页
第3页 / 共61页
第5章循环结构程序设计.ppt_第4页
第4页 / 共61页
第5章循环结构程序设计.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第5章循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章循环结构程序设计.ppt(61页珍藏版)》请在三一办公上搜索。

1、5.1 while语句5.2 do-while语句5.3 for 语句5.4 break、continue和goto语句5.5 循环的嵌套5.6 复合结构程序举例,第五章 循环结构程序设计,教学目的和基本要求:,要求学生了解循环结构程序设计,掌握各种循环语句应用的特点及异同点,掌握循环嵌套及复合结构。,教学重点:,各种循环语句应用的特点及异同点。,对于这样的一个问题:从键盘输入一百个学生的成绩,求总成绩。从前面所学,有两种解决方法。1.设一百个变量,分别输入学生的成绩,然后求和。这种方法浪费内存空间,显然不实际。2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:scanf

2、(“%f”,.这样重复一百次,然后 输出s的值。,这样写显然非常麻烦。我们注意到程序中的 scanf(“%f”,两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。,C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。,5.1 while语句,while 语句是通过判断循环控制条件是否满足来决定是否继续循环的语句。一般形式:while(表达式)语句表达式为循环控制条件,当表达式的值为非零(满足循环条件),就执行语句,当

3、表达式的值为零,就退出循环。,while语句执行流程,首先计算表达式,如果表达式的值为非零,执行语句,重新计算表达式,如果表达式的值为0,则跳出循环,如果表达式的值一开始就为0,则语句一次也会被不执行。,while语句举例,问题:求n个学生的平均成绩算法:1 输入 n;i=1,average=0;2 输入第 i 个学生的score;3 average+=score;i+;4 当 i=n 重复做2;5 average/=n;,main()int n,score,i=1;float average=0;printf(“n Enter n:”);scanf(“%d”,5.2 dowhile语句,do

4、while 语句的一般形式是:do 语句 while(表达式)特点:首先执行语句,再通过判断循环控制条件是否满足来决定是否继续循环。,dowhile语句执行流程,首先计算语句,再计算表达式。,如果表达式的值为非零,继续下一次循环,如果表达式的值为0,则跳出循环,如果表达式的值一开始就为0,也会执行一次语句。,main()int n,score,i=0;float average=0;do printf(“n Enter score:”);scanf(“%d”,注意:循环控制变量值在循环体内必须有所改变。,例如:i=1;while(i=100)putchar(*);i+;,这个循环永远不会结束,

5、因为循环控制变量i没有在循环体内被改变,i+;不属于循环语句。,i+应该在循环体内改变:,i=1;while(i=100)putchar(*);i+;,5.3 for循环语句,for(表达式1;表达式2;表达式3)循环体语句,这是C语言最有特点的循环语句。使用最为灵活方便 一般形式:,先计算初值表达式,用于循环开始前设置变量初值。接着计算循环控制逻辑表达式,控制循环条件,决定循环次数。执行循环体语句,这个语句也可以是其它循环。循环控制变量,修改表达式。,执行流程,例:求 1+2+99,#include(stdio.h)main()int i,s=0;/*s清0*/for(i=1;i100;i+

6、)s=s+i;printf(“s=%d”,i;),循环语句的多种表示,for(i=0;i100;i+)s=s+i;,main()int i=1,s=0;do s=s+i;while(+i100)printf(“s=%d”,i);,main()int i,s=0;i=0;while(i100)s=s+i;i+;printf(“s=%d”,i);,for语句的表达式可以省略,如已先给变量赋过值。则可以省略表达式1。,for(;i100;i+),如果想在循环内部改变变量的值,则可以省略表达式3。,for(i=0;i100;),如果都省略的话就相当于while。,for(;i100;)while(i1

7、00),全部省略就是死循环。,for(;)(需要用break跳出),逗号表达式,逗号运算符的主要应用就在for语句中。for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。,例:for(i=1,j=10;i=j;i+,j-),for(i=a,j=b;i=j;i+,j-)举例,问题:求 1/100+2/99+1 float s=0.0;for(i=1,j=100;i=j;i+,j-)s=s+i/j;,循环语句流程图,while循环 dowhile循环 for循环,循环语句流程图的统一格式。,5.4 brea

8、k、continue、goto语句,这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句,非结构化语句之break,它的作用是把流程转向所在结构之后。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。,简单的说就是跳出当前所在的结构,main()int s=0,i=1:for(;)s=s+i;i+;if(i100)break;/*如果 i100,则退出循环*/printf(“s=%d”,s);本程序中,当i100时,强行终止for循环,

9、继续执行for语句下一条语句,非结构化语句之continue,continue语句被称为继续语句。执行continue语句,使本次循环提前结束,即跳过循环体中continrue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为:continue;,例5.4 显示输入的字符,如果按的是Esc键,则退出循环;如果按的是Enter键,则不做任何处理,继续输入下一个字符。,#include“conio.h”main()char ch;for(;)ch=getch();/*字符输入函数*/if(ch=27)/*Esc键的ACSII

10、码为27*/break;/*退出循环*/if(ch=13)continue;/*按的是Enter:键,跳过字符输出语句*/putch(ch);/*显示输入的字符*/getch();/*让程序停一下,拍任意键继续*/,非结构化语句之goto,goto被称为无条件转移语句。由两部分组成goto 标号;和 标号:语句,它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。,#include“stdio.h”main()float score,average=0;int n=0;scanf(“%f”,&score);/*输入第一个学生的分数*/if(score=0)/*表达式为非0,转移

11、到loop标号处*/goto loop;average=average/n;/*求平均成绩average*/end:printf(“%6.2f”,average);/*输出平均成绩,保留两位小数*/,5.5 循环的嵌套,在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环称语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。While、do-while、for三种循环都可以互相嵌套。循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。,00 01 02 03 04 0510 11 12

12、 13 14 1520 21 22 23 24 2530 31 32 33 34 3540 41 42 43 44 4550 51 52 53 54 55,输出结果:,执行语句段:for(i=0;i6;i+)for(j=0;j6;j+)printf(“%3d%3d”,i,j);putchar(n);,循环嵌套举例,问题:输出图形*,分析:一共6行,每行的*数目与行号相同算法:行用 i 表示,当 i=6 do 输出 i 个*换行,int i,j;for(i=1;i7;i+)printf(n);for(j=1;j=i;j+)putchar(*);,循环嵌套举例,问题:输出图形*,循环嵌套,分析:一

13、共4行,第i行输出的空格数为:(7-i+1)/2 第i行输出 i*2-1个*,算法:当 i=7 do 输出(7-i+1)/2个空格;输出i 个*换行;i+=2;,main()int i,j;for(i=1;i=7;i+=2)printf(“n”);for(j=1;j=(7-i+1)/2;j+)putchar();/*输出(7-i+1)/2个空格*/for(j=1;j=i;j+)putchar(*);/*输出i 个*/getch();,复合程序结构,C语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不

14、允许出现嵌套层次之间相互交叉的情况。,例:给多个学生的成绩评级。#include main()int i,score;scanf(%d,/*输入下一个学生的成绩*/while 结构中嵌套了一个多分支选择结构。,5.6 复合程序结构举例,例1目标:输入一个年号,判断是否为闰年。算法:能被4整除且不是100的倍数,或者能被400整除。,#include void main()int year,leap;printf(“Enter year:”);scanf(“%d”,/*不是闰年leap 置成0*/if(leap=1)printf(“%d:is a leap year.”,year);else p

15、rintf(“d is not a leap year”,year);,例2目标:找出3至1000内的全部的质数。算法:从i=1 开始做分别用2,3,4,i-1 除i,如果i被某个数整除,i是素数。i+;测试下一个i;,#include main()int i,j,count,flag;/*用flag作标志*/count=0;for(i=3;i=1000;i+)flag=0;/*设标志为0*/for(j=2;j=sqrt(i);j+)if(i%j=0)/*用 j 测试 i*/flag=1;/*不是素数,设标志为1*/*i 测试完毕*/if(flag=0)/*i是素数*/printf(“%4d,

16、”,i);count+;if(count%8=0)printf(“n”);/*每输出8个素数就换行*/*测试下一个 i*/,习题课:1.10,130之间,所有整数的平方和。分析:用变量i从10到130循环,用变量s求和,s初值为0,每次循环,s=s+i*i;,main()long int i,s=0;for(i=10;i=130;i+)s=s+i*i;printf(“n%d”,s);,注意:i一定要是 long int 型。,2.10,150奇数的平方和。分析:用变量s求和,s初值为0。用变量I从10到150循环,如果I是奇数(I%2!=0),则s=s+I*I,main()long int i

17、,s=0;for(i=10;i=150;i+)if(i%2!=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,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);,4.1,800中能被3和8整除的数的个数。分析:用变量n求个数,n初值为0。用变量I从1到800循环,如果I能被3和8整除(I%3=0&i%8=0

18、),则n+,main()int i,n=0;for(i=1;i=800;i+)if(i%3=0,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)main()int I;float s=0;for(I=1;I=50;I+)s=s+1.0/(I*I)printf(“n%.4f”,s);,6.求100以内最小的自然数n,使1*1+2*2+3*3+n*n5500 分析:用变量s求和,s初值为0。用变量n从1开始循环,每次I增加1,如果s5500,循环结束。main()int

19、 n=1,s=0;do s=s+n*n;n=n+1;while(s=5500);printf(“nn=%d”,n-1);,7.a1=1 a2=1/(1+a1)an=1/(1+an-1),求a25(结果保留10位小数)分析:用变量a求项,a初值为1。用变量I从2到25循环,a=1/(1+a)main()int I;float a=1;for(I=2;I=25;I+)a=1/(1+a);printf(“n%.10f”,a);,8.1/1!+1/2!+.+1/10!(结果保留10位小数)分析:用变量s求和,s初值为0。用变量a求阶乘,a初值为1。用变量I从1到10循环,a=a*I,s=s+1/a。m

20、ain()int I;long int a=1;float s=0;for(I=1;I=10;I+)a=a*I;s=s+1.0/a;printf(“n%.10f”,s);,9.求s=1+1/3+(1*2)/(3*5)+(1*2*n)/(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。main()float s=1;int n;long int a=1,b=1;for(n=1;n=40;n+)a=a*n;b=b*(2

21、*n+1);s=s+(float)a/b;printf(“ns=%.10f”,s);,10.数列 1,1,2,3,5,8.有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求 f(40)分析:用 变量f1、f2、f作为数列相邻的三项,初值f1=1,f2=1。用变量n从3到40循环,f=f1+f2,f1=f2,f2=f.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).,11.求2/1,3/2,5/3,8/5的前30项之和(保留

22、4位)分析:此数列特征为后一项的分子是前一项的分子与分母的和,后意项的分母为前一项的分子。用变量s求和,s初值为0。用变量a用来求项的分子,变量b求项的分母,c为中间变量,初值a=2,b=1。用变量i从2到30循环,c=a,a=a+b,b=c,s=s+a/b;main()float s=2,a=2,b=1,c;int I;for(I=2;I=30;I+)c=a;a=a+b;b=c;s=s+a/b;printf(“n%.4f”,s);,12.Sn=1-1/3+1/5-1/7+1/(2n-1)求s(100)(保留4位小数)分析:用变量s求和,s初值为0。用变量n从1到100循环,如果n是奇数(n%

23、2!=0),s=s+1/(2*n-1),否则s=s-1/(2*n-1)。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);,13.求20,700间素数的个数。分析:用变量n求个数,n初值为0。用变量a从20到700循环,如果a是素数,则n值加一。判断素数的方法:用变量I从2到a-1循环,如果存在I使得a%I=0,则a不是素数,否则,a是素数。main()int a,n=0,I;for(a=20;a=700;a+)for(I=2;I=a-1;

24、I+)if(a%I=0)break;if(I=a)n+;printf(“nn=%d”,n);,14.求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,s=0,I=1,j;for(a=1000;a=1;a-)for(j=2;j20)break;printf(“n%d”,s);,15.200,1000的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。分析:用变

25、量n统计以求得双胞胎数的对数,n初值为0。用变量a从200到998循环,如果a是素数,则令变量b=a+2,如果b也是素数,则n值增1。素数求法同前,用变量i循环。main()int a,b,n=0,I;for(a=200;a=998;a+)for(I=2;Ia;I+)if(a%I=0)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);,16.求10,200间可以被其因子的个数整除的整数的个数。分析:用变量n统计所求的整数个数,n初值为0。用变量a从10到200循环,如果a可以被其因子的个数整除,则

26、n值增1。判断a是否可以被其因子的个数整除:用变量c求a的因子的个数,c初值为0,用变量I从1到a循环,如果a%I=0,则c值增1。得出c值后,若a%c=0,则a是所求整数。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+;printf(“nn=%d”,n);,17.求1000以内最大的完数。完数就是其真因子的和等于其本身的数。分析:用变量a从1000到1循环,如果a等于其真因子的和,则循环结束。判断a是否等于其真因子的和:用变量s求a的真因子的和,s初值为0,用变量I从1到a-1循

27、环,如果a%I=0,则s=s+i。得出s值后,若a=s,则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);作业:求1000以内所有完数的和。,18.S=sqrt(ln(1)+ln(2)+ln(n)n=50(结果保留6位小数)分析:开平方数及自然对数都是math.h函数库中已定义的函数。可用n从1到50循环直接求得。注意函数定义的数据类型。#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);,19.0a+b,则s=a+b,并保存b的值在变量t.main()int a,b,s=6000,t;for(a=1;a(a+b)s=a+b;t=b;printf(“n%d”,b);,本章结束,再见!,同学们:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号