1、第5章 循环结构程序设计 2022-9-302循环结构的应用场合2022-9-303循环结构类型NYP成立成立?A当当P成立时成立时 A A当当P成立时成立时YNAP成立成立?N-S流程流程图图流程流程图图2022-9-304本章主要内容5.1 C语言的循环语句5.1.1 while语句(当型循环)5.1.2 do-while语句(直到型循环)5.1.3 for语句5.1.4 三种循环语句的比较和使用5.2 循环的跳转5.2.1 break语句5.2.2 continue语句5.3 循环嵌套5.4 循环结构程序设计举例2022-9-3055.1.1 while语句 n语句一般格式 while(
2、)2022-9-3065.1.1 while语句n功能:计算表达式的值内嵌语句 当表达式为真当表达式为真 语句语句表 达 式 非表 达 式 非0?语句语句2022-9-3075.1.1 while语句(举例)【例5.1】编写程序,求100个自然数的和即:思路:寻找思路:寻找加数加数与与求和求和的规律的规律 加数加数 从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到,直到i的值超过的值超过100。的的设为设为1。求和求和设变量设变量 存放和,循环求存放和,循环求,直至直至i超过超过100。2022-9-308算法和程序:#include main()int i,sum;i=1;
3、sum=0;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);程序输出结果:程序输出结果:sum=5050 i=1,sum=0 当当i=100 sum=sum+i i+输出输出sum2022-9-309注意:i的初值=101。死循环 while(i=100)i+;sum=sum+i;2022-9-3010注意(续):n为了保证循环正常运行,应该特别注意:循环控制条件的描述2022-9-30115.1.1 while语句(举例)【例5.2】编写程序,从键盘输入字符,直到输入的字符为0时停止,统计输入的字符个数。自学:自学:P58例例4-1;P61例例4-2
4、。2022-9-30125.1.2 do-while语句n语句一般格式 do while();功能:(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。2022-9-3013 do-while循环的算法 循环体循环体当表达式为真当表达式为真N-S结构图结构图NY循环体循环体表达式非表达式非0?流程图流程图main()int i=1,sum=0;do sum=sum+i;i+;while(i=100);printf(%dn,sum);2022-9-30145.1.2 do-while语句(说明:)nwhiled
5、o-while2022-9-3015while 和 do-while 的用法比较输入一些数,求和,直到输入负数为止。#include void main()int x,sum=0;do scanf(%d,&x);sum+=x;while(x0);printf(sum=%d,sum);#include void main()int x,sum=0;scanf(%d,&x);while(x0)sum+=x;scanf(%d,&x);printf(sum=%d,sum);输入输入 1 2 5 -10输入输入-10 1 2 5sum-x2022-9-30165.1.2 do-while语句(简单应用)
6、【例5.3】用辗转相除法求m和n的最大公约数。定义定义m、n、rmnT F m和和n交换交换r=m%nm=nn=r 当当r!=0时时输出最大公约数输出最大公约数m自学:自学:P62例例4-3。2022-9-30175.1.3 for语句 n语句一般格式 for(表达式1;表达式2;表达式3)语句 2022-9-3018for语句的算法N-S结构图结构图for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句NY流程图流程图计算表达式计算表达式1 语句语句计算表达式计算表达式3表达式表达式2为真为真?例如:main()int i,sum;sum=0;for(i=1;i=100;i+)su
7、m=sum+i;printf(sum=%dn,sum);2022-9-30195.1.3 for语句(省略表达式的for语句)n省略表达式1,即:for(;表达式2;表达式3)例如:;for(;i100)2022-9-30205.1.3 for语句(省略表达式的for语句)n省略表达式3,即:等同于:表达式1;while(表达式2)(死循环)例如:for(i=1;i=100;)i+;for(;)总结:在省略某个表达式时,应在适当位置进行总结:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确循环控制的必要操作,以保证循环的正确执行。执行。2022-9-30215.1.3
8、for语句(说明:)n所有用 while 语句实现的循环都可以用for 语句实现。for(i=0,sum=0;i=100;i+,i+)sum+=i;for(i=0,sum=0;i=100;i=i+2)sum+=i;2022-9-30225.1.3 for语句(简单应用)【例5.4】求n!,即计算p=123n的值。思路:求阶乘与求累加的运算处理过程类似,只要思路:求阶乘与求累加的运算处理过程类似,只要将将“”变为变为“”。设置:设置:,初值为,初值为1,终值为,终值为n(n是循环控制是循环控制终值,需要从键盘输入)终值,需要从键盘输入),初值为初值为1,每次循环令,每次循环令p=p*i2022-
9、9-3023程序:#include main()int i,n;long p;p=1;printf(Enter n:);scanf(%d,&n);for(i=1;i=n;i+)p=p*i;printf(p=%ld n,p);2022-9-3024熟悉几个循环语句2022-9-30255.1.4 3种循环语句的比较和使用nwhiledo-while表达式一个for三个nwhile for先判断后执行do-while先执行后判断2022-9-30265.1.4 3种循环语句的比较和使用n循环语句的选择forwhiledo-while2022-9-30275.1.4 3种循环语句使用(课堂练习)20
10、22-9-30285.1.4 3种循环语句使用(课堂练习)2022-9-30295.1.4 3种循环语句使用(课堂练习)s=s+t t=1.0/i 2022-9-30305.1.4 3种循环语句使用(课堂练习)s=s+t t=1.0/i*flag flag=-flag 2022-9-30315.1.4 3种循环语句使用(课堂练习)s=s+t t=1.0/i*flag flag=-flag tt=tt+2 2022-9-30325.1.4 3种循环语句使用(课堂练习)#include void main()int i,sum=0,x;for(i=0;i0)sum=sum+x;printf(%d,
11、sum);%d,&xif x0sum=sum+x2022-9-30335.1.4 3种循环语句使用(课堂练习)void main()int i,max,n,x;scanf(%d,&n);if(n=1)scanf(%d,&x);max=x;for(i=1;in;i+)scanf(%d,&x);if(max x)max=x;printf(%d,max);x maxmaxx循环循环2022-9-30345.2 循环的跳转n有如下两种语句实现跳转:语句语句n在循环语句的循环体中使用,可以进行循环的流程控制2022-9-3035后续语句后续语句后续语句后续语句5.2.1 break语句n功能:利用bre
12、ak语句能够强迫终止本层循环,转到后续语句执行。后续语句后续语句2022-9-30365.2.1 break语句while(n10)scanf(%d,&x);s+=x;n+;2022-9-30375.2.1 break语句(举例)算法:除了1和m,不能被其它数整除。设 i 取值 2,m-1 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素数m%2%3%4%5%(m-1)不是素数|=0 =0是素数&!=0 !=0 m2022-9-3038break;5.2.1 break语句(举例)问题:能否改写为:问题:能否改写为:fo
13、r(i=2;i=m/2;i+)if(m%i=0)printf(No!n);else printf(%d is a prime number!n,m);循环条件循环条件?循环的结束条件循环的结束条件?2022-9-30395.2.1 break语句(说明)最近一层分析:最大公约数在分析:最大公约数在1到两个数中较小的那个数之间,因此可用循环结构实现。到两个数中较小的那个数之间,因此可用循环结构实现。循环变量初值为循环变量初值为m和和n中较小数,终值为中较小数,终值为1。具体语句:。具体语句:2022-9-3040后续语句后续语句 后续语句后续语句5.2.2 continue语句 n功能:中断循环
14、体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。后续语句后续语句2022-9-30415.2.2 continue语句(与break区别)while(n10)scanf(%d,&x);s+=x;n+;2022-9-30425.2.2 continue语句(举例)【例5.6】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。for(n=100;n=200;n+)n能被能被7整除整除 T F 终止本次循环终止本次循环 输出输出n 输出输出10个数个数 T F 换行换行2022-9-30435.2.2 continue语句(举例)#inc
15、lude main()int n,j=0;for(n=100;n=200;n+)if(n%7!=0)continue;printf(%6d,n);j+;if(j%10=0)printf(n);printf(n j=%dn,j);2022-9-30445.3 循环的嵌套n典型形式:(1)while()while().(2)do do while();.while();(3)while()do while();.(4)for(;)do while();while().2022-9-30455.3 循环的嵌套(注意:)nwhiledo-whilefor2022-9-30465.3 循环的嵌套(举例)
16、sum=sum+第第i项(项(i!)for(i=1;i=n;i+)item=i!;sum=sum+item;for(i=1;i=n;i+)item=1;for(j=1;j=i;j+)item=item*j;sum=sum+item;2022-9-30475.3 循环的嵌套(举例)#include int main(void)int i,j,n;double item,sum;sum=0;scanf(“%d“,&n);for(i=1;i=n;i+)item=1;for(j=1;j=i;j+)item=item*j;sum=sum+item;printf(1!+2!+3!+%d!=%en,n,su
17、m);item=1;for(i=1;i=n;i+)for(j=1;j=i;j+)item=item*j;sum=sum+item;问题:内层循环的初始化能否改问题:内层循环的初始化能否改为:为:2022-9-30485.3 循环的嵌套(举例)for(i=1;i=n;i+)item=1;for(j=1;j=i;j+)item=item*j;sum=sum+item;分析嵌套循环的执行过程:分析嵌套循环的执行过程:n 外层循环变量外层循环变量 i 的每个值的每个值 内层循环变量内层循环变量 j 变化一个轮次;变化一个轮次;n 内外层循环变量不能相同内外层循环变量不能相同 分别用分别用 i 和和 j
18、2022-9-30495.3 循环的嵌套(举例)如果理解了阶乘的含义,该题实际也可用单循环来编程,程序如何写?如果理解了阶乘的含义,该题实际也可用单循环来编程,程序如何写?sum=0;for(i=1;i=n;i+)item=i!;sum=sum+item;item=1;for(i=1;i=n;i+)item=item*i;sum=sum+item;2022-9-30505.3 循环的嵌套(举例)12 43 6 94 8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45
19、 54 63 72 81分析:这是一个典型的双重循环问题。需要两个循分析:这是一个典型的双重循环问题。需要两个循环变量环变量i、j。ij外循环变量外循环变量i用于控制输出行数,因此初用于控制输出行数,因此初值为值为1,终值为,终值为9。内循环变量内循环变量j用于控制输出列数,因此初用于控制输出列数,因此初值为值为1,终值为,终值为当前外循环的当前外循环的i值(为什值(为什么?)么?)。2022-9-30515.3 循环的嵌套(举例)程序:程序:#include main()int i,j;for(i=1;i10;i+)for(j=1;j=i;j+)printf(j=i)?%4dn:%4d,i*
20、j);通过条件表达式判断当输出一行通过条件表达式判断当输出一行(一个内循环结束)后实现换行(一个内循环结束)后实现换行输出。输出。2022-9-30525.4 循环结构程序设计n循环程序的实现要点:归纳出哪些操作需要反复执行?这些操作在什么情况下重复执行?n选用合适的循环语句for while do-whilen循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件控制循环,考虑while或do-while2022-9-3053确定:和 12345 5 4 3 2 112345%10=5 12345/10=1234 1234%10=4 1234/10=123 123%10=3
21、 123/10=12 12%10=2 12/10=1 1%10=1 1/10=0 结束结束循环不变式循环不变式 x%10 x=x/10循环条件循环条件 x=0scanf(“%d”,&x);while(x!=0)digit=x%10;x=x/10;printf(“%d ”,digit);5.4 循环结构程序设计(举例)思考:用思考:用do-while实现?实现?2022-9-30545.4 循环结构程序设计(举例)【例5.10】按每行输出5个数的形式输出Fibonacci数列的前20项。思路:思路:Fibonacci数列的前几项是:数列的前几项是:1、1、2、3、5、8、13、21、34、。此数
22、列的变化规律是:此数列的变化规律是:2022-9-3055【例5.10】:算法和程序#include main()int i,f1,f2,f3;f1=f2=1;printf(n%8d%8d,f1,f2);for(i=3;i=20;i+)f3=f1+f2;f1=f2;f2=f3;printf(%8d,f3);if(i%5=0)printf(n);f1=1,f2=1并输出并输出for(i=3;i=20;i+)f3=f2+f1 f1=f2,f2=f3 输出输出f3 T F 换行换行2022-9-30565.4 循环结构程序设计(举例)【例5.11】编程序求21000以内的完数。一个数的因子(除了这个
23、数本身)之和等于一个数的因子(除了这个数本身)之和等于该数本身。该数本身。的的因子因子是是1、2、3,因子和因子和 1+2+32022-9-3057【例5.11】:算法和程序#include main()int i,j,s;for(i=2;i=1000;i+)s=0;for(j=1;ji;j+)if(i%j=0)s+=j;if(i=s)printf(%6dn,s);for(i=2;i=1000;i+)s=0 for(j=1;ji;j+)i%j=0 T F s=s+j i=s T F i是完数是完数2022-9-3058 c2:2分的数量,1,50)c1:1分的数量,1,100)5*c5+2*c
24、2+c1=1005.4 循环结构程序设计(举例)2022-9-3059【例5.12】:算法和程序for(c5=1;c520;c5+)for(c2=1;c250;c2+)for(c1=1;c1100;c1+)c5*5+c2*2+c1=100 T F 输出输出c5、c2、c1#include void main()int c1,c2,c5,i;i=0;for(c5=1;c520;c5+)for(c2=1;c250;c2+)for(c1=1;c1100;c1+)if(c5*5+c2*2+c1=100)printf(5分硬币分硬币=%d枚枚,2分硬币分硬币=%d枚枚,1分硬币分硬币=%d枚枚n,c5,
25、c2,c1);i+;printf(一共有一共有%d种换法。种换法。n,i);2022-9-30605.4 循环结构程序设计(举例)【例5.13】编程序,输出以下图形。*2022-9-3061【例5.13】:算法和程序#include 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);for(i=1;i=4;i+)for(j=1;j=i;j+)输出一个空格输出一个空格 for(j=1;j1e-6);printf(%fn,x);x赋初值赋初值x0=x计算计算f计算计算f1 计算计算x=x0-f/f1当当|x-x0|10-6时时输出输出x2022-9-3066本章作业n书面作业P62:练习4-1,4-2P76:习题4、7、13n课后思考:(可通过上机完成)P64:练习4-5P64:练习4-9,4-10