C语言中-循环结构课件

上传人:cn****1 文档编号:569293592 上传时间:2024-07-28 格式:PPT 页数:42 大小:127KB
返回 下载 相关 举报
C语言中-循环结构课件_第1页
第1页 / 共42页
C语言中-循环结构课件_第2页
第2页 / 共42页
C语言中-循环结构课件_第3页
第3页 / 共42页
C语言中-循环结构课件_第4页
第4页 / 共42页
C语言中-循环结构课件_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C语言中-循环结构课件》由会员分享,可在线阅读,更多相关《C语言中-循环结构课件(42页珍藏版)》请在金锄头文库上搜索。

1、第五章第五章 循环控制结构循环控制结构1本章知识点:本章知识点:whilewhile语句的一般形式及应用语句的一般形式及应用forfor语句的一般形式及应用语句的一般形式及应用do.whiledo.while语句的一般形式及应用语句的一般形式及应用多重循环结构的使用多重循环结构的使用breakbreak语句和语句和continuecontinue语句语句25.1 while语句语句的一般形式如下:语句的一般形式如下:while (while (表达式表达式) ) 循环体语句循环体语句说明:说明:whilewhile语句属于语句属于“当型当型”循环。循环。表达式循环体语句假(0)真(非0)图5.

2、1 while语句流程图说明:说明:(1)while是关键字。是关键字。while后圆括号内的后圆括号内的表达式一般是关系表达式或逻辑表达式,表达式一般是关系表达式或逻辑表达式,但也可以是但也可以是C 语言中任意合法的表达式。语言中任意合法的表达式。(2)循环体语句可以是一条语句,也可以)循环体语句可以是一条语句,也可以是多条语句,如果循环体语句包含多条语是多条语句,如果循环体语句包含多条语句,则需要用一对花括号句,则需要用一对花括号“”把循环体把循环体语句括起来,采用复合语句的形式。语句括起来,采用复合语句的形式。while (表达式表达式) 循环体语句循环体语句【例5.1】 求前100个自

3、然数的和 。#include #include int main()int main() int n,sum;int n,sum;n=1;sum=0; /*n=1;sum=0; /*变量赋初值变量赋初值* */ /while (n=100)while (n=100) sum=sum+n; /* sum=sum+n; /*累加求和累加求和* */ / n+; /* n+; /*修改基本数据项修改基本数据项n*/n*/ printf(printf(sum=%dn,sum);sum=%dn,sum);return 0;return 0; 5需要注意的几个问题:需要注意的几个问题:(1)累加求和算法。

4、这个程序采用的算法思想)累加求和算法。这个程序采用的算法思想称为累加求和,即:不断用新累加的值取代变称为累加求和,即:不断用新累加的值取代变量的旧值,最终得到求和结果,变量量的旧值,最终得到求和结果,变量sum也叫也叫“累加器累加器”,初值一般为,初值一般为0。(2)必须给变量赋初值。)必须给变量赋初值。 (3)正确判断条件的边界值。)正确判断条件的边界值。 (4) 避免出现避免出现“死循环死循环”。 (5)可能出现循环体不执行。)可能出现循环体不执行。 (6)while后面圆括号内的表达式一般为关系表后面圆括号内的表达式一般为关系表达式或逻辑表达式,但也可以是其它类型的表达式或逻辑表达式,但

5、也可以是其它类型的表达式,达式,.【例5.2】 使用while语句求n!。#include #include int main()int main() int n,i=1;int n,i=1;double sum=1;double sum=1; printf( printf(请输入一个正整数:请输入一个正整数:);); scanf(%d,&n); scanf(%d,&n); while (i=n) while (i=A&ch=a&ch=0&ch=9) c+; /*判断是否为数字*/else if(ch= ) d+;else e+;printf(%d,%d,%d,%d,%dn,a,b,c,d,e

