收藏 分享(赏)

第5章-循环结构.ppt

上传人:j35w19 文档编号:8220405 上传时间:2019-06-15 格式:PPT 页数:81 大小:1.30MB
下载 相关 举报
第5章-循环结构.ppt_第1页
第1页 / 共81页
第5章-循环结构.ppt_第2页
第2页 / 共81页
第5章-循环结构.ppt_第3页
第3页 / 共81页
第5章-循环结构.ppt_第4页
第4页 / 共81页
第5章-循环结构.ppt_第5页
第5页 / 共81页
点击查看更多>>
资源描述

1、第5章 循环结构程序设计,C 语言程序设计,2019/6/15,2,本章主要内容,while循环控制 do-while循环控制 for循环控制 用goto语句实现循环控制(略) 循环结构中的跳转语句 循环的嵌套 循环结构程序设计举例,2019/6/15,3,5.1 while循环控制,语句一般格式 while (表达式) 语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分,2019/6/15,4,功能:,计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就

2、判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。,循环控制条件,循环体,2019/6/15,5,例如:,【例5.1】编写程序,求100个自然数的和 即: s=1+2+3+ +100,思路:寻找加数与求和的规律,加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。,2019/6/15,6,算法和程序:,main( ) int i,sum;i=1; sum=0; while (i=100) sum=sum+i;i+; printf(“sum=%dn“,sum);

3、 ,程序输出结果: sum=5050,i: 循环控制变量 sum: 累加器,2019/6/15,7,注意:,如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 循环体如果包含一个以上语句,可以用,否则,只到while后面第一个分号处。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。,8,2019/6/15,思考程序段的输出?while (i=100) i+; sum=sum+i; ,运行后,输出: sum=5150 原因是什么?,2019/6/15,9,注意(续):,为了

4、保证循环正常运行,应该特别注意:循环控制条件的描述控制条件的初始状态(初始值)循环体内部对控制条件的影响,10,2019/6/15,注意:循环控制变量值在循环体内必须有所改变。,例如: i=1; while (i=100)putchar(*); i+;,这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+; 不属于循环语句。,i+应该在循环体内改变:,i=1; while (i=100) putchar(*);i+; ,11,2019/6/15,分析程序的运行结果 #include main() int num=0;while(num=2)num+; printf(“%dn”,n

5、um+); ,2019/6/15,12,5.2 do-while语句,语句一般格式 do 语句 while (表达式); 功能: 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。,2019/6/15,13,do-while循环的算法,N-S结构图,main( ) int i=1,sum=0;do sum=sum+i;i+; while (i=100);printf(“%dn“,sum); ,用do-while语句 求100个自然数的和,2019/6/15,14,说明:,while和do-wh

6、ile都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别: do- while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行 dowhile循环体中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。,2019/6/15,15,算法和程序:1+2+100,main( ) int i,sum;i=1; sum=0; do sum=sum+i;i+; while (i=100);printf(“sum=%dn“,sum); ,程序输出结果: sum=5050,16,2019/6/15,以下程

7、序的执行结果是_ #include main()int x; x=-1;do x=x*x; while(!x);,2019/6/15,17,5.3 for语句,语句一般格式for (表达式1;表达式2;表达式3) 语句,功能: 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,2019/6/15,18,for语句的算法,例如: main( ) int i,sum;sum=0; for ( i=1; i=100; i+) sum=sum+i; p

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

9、 i100) i+; ,2019/6/15,21,说明:,所有用 while 语句实现的循环都可以用for 语句实现。,等价于:,for(表达式1;表达式2 ;表达式3)语句;,表达式1; while (表达式2) 语句;表达式3;,22,2019/6/15,例: 求 1+2 +100,#include main() int i,s=0; / *s清0 */ for(i=1;i=100;i+) s=s+i; printf(“s=%d”,i;) ,2019/6/15,23,for语句的简单应用,【例】求n! ,即计算p=123n的值。,思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*

10、”。,设置: 乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入) 累乘器 p ,每次循环令p = p*i,2019/6/15,24,程序:,#include “stdio.h“ main( ) int i, n; float p; p=1; printf(“Enter n:“); scanf(“%d“, ,思考: 如何输出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,2019/6/15,25,熟悉几个循环语句,while (!x) x+; 当 x=0 时,执行循环体x+;,while (c=getchar( ) != n) n=n+1; n 称为计数器,

