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

上传人:本田雅阁 文档编号:2577670 上传时间:2019-04-11 格式:PPT 页数:52 大小:322.01KB
返回 下载 相关 举报
第4章循环结构程序设计2.ppt_第1页
第1页 / 共52页
第4章循环结构程序设计2.ppt_第2页
第2页 / 共52页
第4章循环结构程序设计2.ppt_第3页
第3页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、循环程序设计(2),1.break语句,break语句和continue,(1) 语句形式: break;,(2)作用: 结束break所在的 switch语句。 结束当前循环,跳出break所在的循 环结构。,【例7:】 求300以内能被17整除的最大的数。,【例8】 求300以内能被17整除的所有整数。,#include “stdio.h“ void main() int x; for(x=1;x=300;x+) if(x%17!=0) continue; printf(“%dt“,x); ,while(x=300) if(x%17!=0)x+; continue; printf(“%dt

2、“,x); x+; ,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,2、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,#include “stdio.h“ void main() int a, b; for(a=1,b=1; a=10) break; if(b%3=1) b+=3; continue; printf(“%dn“,a); ,【练习:】 分析以下程序的运行结果。,程序运行结果: 4,循环程序设计(循环嵌套),例7:打印如下所示等腰三角

3、形() * * * * *,循环程序设计(循环嵌套),* * * * *,例8 : 如何打印: *,NEXT,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内部的循环体中又有嵌套的循环语句,则构成多重循环。,while 、do-while、for三种循环都可以互相嵌套。,循环嵌套,循环语句之间的关系,菱形图案程序如下:,#include “stdio.h“ void main() int i,j,k; for(j=1;j=0;j-) /下三角 for(k=1;k=4-j;k+) printf(“ “); for(i=1;i=2*j+1;i+) printf(“*“);

4、printf(“n“); ,循环嵌套,枚举或穷举算法:按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。,循环嵌套,例9 :百钱买百鸡。(鸡翁一值钱五,鸡母一值钱3,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?,Cocks hens chicks,1,1,98,2,97,33,66,2,1,2,33,97,96,65,20,1,2,33,#include “stdio.h“ void main() int x,y,z; for(x=1;x=20;x+) for(

5、y=1;y=33;y+) z=100-x-y; if (5*x+3*y+z/3 =100) ,循环嵌套,例10 、搬砖问题:36块砖,36人搬,男搬4,女搬3,两个小孩抬一块砖。要求一次全搬完,问男、女、小孩各若干?,解:据题意: men的值:19 women的值:112 children的值:36-men-women,教材例4-17(P86)采用对个位、十位、百位 进行穷举的方法输出所有水仙花数。,循环程序设计,使用枚举法,主要掌握两条原则: 1、确定搜索范围。 2、选择搜索策略。 搜索策略选择得好坏,直接决定程序的工作量的大小。,循环程序设计,请思考下面程序的功能,并思考怎样改变搜索策略或

6、搜索范围,可以提高程序的效率。 void main() int m,n,i; m=7;n=5;i=1; do if(i%m=0) if(i%n=0) printf(“%dn”,i); break; i+; while (i!=0); ,例10:求最小公倍数 # include void main() int x,y,z,t; printf(“Please input x,y:“); scanf(“%d%d“, ,for(z=x;z%y!=0;z+=x);,void main() int m,n,i; m=7;n=5;i=7; do if(i%n=0) printf(“%dn”,i); brea

7、k; i=i+7; while (i=m*n); ,枚举法求2个整数的最大公约数,# include void main() int x,y,z,t; printf(“Please input x,y:“); scanf(“%d%d“, ,例11 判断m是否素数。 算法: 素数:除了1和自身外不能被其他数整除。 判断方法:测试m能否被2到根号m整除。 数学上已经证明:只要m不被2到根号m之间的数整除,它就是素数。 根号m的计算方法:利用求平方根的函数sqrt,循环程序设计,循环变量:定义为i(整型) 循环变量的范围: 2k ,k=sqrt(m) (k为整型) 即:i的初值为2,循环执行条件为i

8、=k 循环变量的变化:i+ 重复执行的操作: 如果m能被i整除,则说明m不是素数,也就不需要进行后面的判断,应退出循环结构(用break语句);否则,继续判断。 结果的输出: 如果循环是中途退出的,则i=k,输出m不是素数;否则,m是一个素数。,例11 程序 #include #include void main( ) int i,m,k; scanf(“%d“, ,#include #include void main( ) int i,m,k,flag; flag=1; scanf(“%d“, ,输出100以内的所有素数(5个一行输出),#include #include void mai

