ETempC程序设计1第六讲-循环结构.ppt

上传人:牧羊曲112 文档编号:6505194 上传时间:2023-11-07 格式:PPT 页数:64 大小:596.50KB
返回 下载 相关 举报
ETempC程序设计1第六讲-循环结构.ppt_第1页
第1页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第2页
第2页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第3页
第3页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第4页
第4页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《ETempC程序设计1第六讲-循环结构.ppt》由会员分享,可在线阅读,更多相关《ETempC程序设计1第六讲-循环结构.ppt(64页珍藏版)》请在三一办公上搜索。

1、循环结构程序设计,C 语言程序设计,主讲:刘卫红,2,程序的三种基本结构,顺序结构,选择结构,循环结构,直到型循环,当型循环,3,程序的基本结构,int a,b,sum;scanf(“%d%d”,顺序结构,int a,b,max;scanf(“%d%d”,选择结构,如何连续求和或求最大值?,4,若连续求和的次数确定,即循环次数确定的循环,int i,a,b,sum;for(i=1;i=10;i+)scanf(“%d%d”,int i,a,b,sum;i=1;while(i=10)scanf(“%d%d”,for循环,while循环,5,若循环次数不确定,int a,b,sum;while(a!

2、=0|b!=0)scanf(%d%d,错误!,int a,b,sum;scanf(%d%d,错误!,6,int a,b,sum;scanf(%d%d,若循环次数不确定(续),循环初始条件,循环控制条件,循环体(红色大括号内的部分),循环因子(a,b),只要能够找到循环的四个要素,即可写出循环。当循环次数不确定时,用while循环更直观,当然也可可用for循环,7,goto语句构成的循环,int a,b,sum;loop:scanf(%d%d,注意:goto语句是有害的,会破坏程序的结构化程度。因此应限制使用,尽量不用。,8,本节要点,while循环do-while循环for循环循环的嵌套bre

3、ak语句和continue语句,9,while循环,语句一般格式 while(表达式)语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是重复执行的部分,10,功能:,计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。,循环控制条件,循环体,11,求累加和,【例】编写程序,求100个自然数的和即:s=1+2+3+100,思路:寻找加数与求和的规律,1+2+3+99+100,12,求累加和(续),

4、int i,sum;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,正确吗?,循环初始条件,循环控制条件,循环体(红色大括号内的部分),循环因子(i),13,求累加和(续),int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,别忘了sum的初值!,int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(sum=%dn,sum);getch();,for循环更简洁!,14,for循环,语句一般格式 for(

5、表达式1;表达式2;表达式3)语句,功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,15,例如:求15的累加和.,main()int i,s=0;for(i=1;i=5;i+)s+=i;printf(“%d,%dn”,i,s),i=5?,s=s+i,i=i+1,是,否,结束,s=0,i=1,表达式1,表达式2,循环体,表达式3,s=0,i=1,s=1,i=2,s=3,i=3,s=6,i=4,s=10,i=5,s=15,i=6,for(循

6、环变量赋初值;循环条件;循环变量增值)语句(即循环体),更为通俗的表示:,16,说明:,所有用 while 语句实现的循环都可以用for 语句实现。,等价于:,for(表达式1;表达式2;表达式3)语句;,表达式1;while(表达式2)语句;表达式3;,17,几种for语句中表达式的省略情况,表达式1、2、3全省略,即:for(;)就等同于:while(1),会无限循环(死循环),注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行,省略表达式1和表达式3,即:for(;表达式2;)就等同于:while(表达式2)省略表达式2,即:for(表达式1;表达式3)就

7、等同于:表达式1;while(1)表达式3;,18,课堂练习,1+3+5+7+991-2+3-4+5+99-1001+1/2+1/3+1/4+1/1001-1/2+1/3-1/4+1/99-1/100,19,一个典型的错误,main(void)int i,sum=0;for(i=1;i=5;i+);sum=sum+i;printf(sum=%dn,sum);,main(void)int i,sum=0;i=1;while(i=5);sum=sum+i;i+;printf(sum=%dn,sum);,分号的问题!,20,求5!,Si=Si-1*i;,main()int i;long s=1;fo

8、r(i=1;i=5;i+)s=s*i;printf(“%ldn”,s);,若计算1*3*5*7*.前10项的积,怎么修改程序?,21,do-while循环,语句一般格式 do 语句 while(表达式);功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。,22,While循环和do while 循环,int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,int i,sum=0;i=1;do sum=su

9、m+i;i+;while(i=100);printf(sum=%dn,sum);getch();,此时,两种循环实现的功能完全相同,如果将i的初值设为101,将出现什么情况?,23,说明:,while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别:do-while 语句先执行循环体再判断条件,循环体至少执行一次;while 语句先判断条件再执行循环体,循环体有可能一次也不执行dowhile循环也要遵守四要素,应该避免死循环。,24,经典实例,判断几位数,并逆序输出混合运算素数最小公倍数和最大公约数a+aa+aaa+aaaa+Fibonacci数

10、列输出图形输出一个乘法口诀表分解质因数,25,实例1,判断一个不多于五位的非负整数的位数,并逆序输出,如12345,输出为54321,individual=number%10 ten=number/10%10 hundred=number/100%10 thousand=number/1000%10 tenthousand=number/10000,从低位到高位分离:,若要判断任意一个任意位数的整数怎么办?,26,实例1(续),若用循环先找规律(12345):,number%10(5)number=number/10(1234)number%10(4)number=number/10(123)

11、number%10(3)number=number/10(12)number%10(2)number=number/10(1)number%10(1)number=number/10(0)退出条件,循环体:number%10 number=number/10,循环条件:number!=0,while(number!=0)printf(“%d”,number%10);number=number/10;,do printf(“%d”,number%10);number=number/10;while(number!=0);,问题在哪?为什么必须用do while?,27,实例2,(1)求1-2+3

12、-4+5-6+7+99-100(2)利用循环语句求1-1/32+1/52-1/72+.+1/(2n-1)2的值。(本题求前50项的和),28,实例2(续),(2)利用循环语句求1-1/32+1/52-1/72+.+1/(2n-1)2的值。(本题求前50项的和),若没有指定项数,而是要求最后一项的绝对值小于10-5,该如何修改程序?,29,实例2(续),(3)计算s=1+(1+2)+(1+2+3)+(1+2+3+10)(4)计算s=1+(1*2)+(1*2*3)+(1*2*3*10)(5)计算s=1*(1+2)*(1+2+3)*(1+2+3+10)(6)计算s=1*(1*2)*(1*2*3)*(

13、1*2*3*10),main()int i,s=0;for(i=1;i=10;i+)s=s+;,s1,int s1,j;,s1=0;for(j=1;j=i;j+)s1=s1+j;,main()int i,j;long s=0,s1;for(i=1;i=10;i+)s1=1;for(j=1;j=i;j+)s1=s1*j;s=s+s1;,main()int i,j;long s=1,s1;for(i=1;i=10;i+)s1=0;for(j=1;j=i;j+)s1=s1+j;s=s*s1;,请思考:可以用单循环实现吗?,30,几种循环语句的比较,while和do-while语句的表达式只有一个,f

14、or语句有三个。while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。,while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于循环次数固定的情况,31,实例3,判断一个数是否是素数,for(i=2;i=n-1;i+)if(n%i=0)break;if(i=n)printf(“Yesn”);else printf(“Non”);,解题思路:首先按照定义进行枚举:,解题思路:然后看是否能优化?,for(i=2;isqrt(n)printf(“Yesn”);else printf(“Non”);,32,实例3(续

15、),将100-200之间的素数按5个一行输出,解题思路:按照给定的范围逐个进行判断:,for(n=100;n=200;n+),if(n是素数),输出该素数,并统计个数,if(如果个数是5的倍数)换行,33,实例4,判断两个正整数的最小公倍数和最大公约数,for(i=大数;i+)if(i%m=0i即为最大公约数,解题思路:首先按照定义进行枚举:,是否还有更好的方法?,m,n的最大公约数=n,m%n的最大公约数(m是大数),如:M(12,8)=M(8,4)=M(4,0)=4m,n的最小公倍数=m*n/最大公约数,34,实例4(续),while(n!=0)m=n;n=m%n;,辗转相除法:,m,n的

16、最大公约数=n,m%n的最大公约数(m是大数),如:M(12,8)=M(8,4)=M(4,0)=4m,n的最小公倍数=m*n/最大公约数,循环体:m=n;n=m%n,循环条件:n!=0,错误在哪?,while(n!=0)t=m;m=n;n=t%n;m是最大公约数,35,实例5,求s=a+aa+aaa+aaaa+aa.a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。,data=0;for(i=1;i=n;i+)data=data*10+a sum=sum+data;,解题思路:首先读懂题意,a和个数n未知 然后求累加和:sum=s

17、um+第i项的值,解题关键:如何计算第i项的值?,datai=datai-1*10+a,36,实例6,古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.,37,实例6(续),按每行输出5个数的形式输出Fibonacci数列的前20项。,思路:Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、。此数列的变化规律是:,设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项;将f1f2,f2f3,再求

18、f3=f1+f2得到第4项;依此类推求第5项、第6项,这是一种递推算法应采用循环实现,38,算法和程序,#define N 20main()int i,f1,f2,f3;f1=f2=1;printf(n%8d%8d,f1,f2);for(i=3;i=N;i+)f3=f1+f2;f1=f2;f2=f3;printf(%8d,f3);if(i%5=0)printf(n);,39,循环结构中的跳转语句,有如下三种语句实现跳转:continue语句break语句在循环语句的循环体中使用,可以进行循环的流程控制,40,continue语句及应用,功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句)

19、,立即开始执行下一次循环。,while语句,do-while语句,for语句,41,例如:,int x,n=0,s=0;while(n10)scanf(%d,int x,n=0,s=0;do scanf(%d,for(n=0,s=0;n10;n+)scanf(%d,42,循环中break的应用,功能:利用break语句能够强迫终止本层循环,转到后续语句执行。,while语句,do-while语句,for语句,43,例如:,int x,n=0,s=0;while(n10)scanf(%d,int x,n=0,s=0;do scanf(%d,for(n=0,s=0;n10;n+)scanf(%d,

20、44,课堂练习,1.以下程序的运行结果是?main()int a=13,b=21,m=0;switch(a%3)case 0:m+;break;case 1:m+;switch(b%2)default:m+;case 0:m+;break;printf(“m=%dn”,m);,2.阅读程序写结果main()int x=1,y=2,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;case 2:b+;break;case 1:b+;case 2:a+;b+;break;case 3:a+;b+;printf(“a=%d,b=%dn”,a,b);,45,课堂练习

21、,3.下列程序的输出结果是:main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)break;x+;x+;printf(“x=%dn”,x);,break:结束本层循环或本层的switch结构Continue:结束本次循环,继续下一次的循环判断,46,实例7,打印出以下图案:*,解题思路:找行号与每行输出内容之间的规律行号(i)每行的空格数(j)每行的*号数(k)1 3 1 2 2 3 3 1 5 4 0 7 5 1 5 6 2 3 7 3 1,目标:找j,k和i的规律此时,前四行规律好找而后三行规律不易发现,可考虑对后三行重新编号,

22、47,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)1 3 1 2 2 3 3 1 5 4 0 7 1 1 5 2 2 3 3 3 1,前四行输出:for(i=1;i=4;i+)先输出每行的空格;再输出每行的*号;最后输出换行符;,前四行规律:j=4-i;k=2*i-1;,48,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)1 3 1 2 2 3 3 1 5 4 0 7 1 1 5 2 2 3 3 3 1,前四行输出(注意临界值):for(i=1;i=4;i+)for(j=1;j=4-i;j+)putc

23、har();for(k=1;k=2*i-1;k+)putchar(*);putchar(n);,前四行规律:j=4-i;k=2*i-1;,49,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)1 3 1 2 2 3 3 1 5 4 0 7 1 1 5 2 2 3 3 3 1,后三行输出:for(i=1;i=3;i+)先输出每行的空格;再输出每行的*号;最后输出换行符;,后三行规律:j=i;k=7-2*i;,50,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)1 3 1 2 2 3 3 1 5 4 0 7

24、1 1 5 2 2 3 3 3 1,后三行输出:for(i=1;i=3;i+)for(j=1;j=i;j+)putchar();for(k=1;k=7-2*i;k+)putchar(*);putchar(n);,后三行规律:j=i;k=7-2*i;,51,实例7(续),采用另一种方式编号,作为一部分输出:行号(i)每行的空格数(j)每行的*号数(k)3 3 1 2 2 3 1 1 5 0 0 7-1 1 5-2 2 3-3 3 1,输出:for(i=3;i=-3;i-)for(j=1;j=abs(i);j+)putchar();for(k=1;k=7-2*abs(i);k+)putchar(*

25、);putchar(n);,规律:j=abs(i);k=7-2*abs(i);,52,打印出以下图案:1 22 333 4444 55555,解题思路:找行号与每行输出内容之间的规律行号(i)每行的空格数(j)每行的字数(k)1 0 1 2 1 2 3 2 3 4 3 4 5 4 5,目标:找j,k和i的规律j=i-1;k=i;,实例7(续),53,输出:for(i=1;i=5;i+)先输出每行的空格;再输出每行内容;最后输出换行符;,实例7(续),规律j=i-1;k=i;,打印出以下图案:1 22 333 4444 55555,程序:for(i=1;i=5;i+)for(j=1;j=i-1;

26、j+)putchar();for(k=1;k=i;k+)printf(“%d”,i);putchar(n);,54,实例7(续),打印出以下图案:,行号(i)每行的方块数(j)1 2 2 4 3 6 4 8 5 10 6 12 7 14 8 16 9 18 10 20,解题思路:找行号与每行输出内容之间的规律,第一行特殊需单独输出。提示:每个笑脸的ASCII码是1,每个白方块的ASCII码是219.,55,输出:输出第一行;for(i=1;i=10;i+)先输出每行白方块;再输出换行符;,规律j=2*i;,程序:printf(“11n”);for(i=1;i=10;i+)for(j=1;j=2

27、*i;j+)putchar(219);putchar(n);,实例7(续),打印出以下图案:,56,实例8,输出一个乘法口诀表:,行号(i)每行的字数(j)1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 9,解题思路:找行号与每行输出内容之间的规律,第一行特殊需单独输出。,57,输出:输出第一行;for(i=1;i=9;i+)先输出每行的第一个数字;再输出每行的其它数字;最后输出换行符;,规律j=9;,程序:printf(“t1t2t3t4t5t6t7t89n”);for(i=1;i=9;i+)printf(“%-8d”,i);for(j=1;j=9;j+)result=i

28、*j;printf(“%-8d”,result);putchar(n);,实例8(续),注意:循环嵌套时,某些语句是否该放在内循环中。,58,实例9,将一个正整数分解质因数,如90=2*3*3*5。,定义:一个合数用几个质数相乘的形式表示出来,即为分解质因数。原理:从最小的质数除起,一直除到商为质数为止。,18=2*3*3,45=3*3*5,40=2*2*2*5,解题思路:寻找除数divisor和商quotient的变化规律,59,实例9(续),18,2,9,3,3,18=2*3*3,45,3,15,3,5,45=3*3*5,40,2,20,2,10,5,2,40=2*2*2*5,除数divi

29、sor的变化范围:2quotient变化规律:divisor+商quotient的变化范围:ndivisor变化规律:quotient=quotient/divisor,60,课堂练习:,1.下列程序的输出结果是:A)x=4 B)x=8 C)x=6 D)x=12main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)continue;x+;x+;printf(“x=%dn”,x);,2.下列程序的输出结果是:main()int i,j,k=0,m=0;for(i=0;i2;i+)for(j=0;j3;j+)k+;k-=j;m=i+j;p

30、rintf(“k=%d,=%dn”,k,m);,3.下列程序的输出结果是:main()int k=10;while(k-);printf(“k=%dn”,k);,4.下列程序的输出结果是:main()int k=10;while(k=0)k=k-1;printf(“k=%dn”,k);,B),k=0,m=5,k=-1,k=0,61,5.下列程序的循环体执行的次数是:main()int i=1,j=0;while(i+jj)j=j+2;else i=i+2;printf(“i=%d,j=%dn”,i,j);,i=5,j=6,7.以下程序的运行结果是?main()int k=10;char c=b

31、;do switch(c+)case a:k+;case b:k-;case c:k+=3;break;case d:k=k%4;while(c!=c);printf(“%dn”,k);,12,6.下列程序输入1357后,它的输出结果是?main()char c;int i,data=0;for(i=0;i9)break;data=data*10+c-0;printf(data=%dn,data);,1357,62,9.main()int i,j;for(i=1;i5;i+)for(j=1;ji;j+)printf();for(j=1;j=i;j+)printf(%d,i);printf(n);,课堂练习:,1 22 333 4444,63,思考题1,(1)输入一个年,判断该年是否是闰年。(2)统计1000到2000年包含多少个闰年,并将这些闰年输出。(3)判断2009年3月2日是星期几。,判断闰年的条件:能被4整除,但不能被100整除能被400整除,64,思考题2,(1)输入一个数字,1表示大,0表示小,其他无效,如果猜对,输出Right,否则,输出Wrong。(2)连续猜10次,如果猜对五次以上,输出Win,否则,输出Fail。(3)对教材P60的猜数字游戏进行完善,增加的功能参见P64.,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号