11、作用是统计输入字符的个数 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以内的奇数和,2019/6/15,26,几种循环语句的比较,while和do-while语句的表达式只有一个,for语句有三个。 while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。,while语句多用于循环次数不定的情况 do-while语句多用于

12、至少要运行一次的情况 for语句多用于要赋初值或循环次数固定的情况,2019/6/15,27,5.4 用goto语句实现循环,有兴趣的同学自学 不提倡使用goto语句,注意: goto语句能实现程序无条件转移,为编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。因此应限制使用。,2019/6/15,28,5.5 循环结构中的跳转语句,有如下三种语句实现跳转: continue语句 break语句 goto语句 在循环语句的循环体中使用,可以进行循环的流程控制,2019/6/15,29,5.5.1 continue语句及应用,功能: 中断循环体的本次执行(即跳过循环体中尚未执行的语句),

13、立即开始执行下一次循环。,while语句,do-while语句,for语句,2019/6/15,30,例如:, int x,n=0,s=0; while (n10) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, for (n=0,s=0; n10; n+) scanf(“%d“, ,2019/6/15,31,应用举例,【例】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。,2019/6/15,32,算法和程序,main( ) int n,j=0;for(n=100;n=200;n+) if (n%7!=0) con

14、tinue; printf(“%6d“,n);j+;if (j%10=0) printf(“n”); /*每输出十个数换行*/ printf(“ n j=%dn“,j);,2019/6/15,33,5.5.2 循环中break的应用,功能: 利用break语句能够强迫终止本层循环,转到后续语句执行。,while语句,do-while语句,for语句,2019/6/15,34,例如:, int x,n=0,s=0; while (n10) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, for (n=0,s=0; n10; n+ ) scanf(“%d“, ,

15、2019/6/15,35,5.6 循环的嵌套,如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套 例如: #include main( ) int i, j;for ( i=1; i10; i+ )for ( j=1; j=i; j+ )printf (j=i)?“%4dn“:“%4d“,i*j);,外循环语句,内循环语句,2019/6/15,36,注意:,while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。 多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。 例如:,for(a=1;a=10;a+) for (b=0

16、;b=5;b+) ,外循环执行了10次,内循环执行6次 循环正常结束时,内循环共执行了106=60次,37,2019/6/15,00 01 02 03 04 05 10 11 12 13 14 15 20 21 22 23 24 25 30 31 32 33 34 35 40 41 42 43 44 45 50 51 52 53 54 55,输出结果:,执行语句段: for(i=0;i6;i+) for(j=0;j6;j+) printf(“%3d %3d”,i,j); putchar(n); ,38,2019/6/15,循环嵌套举例,问题:输出图形* *,39,2019/6/15,分析: 一

17、共6行, 每行的 *数目与行号相同 算法: 行用 i 表示 , 当 i = 6 do 输出 i 个 *换行 ,int i,j;for ( i=1; i7; i+) printf(“n“);for (j=1; j=i; j+ )putchar(*);,40,2019/6/15,循环嵌套举例,问题:输出图形* * *,41,2019/6/15,循环嵌套,分析: 一共4行,第i行输出的空格数为: (7-i+1)/2第i行输出 i*2-1个*,算法: 当 i = 7 do 输出 (7-i+1)/2个空格 ;输出i 个 *换行 ; i+=2 ;,42,2019/6/15,main() int i,j;

18、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 个 * */ ,43,2019/6/15,以下程序执行后的输出结果是_ #include main() int i,j,k;for(i=1;i=6;i+)for(j=1;j=20-2*i;j+) printf(“ ”);for(k=1;k=i;k+) printf(“%4d”,i);printf(“n”); ,2019/6/15,44,

19、5.7 循环结构综合举例,【例】按每行输出5个数的形式输出Fibonacci数列的前20项 。,思路:Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、。此数列的变化规律是:,设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项; 将f1f2, f2f3,再求f3=f1+f2得到第4项; 依此类推求第5项、第6项,这是一种递推算法 应采用循环实现,2019/6/15,45,算法和程序,#define N 20 main( ) int i,f1,f2,f3;f1=f2=1;printf(“n%8d%8d“,f1,f2);for (i=3; i=N

20、; i+) f3=f1+f2;f1=f2; f2=f3;printf(“%8d“,f3);if (i%5=0) printf(“n“); ,2019/6/15,46,举例2,【例】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。,思路:素数是指只能被1和它本身整除的数,如5、7、11、17、等。,分别用2、3、,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。,这是一种穷举算法 设除数为j,从2循环到m-1,2019/6/15,47,算法和程序:,#include “math.h“ main( ) int j,m,k;printf(“Enter a