9、n( ) int i,k,m,n; n=0; for (m=2;mk) /是素数 printf(“%5d“,m); n+; if(n%5=0) printf(“n“); ,循环程序设计,算法2:迭代。 不断用新值取代变量的旧值或由旧值递推出变量的新值的过程。,分析:设现有人口数为M,则第一年后人口变为:M=M*(1+0.02),第二年后,把上述赋值表达式再执行一次,要计算10年后的人口,就是把上述表达式执行10次。可以用循环来实现。,例如:人口增长问题: 现有12亿人,按年2%的增长速度,10年后将有多少人?,循环程序设计,迭代与下列因素有关:,初值;,迭代公式;,迭代次数,例12 : 兔子繁

10、殖问题: 设有一对新生兔子,从第三个月开始每个月都生一对兔子,按此规律,并假设没有兔子死亡,一年后共有多少兔子?(请写出每月兔子对数,找出规律),每月兔子呈如下规律:1,1,2,3,5,8,13,21,34,找出迭代规律:,f1=f2=1; f3=f1+f2;f4=f2+f3; fn+1=fn+fn-1,程序代码如下: #include “stdio.h“ void main() int i,f1,f2,f3; f1=f2=1; for(i=3;i=12;i+) f3=f1+f2; printf(“%6d“,f3); f1=f2; /用新值取代旧值 f2=f3; /用新值取代旧值 ,循环程序设

11、计,例13 求2个非负整数的最大公约数。,u=55 v=15,r=u%v=10,r=u%v=5,r=u%v=0,求2个非负整数的最大公约数程序代码。,#include “stdio.h“ void main() int u, v, r; scanf(“%d%d“, ,例14猴子吃桃子问题(递推法) (教材P99-14),#include void main() int x,y,i; /i表示天数, y表示某天, x表示其前一天 y=1; /第10天的桃子数 for(i=9;i=1;i-) x=2*(y+1); /计算前一天的桃子数 y=x; printf(“%d“,x); ,x=2*(x+1)

12、,例15:有一分数序列 、 、 、 、,从第2项开始,每一项的分子为前一项的分子与分母之和,每一项的分母为前一项的分子,编程求这个数列的前n 项之和。,编程思路: 该程序需要用到递推算法,根据序列的第1项推出第2项,再根据第2项推出第3项,。,#include void main() int a=2,b=1,t,i,n; double sum=0.0; printf(“请输入n:“); scanf(“%d“, ,例15: 输出所有水仙花数。所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。例:15313+53+33 (枚举法),编程思路: (1) (搜索范围)循环变量的初值:m=10

13、0 循环条件:m=999 循环变量的增量:m+ (2) (搜索策略)循环体:判断m是否是水仙花数,是,则输出该数。,枚举法的其他应用示例,程序代码如下: #include void main() int m,bai,shi,ge;/ bai、shi、ge分别对应百位、十位和个位 for(m=100;m=999;m+) bai=m/100; shi= m/10 %10; ge=m%10; if(m=bai*bai*bai+shi*shi*shi+ge*ge*ge) printf(“%d “,m); ,程序运行结果如下: 153 370 371 407,例16:已知abc+cba=1333;其中a

14、、b、c均为一位数,编程求出满足条件的a,b,c的所有组合。 【解析】可以用三重循环穷举所有的解。 程序代码如下: #include void main() int a,b,c; for(a=1;a=9;a+) for(b=0;b=9;b+) for(c=0;c=9;c+) /把 abc cba 连接起来变成整数判断 if(a*100+b*10+c)+(c*100+b*10+a)=1333) printf(“a=%d,b=%d,c=%dn“,a,b,c); ,例17. 完数,即完美数,一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=123(6的因子是1,2,3),6即完数。试

15、求1000内所有完数并输出。,程序代码如下: #include void main() int j,i /i表示要判断的数,j表示i的因子 int s; for(i=1;i=1000; i+) s = 0; /对某个数进行测试前先将和置0 for(j=1;ji;j+) /j表示因子 if(i%j = 0) s = s + j; if(s= i) printf(“%d是完数n“, i); ,4.7案例分析与实现 4.7.1 学生结构体数组的定义和引用,1. 结构体数组的定义 采用结构体变量可以实现一个学生信息的输入、处理和输出。但是如果要输入100个学生的信息呢? 定义结构体数组的格式如下: s

