《chap循环结构程序设计实用实用教案》由会员分享,可在线阅读,更多相关《chap循环结构程序设计实用实用教案(40页珍藏版)》请在金锄头文库上搜索。
1、程序(chngx)中的重复第1页/共39页第一页,共40页。程序(chngx)中的重复计数循环:可在循环执行前确定重复的次数。如明确告知需要处理n个数据等。标记控制循环:用一个正常(zhngchng)情况下不会出现在数据中的值来作为循环结束的标记。如输入学生成绩时以负数作为结束标记。条件循环:重复操作直到期望的条件满足。如累加的和达到某一数值,或者计算的精度达到某一数值。文件结束控制循环:用EOF来判断输入是否结束。第2页/共39页第二页,共40页。while语句(yj)1.计数(j sh)循环 【例4-1】学生成绩求和。编写程序,从键盘输入10位同学(tng xu)的成绩, 计算他们的总分。
2、 int sum=0; int i=0; int x; printf(Input 10 score:n); while(i10) /*判断循环条件*/ scanf(%d,&x); /*读入一个成绩*/ sum+=x; i+; 第3页/共39页第三页,共40页。while语句(yj)【例4-2】累加运算。计算1+2+3+100intsum,i;sum=0;/*设置(shzh)累加值的初始值*/i=1;/*设置(shzh)循环控制变量的初始值*/while(i=100)sum=sum+i;/*累加*/i+;第4页/共39页第四页,共40页。while语句(yj)【例4-3】累乘运算。本题计算1*2
3、*3*4*5.intpower,i;power=1;/*设置乘积(chngj)的初始值*/i=1;/*设置循环控制变量的初始值*/while(i=0)/*若没有遇到(ydo)标记值(负数)*/*则执行循环体*/sum=sum+score;n+;scanf(%f,&score);/*读取下一个数据*/第6页/共39页第六页,共40页。while语句(yj)【例4-5】从键盘输入若干字符,统计其中字母(zm)、数字以及其他字符的个数。用换行符结束输入charch;intletter=0,digit=0,other=0;ch=getchar();/*读取一个字符*/while(ch!=n)/*若没有
4、遇到标记值(换行符n)*/*则执行循环*/if(ch=a&ch=A&ch=0&ch=1e-6)/*判断条件*/pi=pi+t;/*将当前(dngqin)分数项累加到pi上*/n=n+2;/*下一项的分母以步长2自增*/sign=-sign;/*符号求反*t=sign/n;/*构建下一个分数项*/pi=4*pi;第8页/共39页第八页,共40页。while语句(yj)【例4-8】设计一个程序,输入任意长度(chngd)的正整数,然后逆序输出。如输入3765,则输出5673。intnum,i;scanf(%d,&num);while(num!=0)i=num%10;/*取当前数据的末位数*/pri
5、ntf(%d,i);/*输出当前的末位数*/num=num/10;/*对原数除以10取整,相当于截断末位数*/第9页/共39页第九页,共40页。while语句(yj)【例4-6】scanf函数(hnsh)的返回值。intnum1,num2,num3;inta,b;a=scanf(%d,&num1);/*/b=scanf(%d%d,&num2,&num3);/*/printf(Num1=%d,Num2=%d,Num3=%dn,num1,num2,num3);printf(a=%d,b=%dn,a,b);第10页/共39页第十页,共40页。while语句(yj)4.文件结束控制(kngzh)循环【
6、例4-9】输入一些整数,求出它们的平均值。intx,sum=0;intn=0;/*统计实际输入的数据个数*/while(scanf(%d,&x)!=EOF)/*文件结束控制(kngzh)循环*/sum=sum+x;/*累加*/n+;printf(Average=%fn,(double)sum/n);第11页/共39页第十一页,共40页。while语句(yj)【例4-10】输入两个整数,比较它们的大小(dxio)关系inta,b;while(scanf(%d%d,&a,&b)!=EOF)if(ab)printf(%d%dn,a,b);elseif(ab)printf(%d%dn,a,b);els
7、eprintf(%d=%dn,a,b);第12页/共39页第十二页,共40页。do-while语句(yj)【例4-11】用do-while语句(yj)求1+2+100.intsum,i;sum=0;i=1;dosum=sum+i;i+;while(i0);第15页/共39页第十五页,共40页。for语句(yj)【例4-14】用for语句(yj)求1+2+100.inti,sum=0;for(i=1;i=100;i+)sum+=i;第16页/共39页第十六页,共40页。for语句(yj)【例4-15】使用for语句求解(qiji)数列1+3+5+97+99的和。intsum,i;sum=0;fo
8、r(i=1;i100;i+=2)sum=sum+i;第17页/共39页第十七页,共40页。for语句(yj)【例4-16】求Fibonacci数列的前20项。这个数列有如下特点:第1、2个数都为1,从第3个数开始,每个数都是其前面两个数的和。intf,f1=1,f2=1;printf(%6d%6d,f1,f2);for(i=3;i=20;i+)f=f1+f2;/*递推公式(gngsh),推出一个新值*/printf(%6d,f);if(i%5=0)printf(n);/*控制每行输出5个数*/f1=f2;f2=f;/*更新(gngxn)f1和f2,为下一次递推作准备*/第18页/共39页第十八
9、页,共40页。for(表达式1;表达式2;表达式3)语句(l)表达式1、表达式2、表达式3可以是任何类型的表达式,它们之间用分号间隔。(2)表达式1只被执行一次,通常用来给循环变量(binling)赋初值,也允许在for语句外给循环变量(binling)赋初值,此时可以省略该表达式,但分号不能省略。(3)表达式3通常用来修改循环控制变量(binling)的值,表明循环控制变量(binling)每次变化的数值。关于for语句(yj)的用法以下几点值得注意:第19页/共39页第十九页,共40页。for语句(yj)与while语句(yj)比较循环包括(boku):初值、循环条件、循环体和步长for(
10、表达式1;表达式2;表达式3)语句等价为表达式1;while(表达式2)语句表达式3;如果循环次数不确定,循环的控制需要结合(jih)其它条件并且条件较为明确的情况下,可以使用while语句;如果指定了循环次数,则用for语句会使程序显得简洁、清晰。 第20页/共39页第二十页,共40页。breakcontinue和goto语句(yj)C语言提供(tgng)了break while语句(yj)中break执行流程图do-while语句中break执行流程图for语句中break执行流程图第21页/共39页第二十一页,共40页。break语句(yj)举例#includevoidmain()int
11、a,n,i=1,sum=0;printf(请输入累加求和数的个数,遇到负数将退出!n);scanf(%d,&n);/*先输入一个数*/printf(请输入%d个整数:,n);while(i=n)/*一共要输入10个数,所以再循环9次*/scanf(%d,&a);/*重新输入一个数*/if(a0)break;/*遇到负数退出while循环*/sum=sum+a;/*否则将输入的正数(zhngsh)累加*/i+;printf(此次输入的正数(zhngsh)之和是%dn,sum);第22页/共39页第二十二页,共40页。【例4-18】为迎接一年一度的校运会,需要排练一个团体操,列队时发现每行3个人的
12、话(dehu)还多出1位同学,每行5个人的话(dehu)多出2人,每行7个人的话(dehu)多出5人,每行9个人的话(dehu)多出7人,请问至少有多少同学来参加排练。for(n=1;n+)if(n%3=1&n%5=3&n%7=5&n%9=7)break;break语句(yj)举例第23页/共39页第二十三页,共40页。【例4-19】判断整数m是否为素数。for(i=2;im;i+)if(m%i=0)break;/*只要找到一个因子,循环就可提前(tqin)终止*/break语句(yj)举例第24页/共39页第二十四页,共40页。C语言continuewhile语句(yj) do-while语
13、句(yj)for语句(yj)注意:与break语句完全终止循环不同,continue语句是终止本次循环 第25页/共39页第二十五页,共40页。continue语句(yj)举例输入一个整数n,编写程序在屏幕上以每行10个数输出(shch)100200之间能被n整除的数。第26页/共39页第二十六页,共40页。#includevoidmain()inti,n,count=0;printf(请输入(shr)100到200之间的整数n:);scanf(%d,&n);for(i=100;i=200;i+)if(i%n!=0)continue;printf(%d,i);count+;if(count%1
14、0=0)printf(n);printf(n);printf(能被%d整除的个数是:%dn,n,count);#includevoid main() int i,n,count=0; printf(请输入100到200之间的整数(zhngsh)n:); scanf(%d,&n); for(i=100;i=200;i+) if(i%n=0) printf(%d ,i); count+; if(count%10=0) printf(n); printf(n); printf(能被%d整除的个数是:%dn,n,count); 第27页/共39页第二十七页,共40页。【例4-20】把100300之间不
15、能被3整除的数输出(shch)。intn,count=0;for(n=100;n=300;n+)if(n%3=0)/*若能被3整除,则跳过本次循环*/continue;printf(%d,n);continue语句(yj)举例第28页/共39页第二十八页,共40页。C语言goto控制(kngzh)语句goto语句也称为无条件转移语句一般(ybn)格式:goto语句标号;例:用goto语句求100个自然数之和#includevoidmain()inti=1;intsum=0;loop:sum=sum+i;i+;if(i=100)gotoloop;printf(sum=%dn,sum);第29页/
16、共39页第二十九页,共40页。循环(xnhun)的嵌套【例4-22】有两个红球,三个黄球,四个白球,任意取四个球,其中(qzhng)必须有一个红球,编程输出所有可能的方案。for(i=1;i=2;i+)for( j=0;j=0)printf(%5d%7d%8dn,i,j,k);第30页/共39页第三十页,共40页。循环(xnhun)的嵌套【例4-23】利用双层for循环打印乘法表。inti,j;for(i=1;i=9;i+)/*i控制(kngzh)输出有多少行*/for(j=1;j=i;j+)/*j控制(kngzh)输出每行中有多少个等式*/printf(%d*%d=%d,i,j,i*j);p
17、rintf(n);第31页/共39页第三十一页,共40页。实例(shl)研究【例4-25】投骰子游戏(yux)。模拟投骰子的过程,以6点为目标,投中目标3次为获胜,最多允许投10次。intcount=0,hit=0;/*count记录投的次数,hit记录投中的次数*/intdice;/*dice记录点数*/srand(unsigned)time(NULL);while(count10&hit3)dice=1+rand()%6;/*生成16的随机数来模拟投出的点数*/count+;if(dice=6)hit+;第32页/共39页第三十二页,共40页。实例(shl)研究【例4-26】输入正整数n,
18、求1!+2!+3!+n!。inti,j,n;doublef,sum=0;for(i=1;i=n;i+)f=1;for( j=1;j=i;j+)/*求i!,结果存储在f中*/f=f*j;sum+=f;/*将i!加入( jir)到累加器*/printf(Sum=%en,sum);/*以指数形式输出*/是否有更简单(jindn)的方法?第33页/共39页第三十三页,共40页。补充(bchng)编程:编写程序解决下列问题:用1分,2分,5分硬币组合成1元钱,请问分别需要几个1分,几个2分,几个5分?(每币种必须至少1个)列出所有的组合.用x,y,z分别代表1分,2分,5分,列出方程:x+2y+5z=1
19、00,x的取值范围是1100,y取值范围是150, z取值范围是120#include void main( ) int i,j,k; for(i=1;i=100;i+) for(j=1;j=50;j+) for(k=1;k=20;k+)if(i+2*j+5*k=100) printf(“%3d %3d %3dn”,i,j,k); 如果(rgu)可以没有某种硬币,如何修改程序?第34页/共39页第三十四页,共40页。另外(ln wi)一种解法#include void main( ) int j,k; for(j=1;j=50;j+) for(k=1;k=20;k+)if(2*j+5*k100
20、) printf(“%3d %3d %3dn”100-2*j-5*k,j,k);第35页/共39页第三十五页,共40页。“百钱百鸡”问题(wnt)一只公鸡,值5钱;一只母鸡,值3钱;一只小鸡,值1/3钱。用百钱买百鸡,问可买公鸡,母鸡,小鸡各多少(dusho)只?#includevoidmain()intcock,hen,chick;for(cock=0;cock=20;cock+)for(hen=0;hen=33;hen+)chick=100-hen-cock;if(cock*5+hen*3+chick/3=100&chick%3=0)printf(cock=%d,hen=%d,chick=
21、%dn“,cock,hen,chick);第36页/共39页第三十六页,共40页。补充例题:求输入的某个数是否为素数。若是素数输出YES ,若不是,输出NO素数的定义:大于1,且除了1 和它本身外,不能被其它任何数整除的数。如2、3、5、7、11、13,17.只要试除到根号x,就可以(ky)说明x是否为素数了。 #include void main( ) int i,x,yes,a; printf(“ Enter integer number:”); scanf(“%d”,&x); yes=1; i=2; 第37页/共39页第三十七页,共40页。 a=(int) sqrt(double)x);
22、 while(yes &i=a) if(x%i=0) yes=0; i+; printf(“%d ”,x); if(yes) printf(“YESn”); else printf(“NOn”);思考(sko):假设不放入会如何?第38页/共39页第三十八页,共40页。感谢您的欣赏(xnshng)!第39页/共39页第三十九页,共40页。内容(nirng)总结程序中的重复。 文件结束控制循环:用EOF来判断输入是否结束。第2页/共39页。power=power*i。【例4-5】从键盘输入若干字符,统计其中字母、数字以及其他字符的个数。pi=pi+t。sign=-sign。pi=4*pi。num=num/10。f=f*j。只要试除到根号x,就可以(ky)说明x是否为素数了。第38页/共39页。感谢您的欣赏第四十页,共40页。