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

上传人:max****ui 文档编号:11495667 上传时间:2020-04-25 格式:PPT 页数:64 大小:660.50KB
返回 下载 相关 举报
ETempC程序设计1第六讲-循环结构.ppt_第1页
第1页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第2页
第2页 / 共64页
ETempC程序设计1第六讲-循环结构.ppt_第3页
第3页 / 共64页
点击查看更多>>
资源描述
循环结构程序设计,C语言程序设计,主讲:刘卫红,56381319,2020/4/25,2,程序的三种基本结构,顺序结构,选择结构,循环结构,直到型循环,当型循环,2020/4/25,3,程序的基本结构,inta,b,sum;scanf(“%d%d”,顺序结构,inta,b,max;scanf(“%d%d”,选择结构,如何连续求和或求最大值?,2020/4/25,4,若连续求和的次数确定,即循环次数确定的循环,inti,a,b,sum;for(i=1;i=10;i+)scanf(“%d%d”,inti,a,b,sum;i=1;while(i=10)scanf(“%d%d”,for循环,while循环,2020/4/25,5,若循环次数不确定,inta,b,sum;while(a!=0|b!=0)scanf(%d%d,错误!,inta,b,sum;scanf(%d%d,错误!,2020/4/25,6,inta,b,sum;scanf(%d%d,若循环次数不确定(续),循环初始条件,循环控制条件,循环体(红色大括号内的部分),循环因子(a,b),只要能够找到循环的四个要素,即可写出循环。当循环次数不确定时,用while循环更直观,当然也可可用for循环,2020/4/25,7,goto语句构成的循环,inta,b,sum;loop:scanf(%d%d,注意:goto语句是有害的,会破坏程序的结构化程度。因此应限制使用,尽量不用。,2020/4/25,8,本节要点,while循环do-while循环for循环循环的嵌套break语句和continue语句,2020/4/25,9,while循环,语句一般格式while(表达式)语句,一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式用来控制循环体是否执行,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是重复执行的部分,2020/4/25,10,功能:,计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0时结束循环,转去执行while后面的语句。,循环控制条件,循环体,2020/4/25,11,求累加和,【例】编写程序,求100个自然数的和即:s=1+2+3+100,思路:寻找加数与求和的规律,1+2+3+99+100,2020/4/25,12,求累加和(续),inti,sum;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,正确吗?,循环初始条件,循环控制条件,循环体(红色大括号内的部分),循环因子(i),2020/4/25,13,求累加和(续),inti,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,别忘了sum的初值!,inti,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(sum=%dn,sum);getch();,for循环更简洁!,2020/4/25,14,for循环,语句一般格式for(表达式1;表达式2;表达式3)语句,功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。,循环初始条件,循环控制条件,循环体,2020/4/25,15,例如:求15的累加和.,main()inti,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(循环变量赋初值;循环条件;循环变量增值)语句(即循环体),更为通俗的表示:,2020/4/25,16,说明:,所有用while语句实现的循环都可以用for语句实现。,等价于:,for(表达式1;表达式2;表达式3)语句;,表达式1;while(表达式2)语句;表达式3;,2020/4/25,17,几种for语句中表达式的省略情况,表达式1、2、3全省略,即:for(;)就等同于:while(1),会无限循环(死循环),注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行,省略表达式1和表达式3,即:for(;表达式2;)就等同于:while(表达式2)省略表达式2,即:for(表达式1;表达式3)就等同于:表达式1;while(1)表达式3;,2020/4/25,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,2020/4/25,19,一个典型的错误,main(void)inti,sum=0;for(i=1;i=5;i+);sum=sum+i;printf(sum=%dn,sum);,main(void)inti,sum=0;i=1;while(i=5);sum=sum+i;i+;printf(sum=%dn,sum);,分号的问题!,2020/4/25,20,求5!,Si=Si-1*i;,main()inti;longs=1;for(i=1;i=5;i+)s=s*i;printf(“%ldn”,s);,若计算1*3*5*7*.前10项的积,怎么修改程序?,2020/4/25,21,do-while循环,语句一般格式do语句while(表达式);功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为0结束循环,转去执行while下面的语句。,2020/4/25,22,While循环和dowhile循环,inti,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);getch();,inti,sum=0;i=1;dosum=sum+i;i+;while(i=100);printf(sum=%dn,sum);getch();,此时,两种循环实现的功能完全相同,如果将i的初值设为101,将出现什么情况?,2020/4/25,23,说明:,while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构,区别:do-while语句先执行循环体再判断条件,循环体至少执行一次;while语句先判断条件再执行循环体,循环体有可能一次也不执行dowhile循环也要遵守四要素,应该避免死循环。,2020/4/25,24,经典实例,判断几位数,并逆序输出混合运算素数最小公倍数和最大公约数a+aa+aaa+aaaa+Fibonacci数列输出图形输出一个乘法口诀表分解质因数,2020/4/25,25,实例1,判断一个不多于五位的非负整数的位数,并逆序输出,如12345,输出为54321,individual=number%10ten=number/10%10hundred=number/100%10thousand=number/1000%10tenthousand=number/10000,从低位到高位分离:,若要判断任意一个任意位数的整数怎么办?,2020/4/25,26,实例1(续),若用循环先找规律(12345):,number%10(5)number=number/10(1234)number%10(4)number=number/10(123)number%10(3)number=number/10(12)number%10(2)number=number/10(1)number%10(1)number=number/10(0)退出条件,循环体:number%10number=number/10,循环条件:number!=0,while(number!=0)printf(“%d”,number%10);number=number/10;,doprintf(“%d”,number%10);number=number/10;while(number!=0);,问题在哪?为什么必须用dowhile?,2020/4/25,27,实例2,(1)求1-2+3-4+5-6+7+99-100(2)利用循环语句求1-1/32+1/52-1/72+.+1/(2n-1)2的值。(本题求前50项的和),2020/4/25,28,实例2(续),(2)利用循环语句求1-1/32+1/52-1/72+.+1/(2n-1)2的值。(本题求前50项的和),若没有指定项数,而是要求最后一项的绝对值小于10-5,该如何修改程序?,2020/4/25,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)*(1*2*3*10),main()inti,s=0;for(i=1;i=10;i+)s=s+;,s1,ints1,j;,s1=0;for(j=1;j=i;j+)s1=s1+j;,main()inti,j;longs=0,s1;for(i=1;i=10;i+)s1=1;for(j=1;j=i;j+)s1=s1*j;s=s+s1;,main()inti,j;longs=1,s1;for(i=1;i=10;i+)s1=0;for(j=1;j=i;j+)s1=s1+j;s=s*s1;,请思考:可以用单循环实现吗?,2020/4/25,30,几种循环语句的比较,while和do-while语句的表达式只有一个,for语句有三个。while和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。,while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于循环次数固定的情况,2020/4/25,31,实例3,判断一个数是否是素数,for(i=2;i=n-1;i+)if(n%i=0)break;if(i=n)printf(“Yesn”);elseprintf(“Non”);,解题思路:首先按照定义进行枚举:,解题思路:然后看是否能优化?,for(i=2;isqrt(n)printf(“Yesn”);elseprintf(“Non”);,2020/4/25,32,实例3(续),将100-200之间的素数按5个一行输出,解题思路:按照给定的范围逐个进行判断:,for(n=100;n=200;n+),if(n是素数),输出该素数,并统计个数,if(如果个数是5的倍数)换行,2020/4/25,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/最大公约数,2020/4/25,34,实例4(续),while(n!=0)m=n;n=m%n;,辗转相除法:,m,n的最大公约数=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是最大公约数,2020/4/25,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+asum=sum+data;,解题思路:首先读懂题意,a和个数n未知然后求累加和:sum=sum+第i项的值,解题关键:如何计算第i项的值?,datai=datai-1*10+a,2020/4/25,36,实例6,古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.,2020/4/25,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,再求f3=f1+f2得到第4项;依此类推求第5项、第6项,这是一种递推算法应采用循环实现,2020/4/25,38,算法和程序,#defineN20main()inti,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);,2020/4/25,39,循环结构中的跳转语句,有如下三种语句实现跳转:continue语句break语句在循环语句的循环体中使用,可以进行循环的流程控制,2020/4/25,40,continue语句及应用,功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。,while语句,do-while语句,for语句,2020/4/25,41,例如:,intx,n=0,s=0;while(n10)scanf(%d,intx,n=0,s=0;doscanf(%d,for(n=0,s=0;n10;n+)scanf(%d,2020/4/25,42,循环中break的应用,功能:利用break语句能够强迫终止本层循环,转到后续语句执行。,while语句,do-while语句,for语句,2020/4/25,43,例如:,intx,n=0,s=0;while(n10)scanf(%d,intx,n=0,s=0;doscanf(%d,for(n=0,s=0;n10;n+)scanf(%d,2020/4/25,44,课堂练习,1.以下程序的运行结果是?main()inta=13,b=21,m=0;switch(a%3)case0:m+;break;case1:m+;switch(b%2)default:m+;case0:m+;break;printf(“m=%dn”,m);,2.阅读程序写结果main()intx=1,y=2,a=0,b=0;switch(x)case1:switch(y)case0:a+;case2:b+;break;case1:b+;case2:a+;b+;break;case3:a+;b+;printf(“a=%d,b=%dn”,a,b);,2020/4/25,45,课堂练习,3.下列程序的输出结果是:main()inti,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:结束本次循环,继续下一次的循环判断,2020/4/25,46,实例7,打印出以下图案:*,解题思路:找行号与每行输出内容之间的规律行号(i)每行的空格数(j)每行的*号数(k)131223315407515623731,目标:找j,k和i的规律此时,前四行规律好找而后三行规律不易发现,可考虑对后三行重新编号,2020/4/25,47,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)131223315407115223331,前四行输出:for(i=1;i=4;i+)先输出每行的空格;再输出每行的*号;最后输出换行符;,前四行规律:j=4-i;k=2*i-1;,2020/4/25,48,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)131223315407115223331,前四行输出(注意临界值):for(i=1;i=4;i+)for(j=1;j=4-i;j+)putchar();for(k=1;k=2*i-1;k+)putchar(*);putchar(n);,前四行规律:j=4-i;k=2*i-1;,2020/4/25,49,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)131223315407115223331,后三行输出:for(i=1;i=3;i+)先输出每行的空格;再输出每行的*号;最后输出换行符;,后三行规律:j=i;k=7-2*i;,2020/4/25,50,实例7(续),对后三行重新编号,分两部分输出:行号(i)每行的空格数(j)每行的*号数(k)131223315407115223331,后三行输出:for(i=1;i=3;i+)for(j=1;j=i;j+)putchar();for(k=1;k=-3;i-)for(j=1;j=abs(i);j+)putchar();for(k=1;k=7-2*abs(i);k+)putchar(*);putchar(n);,规律:j=abs(i);k=7-2*abs(i);,2020/4/25,52,打印出以下图案:122333444455555,解题思路:找行号与每行输出内容之间的规律行号(i)每行的空格数(j)每行的字数(k)101212323434545,目标:找j,k和i的规律j=i-1;k=i;,实例7(续),2020/4/25,53,输出:for(i=1;i=5;i+)先输出每行的空格;再输出每行内容;最后输出换行符;,实例7(续),规律j=i-1;k=i;,打印出以下图案:122333444455555,程序:for(i=1;i=5;i+)for(j=1;j=i-1;j+)putchar();for(k=1;k=i;k+)printf(“%d”,i);putchar(n);,2020/4/25,54,实例7(续),打印出以下图案:,行号(i)每行的方块数(j)122436485106127148169181020,解题思路:找行号与每行输出内容之间的规律,第一行特殊需单独输出。提示:每个笑脸的ASCII码是1,每个白方块的ASCII码是219.,2020/4/25,55,输出:输出第一行;for(i=1;i=10;i+)先输出每行白方块;再输出换行符;,规律j=2*i;,程序:printf(“11n”);for(i=1;i=10;i+)for(j=1;j=2*i;j+)putchar(219);putchar(n);,实例7(续),打印出以下图案:,2020/4/25,56,实例8,输出一个乘法口诀表:,行号(i)每行的字数(j)192939495969798999,解题思路:找行号与每行输出内容之间的规律,第一行特殊需单独输出。,2020/4/25,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*j;printf(“%-8d”,result);putchar(n);,实例8(续),注意:循环嵌套时,某些语句是否该放在内循环中。,2020/4/25,58,实例9,将一个正整数分解质因数,如90=2*3*3*5。,定义:一个合数用几个质数相乘的形式表示出来,即为分解质因数。原理:从最小的质数除起,一直除到商为质数为止。,18=2*3*3,45=3*3*5,40=2*2*2*5,解题思路:寻找除数divisor和商quotient的变化规律,2020/4/25,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,除数divisor的变化范围:2quotient变化规律:divisor+商quotient的变化范围:ndivisor变化规律:quotient=quotient/divisor,2020/4/25,60,课堂练习:,1.下列程序的输出结果是:A)x=4B)x=8C)x=6D)x=12main()inti,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()inti,j,k=0,m=0;for(i=0;i2;i+)for(j=0;j3;j+)k+;k-=j;m=i+j;printf(“k=%d,=%dn”,k,m);,3.下列程序的输出结果是:main()intk=10;while(k-);printf(“k=%dn”,k);,4.下列程序的输出结果是:main()intk=10;while(k=0)k=k-1;printf(“k=%dn”,k);,B),k=0,m=5,k=-1,k=0,2020/4/25,61,5.下列程序的循环体执行的次数是:main()inti=1,j=0;while(i+jj)j=j+2;elsei=i+2;printf(“i=%d,j=%dn”,i,j);,i=5,j=6,7.以下程序的运行结果是?main()intk=10;charc=b;doswitch(c+)casea:k+;caseb:k-;casec:k+=3;break;cased:k=k%4;while(c!=c);printf(“%dn”,k);,12,6.下列程序输入1357后,它的输出结果是?main()charc;inti,data=0;for(i=0;i9)break;data=data*10+c-0;printf(data=%dn,data);,1357,2020/4/25,62,9.main()inti,j;for(i=1;i5;i+)for(j=1;ji;j+)printf();for(j=1;j=i;j+)printf(%d,i);printf(n);,课堂练习:,1223334444,2020/4/25,63,思考题1,(1)输入一个年,判断该年是否是闰年。(2)统计1000到2000年包含多少个闰年,并将这些闰年输出。(3)判断2009年3月2日是星期几。,判断闰年的条件:能被4整除,但不能被100整除能被400整除,2020/4/25,64,思考题2,(1)输入一个数字,1表示大,0表示小,其他无效,如果猜对,输出Right,否则,输出Wrong。(2)连续猜10次,如果猜对五次以上,输出Win,否则,输出Fail。(3)对教材P60的猜数字游戏进行完善,增加的功能参见P64.,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!