16、truct 结构体名 数组名下标; 这样学生结构体数组可以定义为: struct stu_type stu100;,2. 结构体数组的引用,引用结构体数组成员的格式如下: 结构体数组名下标.成员名 例如,第1个学生的各科成绩进行赋值,并计算总分: stu0.c=60; stu0.math=70; stu0.en=80; stu0.sum=stu0.c+stu0.math+stu0.en;,在学生信息管理系统的设计中有许多需要重复处理的问题。例如: 向系统添加100个学生的成绩; 统计100个学生中C语言成绩不及格的学生人数; 对100个学生某门课程的成绩进行排序等。 要处理上述问题,最简明的方

17、式是采用循环结构。,4.7案例分析与实现,本章小结,主要内容总结如下: (1) 循环语句包括两部分:循环控制条件和循环体。 (2) 循环语句有三种:for语句、while语句和do-while语句。它们的应用场合如下:循环次数事先明确的,一般使用for语句;循环次数不明确的,一般使用while语句或do-while语句。 (3) break语句用来提前终止循环,跳出循环体;continue语句用来提前结束本次循环,进入下一次循环。 (4) 三种循环语句可以互相嵌套,构成多重循环。,例18输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。,程序代码如下: #include voi

18、d main() char c; int letters=0,space=0,digit=0,others=0; printf(“please input some charactersn“); while(c=getchar()!=n) if(c=a,1.下面有关for循环的正确描述是( ) A)for循环只能用于循环次数已经确定的情况 B)for循环是先执行循环体语句,后判断表达式 C)在for循环中,不能用break语句跳出循环体 D) for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 答案D 2.对for(表达式1; ; 表达式3)可理解为( ) A) for(表达式1

19、; 0 ; 表达式3) ; B)for(表达式1; 1 ; 表达式3); C)for(表达式1;表达式1;表达式3);D) for(表达式1;表达式3 ;表达式3); 答案B 3. 下面程序的运行结果是 #include main() int y=10; doy-;while(-y); printf(“%dn“,y-); -1 B) 1 C) 8 D) 0,答案D,4. 下面程序段的运行结果是 for(y=1;y10;) y=(x=3*y,x+1),x-1); printf(“x=%d,y=%d“,x,y); A) x=27,y=27 B) x=12,y=13 C) x=15,y=14 D)

20、x=y=27 答案C 5. 语句while(!E);中的表达式!E等价于_ A) E=0 B) E!=1 C) E!=0 D) E=1 答案A,6. 下面程序的运行结果是 #include main() int a=1,b=10; do b-=a;a+;while(b-0); printf(“a=%d,b=%dn“,a,b); a=3,b=11 B) a=2,b=8 C) a=1,b=-1 D) a=4,b=9 答案B 7. 以下程序段_ x=-1; do x=x*x; while(!x); A) 是死循环 B) 循环执行二次 C) 循环执行一次 D) 有语法错误 答案C,8. 有以下程序 #

21、include main() int i, j=4; for (i=j;i=2*j; i+) switch (i/j) case 0: case 1: printf(“*“); break; case 2: printf(“#“); 程序的运行结果是(*#) 9. 以下程序的输出结果是( ) main( ) int i; for(i=1;i6;i+) if(i%2)printf(“#“);continue; printf(“*“); printf(“n“); A) #*#*# B) # C) * D) *#*#* 【答案】A,10. 请读程序 #include main() int num=0

22、; while(num=2) num+; printf(“%dn“,num); 上面程序的输出结果是 A) 1 B) 1 C) 1 D) 1 2 2 2 3 3 4 【答案】 B 11. 执行for(m=1;m+5;);后,变量m的值为() A)5 B)6 C)7 D)8 【答案】 B,12. 以下程序的输出结果是( )。 void main() int s,i; for(s=0,i=1;i void main() int n=2,k=0; while(k+ A) 0 2 B) 1 3 C) 5 7 D) 1 2 【答案】D,14. 下面程序的输出是( ) main() int y=9; fo

23、r( ; y0; y-) if(y%3=0) printf(“%d“, -y);continue; A) 741 B) 852 C) 963 D) 875421 【答案】B,单元测试,1、指出下列程序的运行结果 ch6_dycs1.c main() int x=1,i=1; for ( ;x=10) break; if(x%2!=0) x+=3; continue; x-=1; printf(“%dn”,x); printf(“%dn”,i); ,s*(1+r) ;,(r*s)/(s-1);,(n=k);,#include #define k 10 main() int n=1; float r=2.5,s=1.0, t; do s= t= printf(“N=%d,T=%fn“,n,t); +n; while ,用下面的scanf函数输入数据,使a=2,b=4,x=2.5,y=12.66,c1=D,c2=f,问在键盘上如何输入?,#include void main() int a,b; float x,y; char c1,c2; /整数输入 scanf(“a=%d,b=%d“,/实数输入 scanf(“%f%f“, ,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1