C语言程序设计PPT课件第6章.ppt
第六章第六章 循环控制循环控制 gotogoto语句语句 whilewhile语句语句 do-whiledo-while语句语句 forfor语句语句 breakbreak语句语句 continuecontinue语句语句 练习练习 6.1 概述概述循环循环:反复执行称为反复执行称为“循环体循环体”的程序段。的程序段。循循环环控控制制常常用用于于数数学学迭迭代代、对对象象遍遍历历等等问问题的求解,几乎所有实用程序都包含循环。题的求解,几乎所有实用程序都包含循环。C C语言中用如下语句实现循环语言中用如下语句实现循环:1 1、用、用gotogoto语句和语句和ifif语句构成循环。语句构成循环。2 2、用、用whilewhile语句。语句。3 3、用、用do-whiledo-while语句。语句。4 4、用、用forfor语句。语句。6.2 goto语句语句一般形式一般形式:goto 语句标号语句标号 作作 用用:无无条条件件转转向向“语语句句标标号号”处处执执行。行。“语语句句标标号号”是是一一个个标标识识符符,它它表表示示程程序指令的地址序指令的地址。结构化程序设计方法主张限制使用结构化程序设计方法主张限制使用gotogoto语句。语句。gotogoto语句有语句有两种用途两种用途,一是与,一是与ifif语句一起构成语句一起构成循环结构,另一是从循环体中跳转到循环体外。循环结构,另一是从循环体中跳转到循环体外。例例6.1 用用if语句和语句和goto语句构成循环,语句构成循环,求求 。main()int i,sum=0;i=1;loop:if(i=100)/*标号表示程序指令的地址标号表示程序指令的地址,当当i100时,执行加法时,执行加法*/sum=sum+i;i+;goto loop;/*无条件转向标号无条件转向标号loop处的指令处的指令*/printf(%d,sum);sum=sum+ii=i+1i=100假假真真i=1,sum=06.3 while语句语句一般形式一般形式:while (表达式表达式)语句语句作用作用:实现实现“当型当型”循环。循环。当当“表达式表达式”非非0 0(真)时,(真)时,执行while语句中的内嵌“语句”。“语句语句”是被循环执行的程序,称是被循环执行的程序,称为为“循环体循环体”。特点:特点:先判先判“表达式(条件)表达式(条件)”,”,后执行语句。后执行语句。循环体如果包含一个以上的语句,应该以复合语句形式出现循环体如果包含一个以上的语句,应该以复合语句形式出现.在循环体中应有使循环趋向于结束的语句在循环体中应有使循环趋向于结束的语句。语句语句表达式表达式假假真真当当P为真为真 A 例例6.2 流流程程图图:sum=sum+ii=i+1i=100假假真真i=1,sum=0main()int i,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()int n,i=1;float max,min,x;printf(“input n,x:”);scanf(“%d%f”,&n,&x);max=min=x;while(imax)max=x;else if(xn)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的最大公约数是:的最大公约数是:%ldn”,m,n,b);getch();main()long m,n,r,a,b;printf(“input m,n:”);scanf(“%ld%ld”,&m,&n);if(mn)a=m;b=n;else a=n;b=m;while(b!=0)r=a%b;a=b;b=r;printf(“%ld与与%ld的最大公约数是:的最大公约数是:%ldn”,m,n,a);getch();6.4 do-while语句语句一般形式一般形式:do 语句语句 while (表达式表达式)特点特点:“直到型直到型”循环结构。循环结构。先先执执行行一一次次“语语句句”,后后判判“表表达达式式”,当当“表表达达式式”非非0,再再执执行行“语语句句”,直直到到“表表达达式式”为为0,循环结束。,循环结束。直到直到P为假为假语语 句句语句语句条件条件P非00例例6.5 用用do-while语句求语句求 。main()int i,sum=0;i=1;do sum=sum+i;i+;while(i100”,这两者是等同的。,这两者是等同的。2、一一般般情情况况下下,同同一一个个问问题题,既既可可以以用用while循循环环处处理理,也可以用也可以用do-while循环处理循环处理。i=1,sum=0直到直到i100sum=sum+ii=i+1sum=sum+ii=i+1i0);printf(“%ld是是%d位数位数n”,m,n);getch();求求e的近似值。的近似值。直到某一项的值小于或等于直到某一项的值小于或等于10-7为止。为止。main()int n;float sum,t,m;n=1;sum=1;m=1;do t=1/m;sum+=t;n+;m=m*n;while(t1e-7);printf(“e=%f n”,sum);getch();例例6.7 6.5 for语句语句forfor语句常用于语句常用于循环次数已知循环次数已知的循环控制的循环控制;也也可可以以用用于于循循环环次次数数不不确确定定而而只只给给出出循循环环结结束束条条件件的的情情况况,它完全可以代替它完全可以代替whilewhile语句语句。一般形式:一般形式: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语句语句main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(%dn,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=100;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;i100;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;i100)break;例例6.8求求s=1!+2!+3!+n!,其中其中n小于小于30。main()long s,t;int i,n;printf(input n:);scanf(%d,&n);s=0;t=1;for(i=1;i=n;i+)t=t*i;s+=t;printf(1!+2!+3!+%d!=%ldn,n,s);getch();例例6.9求求Fibonacci数列的前数列的前40项。每行输出项。每行输出4项。项。main()long t1,t2,t3;int i;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()long t1,t2;int i;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 循环的嵌套循环的嵌套循循环环嵌嵌套套:一一个个循循环环(称称为为“外外循循环环”)的的循循环环体体内内包包含含另另一一个个循循环环(称称为为“内内循循环环”)。内内循循环环中中还还可可以以包包含含循循环环,形形成成多多层层循循环环。(循环嵌套的层数理论上无限制)。(循环嵌套的层数理论上无限制)。三三种种循循环环(whilewhile循循环环、do-whiledo-while循循环环、forfor循循环)可以互相嵌套。环)可以互相嵌套。例例:(1)(2)while()do .while();嵌嵌套套while()dowhile()(3)(4)for(;)while()(5)(6)for(;)do while();嵌嵌套套嵌嵌套套嵌嵌套套 嵌嵌套套for(;)do while()for(;)while()例例6.11打印九九乘法表。打印九九乘法表。main()int i,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分的硬币,若分的硬币,若 每种面值的硬币都不得少于一个,问有几每种面值的硬币都不得少于一个,问有几 种不同的兑换方法?种不同的兑换方法?main()int i,j,n=0;for(i=1;i20;i+)for(j=1;j0)n+;printf(n=%dn,n);getch();6.8 break语句和语句和continue语句语句一、一、breakbreak语句语句作作用用:跳出所在的多分支switch语句,跳出所在的while do-while for循环语句(提前结束循环)。例、例、#define PI 3.14main()int r;float area;for(r=1;r 100)break;printf(%d,%6.2fn,r,area);printf(%d,%6.2fn,r,area);当当r=6时,时,area100,执行,执行break语句,语句,提前结束循环,不再计算提前结束循环,不再计算r=710的的area。运行结果:运行结果:1 3.14 2 12.57 3 28.27 4 50.27 5 78.54 6 113.10 7 153.94 8 201.06 9 254.47 10 314.16二、二、continuecontinue语句语句作用:提前结束本次循环体的执行,接着进行下一次循环条件的判别。例例6.13 把把100200之间不能被之间不能被3整除的数输出。整除的数输出。main()int n;for(n=100;n=1E-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(pi=%10.6fn,pi);运行结果:运行结果:pi=3.141594练习:练习:1.猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个,以后每天如此,到第10天,只剩下一个桃子了。问最初有多少个桃子?2.古印度国王要褒奖他的聪明能干的宰相达依尔(国际象棋的发明者)。问他要什么,达依尔回答:“陛下只要在棋盘的第一个格子中放1粒麦子,在第二个格子中放2粒麦子。在第三个格子中放4粒麦子,以后每个格子中的麦粒数都是前一格的2倍。如此放满64格,我就心满意足了。”国王想,这不难办到,但是将全印度的麦子都用完了,还是不够。计算应需多少麦子。1立方米麦立方米麦子约为子约为1.42108粒粒3.编写程序求出具有下列性质的四位数:前两位数与后两位数相加,所得和的平方刚好等于原来的四位数。例如:3025=(30+25)24.编写程序求出所有的水仙花数。所谓水仙花数是这样的三位数,它的各位数字的立方和就等于该数本身。例如;153=13+53+335.用 公式,求 的近似值。直到最后一项的绝对值小于10-6为止。6.判断一个正整数m是否是素数。7.求100200之间的所有素数,要求每行输出8个素数。8.用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。迭代公式为:n=0,1,2,3,直到 为止。9.用二分法求方程2x3-4x2+3x-6=0在区间 -10,10之间的根。10.用迭代法求 ,求平方根的迭代公式为:要求前后两次求出的x的差的绝对值小于10-5。11.编一程序。其功能是对输入表达式中的左、右圆括号能否正确匹配进行检查。假定表达式不存在其它的语法错误,表达式以回车符作为结束标志。12.从键盘输入若干行文字,统计输入正文中的行数、单词数和字符个数。这里的单词是指不含空格、换行符和制表符的字符串。以Ctrl+Z作为输入结束标志。