6、);return 0;95.2 for语句forfor语句的一般形式如下:语句的一般形式如下:forfor(表达式(表达式1 1;表达式;表达式2 2;表达式;表达式3 3) 循环体语句循环体语句说明:说明:forfor语句属于语句属于“计数计数”型循环。型循环。11循环体语句真(非0)假(0)表达式1表达式2表达式3for语句流程图For语句最常用、最简单的形式forfor(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值)12【例5.1】 求前100个自然数的和 。#include #include int main()int main() int n,su

7、m=0; int n,sum=0; for (n=1;n=100;n+) for (n=1;n=100;n+) sum=sum+n;sum=sum+n; printf(sum=%dn,sum); printf(sum=%dn,sum); return 0; return 0; 【例例5.45.4】设设n=30n=30,编写程序,计算并输出,编写程序,计算并输出S(n)S(n)的值。的值。 S(n)=(1*2)/(3*4)-(3*4)/(5*6)+(5*6)/(7*8)+(-1)S(n)=(1*2)/(3*4)-(3*4)/(5*6)+(5*6)/(7*8)+(-1)(n-(n-1)1)*(2n

8、-1)*2n/(2n+1)*(2n+2) +*(2n-1)*2n/(2n+1)*(2n+2) +#include#include#include#includeint main()int main() int n;int n; float s=0; float s=0;for(n=1;n=30;n+)for(n=1;n=30;n+) s=s+pow(-1),(n-1)*(2*n-1)*2*n)/(2*n+1)*(2*n+2); s=s+pow(-1),(n-1)*(2*n-1)*2*n)/(2*n+1)*(2*n+2);printf(s(n)=%f,s);printf(s(n)=%f,s);r

9、eturn 0;return 0; 13关于关于for语句的几点说明:语句的几点说明:(1)循环体语句可以是简单语句也可以是使用一对花)循环体语句可以是简单语句也可以是使用一对花括号括起来的复合语句。如果是一个语句,也可以和括号括起来的复合语句。如果是一个语句,也可以和for写在一行上,这样使程序看起来更加简洁;如果写在一行上,这样使程序看起来更加简洁;如果循环体包含多条语句,最好是另起一行,采用一对花循环体包含多条语句,最好是另起一行,采用一对花括号括起来的复合语句形式,增加程序的可读性。括号括起来的复合语句形式,增加程序的可读性。(2)表达式的省略。)表达式的省略。for语句中的三个表达式