21、n integer number: “);scanf(“%d“, ,2019/6/15,48,程序的优化,对于穷举法来说,为了提高程序的效率,就要减少尝试次数。,#include “math.h“ main( ) int j,m,k;printf(“Enter an integer number: “);scanf(“%d“, ,思考:如何输出100200中所有的素数,2019/6/15,49,举例3,【例】输入一个正整数n,计算并输出1+1/2+1/3+.+1/n的值。,#include main( ) int n, i; float t, s;scanf(“%d”, ,2019/6/15,

22、50,举例4,【例】编程序求210000以内的完全数。,完全数:一个数的因子(除了这个数本身)之和等于该数本身。,思路: 设定i从2变到10000,对每个i找到其因子和s; 判定 is?若相等,则i为完全数,否则不是。,例如:6的因子是1、2、3,因子和 1+2+36 因此 6 是完全数,使用穷举算法 用双层循环实现,2019/6/15,51,算法和程序:,main( ) int i,j,s;for (i=2; i=10000; i+) s=0;for (j=1; ji; j+)if (i%j=0)s+=j;if (i=s)printf(“%6dn“,s); ,2019/6/15,52,举例5

23、,【例】编程序,输出以下图形。,*,一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的空格: j 从1变化到 i,每次输出一个空格 变量 k控制输出每行的星号: k从1变化到 8-2*i1,每次输出一个星号,使用双重循环实现,思路:,2019/6/15,53,算法和程序:,main( ) int i,j;for (i=1; i=4; i+) for (j=1; j=i; j+)printf(“ “);for (j=1;j=8-(2*i-1);j+)printf(“*“);printf(“n“);,思考: 如何输出1

24、0行图形? 输出图形向右平移20个字符位置,应如何修改程序?,2019/6/15,54,【例】用辗转相除法求m和n的最大公约数,2019/6/15,55,算法和程序:,main( ) int m,n,r;scanf(“%d, %d“,程序运行情况如下: 24, 60 12,56,2019/6/15,综合练习:1、求水仙花数:如:153=1*1*1+5*5*5+3*3*3,57,2019/6/15,#include main() int i,a,b,c; for(i=100;i=999;i+) a=i/100;b=i/10-a*10;c=i-b*10-a*100; if(i=a*a*a+b*b*

25、b+c*c*c)printf(“%d=%d*%d*%d+%d*%d*%d+%d*%d*%dn”, i,a,a,a,b,b,b,c,c,c); ,解答:,58,2019/6/15,2、已知四位数a2b3能被23整除,求此四位数。,59,2019/6/15,#include main() int a,b,n; for (a=1;a=9;a+) for(b=0;b=9;b+) n=a*1000+200+b*10+3; if(n%23=0)printf(“n=%d2%d3n”,a,b); ,解答:,60,2019/6/15,3、将正偶数n分解为两个素数之和。,61,2019/6/15,#include

26、#include main() int a,b,c,d;scanf(“%d”,解答:,62,2019/6/15,4、将输入的数字字串(回车结束)转换为对应的整数。,63,2019/6/15,#include#include main() char c=getchar();int n,s=0;while(c!=n) if(isdigit(c)n=c-0;s=10*s+n; /*高位应*10*/c=getchar(); printf(“s=%dn”,s); ,解答:,64,2019/6/15,写程序:输出10以内的加法表;(s4-4.c),65,2019/6/15,编写程序:求的值。(s4-5.c

27、),66,2019/6/15,鸡兔共有30只,脚90只,编程计算鸡兔各有多少只。(s4-7.c)提示:设有鸡x只,则兔只有30-x只,循环0-15次,即可求得。,67,2019/6/15,计算e=1+1/1!+1/2!+1/3!+1/N!(s4-8.c) 精度为1E-6(即1/N!1 E-6 就停止循环),68,2019/6/15,编写程序,输出以下图形:(s4-9.c) 提示:在图形的上半部,每行中输出的空格数和字符数随着行的下移而减少和增加,故可通过两个for循环控制每行输出的空格数和字符数。用一个大循环(包含上面的两个循环)控制不同行的输出。 For (.) /*从第一行到最后一行*/

