《第六章循环程序设计案例.ppt》由会员分享,可在线阅读,更多相关《第六章循环程序设计案例.ppt(91页珍藏版)》请在三一办公上搜索。
1、第六章 循环型程序设计,while语句 do_while语句 for语句,1、第一天晨训,班主任为了提高同学们的斗志,要求大家说一百遍“我能行!”,(第1次说:我能行!);(第2次说:我能行!);(第100次说:我能行!);,100条,2、第二天,班主任要求说10000遍“我是最棒的!”,怎么办?,一、为什么需要循环,一、为什么需要循环,(我是最棒的!);(我是最棒的!);(我是最棒的!);(我是最棒的!);(我是最棒的!);(我是最棒的!);(我是最棒的!);,int i=1;while(i=100)printf(我能行!);i+;,i=10000,我是最棒的!);,没有使用循环结构,使用w
2、hile循环,二、什么是循环,生活中的循环,打印50份试卷,10000米赛跑,旋转的车轮,循环结构的特点,锲而不舍地学习,循环结构也称重复结构:程序中反复执行的一组指令或程序段。,循环体:被反复执行的程序段。,循环变量:用来控制循环是否继续进行的变量。,二、什么是循环,三、循环语句,1、while语句,基本格式,while(条件表达式)语句;,流程图:,若表达式(条件)的值为真,则执行内嵌语句A,再判断表达式(条件),当表达式的值为假时,执行while后面的语句。,while语句的说明:,(1)while语句属当型循环,即先判断条件(表达式),再执行循环体。,(2)表达式为一条件,用于控制循环
3、是否可继续执行,故称控制表达式。,(3)语句A为内嵌式语句,是循环结构的循环体。它可以是单语句也可以是复合语句,且该语句中必须包含有对循环条件进行修改的语句。,1、while语句,while范例,在屏幕上打印5次hello,#include“stdio.h”void main()int i=1;while(i=5)printf(“hellon);i+;,初值(从什么情况开始),条件(结束值,什么情况结束),循环体(重复什么),循环体中改变循环条件的语句),例 求 1+2+100,分析:求和的过程为:,1)S=1 S=S+1 2)S=1+2 S=S+2 3)S=1+2+3 S=S+3 100)S
4、=1+2+100 S=S+100,S=0,求和表达式:,S=S+i,初值:,S=0,循环次数 i:,1100,流程图:,程序:,main()int s,i;s=0,i=1;while(i=100)s=s+i;i+;printf(s=%ldn,s);,while语句注意事项,1、计数变量要有初始值2、计数变量在执行语句中要有变化3、条件最后必须为假,来结束语句。否则 为死循环4、如果循环体中包含多个语句,应用括号括起来。如果不加括号,则while语句只负责它后面的第一个语句,5、在循环体中应该有使循环趋向结束的语句,否则会导致死循环。,如上例中的语句改写成如下形式:i=1;while(i=100
5、)s+=i;i+;,则while语句的循环体语句为:s+=i;循环变量i的值没有改变,循环不能终止,陷入死循环,下列情况,退出while循环:条件表达式不成立(为零);循环体内遇break,return,goto无限循环:while(1)循环体;,作业,1、输出110十个整数。2、求10!(10的阶层)。3、输出100内所有的偶数。4、输出100内所有的偶数个数。5、计算1100之间所有奇数的和。6、求1-100内不能被3整除的数之和。7、1100之间可以被7整除,但不能被13整除的数据的和8、1n之间所有整数的和,用户输入n,求10!(10的阶层),#include stdio.hvoid
6、main()long int i=1,s=1;while(i=10)s=s*i;i+;printf(%ld,s);,#include stdio.hvoid main()int i=1,j=0;while(i=100)if(i%2=0)j+;printf(%d,i);i+;printf(n总个数:%d,j);,例:输出100内所有的偶数及偶数个数。,作业,1100之间所有的偶数1100之间所有的奇数1100之间所有偶数的和1100之间所有奇数的和,1100之间所有的偶数(倒序输出)1100之间所有的奇数(倒序输出),从键盘输入 n值,输出n行每行6个*号。例:输入 n=4,输出的图形如下:,*
7、,#include stdio.hvoid main()int i=1,n;scanf(%d,例:求 12+22+32+42+52+1002include stdio.hvoid main()int k;long int result=0;while(k=100)result=result+k*k;k+;printf(result=%ldn,result);,拓展题:,例2:统计从键盘输入一行字符的个数。#include main()int n=0;printf(输入一个字符:n);while(getchar()!=n)n+;printf(%d,n);,输入数据,-1结束并显示求和结果。,#i
8、nclude stdio.hvoid main()int i,s=0;scanf(%d,一般形式:,do 循环体语句;while(表达式);,执行流程:,dowhile语句,执行过程:先执行一次循环体语句,然后判别表达式,当表达式的值为真时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,特点:先执行循环体,然后判断循环条件是否成立。,dowhile范例,在屏幕上打印5次hello,#include void main()int i=1;doprintf(“hellon);i+;while(i=5);,dowhile语句特点和说明,特点:先执行循环体,后判断表达式说
9、明:至少执行一次循环体,例6.3 求1到100的和#include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%dn,sum);,运行结果:5050,举例,如果我国当前人口是13亿,假设我国的人口每年增长的速度是千分之三,问经过多少年我国人口将达到60亿?,main()int n=0;double renkou=13;while(renkou60)renkou=renkou*(1+0.003);n+;printf(%ldn,n);,作业,1、输出110十个整数。2、计算1+2+3+99+100的和3、求5!4、
10、求1100之间5的倍数的个数。,do-while、while的区别,while语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,运行结果:1 sum=55 再运行一次:11sum=0,运行结果:1 sum=55 再运行一次:11sum=11,for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,for语句,一般形式:,for
11、(表达式1;表达式2;表达式3)循环体语句;,执行流程:,for语句,for语句的执行过程:(1)先求解表达式1。(2)求解表达式2,若其值为真,则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假,则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句,for语句最简单的形式:for(循环变量赋初值;循环条件;循环变量增值),例如:for(i=1;i=100;i+)sum=sum+i;,用for语句简单、方便。,main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;pri
12、ntf(“%d”,sum);,例:在屏幕上打印5次hello。,#include“stdio.h”void main()int i;for(i=1;i=5;i+)printf(“hellon);,例:求1100之间5的倍数的个数。,例:求12+22+32+42+52+1002include stdio.hvoid main()int k;long int sum=0;for(k=1;k=100;k+)sum=sum+k*k;printf(“sum=%ldn,sum);,例:求 n!,求阶乘的过程为:,1)S=1 S1=S0 1 2)S=12 S2=S1 2 3)S=123 S3=S2 3 n)
13、S=12 n Sn=Sn-1100,S0=1,求阶乘表达式:,S=S i,初值:,S=1,循环次数 i:,1n,循环结构程序举例,流程图:,程序:,#define N 10main()int i;long int s=1;for(i=1;i=N;i+)s=s*i;printf(s=%ldn,s);,例:求5!,例:打印输出1000以内的水仙花数(三位数)。main()int m,a,b,c;for(m=100;m1000;m+)a=m/100;b=m/10%10;c=m%10;if(m=a*a*a+b*b*b+c*c*c)printf(%6d,m);,6.5 用for 语句实现循环,说明:(1
14、)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i=100;i+)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。,6.5 用for 语句实现循环,说明:(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于:i=1;while(1)sum=sum+1;i+;,6.5 用for 语句实现循环,说明:(3)表达式3也可以省略,但此时程序设计者应另外设法保
15、证循环能正常结束。如:for(i=1;i=100;)sum=sum+i;i+;在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,6.5 用for 语句实现循环,说明:(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100;)while(i=100)sum=sum+i;相当于 sum=sum+i;i+;i+;在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,6.
16、5 用for 语句实现循环,说明:(5)3个表达式都可省略,如:for(;)语句 相当于 while(1)语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。,for范例,计算1+2+3+99+100的和,for范例(续),#include void main()int i;int sum=0;for(i=1;i=100;i+)sum=sum+i;printf(sum=%dn,sum);,for范例(省略表达式),#include void main()int i=1;int sum=0;for(;i=100;i+)sum+=i;printf(sum=%dn
17、,sum);,for范例(省略表达式),#include void main()int i=1;int sum=0;for(;i=100;)sum+=i;i+;printf(sum=%dn,sum);,作业,1、输出110十个整数。2、计算1100之间所有奇数的和。,例:求 水仙花数,即这个数等于它的百位、十位和个位数的立方和。如153是一个水仙花数,因为153,分别用三种循环语句编写该程序。,循环总结:,main()int n=100,i,j,k;/*i、j、k用来放这个数的百位、十位和个位*/printf(“水仙花数是:”);while(n1000)i=n/100;j=(n/10)%10;
18、k=n%10;if(n=i*i*i+j*j*j+k*k*k)printf(%6d,n);n=n+1;,1、使用while结构,main()int n=100,i,j,k;printf(“水仙花数是:”);do i=n/100;j=(n/10)%10;k=n%10;if(n=i*i*i+j*j*j+k*k*k)printf(%6d,n);n=n+1;while(n1000);,2、使用do-while结构,main()int n=100,i,j,k;printf(“水仙花数是:”);for(n=100;n1000;n+)i=n/100;j=(n/10)%10;k=n%10;if(n=i*i*i+
19、j*j*j+k*k*k)printf(%6d,n);,3、使用for结构,6.6 循环的嵌套,1、一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。2、三种循环(while循环、do-while循环和for循环)可以互相嵌套。,6.6 循环的嵌套,下面几种都是合法的形式:(1)while()(2)do(3)for(;)while()do for(;)while();while();,6.6 循环的嵌套,(4)while()(5)for(;)(6)do do while()for(;)while()while(),1、从键盘输入 n值,输出n行每行
20、n个*号。例:输入 n=4,输出的图形如下:,*,思路:要用两层循环,外循环控制行数,内循环控制列数。,循环嵌套,#include stdio.hvoid main()int i,j,n;scanf(%d,*,*,2、,3、,#include stdio.hvoid main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(*);printf(n);,#include stdio.hvoid main()int i,j;for(i=1;i=i;j-)printf(*);printf(n);,*,#include stdio.hvoid main()i
21、nt i,j;for(i=1;i=4;i+)for(j=1;j=2*i-1;j+)printf(*);printf(n);,4、输出9*9口诀。程序分析:分行与列考虑,共9行9列,i控制行,j控制列。,#include stdio.hvoid main()int i,j,result;for(i=1;i=9;i+)for(j=1;j=9;j+)result=i*j;printf(%d*%d=%-3d,i,j,result);printf(n);,5、打印输出九九乘法表。#include stdio.hvoid main()int i,j;for(i=1;i=9;i+)for(j=1;j=i;j
22、+)printf(%d*%d=%-5d,i,j,i*j);printf(n);,6、1!+2!+3!+4!+5!,#include stdio.hvoid main()int i,j,jc=1;long sum=0;for(i=1;i=5;i+)for(j=1;j=i;j+)jc=jc*j;sum=sum+jc;jc=1;printf(%ld,sum);,例4:,*,#include stdio.hvoid main()int i,j,k;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n
23、);,例:打印出如下图案(菱形)*,程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。,#include stdio.hvoid main()int i,j,k;for(i=0;i=3;i+)for(j=0;j=2-i;j+)printf();for(k=0;k=2*i;k+)printf(*);printf(n);for(i=0;i=2;i+)for(j=0;j=i;j+)printf();for(k=0;k=4-2*i;k+)printf(*);printf(n);,题目:有一分数序列:2/1,3/2,5/3,8/5,13
24、/8,21/13.求出这个数列的前20项之和。程序分析:请抓住分子与分母的变化规律。main()int n,t,number=20;float a=2,b=1,s=0;for(n=1;n=number;n+)s=s+a/b;t=a;a=a+b;b=t;printf(sum is%9.6fn,s);,continue语句 结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.一般形式:continue;,辅助控制语句:break、continue,while(表达式1)if(表达式2)continue;,例:输出1100之间是5的倍数的数。void main()int
25、 m;for(m=1;m=100;m+)if(m%5!=0)continue;else printf(%5d,m);,例:输出100以内不能被3整除的数。,main()int i;printf(n);for(i=3;i=100;i+)if(i%3=0)continue;else printf(%d,i);,break语句 break语句是结束整个循环,不再判断循环条件是否成立。,while(表达式1)if(表达式2)break;,例:float pi=3.14159;for(r=1;r100)break;printf(r=%f,area=%fn,r,area);,程序的作用是计算r=1到r=1
26、0时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。,判断m是否为素数。,main()int m,i;scanf(%d,例:求100至200间的全部素数。#include#include main()int m,i,k,n=0;for(m=100;m=k+1)printf(%d,m);n=n+1;if(n%5=0)printf(n);printf(n);,题目:求s=a+aa+aaa+aaaa+aa.a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加)
27、,几个数相加有键盘控制。1.程序分析:关键是计算出每一项的值。main()int a,n,count=1;long int sn=0,tn=0;printf(please input a and nn);scanf(%d,%d,题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?main()float sn=100.0,hn=sn/2;int n;for(n=2;n=10;n+)sn=sn+2*hn;/*第n次落地时共经过的米数*/hn=hn/2;/*第n次反跳高度*/printf(the total of roa d
28、is%fn,sn);printf(the tenth is%f metern,hn);,题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。程序分析:采取逆向思维的方法,从后往前推断。main()int day,x1,x2;day=9;x2=1;while(day0)x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/x2=x1;day-;printf(the total is%dn,x1)
29、;,例二:输出以下图形:(行数从键盘输入)A BBB CCCCC DDDDDDDE E E E E E E E FFFFFFFFFFFFFF,解题思路:用循环变量i控制行:for(i=0;in;i+)每行中,先输出若干空格,再输出若干 字符,最后换行。,n-i-1,2*i+1,j,0122*i,字符,65+065+165+265+2*i,ABC,ASCII码,printf(“%c”,65+i);,根据问题的部分条件预估答案的范围,然后在此范围内对所有可能的情况逐一验证(穷举),直到全部情况都通过了验证为止。,穷举法,穷举法步骤:预估出答案的大致范围;用循环语句对范围内所有可能情况进行穷举;在穷
30、举中逐一验证,将满足条件的情况输出,即为所解。,凡是求解有多少种方案或可能等一类非数值问题都可以用穷举法来求解。如:百钱百鸡问题、换硬币问题、水仙花问题、完数问题、素数问题等。,嵌套循环的应用-穷举法,百钱百鸡问题:每只公鸡5个钱,每只母鸡3个钱,每3只小鸡1个钱,用100个钱,买100只鸡,问公鸡、母鸡和小鸡各买几只?,分析,定义变量x,y,z,表示公鸡、母鸡和小鸡的只数,main()int x,y,z;for(x=1;x=100;x+)for(y=1;y=100;y+)for(z=1;z=100;z+)if(5*x+3*y+z/3=100,程序运算100万次,百钱百鸡问题程序,x最多为20
31、,y最多为34,当x,y已确定时,z的值为100-x-y,main()int x,y,z;for(x=1;x20;x+)for(y=1;y34;y+)z=100-x-y;if(5*x+3*y+z/3=100)printf(“%d,%d,%dn”,x,y,z);,共六组解:x y z3 20 774 18 787 13 808 11 8111 6 8312 4 84,所求的z不能被3整除如何解决?,注意括号,百钱百鸡程序的改进,解决所求的z不能被3整除用z%3=0,main()int x,y,z;for(x=1;x20;x+)for(y=1;y34;y+)z=100-x-y;if(5*x+3*y
32、+z/3=100),共三组解:x y z3 20 774 18 787 13 808 11 8111 6 8312 4 84,注意括号,百钱百鸡程序的进一步改进,main()int a,b,c,k=0;for(a=0;a=20;a+)for(b=0;b=50;b+)for(c=0;c=100;c+)if(5*a+2*b+c=100)k+;printf(k=%dnn,k);getch();运行结果:k=541,将一元钱换成一分,二分和五分的硬币,共有多少种换法?,定义变量a,b,c分别作为三种硬币的个数,定义变量 k作计数器。,计数器,例:换硬币,上机作业,鸡兔同笼上有35头,下有94足 问鸡兔几何?,鸡兔同笼是中国古代著名趣题之一。大约在1500年前,孙子算经中就记载了这个有趣的问题。书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中各有几只鸡和兔?,上机作业,1、“水仙花数”,即一个3位数,其各位数字立方和等于该数本身。如:153=13+53+332、一个数如果恰好等于它的因子之和,这个数就称为“完数”如:6=1+2+3。3、素数:只能被1和它本省整除的数,例如:2,3,5,7,114、回文数:两边数一样的数,例如:12321,121,等,