10、均可以省语句中的三个表达式均可以省略,但是两个分号不能省略。略,但是两个分号不能省略。for(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值)for(表达式(表达式1;表达式;表达式2;表达式;表达式3) 循环体语句循环体语句【例例5.5】编写程序,输出所有的水仙花数。水仙花数是编写程序,输出所有的水仙花数。水仙花数是指一个指一个3位数,其各位数字的立方和等于该数本身。例如:位数,其各位数字的立方和等于该数本身。例如:153=13+53+33=153,所以,所以153就是水仙花数。就是水仙花数。int main()int a,b,c,i;for(i=100;i

11、=999;i+)a=i/100; b=i/10%10; c=i%10; if(i=a*a*a+b*b*b+c*c*c) printf(%dn,i);printf(n);15【例5.11】判断m是否为素数。程序分析:所谓素数,就是一个正整数,除了本身和1 以外并没有任何其他因子。例如 2,3,5,7 就是素数。int main() int m,i,k,flag; /*定义标志变量*/ scanf(%d,&m); flag=1; /*假设m是素数*/ for (i=2;im;i+) if(m%i=0) flag=0; /*表示m不是素数*/ break; /*跳出循环*/ if(flag=1) p

12、rintf(%d is a prime numbern,m); else printf(%d is not a prime numbern,m); return 0;165.3 dowhile语句forfor语句的一般形式如下:语句的一般形式如下:dodo循环体语句循环体语句WhileWhile表达式表达式 ;说明:说明:do do whilewhile语句属于语句属于“直到型直到型”循环。循环。(1)dowhile语句中“While表达式;”后面的分号是不能省略的,这一点是和while语句不一样的。(2)dowhile语句是先执行循环体语句,后判断表达式,因此无论条件是否成立,将至少执行一次

13、循环体。而while语句是先判断表达式,后执行循环体语句,因此,如果表达式在第一次判断时就不成立,则循环体一次也不执行。注意:(1)在计算机解决实际问题时,常常会用到类似本程序的“穷举法”。“穷举法”解决的问题一般具有这种特点:如果问题有解,一组或多组,必定全在某个集合中;如果这个集合内无解,集合外也肯定无解。这样,在解决问题时,就可以将集合中的元素一一列举出来,验证是否为问题的解。本题就是一一验证100999之间所有的数,最终找出答案。(2)程序中在做是否相等关系判断(“i=a*a*a+b*b*b+c*c*c)使用到了关系运算符“=”,而不是“=”,后者是赋值运算符,在c语言中这两种运算符形

14、式是不一样的,要注意区别。20循环体语句表达式假(0)真(非0)图5.5 dowhile语句流程图WhileWhile语句和语句和dowhiledowhile语句的比较:语句的比较:一般来说,对于同一个问题,使用While语句或dowhile语句结果是一样的,但有时并不一样,比较以下两段程序:21#include #include int main()int main() int n,sum=0; int n,sum=0; scanf(%d,&n); scanf(%d,&n); while (n=10) while (n=10) sum=sum+n; sum=sum+n; n+; n+; pr

15、intf(sum=%dn,sum); printf(sum=%dn,sum); return 0; return 0; #include #include int main()int main() int n,sum=0;int n,sum=0;scanf(%d,&n);scanf(%d,&n);dodo sum=sum+n; sum=sum+n; n+; n+; while (n=10);while (n=1.0e-6);pi=4.0*pi;printf(pi=%10.7lfn,pi);23【例例5.7】 用公式用公式 求求的近似值,直到的近似值,直到最后一项的绝对值小于最后一项的绝对值小于

16、10-6为止。为止。三种循环的比较三种循环的比较:(1)while while 和和dowhiledowhile语句一般实现标志式语句一般实现标志式循环,即无法预知循环的次数,循环只是在一循环,即无法预知循环的次数,循环只是在一定条件下进行;而定条件下进行;而forfor语句大多实现计数式循语句大多实现计数式循环。环。(2 2)一般来说,)一般来说,while while 和和dowhiledowhile语句的循语句的循环变量赋初值在循环语句之前,循环结束条件环变量赋初值在循环语句之前,循环结束条件是是whilewhile后面圆括号内的表达式,循环体中包后面圆括号内的表达式,循环体中包含循环变

17、量修改语句;一般含循环变量修改语句;一般forfor循环则是循环循环则是循环三要素集于一行。因此,三要素集于一行。因此,forfor循环语句功能更循环语句功能更强大,形式更简洁,使用更灵活。强大,形式更简洁,使用更灵活。(3)while和和for是先测试循环条件,后执行是先测试循环条件,后执行循环体语句,循环体可能一次也不执行。而循环体语句,循环体可能一次也不执行。而dowhile语句是先执行循环体语句,后测试循语句是先执行循环体语句,后测试循环条件,所以循环体至少被执行一次。环条件,所以循环体至少被执行一次。5.4 多重循环结构for( for( ; ; ; ); ) for( for( ;

18、 ; ; ; ) ) for( for( ; ; ; ); ) for( ; ; )for( ; ; ) for( for( ; ; ; ; ) ) for( for( ; ; ; ; ) ) 嵌套循环并列循环交叉循环(错误)循环的嵌套循环的嵌套是指一个循环语句的循环体内完整的包是指一个循环语句的循环体内完整的包含另一个完整的循环结构。前述三种循环结构含另一个完整的循环结构。前述三种循环结构(whilewhile循环、循环、forfor循环、循环、do-whiledo-while循环)可以任意循环)可以任意组合嵌套。组合嵌套。循环的嵌套有双重循环嵌套和多重循环嵌套。但一循环的嵌套有双重循环嵌套

