《第5章循环结构的语句及流程》由会员分享,可在线阅读,更多相关《第5章循环结构的语句及流程(36页珍藏版)》请在金锄头文库上搜索。
1、布置作业布置作业l书面练习:书面练习:P113P114习题习题l 准备上机题目:实验报告上:实验五,准备上机题目:实验报告上:实验五,实验六实验六 要求画出程序流图。要求画出程序流图。l上机实验:上机实验: 实现实验五、实验六实现实验五、实验六上交作业上交作业下机时班长收齐程序流图上交下机时班长收齐程序流图上交 。程序设计方法第第5章章 循环结构的程序设计循环结构的程序设计 问题问题1:假如全班假如全班41人,欲从键盘上输入每人的数人,欲从键盘上输入每人的数学成绩,然后计算出平均成绩学成绩,然后计算出平均成绩;问题问题2:编程计算编程计算n! . . 这些都是重复计算的问题,需要由循环结构这些
2、都是重复计算的问题,需要由循环结构来解决。来解决。C 提供了以下提供了以下4 4种重复计算的结构种重复计算的结构:ugoto标号标号uwhile(表达式表达式)语句语句udo语句语句while(表达式表达式)ufor(表达式表达式1;表达式表达式2;表达式表达式3)语句语句goto语句及用语句及用goto构成循环构成循环格式格式1 1: gotolabel;其中:其中:label是语句标号,它命名的规则同变量名是语句标号,它命名的规则同变量名;功能:功能:使程序无条件地转向标号为使程序无条件地转向标号为label的语句去执行;的语句去执行;可以可以用用 ifgoto 语句构成循环语句构成循环.
3、 . 如:解上述问题如:解上述问题 1:#include#defineN41main()/*c501.c*/inti=1;floatmath,avg=0.;loop:printf(“输入数学成入数学成绩(%d):“,i);scanf(“%f”,&math);avg+=math;i+;if(i=N)gotoloop;printf(“n平均分平均分=%gn”,avg/N);程序实现程序实现说明:说明:1 1)标号不必进行类型说明;标号不必进行类型说明;2)程序中的任何一个语句均可带上标号,但标号必程序中的任何一个语句均可带上标号,但标号必须以冒号结束;须以冒号结束; 3)不提倡使用不提倡使用got
4、ogoto语句。语句。循环体循环结构的语句及流程控制循环结构的语句及流程控制 格式格式2:2: while (表达式表达式) 语句语句功功能能:当当表表达达式式的的值值非非0 0时时, ,执执行行语语句句, ,该该语语句句一一般般是是复合语句复合语句, ,被称之为被称之为循环体循环体. .例例:解问题解问题2,求,求n!的值的值.需要定义的变量需要定义的变量:mul-存放累乘积存放累乘积;i-计数计数;n-程序程序: c502.c#includemain()inti=1,n;longmul=1;printf(“nInputn:”);scanf(“%d”,&n);while(i=n)mul*=i
5、;i+;printf(n%d!=%ld,n,mul);循环体mul*=i+;说明:说明:l循环体可以是单个语句或复合语句循环体可以是单个语句或复合语句lwhile语句前应有为测试表达式中的循环控制变量赋语句前应有为测试表达式中的循环控制变量赋初值的语句,以确保循环的正常开始;初值的语句,以确保循环的正常开始;l循环体内应有改变循环控制变量的语句,以确保循循环体内应有改变循环控制变量的语句,以确保循环进行有限次后正常结束;环进行有限次后正常结束;如:如:inti=1;while(i=100)sum=sum+1;(死循环死循环)lwhile循环的特点是先判断后执行,故循环有可能一循环的特点是先判断
6、后执行,故循环有可能一次都不被执行;次都不被执行;如:如:inti=3;while(i3)printf(“i=%dn”,i);例例2:求整数:求整数a和和b的最小公倍数的最小公倍数算法流图如下算法流图如下: :程序如下程序如下: :C503.c c503_1.cC503.c c503_1.c#includemain()inta,b,i,m,n;scanf(“%d%d”,&a,&b);i=1;m=n=(ab)?a:b;while(1)m=n*i+;if(m%a=0&m%b=0)printf(“%dn”,m);break;#includemain()inta,b,i;scanf(“%d%d”,&a
7、,&b);i=a;while(1)if(i%a=0&i%b=0)printf(“%dn”,i);break;i+;循环结构的语句及流程控制循环结构的语句及流程控制 格式格式3: do 语句语句 while (表达式表达式);功能功能: :先执行语句先执行语句(单个语句或复合语句单个语句或复合语句,被称之为循环体被称之为循环体),当当表达式的值非表达式的值非0时时,重复重复执行该语句执行该语句,直到直到表达式的值为表达式的值为0。例例:sum=1+2+3+N.(c604.c)#include#defineN100main()inti=1,sum=0;dosum=sum+i;i+;while(i=
8、N);printf(nsum=%d,sum);#includemain()inti=1,sum=0,N;scanf(“%d”,&N);dosum+=i+;while(i=N);printf(nsum=%d,sum);例子例子需要定义的变量需要定义的变量:e-存放累加值存放累加值;i-计数计数;n-存放计算阶存放计算阶乘值乘值.计算计算: e1+1/1!+1/2!+.+1/100!程序程序 (c505.c)#includevoidmain()inti=1;doublee,n;e=n=1.0;don=n*i;e=e+1./n;while(+i=100);printf(ne=%f,e);#inclu
9、demain()inti=1;doublet,e=1.0;intn=1;don=n*i+;t=1./n;e=e+t;while(t=1e-7);printf(ne=%f,e);循环结构循环结构for循循环环比比较较灵灵活活,既既可可用用于于确确定定次次数数的的循循环环,也也可可用用于于不不确确定定次次数数的的循循环环其执行流程描述如下:其执行流程描述如下:格式格式4: for(表达式表达式1;表达式表达式2;表达式表达式3)语句语句常用形式常用形式:for(循环变量初值循环变量初值;循环条件循环条件;循环变量增值循环变量增值)语句语句程序示例程序示例例例:计算计算sum=1+2+3+100(c
10、506.c)voidmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;printf(nsum=%d,sum);例例:计算计算:e1+1/1!+1/2!+.+1/100!(c507.c)voidmain()inti;doublee=1.0,n=1.0;for(i=1;i=100;i+)n=n*i;e=e+1.0/n;printf(ne=%f,e);程序设计的三种方法程序设计的三种方法l 枚举法枚举法 就是逐一列举出可能解的各个元素,并就是逐一列举出可能解的各个元素,并加以判断,直到求得所需要的解。常用在排列、加以判断,直到求得所需要的解。常用在排列、组合、数据分类
11、、信息检索、多解方程的求解组合、数据分类、信息检索、多解方程的求解上;上;l归纳法归纳法 是从大量的特殊性中总结出规律性或一是从大量的特殊性中总结出规律性或一般性的结论。在程序设计上主要表现为递归和般性的结论。在程序设计上主要表现为递归和迭代、数列和级数求和。迭代、数列和级数求和。l 抽象法抽象法 自顶向下,逐步求精。自顶向下,逐步求精。枚举问题枚举问题l求求1000 1000 20002000之间的素数之间的素数l打印出水仙花数,所谓水仙花数是指一个打印出水仙花数,所谓水仙花数是指一个3 3位数,位数,其各位数的立方之和等于该数本身。如:其各位数的立方之和等于该数本身。如:153=1*1*1
12、+5*5*5+3*3*3.153=1*1*1+5*5*5+3*3*3.l百钱买百鸡问题百钱买百鸡问题. .大公鸡大公鸡5 5钱一只,母鸡钱一只,母鸡3 3钱一只,钱一只,雏鸡一钱买雏鸡一钱买3 3只,有几种买法,求出所有解。只,有几种买法,求出所有解。l两个乒乓球队进行比赛,各出三人甲队为两个乒乓球队进行比赛,各出三人甲队为A A、B B、C.C.乙队为乙队为X X、Y Y、Z Z。已经抽签决定了比赛名单。已经抽签决定了比赛名单。有人向队员打听比赛对阵情况,有人向队员打听比赛对阵情况,A A说他不和说他不和X X比,比,C C说他不和说他不和X X、Z Z比。比。 编程序找出三对赛手的名单编程
13、序找出三对赛手的名单. . 例例1求求1000 2000之间的素数之间的素数需要的变量说明:需要的变量说明:i:10002000;j:2ik:0,10-是素数是素数1-不是素数不是素数参考程序参考程序 c510.c #includemain()inti,j,k,m;printf(“10002000之间的素数:之间的素数:n”);for(i=1000;i2000;i+)k=0;/*用于标识是否素数用于标识是否素数*/m=sqrt(i);for(j=2;j=m;j+)if(i%j=0)k=1;break;if(k=0)printf(%8d,i);例例2.2.打印出所有的打印出所有的“水仙花数水仙花
14、数” 所谓所谓“水仙花数水仙花数”是指一个是指一个3位数,其各位数字位数,其各位数字的立方和等于该数本身。例如,的立方和等于该数本身。例如,153是一个是一个“水仙花水仙花数数”,因为,因为153=13+53+33参考程序参考程序 c514.c#includevoidmain()inti,j,k,m;for(m=100;m1000;m+)i=m/100;j=m/10-i*10;/*m%100/10*/k=m%10;if(m=i*i*i+j*j*j+k*k*k)printf(“%4d”,m);#includevoidmain()inti,j,kfor(i=1;i=9;i+)for(j=0;j=9
15、;j+)for(k=0;k=9;k+)m=i*i*i+j*j*j+k*k*k;n=i*100+j*10+kif(m=n)printf(“%4d”,n);例例3百钱买百鸡问题百钱买百鸡问题大大公公鸡鸡5钱钱一一只只,母母鸡鸡3钱钱一一只只,雏雏鸡鸡一一钱钱买买3只只,有几种买法,求出所有解。有几种买法,求出所有解。设:设:x为大公鸡数;为大公鸡数;y为母鸡数;为母鸡数;z为雏鸡数。为雏鸡数。不定方程:不定方程:x+y+z=1005x+3y+z/3=100限定条件:限定条件:x20,y34;z是是3的倍数。的倍数。参考程序参考程序 c511.c#includevoidmain()intx,y,z;
16、printf(“n大公鸡大公鸡母鸡母鸡雏鸡雏鸡);for(x=0;x20;x+)for(y=0;y34;y+)z=100-x-y;if(z%3!=0)continue;if(5*x+3*y+z/3=100)printf(n%8d%8d%8d,x,y,z);示例示例4 4 两个乒乓球队进行比赛,各出三人甲队为两个乒乓球队进行比赛,各出三人甲队为A、B、C.乙队为乙队为X、Y、Z三人三人.已经抽签决定比赛已经抽签决定比赛名单。有人向队员打听比赛的名单名单。有人向队员打听比赛的名单,A说他不和说他不和X比比,C说他不和说他不和X、Z比比.编程序找出三对赛手的名单编程序找出三对赛手的名单.A-YZB-
17、XZC-Y参考程序参考程序 c615.c#includevoidmain()charA,B,C=Y;for(A=Y;A=Z;A+)for(B=X;B=Z;B+)if(A!=B)if(A!=C&B!=C)printf(“A-%ctB-%ctC-%cn”,A,B,C);归纳问题归纳问题l用用/41-1/3+1/5-1/7+/41-1/3+1/5-1/7+近近似似公公式式计计算算的的值值直直到最后一项到最后一项1/n101/n10-6-6lFibonacciFibonacci数列这是一个古典数学问题:一对兔子从数列这是一个古典数学问题:一对兔子从它出生后第它出生后第3 3个月起,每个月都生一对小兔子
18、,小兔个月起,每个月都生一对小兔子,小兔子子3 3个月后又生一对小兔子,假设兔子都不死,求每个月后又生一对小兔子,假设兔子都不死,求每个月的兔子对数。该数列为:个月的兔子对数。该数列为: 1 1 2 3 5 1 1 2 3 5 8 13 218 13 21 即从第即从第3 3项开始,其该项是前两项项开始,其该项是前两项之和。之和。l用牛顿迭代法求用牛顿迭代法求ax3+bx2+cx+d=0 xax3+bx2+cx+d=0 x在在1 1附近的实根。附近的实根。l猴子第一天摘下若干桃子,当即吃了一半,还不过猴子第一天摘下若干桃子,当即吃了一半,还不过瘾瘾, ,又多吃了一个。第二天早上又将剩下的桃子吃
19、掉又多吃了一个。第二天早上又将剩下的桃子吃掉了一半了一半, ,又多吃了一个又多吃了一个, ,以后每天早上都吃了前一天以后每天早上都吃了前一天剩下的一半零一个。到第剩下的一半零一个。到第1010天早上再想吃时天早上再想吃时, ,发现只发现只剩下一个桃子了。求第一天共摘多少个桃子。剩下一个桃子了。求第一天共摘多少个桃子。例子:例子:例例1.用用/41-1/3+1/5-1/7+近近似似公公式式计计算算的的值直到最后一项值直到最后一项10-6需要定义如下变量:需要定义如下变量:n-项计数项计数;s-确定各项的符号确定各项的符号;pi-存放求和的值存放求和的值./41-1/3+1/5-1/7+#incl
20、udevoidmain()ints=1;/*确定各项的符号确定各项的符号*/floatn,pi=0.;/*n:项计数项计数pi:和值和值.*/for(n=0;1./(2*n+1)1e-6;n+)pi=pi+s*1./(2*n+1);s=-s;pi=pi*4;printf(npi=%10.6f,pi);例例2求求Fibonacci数列的前数列的前40个数个数这这是是一一个个古古典典数数学学问问题题:一一对对兔兔子子从从它它出出生生后后第第3个个月月起起,每每个个月月都都生生一一对对小小兔兔子子,小小兔兔子子3个个月月后后又又生生一一对对小小兔兔子,假设兔子都不死,求每个月的兔子对数。该数列为:子
21、,假设兔子都不死,求每个月的兔子对数。该数列为:1123581321 即即从从第第3项项开开始始,其其该该项项是是前前两两项之和。项之和。需要定义的变量需要定义的变量:i-计数计数;f1-计算前项值计算前项值;f2-计算下项值计算下项值.参考程序参考程序 (c509.c)#includevoidmain()inti;longf1=1,f2=1;for(i=1;i=20;i+)printf(%12ld%12ld,f1,f2);if(i%2=0)printf(“n”);/*输出两次后换行输出两次后换行*/f1=f1+f2;f2=f2+f1;示例示例3f(xf(x)=ax)=ax3 3+bx+bx2
22、 2+cx+d+cx+df1(x)=3axf1(x)=3ax2 2+2bx+c+2bx+c需要定义的量:需要定义的量:系数系数a a,b b,c c,d d;存放函数值存放函数值 f f,f1f1;近似根近似根 xkxk,xk1xk1;关键关键3 3要素要素: :初值、迭代公式、精度要求初值、迭代公式、精度要求例例3 用牛顿迭代法求用牛顿迭代法求ax3+bx2+cx+d=0 x在在1附近附近的实根。的实根。迭代公式:迭代公式:xk+1=xk-f(xk)/f(xk)迭代到迭代到:|xk+1-xk|=10-5参考程序参考程序 (c512.c)#include#includevoidmain()fl
23、oata,b,c,d,xk=1,xk1,f,f1;printf(ninputa,b,c,d:);scanf(%f,%f,%f,%f,&a,&b,&c,&d);doxk1=xk;f=(a*xk1+b)*xk1+c)*xk1+d;printf(“xk=%f,f(xk)=%fn”,xk,f);f1=(3*a*xk1+2*b)*xk1+c;xk=xk-f/f1;while(fabs(xk1-xk)=1.e-6);printf(nx=%10.7f,xk);示例示例4猴子第一天摘下若干桃子,当即吃了一半,还不过瘾猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又又多吃了一个。第二天早上又将剩下的桃子吃掉了
24、一半多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多又多吃了一个吃了一个,以后每天早上都吃了前一天剩下的一半零一个。以后每天早上都吃了前一天剩下的一半零一个。到第到第10天早上再想吃时天早上再想吃时,发现只剩下一个桃子了。求第一天发现只剩下一个桃子了。求第一天共摘多少个桃子。共摘多少个桃子。分析:分析:假设假设s为剩下的为剩下的,则则s+1为前一天的一半为前一天的一半,而而2(s+1)为前一为前一天的总个数。依次类推天的总个数。依次类推,10天前的桃子数即可算出天前的桃子数即可算出. .定义定义 s,i1s, 9 i 当当 i =12*(s+1) s输出输出 s#includevoidma
25、in()/*c513.c*/ints=1,i=9;for(;i=1;i-)s=(s+1)*2;printf(“s=%dn”,s);输出格式处理输出格式处理输出以下图案输出以下图案 c616.c*参考程序参考程序#includevoidmain()inti,j;for(i=1;i5;i+)for(j=1;j=40-i;j+)printf(“”);for(j=1;j0;i-)for(j=1;j=40-i;j+)printf(“”);for(j=1;j=2*i-1;j+)printf(“*”);printf(“n”);*本章小结本章小结 本章主要介绍了几种循环结构的形式及其一般本章主要介绍了几种循环
26、结构的形式及其一般应用、程序设计的基本方法。应该注意:应用、程序设计的基本方法。应该注意:lwhile(表达式表达式) 语句语句do 语句语句 while (表达式表达式) ;for(表达式表达式1;表达式表达式2;表达式表达式3) 语句语句语句即是循环体,可以是单个语句或多个语句组语句即是循环体,可以是单个语句或多个语句组成的复合语句成的复合语句( (以以 括住括住) );也可以自身嵌套的循;也可以自身嵌套的循环语句或另一结构的循环语句,称之为多重循环。环语句或另一结构的循环语句,称之为多重循环。各表达式的作用。各表达式的作用。lbreak、 continue语句在循环结构中的作用及应用语句在循环结构中的作用及应用l程序设计的三种基本方法及应用程序设计的三种基本方法及应用