【文档说明】C语言程序设计课件第6章.ppt,共(37)页,288.035 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44530.html
以下为本文档部分文字说明:
第六章循环控制•goto语句•while语句•do-while语句•for语句•break语句•continue语句•练习§6.1概述循环:反复执行称为“循环体”的程序段。循环控制常用于数学迭代、对象遍历等问题的求解,几乎所有
实用程序都包含循环。•C语言中用如下语句实现循环:1、用goto语句和if语句构成循环。2、用while语句。3、用do-while语句。4、用for语句。§6.2goto语句一般形式:goto语句标号作用:无条件转向“语句标号”处执行。“语句标号”是一个标识符,它表示程序指令的地址。•结
构化程序设计方法主张限制使用goto语句。•goto语句有两种用途,一是与if语句一起构成循环结构,另一是从循环体中跳转到循环体外。[例6.1]用if语句和goto语句构成循环,求。1001iimain(){inti,sum=0;i
=1;loop:if(i<=100)/*标号表示程序指令的地址,当i≤100时,执行加法*/{sum=sum+i;i++;gotoloop;/*无条件转向标号loop处的指令*/}printf("%d",sum);}sum=sum+ii=i+1i<=100假真i
=1,sum=0§6.3while语句一般形式:while(表达式)语句作用:实现“当型”循环。当“表达式”非0(真)时,执行while语句中的内嵌“语句”。“语句”是被循环执行的程序,称为“循环体”。特点:先判“表达式(条件)”,后执行
语句。•循环体如果包含一个以上的语句,应该以复合语句形式出现.•在循环体中应有使循环趋向于结束的语句。语句表达式假真当P为真A[例6.2]流程图:1001iisum=sum+ii=i+1i<=100假真i=1,sum=0main(){i
nti,sum=0;/*为循环赋初值*/i=1;whie(i<=100)/*“当型”循环*/{sum=sum+i;i++;/*使循环趋于结束*/}printf("%d",sum);}i<=100真假sum=sum+ii=i+1i
=1,sum=0[例6.3]从任意n个实数中选出最大数和最小数main(){intn,i=1;floatmax,min,x;printf(“inputn,x:”);scanf(“%d%f”,&n,&x);max=min=x;while(i<n){pr
intf(“inputx”);scanf(“%f”,&x);if(x>max)max=x;elseif(x<min)min=x;i++;}printf(“Max=%f,Min=%f\n”,max,min);}[例
6.4]任意输入两个正整数,求它们的最大公约数。main(){longm,n,r,a,b;printf(“inputm,n:”);scanf(“%ld%ld”,&m,&n);if(m>n){a=m;b=n;}else{a=n;b=m;}r=a%b;while(r!=0){a=b;b=r;r=
a%b;}printf(“%ld与%ld的最大公约数是:%ld\n”,m,n,b);getch();}main(){longm,n,r,a,b;printf(“inputm,n:”);scanf(“%ld%ld”,&m,&n);if
(m>n){a=m;b=n;}else{a=n;b=m;}while(b!=0){r=a%b;a=b;b=r;}printf(“%ld与%ld的最大公约数是:%ld\n”,m,n,a);getch();}§6.4do-while语
句一般形式:do语句while(表达式)特点:“直到型”循环结构。先执行一次“语句”,后判“表达式”,当“表达式”非0,再执行“语句”,直到“表达式”为0,循环结束。直到P为假语句语句条件P非00[例6.5]用do-whil
e语句求。main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d",sum);}注意:1、上面的流程图中循环条件是“当i≤100时循环”,N-S图中的条件是“循环直到i>100”,这两者是等同的。2、
一般情况下,同一个问题,既可以用while循环处理,也可以用do-while循环处理。1001iii=1,sum=0直到i>100sum=sum+ii=i+1sum=sum+ii=i+1i<=100假真i
=1,sum=0[例6.6]从键盘上输入一个整数,判断其是几位数。main(){longm,a;intn=0;printf(“请输入一个正整数:”);scanf(“%ld”,&m);a=m;do{a=a/10;n++;}while(a>0);printf(“%ld是
%d位数\n”,m,n);getch();}...!1...!31!21!111ne求e的近似值。直到某一项的值小于或等于10-7为止。main(){intn;floatsum,t,m;n=1;sum=1;m=1;do{t=1/m;sum+=t
;n++;m=m*n;}while(t>1e-7);printf(“e=%f\n”,sum);getch();}[例6.7]§6.5for语句•for语句常用于循环次数已知的循环控制;也可以用于循环次数不确定而只给出
循环结束条件的情况,它完全可以代替while语句。•一般形式:for(表达式1;表达式2;表达式3)语句执行过程:(1)求表达式1;(2)求表达式2,若为“真”,执行“语句”;若为假,转第(5)步。(3)求表达式3。(4)转第(2)步。(5)执行for语句下面的语句。循环初始条件判别循
环条件修改循环条件for(i=1;i<=100;i++)sum=sum+i;这里,循环条件由变量i设定,变量i称为“循环变量”。这是for语句的典型用法:已知循环次数。(本例100次)。“表达式1”,循环初始条件(i=1)。“表达式2”,循环条件(i<=100)。“表达式3”,修改循环条件(i+
+)。注:for循环中,表达式1仅求解一次;执行循环体后才求解表达式3。先判断后执行。例、用for语句1001iimain(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d\n",sum);}上述for语句也可以用
如下while语句表示:i=1;while(i<=100){sum=sum+i;i++;}几点说明1.for语句中的表达式1:可以给循环变量赋初值,亦可以是与循环变量无关的其它表达式,甚至表达式1可以省略。若省略,则应在for语句前对循环变量赋初值。注意,表达式1省略时,其后
的分号不能省略。此处的分号不是语句的一部分,而是表达式的分隔符。在for语句中的表达式中可以使用逗号表达式,故不用逗号分隔表达式。例:sum=0;for(i=1;i<=100;i++)sum+=i;或:i=1;for(sum=0;i<=1
00;i++)sum+=i;或:for(i=1,sum=0;i<=100;i++)sum+=i;或:i=1;sum=0;for(;i<=100;i++)sum+=i;2.关于表达式3:可以用来改变循环变量的值,也可以是与循环变量的无关的其它表达式,甚至可将循环体中的语句放在表达式3的位置上。表达
式3也可以省略,程序设计者必须保证循环能正常结束。例:i=0;for(sum=0;i<100;sum+=i)i++;或:sum=0;for(i=1;i<=100;sum+=i,i++);或:sum=0;for(i=1;i<=100;){sum+=i;
i++;}3.表达式1与表达式3可以同时省略,只有表达式2,即只给出循环条件。例、s=1;i=1;for(;i<=10;){s=s*i;i++;}s=1;i=1;while(i<=10){s*=i;i++;}在这种情况下,for与while语句完全相同。可
见,for语句比while语句功能强大。4.关于表达式2:作为循环的判断条件,一般为关系表达式或逻辑表达式,但亦可以是数值表达式或字符表达式。例、sum=0;for(i=1;i<=100;i++)sum+=i;或:sum
=0;for(i=100;i;i--)sum+=i;5.表达式2也可以省略,此时,系统不再判断循环条件,认为表达式2的值始终为真。即循环条件始终成立。循环将出现死循环,程序设计者必须设法保证循环能正常结束。例、sum=0;for(i=1;;i+
+)sum+=i;或:sum=0;i=1;for(;;)sum+=i;此为死循环。i=1;sum=0;for(;;){sum+=i;i++;if(i>100)break;}[例6.8]求s=1!+2!+3!+…+n!,其中n小于
30。main(){longs,t;inti,n;printf("inputn:");scanf("%d",&n);s=0;t=1;for(i=1;i<=n;i++){t=t*i;s+=t;}printf("1!+2!+3
!+…+%d!=%ld\n",n,s);getch();}[例6.9]求Fibonacci数列的前40项。每行输出4项。main(){longt1,t2,t3;inti;t1=t2=1;printf("%10ld%10ld",t1,t2);for(i
=3;i<=40;i++){t3=t1+t2;printf("%10ld",t3);if(i%4==0)printf("\n");t1=t2;t2=t3;}getch();}[例6.10]求Fibonacci数列的前40项。每行输出4项。main(){longt1,t2;in
ti;t1=t2=1;for(i=1;i<=20;i++){printf("%10ld%10ld",t1,t2);if(i%2==0)printf("\n");t1=t1+t2;t2=t1+t2;}getch();}§6.6
循环的嵌套•循环嵌套:一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上无限制)。•三种循环(while循环、do-while循环、for循环)可以
互相嵌套。例:(1)(2)while()do{….{….}}while();嵌套while(){…}dowhile(){…}(3)(4)for(;;)while(){┆{┆}┆}(5)(6)for(;;)do{…{┆┆}}while();嵌套嵌套嵌套嵌套for(
;;){…}do{…}while()for(;;){…}while(){…}[例6.11]打印九九乘法表。main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf
("%d*%d=%-2d",i,j,i*j);printf("\n");}getch();}[例6.12]将1元钱兑换成1分、2分、5分的硬币,若每种面值的硬币都不得少于一个,问有几种不同的兑换方法?m
ain(){inti,j,n=0;for(i=1;i<20;i++)for(j=1;j<50;j++)if(100-5*i-2*j>0)n++;printf("n=%d\n",n);getch();}§6.8break语句和co
ntinue语句一、break语句•作用:跳出所在的多分支switch语句,跳出所在的whiledo-whilefor循环语句(提前结束循环)。•例、#definePI3.14main(){intr;floatarea;for(r=1;r<=10;r++){area
=PI*r*r;if(area>100)break;printf("%d,%6.2f\n",r,area);}printf("%d,%6.2f\n",r,area);}当r=6时,area>100,执行break语句,提前结束循
环,不再计算r=7~10的area。运行结果:13.14212.57328.27450.27578.546113.107153.948201.069254.4710314.16二、continue语句作用:提前结束本次循环体的
执行,接着进行下一次循环条件的判别。[例6.13]把100~200之间不能被3整除的数输出。main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}}当n能被3整除时,执行continue语句,结束执行本次循环
的循环体,即跳过printf语句。三、break语句和continue语句的区别while(表达式1)while(表达式1){┇{┇if(表达式2)break;if(表达式2)continue;┇┇}}break语句跳出循环
continue语句结束本次循环体的执行,进入下一次循环§6.9程序举例[例6.13]用以下公式计算л的值,直到最后一项的绝对值小于1E-6为止。算法分析:1、每项的分母,等于前一项分母加2,用n=n+2实现,n的初值为1。2、每项的符号交替变化,用s
=-s实现,s的初值为+1(第一项为正)。3、根据1和2,每一项的值t=s/n,第一项的值为1。...71513114#include"math.h"main(){ints;floatn,t,pi;t=1;pi=0;n=1.0
;s=1;while((fabs(t))>=1E-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}运行结果:pi=3.141594练习:1.猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还
嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个,以后每天如此,到第10天,只剩下一个桃子了。问最初有多少个桃子?2.古印度国王要褒奖他的聪明能干的宰相达依尔(国际象棋的发明者)。问他要什么,达依尔回答:“陛下只要在棋盘的第一个格子中放1粒麦子,在第二个格子中放2粒麦子。在第
三个格子中放4粒麦子,以后每个格子中的麦粒数都是前一格的2倍。如此放满64格,我就心满意足了。”国王想,这不难办到,但是将全印度的麦子都用完了,还是不够。计算应需多少麦子。1立方米麦子约为1.42×108粒3.编写程
序求出具有下列性质的四位数:前两位数与后两位数相加,所得和的平方刚好等于原来的四位数。例如:3025=(30+25)24.编写程序求出所有的水仙花数。所谓水仙花数是这样的三位数,它的各位数字的立方和就等于该数本身。例如;153=13+53+335.用公式,求的近似值。直
到最后一项的绝对值小于10-6为止。6.判断一个正整数m是否是素数。7.求100~200之间的所有素数,要求每行输出8个素数。11191715131148.用牛顿迭代法求方程2x3-4x2+3x-6
=0在1.5附近的根。迭代公式为:)(')(1nnnnxfxfxxn=0,1,2,3,······直到为止。611exxnn9.用二分法求方程2x3-4x2+3x-6=0在区间[-10,10]之间的根
。10.用迭代法求,求平方根的迭代公式为:要求前后两次求出的x的差的绝对值小于10-5。ax)(211nnnxaxx11.编一程序。其功能是对输入表达式中的左、右圆括号能否正确匹配进行检查。假定表达式不存在其它的语法错误,表达式以回车符作为结束标志。12.从键盘输入若干行文字,统计输入正
文中的行数、单词数和字符个数。这里的单词是指不含空格、换行符和制表符的字符串。以Ctrl+Z作为输入结束标志。