19、和多重循环嵌套。但一般使用两重或三重的比较多,般使用两重或三重的比较多,若嵌套层数太多,就若嵌套层数太多,就降低了程序的可读性和执行效率。降低了程序的可读性和执行效率。如果是多重循环,外循环和内循环应选用不同的循如果是多重循环,外循环和内循环应选用不同的循环控制变量。环控制变量。26双重循环嵌套双重循环嵌套:嵌套层次数为2层的循环嵌套执行过程是:首先首先进行外层循环的条件判断,当外层循环条件成立时顺序执行外层循环体语句,遇到内层循环,则进行内层循环条件判断,并在内层循环条件成立的情况下反复执行内层循环体语句,当内层循环因循环条件不成立而退出后重新返回到外层循环并顺序执行外层循环体的其它语句,外

20、层循环体执行一次后,重新进行下一次的外层循环条件判断,若条件依然成立,则重复上述过程,直到外层循环条件不成立时,退出双重循环嵌套,执行后面其它语句。【例例5.8】编写程序,输出编写程序,输出1000以内所有的完数。如果一个以内所有的完数。如果一个整数的因子之和等于这个数本身,这个数就被称为完数。例整数的因子之和等于这个数本身,这个数就被称为完数。例如:如:1、2、3是是6的因子,并且的因子,并且6=1+2+3,所以,所以6是完数。是完数。程序分析:此题应该分成两步来做。第一步:判断一个数n是否为完数。可以定义一个变量s作为“累加器”,此问题仍然需要用前面讲过的 “穷举法”,从1n-1逐一去除n

21、,如果能除尽,就说明是n的因子,把它累加到s上。可以选用for循环。第二步:外层循环对1000以内的所有正整数一一进行判断,利用第一步的方法,逐个判断n的因子之和s是否等于n。若相等,则显示输出。同样选用for循环。28#includeint main()int i,n,s;for(n=2;n=1000;n+) /*外循环*/s=0;for(i=1;in;i+)/*内循环求出n的所有因子之和*/ if(n%i=0)s+=i;if(n=s) /*判断a是否等于所有因子之和*/ printf(%dn,n);return 0;【例例5.9】打印九九乘法口诀表。打印九九乘法口诀表。程序分析:乘法口诀表

22、的形式如下:程序分析:乘法口诀表的形式如下:1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=638*9=729*9=81#includeint main()int i,j;for(i=1;i=9;i+) /*外循环控制输出行*/for(j=1;j=i;j+) /*输出该行的内容*/printf(%2d*%d=%2d,j,i,i*j);printf(n); /*每行结束后输出换行*/return 0;5.5 break5.5 break语句

23、和语句和continuecontinue语句语句5.5.1 break5.5.1 break语句语句breakbreak语句可以使流程跳出语句可以使流程跳出switchswitch结构,它也可以结构,它也可以用在用在whilewhile语句、语句、forfor语句和语句和dowhiledowhile语句中。可语句中。可使程序跳出使程序跳出本层本层循环结构,接着执行循环体下面的循环结构,接着执行循环体下面的语句。语句。其一般形式如下:其一般形式如下:break;break;33例子:例子:int r;int r;float area,pi=3.14159;float area,pi=3.1415

24、9;for(r=1;r=10;r+)for(r=1;r100) break;if(area100) break;printf(r=%d,area=%fn,r,area);printf(r=%d,area=%fn,r,area); 说明:说明:(1 1)breakbreak语句只能用于语句只能用于whilewhile、forfor和和dowhiledowhile循循环语句以及环语句以及switchswitch语句中,不能用于其他语句。语句中,不能用于其他语句。(2 2)如果)如果breakbreak语句用在多重循环结构体中,使用语句用在多重循环结构体中,使用breakbreak语句只能使程序退出