28、for () printf(); /*输出若干空格*/for () printf(); /*输出若干字符*/printf(); /*换行*/,循环结构,C 语言程序设计,课堂练习,70,选择题:,1. 语句while (!E); 括号中的表达式!E等价于_ 。A)E=0 B)E!=1C)E!=0 D)E=1 2. 执行语句for (i=1;i+4;) ; 后变量i的值是_。A)3 B)4 C)5 D)不确定 3. 以下程序段的循环次数是_ 。for (i=2; i=0; ) printf(“%d” , i-) ;A)无限次 B)0次 C)1次 D)2次,71,4. 有程序段 int k=2;

29、while (k=0) printf(“%d”,k);k-; 则下面描述中正确的是_ 。A)while循环执行10次B)循环是无限循环C)循环题语句一次也不执行D)循环体语句执行一次,72,5.下面程序的输出结果是_。main ( ) int x=9;for (; x0; x-) if (x%3=0) printf(“%d”,-x); continue ;A)741 B)852 C)963 D)875421,73,6.下述程序段的运行结果是_。int a=1,b=2, c=3, t;while (abc) t=a; a=b; b=t; c-;printf(“%d,%d,%d”,a,b,c);A

30、)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1,74,7. 下面程序的输出结果是_ 。 main ( ) int k=0,m=0,i,j;for (i=0; i2; i+) for (j=0; j3; j+)k+ ;k-=j ;m = i+j ;printf(“k=%d,m=%d”,k,m) ; A)k=0,m=3 B)k=0,m=5C)k=1,m=3 D)k=1,m=5,75,8. 以下for循环的执行次数是_。for (x=0,y=0; (y=123) A)无限循环 B)循环次数不定C)4次 D)3次9.下面有关for循环的正确描述是_。 A) for循环只能用于循环次数已经

31、确定的情况 B) for循环是先执行循环体语句,后判断表达式 C) 在for循环中,不能用break语句跳出循环体 D) for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来,76,10.以下不是死循环的语句是_。A)for (y=9,x=1;x+y;x=i+) i=x ;B)for ( ; ; x+=i ) ;C)while (1) x+ ; D)for (i=10 ; x=1; i-) sum+=i ;,77,1. int i,j,k=0; 执行for(i=0;i=7;i+=2) for (j=1;j=15;j+=3) k+; k的值为_。 2. int d; for (d=1

32、;d=3;d+) if (d%2) printf(“O”);else continue; printf(“K”); 执行输出_。 3. int a, b=32451; 则while(b) a=b%10;b=b/10; printf(“%d:”,a); 输出_。 4. int a,b,r; 执行for(a=0,b=5;a=b;a+,b-) r=a+b; 后r 的值为_。,填空题:,78,5.下列程序段的输出是_。 main() int k;for(k=1; k5; k+) if(k % 2) printf(“*“);else continue;printf(“#“); ,79,6.程序运行后输出

33、结果是_。 main() int i;for(i=0;i3;i+)switch(i) case 1: printf(“%d“,i);case 2: printf(“%d“,i);default: printf(“%d“,i); ,80,编程题:,1. 找出100200之间所有不能被3整除的数。 2. 已知四位数a2b3能被23整除,编程求出此数。 3. 将输入的数字字串(回车结束)转换为对应的整数 。 4. 求100以内最小的自然数n,使1*1+2*2+3*3+n*n5500 5. 求1/1!+1/2!+.+1/10! (结果保留10位小数) 6. 求1000以内的完数。完数就是其真因子的和等于其本身的数。 7. 输出九九乘法表(正三角形式)。,2019/6/15,81,本章结束,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报