您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 06第06章 循环结构程序设计
循环就是重复时钟的循环是无限循环循环是在满足一定条件时重复执行一段程序问题:将任意若干大写字母转化为小写字母显示算法:将处理一个字母时的方法扩展到处理多个字母c=getchar()'A'=c='Z'putchar(c)是否c=c+32向后跳转向前跳转魏东平3实现循环的方法(四种):1、用if语句和goto语句构成循环2、用while语句3、用do-while语句4、用for语句魏东平4goto语句标号goto语句goto语句的功能是无条件地转到标号所指的语句goto语句的一般形式:语句标号:用于定义程序中的某个位置构成:标识符:如:start:破坏程序的结构,应避免使用用if-goto语句构成循环#includestdio.hvoidmain(){intk=1,s=0;loop:if(k=3){s=s+k;k++;gotoloop;}printf(s=%d\n,s);}【例6.1】计算s=∑3k=1k魏东平6while循环表达式语句真(非0)下一语句假(0)while(表达式)语句用while语句实现当型循环表达式语句N-S图While语句的一般形式:分析:这是一个累加求和问题s=1+2+3和的新值和的当前值求和项当前值【例6.1】计算s=∑3k=1ks=0+1s=1+2s=3+3sk=sk-1+ks=s+ks=0s=s+1s=s+2s=s+3#includestdio.hvoidmain(){intk,s;s=0;k=1;while(k=3){s=s+k;k++;}printf(s=%d\n,s);}s=0,k=1k=3s=s+kk++输出s#includestdio.hvoidmain(){intk,s;s=0;k=1;while(k=3){s=s+k;k++;}printf(s=%d\n,s);}①求和项增值②修改循环条件while(k=3){s=s+k;k++;}if(k=3){s=s+k;k++;}if(k=3){s=s+k;k++;}if(k=3){s=s+k;k++;}s=0k=1s=1k=2s=3k=3s=6k=4?有什么作用【例6.2】求任意两个正整数m和n的最大公约数和最小公倍数1.用辗转相除法求最大公约数m对n求余数为a,若a≠0,则mn,na,继续求余;否则n为最大公约数例如,设m=12,n=21,计算过程如下:计算次数被除数除数余数112211222112931293493032.最小公倍数=即m·n/n'两个数的积最大公约数输入m,nm1=m,n1=n,a=m1%n1a≠0m1=n1n1=aa=m1%n1输出n1及m·n/n1#includestdio.hvoidmain(){intm,n,m1,n1,a;printf(输入两个正整数:);scanf(%d,%d,&m,&n);m1=m;n1=n;a=m1%n1;while(a!=0){m1=n1;n1=a;a=m1%n1;}printf(最大公约数是%d\n,n1);printf(最小公倍数是%d\n,m/n1*n);}魏东平13do-while语句do语句while(表达式);语句表达式形式为:do-while语句用来实现直到型循环语句表达式下一语句真假不可省略!切记切记!!!s=0,k=1s=s+kk++k=3输出s【例6.1】计算s=∑3k=1ks=0,k=1k=3s=s+kk++输出s#includestdio.hvoidmain(){intk,s;s=0;k=1;do{s=s+k;k++;}while(k=3);printf(s=%d\n,s);}#includestdio.hvoidmain(){intk,s;s=0;k=1;while(k=3){s=s+k;k++;}printf(s=%d\n,s);}魏东平16for循环求解表达式1表达式2语句求解表达式3真假下一语句求解表达式1表达式2语句求解表达式3表达式1在进入循环之前求解表达式3是循环体的一部分for循环的一般形式:for(表达式1;表达式2;表达式3)语句表达式1;表达式3;{}这个分号不能移走这个分号不能丢掉for(表达式1;表达式2;表达式3)语句表达式1可以移到for语句的前边表达式3可以移到内嵌语句的后边表达式2为空值永远为真成为死循环说明1.表达式1省略时,应在for前给循环变量赋初值如:k=1;for(;k=3;k++)s=s+k;2.表达式2省略时,将成为“死循环”需要在循环体中引入break语句以退出循环如:for(k=1;;k++){if(k10)break;s+=k;}3.表达式3省略时,循环体内应有使循环条件改变的语句如:for(k=1;k=10;){s+=k;k+=2;}如:k=1;k=1;for(;k=3;)while(k=3){s=s+k;{s=s+k;k++;k++;}}4.同时省略表达式1和表达式3,只有表达式2,相当于while语句5.表达式2一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值不等于0就执行循环体如:for(k=1;k-4;k++)s=s+k;当k的值等于4时终止循环。k-4是数值表达式。#includestdio.hvoidmain(){charc;for(;(c=getchar())!='\n';)putchar(c);putchar('\n');}读入一个字符,当它不是回车符时就输出。【例6.4】读程序,判断程序的功能。printf(\n);程序段1:for(s=0,k=1;k=3;k++)s=s+k;程序段4:内嵌语句写到表达式3前for(s=0,k=1;k=3;s=s+k,k++);程序段2:s=0;k=1;表达式1移到前面for(;k=3;s=s+k,k++);程序段3:for(s=0,k=1;k=3;)表达式3移到后面{s=s+k;k++;}【例6.1】计算s=∑3k=1k程序段5:s=0;k=1;表达式1和3均移出for(;k=3;){s=s+k;k++;}程序段6:s=0;标准写法for(k=1;k=3;k++)s=s+k;条件条件初始化条件修改魏东平24循环的嵌套•一个循环体内包含着另一个完整的循环结构,称为循环嵌套•内嵌的循环中又可以嵌套循环,从而构成多重循环•三种循环都可以互相嵌套魏东平25几种嵌套形式:(1)while嵌套whilewhile(~){…...while(~){……}}(2)do-while嵌套do-whiledo{……do{……}while(~);}while(~);(3)for嵌套forfor(;~;){……for(;~;){……}}(4)while嵌套do-whilewhile(~){……do{……}while(~);}(5)for嵌套whilefor(;~;){……while(~){……}}(6)do-while嵌套fordo{……for(;~;){……}}while(~);【例6.5】打印九九乘法口诀#includestdio.hvoidmain(){intm,n;m=1;while(m=9){n=1;while(n=m){printf(%1d×%1d=%-4d,m,n,m*n);n++;}printf(\n);m++;}}n=1,m=1m=9换行m=m+1n=m打印mxnn=n+1?#includestdio.hvoidmain(){intm,n;for(m=1;m=9;m++){for(n=1;n=m;n++)printf(%1d×%1d=%-4d,m,n,m*n);printf(\n);}}魏东平29几种循环的比较while(表达式)语句do语句while(表达式)for(表达式1;表达式2;表达式3)语句(1)循环的控制循环条件初始化也可在for前循环控制条件修改循环条件也可在循环体内(3)for循环功能强,使用灵活两个“界限不清”,使程序设计较随意(4)都可以用break语句结束循环用continue语句结束本次循环(2)循环体的执行while循环:先判断条件,循环体可能一次也不执行do~while循环:后判断条件,循环体至少执行一次for(表达式1;表达式2;表达式3)语句界限不清界限不清魏东平31break语句用break语句可以结束switch结构和三种循环【例6.6】判断整数m是否为素数。分析:素数m是不能被整数r(1rm)整除的数,即如果m不是素数,则必然存在r、t(1r、tm)使得m=r·t成立r的取值范围可以缩小到2~k=m。输入mk=sqrt(m)i=2i=km%i为0是否结束循环i++i=k+1是否m是素数m不是素数#includemath.h#includestdio.hvoidmain(){intm,i,k;printf(输入一个整数:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(ik)printf(%d是素数\n,m);elseprintf(%d不是素数\n,m);}结束循环break总是与if一起使用魏东平34用continue语句结束本次循环,即忽略循环体中剩余的语句开始下一次循环【例6.7】打印100~200间所有不能被3整除的数#includestdio.hvoidmain(){intn;for(n=100;n=200;n++){if(n%3==0)continue;printf(%d,n);}}continue语句能整除,不打印魏东平35程序举例【例6.8】用下面的公式计算π的近似值,直到最后一项的绝对值小于10-4为止。π111=1-+-+……4357分析:11累加公式为:pi=pi+(——-——)nn+2其中n=1、5、9、……pi—求和结果,其初值为1n—初值为1,每次增加4t1—第一项,值为1/(n-2)t2—第二项,值为1/n初值为1,使条件为真|t2|≥10-4—循环控制条件其中:pi=1,n=1,t2=1|t2|≥10-4n=n+4t1=1/(n-2)t2=1/npi=pi-t1+t2pi=4*pi输出pi#includemath.h#includestdio.hvoidmain(){floatpi,n,t1,t2;pi=1;n=1;t2=1;while(fabs(t2)=1e-4){n=n+4;t1=1/(n-2);t2=1/n;pi=pi-t1+t2;}printf(π=%.6f\n,4*pi);}n改为整型如何?用累加公式:(-1)n+1s=Σ———n=12n-1重新设计该程序。【例6.9】用下面的递推公式,求Fibonacci数列1,1,2,3,5,8……的前40项。F1=1n=1F2=1n=2Fn=Fn-1+Fn-2n≥3分析:(1)F1、F2直接赋值并输出(2)进行19次循环,每次计算并输出两项注意:此数列增长很快,宜用长整型。(3)计算F3=F1+F2由于此后F1已无用,F3可存于F1,即F3=F1=F1+F2计算F4=F2+F3同样,F3已在F1中,F4可存于F2,即F4=F2=F2+F3=F2+F1依此类推,计算出F5、F6直至F39、F40f1=1,f2=1输出f1、f2i=2i=20f1=f1+f2f2=f2+f1输出f1、f2#includestdio.hvoidmain(){inti;longintf1,f2;f1=1;f2=1;printf(%16ld%16ld,f1,f2);for(i=2;i=20;i++){f1=f1+f2;f2=f2+f1;printf(%16ld%16ld,f1,f2);if(i%2==0)printf(\n);}}【例6.10】求100~200之间的全部素数。分析:判断m是否为素数(例5.6)#includemath.h#includestdio.hvoidmain(){intm,i,k;pri
本文标题:06第06章 循环结构程序设计
链接地址:https://www.777doc.com/doc-3847163 .html