25、语句只能使程序退出breakbreak语句所在的最内层语句所在的最内层循环。循环。5.5.2 continue语句continue语句的作用是 结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环体的判断。 其一般形式如下:continue; continue语句只能用于循环结构中。int i,n,score;float sum=0,aver;printf(请输入学生的个数请输入学生的个数:);scanf(%d,&n);for(i=1;i=n;i+) printf(请输入学生的成绩请输入学生的成绩:); scanf(%d,&score); if(score100) /*学

26、生成绩输入有误学生成绩输入有误*/ printf(输入成绩有误,请重新输入输入成绩有误,请重新输入!n); i-; /*此次输入成绩不算,计数应减去此次输入成绩不算,计数应减去1*/ continue; sum=sum+score; aver=sum/n; printf(%.2fn,aver); 35【例例5.105.10】输入若干学生的成绩,求平均值。输入若干学生的成绩,求平均值。5.5 break5.5 break语句和语句和continuecontinue语句语句 continue continue语句的作用是结束本次循环,即跳过循语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语

27、句,接着进行下一次是否环体中下面尚未执行的语句,接着进行下一次是否执行循环体的判断。其一般形式如下:执行循环体的判断。其一般形式如下:continue;continue;注意:注意:continuecontinue语句只能用于循环结构中。语句只能用于循环结构中。对于对于whilewhile和和dowhiledowhile语句,语句,continuecontinue语句使程序语句使程序结束本次循环,跳转到循环条件的判断部分,根据结束本次循环,跳转到循环条件的判断部分,根据条件判断是否进行下一次循环;对于条件判断是否进行下一次循环;对于forfor语句,语句,continuecontinue语句使

28、程序不再执行循环体中下面尚未执语句使程序不再执行循环体中下面尚未执行的语句,直接跳转去执行行的语句,直接跳转去执行“表达式表达式3 3”,然后再,然后再对循环条件对循环条件“表达式表达式2 2进行判断进行判断”,根据条件判断,根据条件判断是否进行下一次循环。是否进行下一次循环。5.6 5.6 应用程序举例应用程序举例37【例例5.125.12】从键盘输入两个正整数从键盘输入两个正整数m m和和n n,求它们的最大,求它们的最大公约数和最小公倍数。公约数和最小公倍数。方法一方法一:根据最大公约数的数学定义,使用for循环查找即能整除m又能整除n的最大的数就是m、n的最大公约数。 int m,n,

29、k,max,x,y,z; printf(input m and n:n); scanf(%d,&m); scanf(%d,&n); x=m; y=n; for (k=1;k=(mm) /*若若nm,则交换,则交换m、n中的数据中的数据*/ k=m;m=n;n=k;x=m; /*保存最初两个数的值给保存最初两个数的值给x和和y,以备求最小公倍数时使用,以备求最小公倍数时使用*/y=n;r=m%n;while(r!=0) m=n; n=r; r=m%n;z=x*y/n; /*求最小公倍数求最小公倍数*/printf(m和和n的最大公约数为:的最大公约数为:%d,n最小公倍数为:最小公倍数为:%dn

30、,n,z);int f1,f2,f3,i; f1=1;f2=1;printf(%10d%10d,f1,f2);for(i=3; i=30; i+) /*从第三项开始计算*/ f3=f1+f2; printf(%10d,f3); if(i%5=0) printf(n); /*每输出5个后换行*/ f1=f2; f2=f3;【例5.13】求Fibonacci数列前30项,每行输出5个数。 1 12 35 813.40DDDDDDDC C C C CB B BA【例5.15】编写程序,输出如下所示图形。 图形的每行可视为由行前导空格和行中字母构成,且把每行的字母视为一个整体。其规律是行号行号与每行不同字符个数字符个数有确定的对应关系:前导空格:第i行对应的空格数为i-1每行字母:第i行对应的字母个数为9-2*iint i,j; for(i=1;i=4;i+) for(j=1;j10+i;j+) printf( ); for(j=1;j=9-2*i;j+) printf(%c,69-i); printf(n); 作业作业 本章课后习题:5.45.11

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号