《C语言程序设计教程(第2版)课件第6章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程(第2版)课件第6章.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 循环结构程序设计循环结构程序设计 本章要点本章要点whilewhile语句语句do-whiledo-while语句语句forfor语句语句breakbreak语句和语句和continuecontinue语句在循环体中的作用语句在循环体中的作用循环结构的嵌套循环结构的嵌套本章难点本章难点循环结构的嵌套循环结构的嵌套能够熟练地使用循环语句进行程序设计能够熟练地使用循环语句进行程序设计 main()int i=1;long int sum=1;while(i=10)sum=sum*i;i+;printf(“10!=%ldn”,sum);sum=1*2*3*4*5*6*7*8*9*10;s
2、um请看下面的程序:循环结构的特点是:循环结构的特点是:程程序序的的流流程程是是在在给给定定条条件件时时,反反复复执执行行某某个个程程序段。序段。语言中可以用以下语句来实现循环:语言中可以用以下语句来实现循环:用用goto语句和语句和 if 语句构成循环;语句构成循环;用用while语句;语句;用用do-while语句语句;用用for语句。语句。6.1 while6.1 while语句语句 一般形式:一般形式:while(表达式表达式)语句语句 执行过程:执行过程:先计算表达式的值先计算表达式的值;若表达式的值为真若表达式的值为真(非非0)时执行循环体中的语句,时执行循环体中的语句,然后重复上
3、面步骤。若然后重复上面步骤。若 表达式的值为假表达式的值为假(0),则,则 结束循环。结束循环。6.1.1 while结构的形式结构的形式 例:计算例:计算10!并输出结果的程序用!并输出结果的程序用 while语句写出:语句写出:main()int i=1;long int sum=1;while(i=10)sum=sum*i;i+;printf(“10!=%ldn”,sum);main()int i=1;long int sum=1;loop:if(i=10)sum=sum*i;i+;goto loop;printf(“10!=%ldn”,sum);循环结构的术语循环结构的术语 1.循环条
4、件循环条件:是循环结构中的测试表达式。是循环结构中的测试表达式。如:while(i=10)2.循环体循环体:是在每个循环周期均要执行一次的语是在每个循环周期均要执行一次的语 句。语句可以是任何语句,简单语句、句。语句可以是任何语句,简单语句、复合语句、空语句均可以。复合语句、空语句均可以。如:上例while语句中用花括号括起来的复合语句。3.循环控制变量循环控制变量:是在循环条件中控制条件是真是在循环条件中控制条件是真 是假的变量。是假的变量。如:上例while语句中使用的变量 i。循环条件中的表达式一般是循环条件中的表达式一般是逻辑表达式逻辑表达式和和关系表达式关系表达式,也可以是,也可以是
5、算数表达式算数表达式(非(非0为为真,真,0为假)。一般表达式中应含有循环控制为假)。一般表达式中应含有循环控制变量。变量。while(3)和和while(0)虽然从程序设计的虽然从程序设计的角度上说是不合理的,但是合法的。角度上说是不合理的,但是合法的。while(3)语句 表示无限循环while(0)语句 表示不进入循环体 要要写写出出一一个个正正确确的的循循环环结结构构,对对控控制制变变量量要要做做三三方方面面工工作作:控控制制变变量量赋赋初初值值;把把控控制制变变量量写写入入正正确确的的循循环环条条件件;控控制制变变量的更新、调整。量的更新、调整。6.1.2 while循环的含义循环的
6、含义(3)循循环环体体包包括括一一个个以以上上语语句句,则则必必须须用用。long int sum=1;while(i=10)sum=sum*i;i+;(4)应该注意条件的选择以避免死循环。应该注意条件的选择以避免死循环。int a=5,n=0;while(a=5)printf(“%d”,n+);(5)允允许许while语语句句的的循循环环体体也也是是while语语句句,从从而而形形 成双重循环成双重循环。6.2 do-while6.2 do-while语句语句 一般形式:一般形式:do 语句语句 while(表达式);表达式);分号不能少 执行过程:执行过程:执行循环体中的语句;执行循环体中
7、的语句;计算表达式,测试循环计算表达式,测试循环 条件,为真条件,为真(非非0)则重复则重复 上面步骤,为假上面步骤,为假(0)结束结束循循 环。环。6.2.1 6.2.1 结构形式结构形式 例:将上面计算例:将上面计算10!并输出结果的程序用!并输出结果的程序用 do-while语句写出:语句写出:main()int i=1;long int sum=1;while(i=10)sum=sum*i;i+;printf(“10!=%ldn”,sum);main()int i=1;long int sum=1;do sum=sum*i;i+;while(i=10);printf(“10!=%ldn
8、”,sum);我们将我们将while和和do-while循环做一下比较循环做一下比较:main()int i;long sum=1;scanf(“%d”,&i);while(i=10)sum=sum*i;i+;printf(“%ldn”,sum);main()int i;long sum=1;scanf(“%d”,&i);do sum=sum*i;i+;while(i=10);printf(“%ldn”,sum);输入:9输出:90输入:11输出:1输入:9输出:90输入:11输出:11 比较上面两个程序,虽然结构是相同的,在比较上面两个程序,虽然结构是相同的,在输入值为有效值时结果相同,但当
9、输入无效值时输入值为有效值时结果相同,但当输入无效值时输出结果是不同的。为什么?输出结果是不同的。为什么?而do-while语句不管开始的时候测试循环条件是真是假,循环体都要执行一次,因为循环体是先于测试条件执行的。while语句进入循环体之前,测试循环条件,表达式必须为真,否则while循环不进入循环体,即循环体可能一次也不执行。while与与do-while的主要区别:的主要区别:6.2.2 do-while6.2.2 do-while循环的含义循环的含义 do while型循环是先执行后判断的循环,在任何型循环是先执行后判断的循环,在任何情况至少执行循环体一次情况至少执行循环体一次 do
10、 while型循环应注意以下几点型循环应注意以下几点:(1)在在if 语句,语句,while语句中,表达式都不能加分号,语句中,表达式都不能加分号,而在而在do while语句的表达式后面则必须加分号。语句的表达式后面则必须加分号。(2)do while语句可以组成多重循环,而且也可以和语句可以组成多重循环,而且也可以和while语句相互嵌套。语句相互嵌套。(3)在在do和和while之间的循环体由多个语句组成时,也之间的循环体由多个语句组成时,也必须加必须加 括起来组成一个复合语句。括起来组成一个复合语句。(4)do while和和while语句相互替换时,要注意修改循语句相互替换时,要注意
11、修改循环控制条件环控制条件 6.3 6.3 forfor型循型循环环 一般形式:一般形式:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句表达式表达式1:一组初始化表达式。:一组初始化表达式。表达式表达式2:循环控制条件。:循环控制条件。表达式表达式3:在执行完循环体语句之后执行的表达式。:在执行完循环体语句之后执行的表达式。我我们们前前面面已已经经说说明明,要要正正确确表表达达循循环环结结构构应应注注意意三三方方面面的的问问题题:控控制制变变量量的的初初始始化化,循循环环的的条件条件和和控制变量的更新控制变量的更新。for语句在书写形式上正好体现了这种紧密语句在书写形式上
12、正好体现了这种紧密的逻辑关系。的逻辑关系。不能省略不能省略不能省略不能省略6.3.1 for循环表现形式循环表现形式执行过程:执行过程:求出表达式求出表达式1的值,的值,(若表达式(若表达式1是逗号表达是逗号表达式,则依次计算);式,则依次计算);对对“表达式表达式2”进行判断,进行判断,为假退出循环,否则转为假退出循环,否则转;执行循环体中语句;执行循环体中语句;执行执行“表达式表达式3”,(若,(若表达式表达式3是逗号表达式,是逗号表达式,则依次计算)。则依次计算)。转向转向。例:将上面计算例:将上面计算10!的程序用!的程序用 for语句写出:语句写出:main()int i;long
13、sum;for(i=1,sum=1;i=10;i+)sum=sum*i;printf(“10!=%ldn”,sum);main()int i;long sum;for(i=1,sum=1;i=10;sum=sum*i,i+);printf(“10!=%ldn”,sum);空语句说明说明:表达式1:用于进入循环体之前给某些变量赋初值。若省略,可在for语句前给变量赋初值。main()int i=1;long sum=1;for(;i=10;i+)sum=sum*i;printf(“10!=%ldn”,sum);for 循环的三个表达式起着不同的作用,循环的三个表达式起着不同的作用,根据需要可以省
14、略。根据需要可以省略。表达式2:决定循环的条件,若省略,则为无限 循环。如:for(i0;i+)语句 for(;)语句无限循环(死循环)表达式3:用于循环一次后对某些变量进行修改。若省略,可在循环体内对变量进行修改。main()int i;long sum=1;for(i=1;i=10;)sum=sum*i;i+;printf(“10!=%ldn”,sum);for 语句最为灵活,它完全可以代替的语句最为灵活,它完全可以代替的while语句。语句。如:i=1;while(i=10)sum=sum*i;i+;等效于for(i=1;i=10;i+)sum=sum*i;for语句功能很强,其中表达式
15、语句功能很强,其中表达式1和表达式和表达式3可以是可以是逗号表达式,但为增强程序的可读性,一般不要把逗号表达式,但为增强程序的可读性,一般不要把与循环无关的东西放到与循环无关的东西放到for语句中。语句中。如:sum=1;for(i=1;i=10;i+)sum=sum*i;for(循环变量赋初值;循环条件;循环变量增值)语句for语句最简单、常用的形式如下:语句最简单、常用的形式如下:例例 从键盘上输入若干学生的成绩,当输入负数从键盘上输入若干学生的成绩,当输入负数时结束输入,统计并输出最高成绩和最低成绩。时结束输入,统计并输出最高成绩和最低成绩。空语句#includemain()float
16、x,xmax,xmin;scanf(“%f”,&x);xmax=x;xmin=x;for(;x=0;)if(xxmax)xmax=x;if(xxmin)xmin=x;scanf(“%f”,&x);printf(“nxmax=%fnxmin=%fn”,xmax,xmin);6.3.2 6.3.2 三种循环语句的总结三种循环语句的总结 三种循环语句共同的特点是三种循环语句共同的特点是:当循环控制条件非:当循环控制条件非零时,执行循环体语句,否则终止循环。零时,执行循环体语句,否则终止循环。语句可以是任何语句,简单语句、复合语句、空语句可以是任何语句,简单语句、复合语句、空语句均可以。语句均可以。w
17、hilewhile和和forfor语句语句先判断先判断循环控制条件,循环控制条件,do-whiledo-while语语句句后判断后判断循环控制条件,所以,循环控制条件,所以,whilewhile和和forfor语句的循语句的循环体可能一次也不执行,而环体可能一次也不执行,而do-whiledo-while语句的循环体至语句的循环体至少也要执行一次。少也要执行一次。在循环体内或循环条件中必须有使循环趋于结束在循环体内或循环条件中必须有使循环趋于结束的语句,否则会出现死循环等异常情况。的语句,否则会出现死循环等异常情况。三种循环可以处理同一问题,一般情况可以互相代替。但在实际应用中,我们要根据具体
18、情况来选用不同的循环语句。选用的一般原则如下:如果循环次数在执行循环体之前就已确定,一般用如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确语句;如果循环次数是根据循环体的执行情况确定的,一般用定的,一般用while语句或者语句或者do-while语句。语句。(循环次数确定例)int i;long sum=1;for(i=1;i=10;i+)sum=sum*i;(循环次数不确定例)char cdo c=getchar();printf(“%c”,c);while(c!=q|c!=Q);当循环体至少执行一次时,用当循环体至少执行一次时,用do-while
19、语句;语句;反之,如果循环体可能一次也不执行时,用反之,如果循环体可能一次也不执行时,用while语句。语句。(循环体至少执行一次)/*只有当用户键入q或Q,才结束循环*/char cdo c=getchar();printf(“%c”,c);while(c!=q|c!=Q);(循环体可能一次不执行)/*只有不是q或Q的字符才被打印*/char c;c=getchar();while(c!=q|c!=Q);printf(“%c”,c);c=getchar();6.4 循环的嵌套循环的嵌套 例:在屏幕上打印一个例:在屏幕上打印一个8行行7列的星号矩阵。列的星号矩阵。#include main()
20、int i;for(i=0;i7;i+)printf(*);/*打印第1行星号*/printf(n);for(i=0;i7;i+)printf(*);/*打印第2行星号*/printf(n);for(i=0;i7;i+)printf(“*”);/*打印第8行星号*/什么叫循环嵌套?什么叫循环嵌套?一个循环的循环体中套有另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。一个循环外面包围一层循环称为二重循环二重循环。一个循环外面包围二层循环称为三重循环重循环。一个循环外面包围多层循环称为多重循环多重循环。(1)while()(2)while()(3)for(;)while()do while()
21、while();(4)do (5)do (6)for()for(;)do for(;)while();while();while();while、do-while、for可以互相嵌套自由组合。例:将上例(打印例:将上例(打印8行行7列的星号矩形)用二列的星号矩形)用二重循环实现。重循环实现。#include main()int i,k;for(i=0;i8;i+)for(k=0;k7;k+)printf(*);printf(n);6.5 6.5 其他控制语句其他控制语句 6.5.1 break 语句语句一般形式:一般形式:break;功能:功能:结束当前的一层循环。结束当前的一层循环。解释:解
22、释:break 语句一般用在循环体的条件语语句一般用在循环体的条件语 句中,其作用是当某个条件成立时用句中,其作用是当某个条件成立时用 break语语句退出循环,不再继续执行句退出循环,不再继续执行其余的几次循环。其余的几次循环。例:打印半径为例:打印半径为110的圆的面积,如果面积超过的圆的面积,如果面积超过100,则不再打印。,则不再打印。#include#define PI 3.14159main()int r;float area;for(r=1;r100.0)break;printf(area=%fn,area);printf(now,r=%dn,r);注意:注意:在嵌套循环中使用b
23、reak语句,它只影响包含它的最内层循环,即程序仅跳出包围该break的那层循环。例:编写程序,输出三角乘法表。编写程序,输出三角乘法表。main()int i,j;for(i=1;i=9;i+)for(j=1;ji)break;printf(“%3d”,i*j);printf(“n”);运行结果:1 2 4 3 6 9 4 8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81一般形式:一般形式:continue;功能:功能:结束循环体,进入下
24、一个循环周期。结束循环体,进入下一个循环周期。解释:解释:一旦执行了一旦执行了continue语句,程序就跳语句,程序就跳 过循环体中位于该语句后的所有语句,过循环体中位于该语句后的所有语句,提前结束本次循环周期并开始下一个提前结束本次循环周期并开始下一个 循环周期。循环周期。6.5.2 continue语句语句 例:计算用户输入的所有正整数的和,例:计算用户输入的所有正整数的和,用户输入用户输入 0 时结束。时结束。#include main()long data,sum;sum=0;do printf(“Please input:data=”);scanf(%ld,&data);if(da
25、ta=.000001)sum=sum+t;n=n+2;s=-s;t=s/n;pi=sum*4;printf(pi=%fn,pi);运行结果:pi=3.141594pi=3.141594例例6.2 求斐波纳契数列:求斐波纳契数列:1,1,2,3,5,8 的前的前20个数。个数。(该数列特点:第(该数列特点:第1、2两个数是两个数是1、1,从第,从第3个数个数 开始,该数是其前两个数之和。)开始,该数是其前两个数之和。)main()int f1=1,f2=1,i;for(i=1;i=10;i+)printf(%6d%6dn,f1,f2);f1=f1+f2;f2=f1+f2;运行结果:1 1 2 3
26、 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 例例6.3 判断判断N是否为素数。是否为素数。#includemain()int n,i,k;scanf(%d,&n);k=sqrt(n);for(i=2;ik)printf(%d is a prime number.n,n);else printf(%d is not a prime number.n,n);素数的定义:只能被素数的定义:只能被1和它他本身整除的正整数。和它他本身整除的正整数。例例6.4 求出求出100200以内的所有素数。以内的所有素数。main()int
27、 m,k,i,n=0;for(m=101;m=200;m=m+2)k=sqrt(m);for(i=2;i=k+1)printf(%d,m);n=n+1;if(n%10=0)printf(n);printf(“n”);例例6.5 译密码。密码规律为译密码。密码规律为 每个字母用其后每个字母用其后 第四个字母代替,第四个字母代替,26个字母循环排列。个字母循环排列。#include stdio.hmain()char c,c1;while(c=getchar()!=n)if(c=a&c=A&c=w&c=W&c=Z)c=c-22;printf(%c,c);China!Glmre!ABCDEFGVWX
28、YZ 例例6.6 用一角人民币换用一角人民币换1分,分,2分,和分,和5分硬币,共分硬币,共有多少种换法。有多少种换法。根据题义设根据题义设i,j,k分别为兑换的分别为兑换的1分,分,2分,分,5分分硬币所具有的钱数,则硬币所具有的钱数,则i,j,k的值应该满足:的值应该满足:i+j+k=10#includemain()int i,j,k,count;printf(“there are exchange plans for 1 yuan note:n”);for(i=0;i=10;i+)for(j=0;j=10-i;j+=2)for(k=0;k=10-i-j;k+=5)if(i+j+k=10)
29、printf(“%d:1*%d+2*%d+5*%dn”,+count,i,j/2,k/5);运行结果:1:1*0+2*0+5*22:1*0+2*5+5*03:1*1+2*2+5*14:1*2+2*4+5*05:1*3+2*1+5*16:1*4+2*3+5*07:1*5+2*0+5*18:1*6+2*2+5*09:1*8+2*1+5*010:1*10+2*0+5*0习题习题1已知:一位数码a 和要组成的最大重码数tn的位数n。求 :各重码数的累加和sn。算法:对给定的a和n,从i=1 n 依次作:求第i个重码数tntn*10+a。(其中tn的初值应是0)求累加和 snsn+tn。main()in
30、t sn,a,n,i,tn;long sn,tn;printf(na,n=);scanf(%d%d,&a,&n);for(tn=0,sn=0,i=1;i=n;i+)tn=tn*10+a;sn+=tn;printf(na+aa+.=%ld,sn);习题习题2已知:正整数 1n1000 求:其中的“完数”,即一个数的所有因子之和等 于该数本身的数。算法:对于n=21000的每一个数,进行:求出该数的所有因子并累加于sum(不保 留其中的因子)。(一个数n的所有因子的求法:只需用2n/2 的所有数去除n,能整除的就是其因子。)当能满足完数条件时(sum=n),重新求 出该数的所有因子并打印。main
31、()int sum,n,i;for(n=2;n=1000;n+)sum=0;for(i=1;i=n/2;i+)if(n%i=0)sum+=i;if(sum=n)printf(“n%d:,n);for(i=1;i=n/2;i+)if(n%i=0)printf(%d ,i);习题习题3已知:正数已知:正数a和求和求a的算术平方根的算术平方根x的公式。的公式。求求 :a的算术平方根的算术平方根x。算法:算法:从键盘上输入从键盘上输入a,并假设并假设a的根为的根为x=a;误差标志变量误差标志变量dx。重复做:重复做:记下上一个根记下上一个根 x0=x。按公式求下一个根按公式求下一个根 x。求两个根的误
32、差绝对值求两个根的误差绝对值dx=fabs(x-x0)。当两次求得的根之差的绝对值当两次求得的根之差的绝对值 dx0.00001);printf(“n x=%f,x);(1)while循环的一般格式为:循环的一般格式为:while(表达式表达式)循环体循环体(2)do-while循环又称直到型循环,它的一般格式为:循环又称直到型循环,它的一般格式为:do循环体循环体 while(表达式表达式);(3)for循环的一般格式为:循环的一般格式为:for(表达式表达式1;表达式表达式2;表达式表达式3)循环体循环体(4)break语句和语句和continue语句对循环控制的影响是不同的:语句对循环控
33、制的影响是不同的:break语句是结束整个循环过程,不再判断执行循环的条件是语句是结束整个循环过程,不再判断执行循环的条件是否成立;而否成立;而continue语句只结束本次循环,并不终止整个循语句只结束本次循环,并不终止整个循环的执行。环的执行。(5)在在C语言中,标号可以是任意合法的标识符,标号可语言中,标号可以是任意合法的标识符,标号可以和变量同名。以和变量同名。(6)循环嵌套指在一个循环体内还可以包含另一个完整的循环嵌套指在一个循环体内还可以包含另一个完整的循环语句。前面介绍的三类循环都可以互相嵌套,循环的嵌循环语句。前面介绍的三类循环都可以互相嵌套,循环的嵌套可以多层,但每一层循环在逻辑上必须完整。套可以多层,但每一层循环在逻辑上必须完整。6.7小结小结