《C语言循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言循环结构程序设计.ppt(64页珍藏版)》请在金锄头文库上搜索。
1、第第5章章 循环结构程序设计循环结构程序设计5.1 概概 述述n为了方便地处理循环问题,为了方便地处理循环问题,C语言提供了语言提供了3种用于循环控制的语句:种用于循环控制的语句:while语句、语句、do-while语句、语句、for语句。语句。 5.2 while5.2 while语句语句一般形式为:一般形式为:while(while(表达式)表达式)循环体语句循环体语句表达式表达式语句语句非非00例例5.1 求求1+2+3+.+10的和。的和。 #include stdio.hvoid main()int i=1,iSum=0;while(i 1e-6)pi=pi+t;n=n+2;s=-
2、s;t=(float)(s)/(float)(n);pi=pi*4;printf(npi=%lfn,pi);输出结果:输出结果:输出结果:输出结果:pi=3.141591pi=3.141591例例5.3 求两个正整数的最大公约数。求两个正整数的最大公约数。/*用用Euclid(欧几里得欧几里得)算法求最大公约数算法求最大公约数*/#include stdio.hvoid main()int m,n,r; printf(please input two positive integers:);scanf(%d%d,&m,&n); r=m%n; /求余数求余数while(r!=0) m=n;n=r
3、;r=m%n;printf(Their greatest common divisor is %d.n,n);输出结果:输出结果:输出结果:输出结果:please input two positive integers:64 24please input two positive integers:64 24Their greatest common divisor is 8.Their greatest common divisor is 8.例例5.4 跳过输入字符中的空白字符,输出第跳过输入字符中的空白字符,输出第一个非空白字符。一个非空白字符。#include stdio.hvoid
4、main()char c;while(c=getchar()= |c=t|c=n);putchar(c);putchar(n);例例5.5 不用空语句实现的例不用空语句实现的例5.4。5.3 do-while5.3 do-while语句语句一般形式为:一般形式为:dodo 循环体语句循环体语句while(while(表达式)表达式); ;语句语句表达式表达式?0非0例例5.6 求求1+2+3+.+10的和。的和。#include stdio.hvoid main()int i=1,iSum=0;doiSum=iSum+i; printf(i=%2d,iSum=%2dn,i,iSum);i+;
5、while(i=10);printf(1+2+3+.+10= %dn,iSum); 输出结果:输出结果:输出结果:输出结果:i=1,iSum=1i=1,iSum=1i=2,iSum=3i=2,iSum=3i=3,iSum=6i=3,iSum=6i=4,iSum=10i=4,iSum=10i=5,iSum=15i=5,iSum=15i=6,iSum=21i=6,iSum=21i=7,iSum=28i=7,iSum=28i=8,iSum=36i=8,iSum=36i=9,iSum=45i=9,iSum=45i=10,iSum=55i=10,iSum=551+2+3+.+10=551+2+3+.+1
6、0=55例例5.7 将一个给定的整数反序输出。将一个给定的整数反序输出。#include stdio.hvoid main()int i,r;printf(nInput an integer:);scanf(%d,&i);if(i0)printf(-); /如果如果i是负整数,输出时首先加一个负号是负整数,输出时首先加一个负号i=-i; /然后对然后对i取负,得到它的绝对值取负,得到它的绝对值 dor=i%10; /提取出当前提取出当前i的个位数字的个位数字printf(%d,r);while(i=i/10)!=0); /去掉当前去掉当前i的个位数字,并判断这个新值是否为的个位数字,并判断这个
7、新值是否为0 printf(n);输出结果:输出结果:输出结果:输出结果:Input an integer:1983Input an integer:198338913891例例5.8/*用用while循环将一个给定的整数反序输出循环将一个给定的整数反序输出*/#include stdio.hvoid main()int i,r;printf(nInput an integer:);scanf(%d,&i);if(i0)printf(-); /如果如果i是负整数,输出时首先加一个负号是负整数,输出时首先加一个负号i=-i; /然后对然后对i取负,得到它的绝对值取负,得到它的绝对值 if(i=0
8、)printf(%d,i);while(i!=0)r=i%10; printf(%d,r);i=i/10; printf(n);注意:循环体的有效范围注意:循环体的有效范围例:例:i=1;i=1;while(iwhile(i=100)=100) putcharputchar(*);(*); i+; i+;程序段一程序段一:int k=1;while(!k= = 0)k=k+1; printf(“%dn”,k);程序段二程序段二int k=0;while(k+=2)printf(“%dn”,k);(注:若在注:若在while后加;后加;)程序段三:程序段三:int x=3;doprintf(“%
9、3d”,x-=2);while(-x);(2009.3)8.(2009.3)8.有以下程序有以下程序#include#include main()main() charcharc1,c2;c1,c2;scanf(%c,&c1);scanf(%c,&c1);while(c190)while(c190)scanf(%c,&c1);scanf(%c,&c1);c2=c1+32;c2=c1+32;printf(%c,%cn,c1,c2);printf(%c,%cn,c1,c2); 程序运行输入程序运行输入6565回车后回车后, ,能否输出结果能否输出结果, ,结束运结束运行行( (请回答能或不能请回答
10、能或不能) )【 】不能不能(2009.9)(2009.9)(2121)有以下程序)有以下程序 #include #include main() main() intint n=2,k=0; n=2,k=0; while(k+&n+2); while(k+&n+2); printf(“%d %dn”,k,n); printf(“%d %dn”,k,n); 程序运行后的输出结果是程序运行后的输出结果是 A A)0 2 B0 2 B)1 3 C1 3 C)5 7 D5 7 D)1 21 2D(2009.9)2009.9)(9 9)以下程序运行后的输出结果是)以下程序运行后的输出结果是 #inclu
11、de #include mainmain()() intint a=1,b=7; a=1,b=7; do do b=b/2;a+=b; b=b/2;a+=b; while (b1); while (b1); printf(“%dn”,a); printf(“%dn”,a);55.4 for语句语句nfor语句的一般形式语句的一般形式for(表达式表达式1;表达式;表达式2;表达式;表达式3) 循环体语句循环体语句表达式表达式1表达式表达式2循环体语句循环体语句表达式表达式30非0例例5.9 求求1+2+3+.+10的和。的和。 #include stdio.hvoid main()int i,
12、iSum=0; for(i=1;i=10;i+)iSum=iSum+i; printf(i=%2d,iSum=%2dn,i,iSum); printf(1+2+3+.+10= %dn,iSum);输出结果:输出结果:输出结果:输出结果:i=1,iSum=1i=1,iSum=1i=2,iSum=3i=2,iSum=3i=3,iSum=6i=3,iSum=6i=4,iSum=10i=4,iSum=10i=5,iSum=15i=5,iSum=15i=6,iSum=21i=6,iSum=21i=7,iSum=28i=7,iSum=28i=8,iSum=36i=8,iSum=36i=9,iSum=45i
13、=9,iSum=45i=10,iSum=55i=10,iSum=551+2+3+.+10=551+2+3+.+10=55例例 5.10 输入输入10个字符,输出这个字符,输出这10个字符中个字符中ASCII码值最大的那个字符的码值最大的那个字符的ASCII码值。码值。 #include stdio.hvoid main()int i,ch,max=0; for(i=1;imax)max=ch; printf(The largest ASCII value is %d.n,max);输出结果:输出结果:输出结果:输出结果:12 AB9 12 AB9 XabXab The largest ASCI
14、I value is 98.The largest ASCII value is 98.例例5.11 国王的许诺。相传国际象棋是古印度舍罕王国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指定让宰相自己选择何种赏赐。这位聪明的宰相指着着88共共64格的象棋盘说:陛下,请您赏给我一格的象棋盘说:陛下,请您赏给我一些麦子吧,在棋盘的第些麦子吧,在棋盘的第1个格子中放个格子中放1粒,第粒,第2格放格放2粒,第粒,第3格中放格中放4粒,以后每一格都比前一格增加粒,以后每一格都比前一格增加一
15、倍,依次放完棋盘上的一倍,依次放完棋盘上的64个格子,我就感恩不个格子,我就感恩不尽了。舍罕王让人抗来一袋麦子,他要兑现的承尽了。舍罕王让人抗来一袋麦子,他要兑现的承诺。请问:国王能兑现他的承诺吗?试编程计算诺。请问:国王能兑现他的承诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米多少立方米(已知已知1立方米麦子约立方米麦子约1.42e8粒粒)?#include stdio.h#include math.hvoid main()int n; double term,sum=0; for(n=1;n=64;n+)term=pow(2,
16、n-1); sum=sum+term; printf(Sum=%en,sum); printf(Volum=%en,sum/1.42e8);输出结果:输出结果:输出结果:输出结果:Sum=1.844674e+019Sum=1.844674e+019VolumVolum=1.299066e+011=1.299066e+011#include stdio.hvoid main()int n; double term=1,sum=1; for(n=2;n=64;n+)term=term*2; sum=sum+term; printf(Sum=%en,sum); printf(Volum=%en,su
17、m/1.42e8);输出结果:输出结果:输出结果:输出结果:Sum=1.844674e+019Sum=1.844674e+019VolumVolum=1.299066e+011=1.299066e+011(2010.3)有以下程序include(stdio.h)main()int a5=1,2,3,4,5,b50,2,1,3,0,i,s0;for(i0;i5;i+) ss+abi);printf(%dn, s);程序运行后的输出结果是A)6B)10C)11D)15C C(2009.3)22.(2009.3)22.设变量已正确定义设变量已正确定义, ,以下不能统计以下不能统计出一行中输入字符个数
18、出一行中输入字符个数( (不包含回车符不包含回车符) )的程序的程序段是段是A)n=0;while(ch=getchar()!=n) n+;A)n=0;while(ch=getchar()!=n) n+;B)n=0;while(getchar()!=n) n+;B)n=0;while(getchar()!=n) n+;C)for(n=0;getchar()!=n;n+);C)for(n=0;getchar()!=n;n+);D)n=0;for(ch=getchar();ch!=n;n+);D)n=0;for(ch=getchar();ch!=n;n+);D D(2009.9)(2009.9)(
19、1010)有以下程序)有以下程序main()main() intint f,f1,f2,i; f,f1,f2,i; f1=0;f2=1; f1=0;f2=1; printf(“%dprintf(“%d %d ”,f1,f2); %d ”,f1,f2); for(ifor(i=3;i=5;i+)=3;i=5;i+) f=f1+f2; f=f1+f2; printf(“%d”,fprintf(“%d”,f);); f1=f2; f2=f; f1=f2; f2=f; printf(“nprintf(“n”);”); 程序运行后的输出结果是程序运行后的输出结果是 【1010】 。0 1 123 0 1
20、 123 5.5 循环的嵌套循环的嵌套5.5.1 二重循环二重循环如果一个循环语句的循环体内只包含一层如果一个循环语句的循环体内只包含一层循环,这样的嵌套循环叫作二重循环。对于循环,这样的嵌套循环叫作二重循环。对于一个二重循环,如果外层循环的循环变量变一个二重循环,如果外层循环的循环变量变化化s次,内层循环的循环变量变化次,内层循环的循环变量变化t次,则外次,则外层循环每执行层循环每执行1次,内层循环就执行次,内层循环就执行t次,当次,当外层循环执行了外层循环执行了s次之后,内层循环的循环体次之后,内层循环的循环体已经执行了已经执行了st次。次。例例: 输入输入nxn个字符个字符 *main(
21、) int i,j,n=3; for(i=1;i=n;i+) for(j=1;j=n;j+) putchar(*); putchar(n); 例例:编写程序输出如下图形。编写程序输出如下图形。*main() int i,j,n=5; for(i=1;i=n;i+) for(j=1;j=i;j+) putchar(*); putchar(n); 例例5.12 求求100以内的全部素数。以内的全部素数。void main()int m,n,i,prime;i=0;for(m=2;m=100;m+)prime=1;for(n=2;nm;n+)if(m%n=0)prime=0;if(prime)pri
22、ntf(%6d,m);i+;if(i%5=0)printf(n);if(i%5!=0)printf(n);输出结果:输出结果:输出结果:输出结果: 2 3 5 7 11 2 3 5 7 11 13 17 19 23 29 13 17 19 23 29 31 37 41 43 47 31 37 41 43 47 53 59 61 67 71 53 59 61 67 71 73 79 83 89 97 73 79 83 89 975.5.2 多重循环多重循环n如果一个循环语句的循环体包含两层甚至两如果一个循环语句的循环体包含两层甚至两层以上的循环时,就构成了多重循环。层以上的循环时,就构成了多重循
23、环。n例例5.13 打印所有的打印所有的“水仙花数水仙花数”。所谓。所谓“水仙花数水仙花数”,是指一个三位数,其各位数,是指一个三位数,其各位数字的立方和等于该数本身。例如,字的立方和等于该数本身。例如,153是是“水仙花数水仙花数”,因为,因为153=13+53+33。void main()int n,x,y,z;printf(The result is:);for(x=1;x=9;x+)for(y=0;y=9;y+)for(z=0;z=9;z+)if(x*x*x+y*y*y+z*z*z=100*x+10*y+z)printf(%dt,100*x+10*y+z);printf(n);输出结果
24、:输出结果:输出结果:输出结果:The result is:153 370 371 407The result is:153 370 371 407 (2010.3)有以下程序include(stdio.hmain()int a1;b2;for(;a8;a+) b+=a;a+=2;printf(%d,%dn,a,b);程序运行后的输出结果是A)9,18B)8,11C)7,11D)10,14D D(2009.3)20.(2009.3)20.以下程序段中的变量已正确定义以下程序段中的变量已正确定义for(i=0;i4;i+,j+)for(i=0;i4;i+,j+)for(k=1;k3;k+);fo
25、r(k=1;k3;k+);printf(*);printf(*);程序段的输出结果是程序段的输出结果是A)*A)*B)*B)*C)*C)*D)*D)*D D(2010.3)有以下程序includestdio.hmain()int i,j,m=1;for(i=1;i3;i+)for(j=3;j0;j-) if(i*j)3)break; m*=i*j; printf(m=%dn,m);程序运行后的输出结果是A)m=6B)m=2C)m=4D)m=5A A(2010.3)有以下程序include main()int b 33=0,1,2,0,1,2,0,1,2,i,j,t=1;for(i=0;i3;i
26、+)for(j=i;j100) break; printf(“s=%d”,s);其作用是跳出所其作用是跳出所在的循环结构,在的循环结构,转向执行该循环转向执行该循环结构后面的语句结构后面的语句例例5.14 读入读入5个正整数并且显示它们。当程个正整数并且显示它们。当程序读入的数据为负数时,程序立即终止。序读入的数据为负数时,程序立即终止。本例的流程图如图本例的流程图如图5-20所示。所示。#include stdio.hvoid main()int i,n;for(i=1;i=5;i+)printf(Please enter n:);scanf(%d,&n);if(n0) break;prin
27、tf(n=%dn,n);printf(Program is over!n);输出结果:输出结果:输出结果:输出结果:Please enter n:5 n=5Please enter n:-5 Program is over!5.6.2 continue语句语句一般形式:一般形式: continue;如果我们将例如果我们将例5.14中的中的break语句改为语句改为continue语语句,则流程图如图句,则流程图如图5-21所示,程序的功能变为:读所示,程序的功能变为:读入入5个正整数并显示它们。当程序读入的数据为负个正整数并显示它们。当程序读入的数据为负数时,程序并不终止,而是等待用户输入下一
28、个数。数时,程序并不终止,而是等待用户输入下一个数。其作用跳过循环体中其作用跳过循环体中continue语句后面尚未执语句后面尚未执行的循环体语句,继续进行行的循环体语句,继续进行下一次循环的条件判别。下一次循环的条件判别。输出结果:输出结果:输出结果:输出结果:Please enter n:5 n=5Please enter n:-4 Please enter n:3 n=3Please enter n:2 n=2Please enter n:-1 Program is over!5.6.3 goto语句语句一般形式:一般形式: goto 标号语句;标号语句;标号语句的形式:标号语句的形式:
29、 标号:语句标号:语句例:用例:用goto语句来实现求平均成绩的功能语句来实现求平均成绩的功能break只能终止循环只能终止循环层,若要从多重循环层,若要从多重循环的内层一下转移到最的内层一下转移到最外层,可以使用外层,可以使用gotomain() float score,average=0; int n=0; scanf(%f,&score); if(score=0) goto loop; average=average/n; end:printf(%6.2f,average);5.6.4 exit()函数函数n虽然虽然exit()函数只是标准库函数而不是程序控制语函数只是标准库函数而不是程
30、序控制语句,但是它可以控制程序的流程。函数句,但是它可以控制程序的流程。函数exit()的作的作用是终止整个程序的执行,强制返回操作系统。用是终止整个程序的执行,强制返回操作系统。当执行程序时所必需的条件不能满足时,常常要当执行程序时所必需的条件不能满足时,常常要用到用到exit()函数。调用该函数需要嵌入头文件函数。调用该函数需要嵌入头文件。函数。函数exit()的一般调用方式为:的一般调用方式为:exit(code);n其中参数其中参数code为为int型,调用时将型,调用时将code的值传给的值传给调用过程调用过程(一般为操作系统一般为操作系统)。当。当code值为值为0或宏或宏常量常量
31、EXIT_SUCCESS时,表示程序正常退出;当时,表示程序正常退出;当code值为非值为非0值或宏常量值或宏常量EXIT_FAILURE时,表时,表示程序出现某种错误后退出。示程序出现某种错误后退出。例如,现在需要计算例如,现在需要计算a/b(a和和b都是都是int型的型的),为了,为了避免避免0作为除数的情况发生,可以这样处理:作为除数的情况发生,可以这样处理:nnscanf(%d%d,&a,&b);nif(b=0)nnprintf(The divisor can not be 0.n);nexit(0);nn?下面语句段中,若有定义下面语句段中,若有定义intint i,a,k,si,a
32、,k,s; ;不是不是死循环的是哪些?死循环的是哪些?A)for(i=1;i+) if(i=-10) break; s=s+i;B)k=0;do k+; while(k0);C)i=0;while(1) i+; if(i=20) break;D)a=1;while(a5) continue; a+;n执行下面的程序后,a 的值为( ) main() int a , b; for( a=1 , b=1 ; a=20) break; if(b%3 = = 1) b+=3; continue; b-=5; 8(2009.3)9.(2009.3)9.以下程序运行后的输出结果是以下程序运行后的输出结果是
33、【 】#include#include main()main() intintk=1,s=0;k=1,s=0;dodoif(k%2)!=0)if(k%2)!=0)continue;continue; s+=s+=k;kk;k+;+; while(kwhile(k10);10);printf(s=%dn,s);printf(s=%dn,s); s=0 s=0 10.10.下列程序运行时下列程序运行时, ,若输入若输入labcedf2dflabcedf2df 输出结果为输出结果为【 】#include#include main()main() charchara=0,ch;a=0,ch;while(chwhile(ch= =getchgetch()!=n)()!=n) if(a%2!=0&(ch=if(a%2!=0&(ch=a&cha&ch=z)=z) chch= =ch-a+Ach-a+A;a+;a+;putchar(ch);putchar(ch); printf(n);printf(n); 1AbCeDf2dF 1AbCeDf2dF