分校C课件第8讲循环结构36(53).ppt_第1页
分校C课件第8讲循环结构36(53).ppt_第2页
分校C课件第8讲循环结构36(53).ppt_第3页
分校C课件第8讲循环结构36(53).ppt_第4页
分校C课件第8讲循环结构36(53).ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第八讲循环结构,1掌握循环的概念,循环就是重复地执行的一组指令或程序段。需反复执行的程序段称为循环体,控制循环进行的变量称为循环变量。 2掌握三种循环语句:while语句实现当型循环、do while 语句实现直到型循环和for语句实现次数控制的循环,掌握利用他们设计程序的方法。 3掌握break和continue 语句的功能和使用方法。 4掌握多重循环的设计方法,达到简单运用。 5掌握goto语句构造循环的方法及缺点。,【教学要求】,2/40,While循环结构,while语句 while () ; C语言代码举例:,循环结构,int product=2; while (product=10) product=2*product;,while 循环结构是单入/单出结构,1、功能:while语句一般完成当型循环, 2、语句格式为: while (表达式p) 循环体 3、执行过程:当表达式P为真时,反复执行A操作,而当表达式P为假(0)时停止执行。,可以是两种语句 单语句 复合语句,P,A,3/40,/例cw0701-1.c :求 #include #define P printf int main( ) int i=1,sum=0; while (i=100) sum=sum+i; i+; P(“%dn“,sum); for(i=1;i25;i+) P(“*“); P(“n“); return 0; ,求和变量赋初值为0,后面一个循环起什么作用?,此处可否用一个语句代替?i+,以后类推。,4/40,/*cw0702.c*/ #include int main ( ) int n,t=1; long int s=1; printf(“求多少的阶乘?“); scanf (“%d“, ,分析:n!= n* (n 1)*(n 2)* 2*1, 0 ! = 1。即S0= 1,Sn= n *(S n 1)! 可以从S0开始,依次求出S1、S2、. . . Sn。 令S等于阶乘值, S的初值为0!= 1;变量i为计数器, i从1变到n,每一步令S = S * i,则最终S中的值就是n!,例cw0702.c 求n!,求多少的阶乘?5 5!=120 Press any to continue,注意如果阶乘太大可能造成数据溢出,此时应当设为双精度,用指数形式表示,5/40,计数器控制的循环,源代码分析(cw0703.c),#include int main() int counter, grade, total, average; total=0; /*注意为什么这么样被始化*/ counter=0; while (counter 10) printf(“Enter grade:“); scanf(“%d“, ,赋值语句 (initialization) 执行循环 (execute loop) 输入 累加 结束 (termination) 最后的计算 输出结果,计算某班10个学生考试的班平均成绩。 分析与设计 输入每个学生的成绩,累计总成绩,计算平均分,显示结果。 采用计数器控制的循环,重复执行操作: 输入一个学生的成绩。就进行累加。,对于任意多学生怎么办?,6/40,标记控制的循环,举例 问题:编写一个班级平均分计算程序,每次执行该程序,都能够处理任意数量的学生分数。 思考:学生人数未知,何时结束输入? 标记控制的循环 使用标记(flag)指定“数据输入的结束” 即当用户输入标记值时,循环结束 标记的其他名称:信号值(signal value),哨兵(sentinel) 标记值不应与正常的用户输入混淆 本例可以采用 “-1” 教材P68例5-20用“! “ 但同时标记值也是合法的输入 适用于不确定的循环,即循环次数未知。,循环结构,7/40,标记控制的循环,进一步细化 初始化变量 输入考试的分数,求分数总和,并计数(计算考试人数),循环结构,设置总分(total)初值为0 设置计数器(counter)(初值为0 ),输入第一个分数(grade)(可能是标记值) While 输入的分数不是标记值 把当前分数加到总分中 计数器加1 输入下一个分数(可能是标记值),被 0 除 将导致致命错误 会导致程序崩溃,If 计数器不等于0 总分除以计数器的结果就是班级平均分 显示班级平均分 Else 显示“没有输入成绩”,计算并显示班级平均分,8/40,标记控制的循环,循环结构,#include int main() float average; int counter, grade, total=0; /计数、成绩、总分=0 counter=0; /计算参加考试人数初值必须设为0 printf(“Enter grade, -1 to end:“); scanf(“%d“, ,赋初值,处理,结束判断标记,源代码分析(cw0704.c),结束,Enter grade, -1 to end:70 Enter grade, -1 to end:60 Enter grade, -1 to end:65 Enter grade, -1 to end:-1 Class average is 65.00,9/40,do-while循环结构,1、功能:dowhile语句一般完成直到型循环。 2、格式为: do ; while (); 3、执行过程:先执行循环体,后判定表达式,直到表达式的值为“假”时,循环结束。,循环结构,do-while 循环结构是单入/单出结构,先执行循环体语句,再判断循环条件,10/40,do-while语句,举例(cw0701-2.c) 问题:用do-while 计算,循环结构,#include int main() int s=0, i=1; do s=s+i; i+; while (i=100); printf(“1+2+.+100=%dn“, s); return 0; ,既是循环控制计数器,也是加数,#include int main() int s=0, i=100; do s=s+i; i-; while (i); printf(“1+2+.+100=%dn“, s); return 0; ,cw0701-2f.c),用do-while 计算,while (x!=0)可写成while (x) 即省了!=0 while (x=0)可写成while (!x) 即省了!=0 非x不等于0,即恒等于0,P64中部:,11/40,do-while语句,比较do-while语句与while语句,循环结构,/*cw0705-1.c*/ int main() int s=0, n; scanf(“%d”, ,/*cw0705-2.c*/ int main() int s=0, n; scanf(“%d”, ,1 s=3,n=3,3 s=0,n=3,1 s=3,n=3,3 s=3,n=4,1,2,do-while的循环体至少被执行一次,(cw0705-1.c,cw0705-2.c),注意:dowhile后有分号;,12/40,for循环结构,循环结构,分号作为表达式的分隔符,只计算一次,1、功能:用于循环次数已确定或给定循环条件(次数不知)的情况,适合于描述一个事物从初始态到终止态的变化过程。最为灵活。 2、语句格式为: for (; ; )循环体; ; 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:关系表达式或逻辑表达式,循环控制条件; 表达式3:一般为赋值表达式,给控制变量增量或减量。 循环体:当有多条语句时,必须使用复合语句。,13/40,for语句,for语句能够自动处理计数器控制的循环的细节 举例:打印 110。(cw0705.c),循环结构,#include int main() int counter; for(counter=1; counter=10; counter+ ) printf(“%d “, counter); printf(“n“); return 0; ,循环条件,控制变量增1,对控制变量进行初始化,1 2 3 4 5 6 7 8 9 10,执行过程为: 先求解表达式1(初值);再求解表达式2,并判定其值是否为真,若为真,则执行循环体中的语句, 如果执行了循环体,则循环体每执行一次,都求解表达式3,然后重新计算表达式2,再判定其值是否为真,直至表达式2的值为假,退出for循环,执行for循环后的语句。,14/40,for语句,for 语句使用说明 三个表达式都是可选的(都可以为空),但分号不能少 如果表达式2为空,那么就假定该循环条件为真,循环结构,for (i=0;i+) printf(“%2d”,i);,for (i=0;1;i+) printf(“%2d”,i);,=, 强行终止无限循环,结束程序的执行,常用逗号表达式,for (s=0,i=1;i=100;i+) s+=i;,for (s=0,i=1;i=100;s+=i,i+);,对多个变量初始化,修改多个变量的值,则创建一个无限循环,表达式1和表达式3可以是任何合法的表达式,常用逗号表达式,15/40,#include int main( ) int i,sum; for(sum=0,i=1;i=100;i+) sum=sum+i; printf(“%dn“,sum); return 0; ,求和变量赋初值为0,计算起始值为1,Cw0701-3.c用for语句求 :求,循环结构,/*ex0520 jcp68-l5-20.c统计输入的字符个数,并输出他们,以“!“终止。*/ #include int main() char chr; int s; for (s=0; ;s+) chr=getchar(); if (chr=!) break; else printf(“%c“,chr); printf(“ns=%dn“,s); return 0; ,1+100=5050,Abcd123&%$!bbb Abcd123&%$ S=10,标记,表达式2省总为真,16/40,求水仙花数,/*ex0518 jcp67-l5-18.c求水仙花数,即这个数 等于它的百位、十位和个位数的立方和。例如 153是一个水仙花数,因为153=13+53+33。*/ #include int main() int n=100,i,j,k; printf(“水仙花数是:n“); for (n=100;n1000;n+) i=n/100; j=(n/10)%10; k=n%10; if (n=i*i*i+j*j*j+k*k*k) printf(“%dn“,n); return 0; ,水仙花数是: 153 370 371 407 Press any key to continue,jcp67-l5-18.c,17/40,for语句使用要点:,(1)for中的表达式1可以省略,但在for循环之前应给循环变量赋值.,(2)表达式2也可以省略,但循环将陷入死循环.,(例如:i=1;for(;i=100;i+) sum=sum+i;,用Ctrl + C 强行终止无限循环,结束程序的执行,例如:for(i=1;i+) sum=sum+i;,(3)表达式3也可以省略,但应在循环体中增加使循环变量值改变的语句.,例如:for(sum=0,i=0;i=100;) sum=sum+i; i+;,18/40,(4)表达式1和表达式3同时省略也允许, 例如:i=1;sum=0; for(;i=100;) sum=sum+i; i+; 这是完全与while循环等同. (5)三表达式都可省,但“;”不能省略。 for(;) sum=sum+i; 循环将无休止的执行下去.,for语句使用要点:,循环结构,/*ex0518 jcp67-l5-18.c求水仙花数,即这个数等于它的百位十位和个位数的立方和。例如153是一个水仙花数,因为153=13+53+33。省三个表达式, “;”不能省略*/ #include int main() int n=100,i,j,k; printf(“水仙花数是:n“); for (;) if (n1000) i=n/100; j=(n/10)%10; k=n%10; if (n=i*i*i+j*j*j+k*k*k) printf(“%dn“,n); n+; return 0; ,水仙花数是: 153 370 371 407,必须用ctrl+c终止程序,不会出现: Press any key to continue,19/40,#include int main() int x,y,z; for(x=1;x20;+x) for(y=1;y34;+y) z=100-x-y; if(z%3=0) ,例cw0706.c 百鸡问题:一只母鸡值5个钱,一只公鸡值3个钱,三只小鸡值1个钱,现有100个钱,要买100个鸡,是否可以?要求三种鸡都有。 分析:设母鸡x只、公鸡y只、小鸡z 只,则可知z=100-x-y, 且 5x+3y+z/3=100 采用试探法;,20/40,例(cw0707.c) 打印10行*号,第1行打印1个,第2行打印2个第n行有n个星号第10行打印10个。,* * * * * * * * * *,嵌套的控制结构,循环结构,外层循环控制行数,内层循环控制列数,* * * * * * * * * *,(cw0707-1.c),21/40,程序设计举例,源代码分析(cw0707-1.c),循环结构,问题 输出图形,分析 共有10行 第n行先输出n-1个空格,再输出10-(n-1)个星号 用计数器控制的循环实现,见cw0706.c的正三角十行*,这两图如何编?,看程序,22/40,程序设计举例,源代码分析 图2 (cw0718.c),循环结构,#include int main() int m, n; for (n=1;n=5;n+) for (m=1;m=5-n;m+) printf(“ “); for (m=1;m=2*n-1;m+) printf(“*“); printf(“n“); ,for (n=4;n=1;n-) for (m=1;m=5-n;m+) printf(“ “); for (m=1;m=2*n-1;m+) printf(“*“); printf(“n“); return 0; ,返回,23/40,循环的嵌套,一个循环语句的循环体内又包含另一个完整的循环语句,称为循环的嵌套。这种嵌套过程可以有很多重。一个循环外面仅包围一层循环叫二重循环;一个循环外面包围两层循环叫三重循环;一个循环外面包围多层循环叫多重循环。,注意要点:,1、内循环必须完整地嵌套在外循环内,两者不允许交叉。 2、并列的循环变量可以同名,但嵌套循环变量不允许同名。 3、 while语句、do-while语句和for语句都可以互相嵌套,甚至可以多层嵌套。但不得交叉。 4、选择结构和循环结构彼此间也可以互相嵌套,但二者不允许交叉。 5、可用break语句从内循环跳转到外循环,但不允许从外循环跳转到内循环(即不能用goto语句)。 6、不能在for循环体内修改循环变量,防止循环失控。,24/40,循环语句的注意点,1、在多重循环中,应尽可能将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨层循环的次数。 2、建议for语句的循环控制变量的取值采用“半开半闭区间”写法。半开半闭区间写法for(n=0;n10;n+)和闭区间写法for(n=0;n=9;n+) 虽功能相同,但相比之下,半开半闭区间写法更加直观。 3、循环要尽可能的短,要使代码清晰,一目了然。 如果一个循环代码超过一显示屏,会让读代码的人发狂的。 解决的办法有两个: 第一,重新设计这个循环,确认是否这些操作都必须放在这个循环里; 第二,将这些代码改写成一个子函数,循环中只调用这个子函数即可。一般来说循环内的代码不要超过20行。 4、把循环嵌套控制在3层以内。,25/40,break语句,break语句 break; 当在while、do-while、for或switch结构中执行break语句时,break语句会造成程序从该结构中退出,程序接着执行该结构之后的第一条语句。 注意: 执行break语句后,for语句的表达式3不被执行 常规应用: 在for结构中提前从循环结构中退出,表示终止本层循环。 switch结构中跳过剩余部分,循环结构,26/40,break语句,举例(cw0708.c),循环结构,#include int main() int x; for (x = 1; x = 10; x+) if (x = 5) break; printf(“%d “, x); if (x=5) printf(“n 用break时当x=5时跳出循环体。n“); return 0; ,1 2 3 4 用break时当x=5时跳出循环。,与if配合使用,如果改用cotinue,27/40,break语句,在switch和for语句中的使用,循环结构,/*cw0708x.c 用break退出本级结构*/ int main() int i; for (i=1;i=3;i+) switch(i) case 1:printf(“*n”); break; case 2:printf(“*n”); break; case 3:printf(“*n”); break; return 0; ,* * *,/*cw0708y.c 用break退出for循环结构 */ int main() int i; for (i=1;i=3;i+) if (i=1) printf(“*n”); break; if (i=2) printf(“*n”);break; if (i=3) printf(“*n”);break; return 0; ,*,28/40,continue语句,continue 语句,循环结构,当在while、do-while或for结构中执行continue语句时,continue语句能够跳过该层结构中剩余语句,执行下一个循环过程。continue表示终止本次(本轮)循环。,#include / (cw0708_2.c) int main() int x; for (x = 1; x = 10; x+) if (x = 5) continue; printf(“%d “, x); printf(“n “); return 0; ,1 2 3 4 6 7 8 9 10 Press any key to continue,举例(cw0708_2.c),用continue时暂停x=5 时的本次循环,后面的循环继续执行。,#include / (cw0708_1x.c) int main() int x; for (x = 1; x = 10; x+) if (x = 5) break; printf(“%d “, x); if (x=5) printf(“n 用break时当x=5时跳出循环体。n“); return 0; ,29/40,#include int main() int x; x = 1; do if (x = 5) continue; printf(“%d “, x); x+; while(x = 10); printf(“在do while中用continue造成死循环“); return 0; ,continue语句,continue 语句举例,循环结构,#include int main() int x; x = 1; while (x = 10) if (x = 5) continue; printf(“%d “, x); x+; return 0; ,1 2 3 4,(cw0708_4.c),(cw0708_3.c),1 2 3 4,死循环,注意:,在while和do-while结构中 continue语句被执行之后,立即进行循环条件的测试 在for结构中 先执行表达式3之后,才能进行循环条件的测试,没有退出提示,按ctrl+c强行退出,30/40,结束本次循环,接着判定下一次是否执行循环。 语句只能用于循环结构中,一旦执行了continue语句,程序就跳过循环体中位于该语句后的所有语句,提前结束本次循环周期并开始新一轮循环。,/*例(cw0709-1.c)把100200之间的不能被3整除的数输出*/,continue语句,循环结构,只结束能被3整除的本次循环不用输出而已。n还要增1,再判断。,#include int main() int n,i=0; for(n=100;n=200;n+) if (n%3=0) continue; printf(“%d”,n); i+; if (i%6=0) printf(“n”); printf(“n”); return 0; ,31/40,分析:首先可确定分成的这4个数是4的倍数,相应的和、差、积、商(设为x)也为4的倍数。采用试探法,使得x从8开始,每次加4循环判断,直到找到这4 个数为止。 1 8x 2 第一个数x1x-4 第二个数x2x+4 第三个数x3x/4 第四个数x4x*4 3 判断x1+x2+x3+x4是否等于100 ,如果是转5,否则转4。 4 x+4x 转2 5 输出x1、x2、x3、x4,程序设计举例,循环结构,例 (cw0709-2.c )将100分成4个数之和,使得第一个数加上4、第二个数减去4、第三个数乘以4、第四个数除以4后得到的和、差、积、商相等,问这4个数是多少?,32/40,程序设计举例,循环结构,/*(cw0709-2.c )将100分成4个数之和,使得第一个数加上4、第二个数减去4、第三个数乘以4、第四个数除以4后得到的和、差、积、商相等,问这4个数是多少? */ #include int main() int x,x1,x2,x3,x4; for(x=8;x+=4) x1=x-4;x2=x+4;x3=x/4;x4=x*4; if (x1+x2+x3+x4=100) break; printf(“x1=%dtx2=%dtx3=%dtx4=%dn”,x1,x2,x3,x4); return 0; ,33/40,goto语句,goto语句 goto ; 立即执行语句标号指向的语句。 合理的使用: 与if语句一起构成循环结构 从循环体内跳到循环体外 特别是从多层嵌套循环的内部跳到外层循环,或者直接跳出,循环结构,语句标号 是一个标识符 放在可执行语句前面,结构化编程技术限制使用 goto 语句 滥用goto语句使得程序无结构可言,可读性差,调试和维护困难。,34/40,goto语句,goto语句举例(cw0701-4.c),循环结构,#include int main() int s=0, i=1; Loop: s=s+i; i+; if (i=100) goto Loop; printf(“1+2+.+100=%dn“, s); return 0; ,1+2+100=5050,用条件和goto计算,break 可以用在3种循环结构和开关结构中退出该层结构。 continue一般与for结构用得比较多,用于退出当次循环,后续的循环继续。 Goto可以一次退出1层甚至多层循环。与if可以组成循环。,35/40,程序设计举例,问题 找出1100之间的全部素数 源代码分析(cw0714.c),循环结构,#include #include Int main() int m, k, i,cout=0; for (m=1;mk) cout+; printf(“%4d“, m); if (cout%6=0) printf(“n“); printf(“n“); return 0; ,36/40,小结,建立循环时特别注意三个方面: 明确定义结束循环的条件 确保在循环判断中使用的值在第一次使用之前已经初始化 确保循环在每个周期中更新了判断值 构造循环结构的流程控制语句,循环结构,跳转语句 break语句 continue语句 goto语句 结构化程序设计的规则,while do-while For 其中, do-while提供退出条件循环 while和for提供入口条件循环,请自学本章教材内容并 预习下一章的内容与实验,请自己做本章的习题与实验体验,本章到此结束,谢谢您的光临!,THANK YOU VERY MUCH !,访问软件屋: /,南开100题二级C,38/40,程序设计举例,问题 求下面公式的前n项之和 分析 累加求和: s = s + ai 关键在于写出 ai 的表达式 用计数器控制的循环实现,循环结构,初始化累加和变量 s 为0 初始化计数器变量 i 为1 输入要累加的项数,放入变量 n While i = n 计算第i项的值,结果放入ai 累加:s = s + ai 修改计数器变量:i+ 输出结果 s,不确定量的数据来源: 输入获得 计算获得,n,39/40,程序设计举例,第一种实现的源代码分析(cw0710.c),循环结构,#include #include int main() int i=1, n; float s=0, ai; scanf(“%d”, ,while (i=n) ai=pow(-1,i-1)/(2*i-1); s+=ai; i+; printf(“sum=%.3fn”, s); return 0; ,不划算,1 sum=1.000,2 sum=0.667,5 sum=0.835,0 sum=0.000,40/40,程序设计举例,第二种实现的源代码分析(cw0711.c),循环结构,#include int main() int i=1, n, sign=1; float s=0, ai; scanf(“%d“, ,1 sum=1.000,2 sum=0.667,5 sum=0.835,0 sum=0.000,现在ai表示每一项的绝对值,41/40,程序设计举例,问题 用下面的公式求的近似值(直到最后一项的绝对值小于10-6为止): 分析 先计算等式右边的和 累加求和: s = s + ai 当|ai|10-6时,停止累加 用标记控制的循环实现,循环结构,初始化累加和变量 s 为0 初始化计数器变量 i 为1 第1项的值 ai = 1 While |ai| = 10-6 累加:s = s + ai i增一 计算第i项(下一项)的值,结果放入ai 计算=s*4 输出结果 ,42/40,程序设计举例,第一种实现的源代码分析(cw0712.c),循环结构,#include int main() int i=1, n, sign=1; double s=0, ai; ai=1; while (!(ai1e-6) s+=sign*ai; i+; sign*=-1; ai=1.0/(2*i-1); printf(“pi=%.8lfn“, s*4); return 0; ,pi=3.14153162,ai 保存的是第i项的绝对值,43/40,程序设计举例,第二种实现的源代码分析(cw0713.c),循环结构,#include Int main() int i=1, n, sign=1; double s=0, an; for (;) an=1.0/(2*i-1); if (an1e-6) break; s+=sign*an; sign*=-1; i+; printf(“pi=%.8lfn“, s*4); return 0; ,pi=3.14153162,使用 break 语句违背了结构化程序设计的原则 continue语句也有类似的问题,44/40,程序设计举例,数的范围无法确定 把输入的第一个数作为最大数和最小数 将其余的数与最大数、最小数分别比较 每次根据比较的结果更新最大数和最小数 用计数器控制的循环实现,循环结构,问题 任意输入10个数,找出最大数和最小数 分析,45/40,程序设计举例,源代码分析(cw0714.c),循环结构,#include int main() int i, d, max, min; printf(“Input 10 integers:n“); scanf(“%d“, ,把输入的第一个数作为最大数和最小数变量的初值,根据比较的结果更新最大数和最小数变量的值,46/40,程序设计举例,问题 判断整数 m 是否素数 源代码分析(cw0715.c),循环结构,#include #include int main() int m, k, i; scanf(“%d“, ,如果break被执行了,则该数不是素数,那么i=k,/*如果要找出1100之间的全部素数该怎么做呢? cw0716.c*/,47/40,程序设计举例,源代码分析 图1 (cw0717.c),循环结构,#include int main() int m, n; for (n=1;n=5;n+)

温馨提示

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

评论

0/150

提交评论