《循环结构》PPT课件.ppt

《循环结构》PPT课件.ppt

ID:52283965

大小:627.01 KB

页数:56页

时间:2020-04-03

上传者:U-3269
《循环结构》PPT课件.ppt_第1页
《循环结构》PPT课件.ppt_第2页
《循环结构》PPT课件.ppt_第3页
《循环结构》PPT课件.ppt_第4页
《循环结构》PPT课件.ppt_第5页
资源描述:

《《循环结构》PPT课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

第四章循环结构4.1用格里高利公式求π的近似值(while语句)4.2统计一个整数的位数(do-while语句)4.3判断素数(break和continue语句)4.4求1!+2!+...+100!(循环嵌套)4.5循环结构程序设计 本章要点什么是循环?为什么要使用循环?如何实现循环?实现循环时,如何确定循环条件和循环体?怎样使用while和do-while语句实现次数不确定的循环?while和do-while语句有什么不同?如何使用break语句处理多循环条件?如何实现多重循环? for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){循环体语句}#includevoidmain(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum);}for(表达式1;表达式2;表达式3)循环结构回顾确定循环次数 4.1用格里高利公式求π的近似值使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。4.1.1程序解析4.1.2while语句4.1.3输入一批学生的成绩,统计平均分 4.1.1程序解析-求π的近似值#include#includevoidmain(){intdenominator,flag;doubleitem,pi;flag=1;denominator=1;item=1.0;pi=0;while(fabs(item)>=0.0001){item=flag*1.0/denominator;pi=pi+item;flag=-flag;denominator=denominator+2;}pi=pi*4;printf(“pi=%f ”,pi);}不确定循环次数for(i=1;i<=100;i++) 4.1.2while语句while(条件)循环体语句;真假while下一条语句表达式循环体语句循环条件循环体 一般形式:while(表达式)循环体语句;执行流程:当表达式为真(非0值)时,执行循环体语句;直到表达式为假,循环终止表达式循环体假(0)真(非0)while4.1.2while语句特点:先判断表达式,后执行循环体(当型)求1+2+…+100的和sum=0;i=1;while(i<=100){sum=sum+i;i++;}此处无分号; 一般形式:while(表达式)循环体语句4.1.2while语句说明:循环体有可能一次也不执行(一开始条件就不成立)当表达式为真(非0值)时,即可继续执行循环循环体包括一个以上语句的用{}组成复合语句有使循环趋向结束的语句,如i++无限循环:也即无循环结束条件while(1)循环体;下列情况,退出while循环:条件表达式不成立(为零)循环体内遇break特点:先判断表达式,后执行循环体(当型)sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf(“%d”,sum);用一对大括号{}将若干语句顺序组合在一起就是一个复合语句 例用while循环求1+2+…+100的累加和#includevoidmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体循环结构的五要素:循环初值,循环条件,循环终值,循环变量增值,循环体 例用while循环求1+2+…+n的累加和#includevoidmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}求前n项的和可用scanf读入n#includevoidmain(){inti,sum=0,n;i=1;printf(“Entern:”);scanf(“%d”,&n);while(i<=n){sum=sum+i;i++;}printf("%d",sum);} while语句和for语句都是在循环前先判断条件while和for的比较while语句说明表达式1;while(表达式2){循环体语句;表达式3;}for(表达式1;表达式2;表达式3)循环体语句for(i=1;i<=10;i++)sum=sum+i;i=1;while(i<=10){sum=sum+i;i++;}求1~10的累加和 程序解析-求π的近似值例4-1#include#includevoidmain(){intdenominator,flag;doubleitem,pi;flag=1;denominator=1;item=1.0;pi=0;while(fabs(item)>=0.0001){item=flag*1.0/denominator;pi=pi+item;flag=-flag;denominator=denominator+2;}pi=pi*4;printf(“pi=%f ”,pi);}精确到最后一项的绝对值小于10–4,即|item|≤10–4,达到精度要求,循环结束fabs(item)<0.0001精度要求给出了循环结束条件 程序解析-求π的近似值#include#includevoidmain(){intdenominator,flag;doubleitem,pi;flag=1;denominator=1;item=1.0;pi=0;while(fabs(item)>=0.0001){item=flag*1.0/denominator;pi=pi+item;flag=-flag;denominator=denominator+2;}pi=pi*4;printf(“pi=%f ”,pi);}item=0.0?#include#includevoidmain(){ints;floatn,t,pi;t=1;s=0;n=1.0;m=1;while((fabs(t))>=1e-6){s=s+t;n=n+2;m=-m;t=m/n;}pi=s*4;printf("pi=%f ",pi);} 例4-2从键盘输入一批学生的成绩,计算平均分分析:求累加和确定循环条件不知道输入数据的个数,无法事先确定循环次数用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。4.1.3统计输入的一批学生的平均成绩 例4-2从键盘输入一批学生的成绩,计算平均分#includevoidmain(){intnum;doublegrade,total;num=0;total=0;printf(“Entergrades: ");scanf(“%lf”,&grade);/*输入第1个数*/while(grade>=0)/*输入负数,循环结束*/{total=total+grade;num++;scanf(“%lf”,&grade);}if(num!=0)printf(“Gradeaverageis%.2f ",total/num);elseprintf("Gradeaverageis0 ");} 4.2统计一个整数的位数从键盘读入一个整数,统计该数的位数。4.2.1程序解析4.2.2do-while语句4.2.3循环语句的选择 例4-3#includevoidmain(){intcount,number;count=0;printf(“Enteranumber:");scanf("%d",&number);if(number<0)number=-number;do{number=number/10;count++;}while(number!=0);printf("Itcontains%ddigits. ",count);}4.2.1程序解析-统计一个整数的位数while(number!=0){number=number/10;count++;} 4.2.2do-while语句do{循环体语句}while(表达式);先循环后判断真假表达式循环体语句do-while的下一条语句 while是先判别条件,再决定是否循环;do-while是先至少循环一次,然后再根据循环的结果决定是否继续循环。while和do-while的比较真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句while(number!=0) {number=number/10;count++;}do{number=number/10;count++;}while(number!=0); 例while和do~while比较#includevoidmain(){inti,sum=0;scanf("%d",&i);do{sum+=i;i++;}while(i<=10);printf("%d",sum);}#includevoidmain(){inti,sum=0;scanf("%d",&i);while(i<=10){sum+=i;i++;}printf("%d",sum);}结论:当while后的表达式第一次的值为“真”时,两种结果相同,否则不同输入:10输出:sum=10输出:sum=10输入:11输出:sum=11输出:sum=0 三种循环结构:求1~100的和sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);sum=0;i=1;do{sum+=i;i++;}while(i<=100);printf("%d",sum);sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum); 几种循环的比较1、三种循环语句在处理循环问题时,一般可以相互替代2、对于循环次数不确定的问题,可以用while或do-while语句来实现。while语句为先判断后执行,do-while语句则先执行后判断。3、对于循环次数确定的问题,用for语句更方便。for语句也为先判断后执行。 4.2.3循环语句的选择if(循环次数已知)使用for语句else/*循环次数未知*/if(循环条件在进入循环时明确)使用while语句else/*循环条件需要在循环体中明确*/使用do-while语句 4.3判断素数输入一个正整数m,判断它是否为素数。4.3.1程序解析4.3.2break语句和continue语句 4.3.1程序解析-判断素数算法:一个正整数m,除了能被1和它本身(m)整除外,不能被其它数整除,该数就是素数。设i取值[2,m-1]如果m不能被该区间上的任何一个数整除,即对每个i,m%i都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素数m不可能被大于m/2的数整除i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)printf("yes ")elseprintf("no ”); intmain(void){inti,m;printf(“Enteranumber:");scanf("%d",&m);for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)printf("%disaprimenumber! ",m);elseprintf("No! ");}例4-4源程序-判断素数for(i=2;i<=m/2;i++)if(m%i==0)printf("No! ");elseprintf("%disaprimenumber! ",m);根据素数定义,在for循环中,只要有一个i能满足m%i==0,则m就不是素数,不用在检查m是否能被其他数整除,可提前结束循环 一般形式:break;功能:放在循环语句和switch语句中,用于终止并跳出循环体或switch语句,接着执行循环语句或switch语句后面的语句。说明:break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环break只能终止并跳出最近一层的循环(嵌套循环时)。如果要跳出多层循环,用goto语句break只能用于循环语句和switch语句break语句求前50项和for(i=1;i<=100;i++){if(i>50)break;sum+=i;}printf("%d",sum); switch表达式语句组1break;语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase表达式2……break;…...假(0)真(非0)for表达式1表达式3循环体 例lt-area:break举例:按不同的半径,输出圆面积,面积大于100时停止#include#definePI3.14159voidmain(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100)break;printf("r=%d,area=%.2f ",r,area);}}通常break语句总是和if语句连在一起if(area<=100)printf("r=%d,area=%.2f ",r,area);elsebreak; 例lt-charbreak举例:小写字母转换成大写字母,直至输入非小写字母字符。#includevoidmain(){charc;while(1){c=getchar();if(c>='a'&&c<='z')putchar(c-'a'+'A');elsebreak;}putchar(‘ ’);}#includevoidmain(){charc;while(1){c=getchar();if(c>='a'&&c<='z')putchar(c-'a'+'A');elseif(c>=‘A'&&c<=‘Z')putchar(c); elsebreak;}putchar(‘ ’);}只将小写字母转成大写字母输出将小写字母转成大写字母输出如果是大写字母,则直接输出 一般形式:continue;功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断,如果条件成立,继续执行循环。说明:仅用于循环语句中continue语句仅结束本次循环,但break语句则是结束整个循环过程。例输出1到100之间能被9整除的数#includevoidmain(){inti;for(i=1;i<=100;i++){if(i%9!=0)continue;printf("%d ",i);}}continue语句 表达式2……continue;…...假(0)真(非0)for表达式1表达式3表达式2……break;…...假(0)真(非0)for表达式1表达式3 分析:i为循环变量,从1~10十个整数n,用scanf读入正数的个数放入num中正数的和放入sum中正数的平均值为aver=sum/num例li-count求输入的十个整数中正整数的个数及其和与平均值#includevoidmain(){inti,n,num=0;floatsum=0,aver;printf(“请输入10个数:”);for(i=0;i<10;i++){scanf("%d",&n);if(n<=0)continue;num++;sum=sum+n;}aver=sum/num;printf("%dplusinteger'ssum:%.2f ",num,sum);printf(“averageis:%.2f ",aver);}if(n>0){num++;sum+=n;}elsecontinue;if(n>0){num++;sum+=n;}行不?注意:scanf的输入格式是用124569还是用12,45,69for循环中scanf的输入格式要用空格或回车 4.4求1!+2!+….+100!累乘求阶乘,累加求和(循环100次)item=i!sum=sum+item;4.4.1程序解析计算i的阶乘4.4.2嵌套循环用循环计算i的阶乘以及阶乘的和 #includedoublefact(intn);intmain(void){inti;doublesum;sum=0;for(i=1;i<=100;i++)sum=sum+fact(i);printf("1!+2!+3!+…+100!=%e ",sum);return0;}doublefact(intn){inti;doubleresult=1;for(i=1;i<=n;i++)result=result*i;returnresult;}4.4.1程序解析 求1!+2!+….+100! 4.4.2嵌套循环求6!阶乘item=1;for(j=1;j<=6;j++)item=item*j;累加和for(i=1;i<=100;i++){item=1;for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求阶乘1!=12!=1*2=1!*23!=1*2*3=2!*3……j!=1*2*….*j=(j-1)!*j求阶乘的和1!+2!+….+100! 例4-6源程序#includevoidmain(){inti,j;doubleitem,sum;/*item存放阶乘*/sum=0;for(i=1;i<=100;i++){item=1;/*每次求阶乘都从1开始*/for(j=1;j<=i;j++)/*内层循环算出item=i!*/item=item*j;sum=sum+item;}printf("1!+2!+3!+…+100!=%e ",sum);}求阶乘1!=12!=1*2=1!*23!=1*2*3=2!*3……j!=1*2*….*j=(j-1)!*j 内层循环的初始化for(i=1;i<=100;i++){item=1;for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100! 例lt4-star:根据输入的边长,输出正方形#includevoidmain(){inti,j,n;printf("inputn:");scanf("%d",&n);while(n>0&&n<=20){for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf(“*");printf(" ");}printf("inputn:");scanf("%d",&n);}} 例lt4-99循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#includevoidmain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf(" ----------------------------------- ");for(i=1;i<10;i++)for(j=1;j<10;j++)printf((j==9)?"%4d ":"%4d",i*j);}变量i控制行,变量j控制列i=1,j从1~9循环,输出i*ji=2,j从1~9循环,输出i*jjifor(i=1;i<10;i++){for(j=1;j<10;j++)printf("%4d",i*j);printf(“ ”);} 12345678912436991827364554637281……………..例lt4-99a循环嵌套,输出九九表ij#includevoidmain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf(" ----------------------------------- ");for(i=1;i<10;i++)for(j=1;j<=i;j++)printf((j==i)?"%4d ":"%4d",i*j);}变量i控制行,变量j控制列i=1,j从1~i循环,输出i*ji=2,j从1~i循环,输出i*jfor(i=1;i<10;i++){for(j=1;jintmain(void){inti,mark,max,n;printf("Entern:");scanf("%d",&n);printf("Enter%dmarks:",n);scanf("%d",&mark);/*读入第一个成绩*/max=mark;/*假设第一个成绩是最高分*/for(i=1;ivoidmain(){intmark,max;printf(“Entermarks:");scanf("%d",&mark);/*读入第一个成绩*/max=mark;/*假设第一个成绩最高分*/while(mark>=0){if(maxintmain(void){intmark,max;max=-1;/*给max赋一个小初值*/printf(“Entermarks:");do{scanf("%d",&mark);if(max=0);printf("Max=%d ",max);}例4-7输入一批学生的成绩,求最高分(do-while)Entermarks:6788735482-1Max=88Entermarks:-1 例lt4-chicken:现有100元,要求买100只鸡,假定母鸡每只3元,公鸡每只2元,小鸡每只5角。列出所有可能的买鸡方案。设母鸡个数为m,公鸡个数为g,小鸡个数为x。根据题意,有以下公式成立:0.5*x+2*g+m*2=100#includevoidmain(){intx,g,m,n=0;for(m=0;m<=100;m++)for(g=0;g<=100;g++){x=100-m-g;if(0.5*x+2*g+m*3==100){n++;printf(“ 第%d种方案是:”,n);printf(“x=%d,g=%d,m=%d ”,x,g,m);}}}#includevoidmain(){intx,g,m,n=0;for(x=0;x<=100;x++)for(g=0;g<=100;g++){m=100-x-g;if(0.5*x+2*g+m*3==100){n++;printf(“ 第%d种方案是:”,n);printf(“x=%d,g=%d,m=%d ”,x,g,m);}}}优化程序1、各种鸡至少买一只2、各种鸡最多能买几只 例4-10求Fibonacci序列:1,1,2,3,5,8,13,…的前10项1,1,2,3,5,8,13,……x1x2xx1x2xx1=x2=1;x=x1+x2;x1=x2;x2=x;x1=1;x2=1;printf("%6d%6d",x1,x2);/*输出头两项*/for(i=1;i<=8;i++){/*循环输出后8项*/x=x1+x2;/*计算新项*/printf("%6d",x);x1=x2;/*更新x1和x2*/x2=x;}求Fibonacci序列:1,1,2,3,5,8,13,…的前n项 例4-11古典算术问题-搬砖头某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?for(men=0;men<=45;men++)for(women=0;women<=45;women++)for(child=0;child<=45;child++)if((men+women+child==45)&&(men*3+women*2+child*0.5==45))printf("men=%dwomen=%dchild=%d ",men,women,child);} 例4-11源程序(2)for(men=0;men<=15;men++)for(women=0;women<=22;women++){child=45–women–men;if(men*3+women*2+child*0.5==45)printf("men=%dwomen=%dchild=%d ",men,women,child);}for(men=0;men<=45;men++)for(women=0;women<=45;women++)for(child=0;child<=45;child++)if((men+women+child==45)&&(men*3+women*2+child*0.5==45))printf("men=%dwomen=%dchild=%d ",men,women,child);}比较循环次数 4.5循环程序设计-习题习题4-9输入一个整数,从高位开始逐个数字输出。12345/10000=112345%10000=23452345/1000=22345%1000=345345/100=3345%100=4545/10=445%10=55/1=55%1=5(1)如何得到10000找输入数据对应的幂pow=1;temp=x;while(x!=0){pow=pow*10;x=x/10;}pow=pow/10;(2)每次循环pow缩小1/10(3)pow=0结束 例4-8将一个正整数逆序输出确定:循环条件和循环体(循环不变式)123455432112345%10=512345/10=12341234%10=41234/10=123123%10=3123/10=1212%10=212/10=11%10=11/10=0结束循环不变式x%10x=x/10循环结束条件x==0scanf(“%d”,&x);while(x!=0){digit=x%10;x=x/10;printf("%d",digit);}用do-while实现? 例4-9求500以内的全部素数,每行输出10个for(m=2;m<=500;m++)if(m是素数)printf("%d",m);n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("yes ")elseprintf("no ”);for(m=2;m<=500;m++){n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("%d",m)} 例4-9源程序#include#includeintmain(void){intcount,i,m,n;count=0;for(m=2;m<=500;m++){n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n){/*如果m是素数*/printf("%6d",m);count++;if(count%10==0)printf(“ ”);}}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