C语言05循环结构

上传人:鲁** 文档编号:592285786 上传时间:2024-09-20 格式:PPT 页数:70 大小:2.55MB
返回 下载 相关 举报
C语言05循环结构_第1页
第1页 / 共70页
C语言05循环结构_第2页
第2页 / 共70页
C语言05循环结构_第3页
第3页 / 共70页
C语言05循环结构_第4页
第4页 / 共70页
C语言05循环结构_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《C语言05循环结构》由会员分享,可在线阅读,更多相关《C语言05循环结构(70页珍藏版)》请在金锄头文库上搜索。

1、C Programming Language循环结构程序设计循环结构程序设计C C 语言程序设计语言程序设计 Lecture 5Lecture 5C Programming Language2 2循环结构循环结构 循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。在C语言中可以用以下语句来实现循环:1、用while语句;2、用do-while语句;3、用for语句;4、用goto语句和if语句构成循环。C Programming Language3 35.1 while语句语句 1、while 语句 常称为“当型”循环语句。 循环体循环体循环体循环体非零非零非零非零

2、零零零零表达式表达式表达式表达式C Programming Language4 42 、while 语句的形式: while (表达式) 循环体;特点:先判断表达式,后执行语句。说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)循环体; C Programming Language5 5例例 (ch5_01.c)求)求1+2+3+4+5+100。#include #include main()main() int i,sum=0; int i,sum=0; i=1; i=

3、1; while(i=100) while(i=100) sum=sum+i; sum=sum+i; i+; i+; printf(%d,sum); printf(%d,sum); 循环初值循环初值循环初值循环初值循环终值循环终值循环终值循环终值循环变量增值循环变量增值循环变量增值循环变量增值 循环条件循环条件循环条件循环条件循环体循环体循环体循环体求求求求1010!C Programming Language6 6例例 (ch5_02.c)显示)显示110的平方的平方 #include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i)

4、; i+; 运行结果:运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100C Programming Language7 75.2 do-while语句语句1、do-while语句 常称为“直到型”循环语句。 循环体循环体循环体循环体非零非零非零非零零零零零表达式表达式表达式表达式C Programming Language8 82、do-while的形式: do 循环体; while (表达式);特点:先执行,后判断。说明:至少执行一次循环体dowhile可转化成while结构例(ch5_03.c)用dowhile

5、求1+2+3+4+5+100。C Programming Language9 9main() inti,sum=0;i=1;while(i=100) sum=sum+i;i+; printf(“%dn”,sum);main() inti,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%dn”,sum);C Programming Language10105.3 for语句语句1、C语言中最灵活、最语言中最灵活、最复杂的循环语句;复杂的循环语句;表达式表达式表达式表达式1 1表达式表达式表达式表达式2 2循环体语句循环体语句循环体语句循环体语句表达

6、式表达式表达式表达式3 34 可以用于循可以用于循环次数次数确定的情况;确定的情况;4 可以用于循可以用于循环次数次数不确定的情况;不确定的情况;4 可可实现while和和do-while语句的所有句的所有功能。功能。非零非零非零非零零零零零C Programming Language11112、for的形式:for (表达式1;表达式2;表达式3) 循环体 说明:forfor语语句中句中expr1,expr2,expr3expr1,expr2,expr3类类型任意,都可型任意,都可省略,但分号;不可省省略,但分号;不可省无限循无限循环环:for(;):for(;)forfor语语句可以句可以

7、转换转换成成whilewhile结结构构 循环变量循环变量赋初值赋初值循环终止循环终止条件条件循环变量循环变量控制控制C Programming Language1212sum=0;for(i=1;i=100;i+)sum=sum+i; 它相当于以下语句:sum=0;i=1;while(i=100) sum=sum+i;i+;表达式表达式1;while(表达式(表达式2) 语句;语句; 表达式表达式3; C Programming Language1313 3、for语句中表达式的省略语句中表达式的省略(1)for语句一般形式中的“表达式1”可以省略;如:如: sum=0;i=1;sum=0;

8、i=1;for(;i=100;i+)for(;i100)break;C Programming Language1414(3)表达式3也可以省略,但此时保证循环能正常结束。如:如:for(sumfor(sum=0,i=1;i=100;)=0,i=1;i=100;)sum=sum=sum+isum+i; ;i+;i+;(4)可以省略表达式1和表达式3,只有表达式2。如:如:i=1;sum=0;i=1;sum=0;i=1;sum=0;i=1;sum=0; for(;i=100;)for(;i=100;) while(i=100)while(i100)break;100)break;sum=sum=

9、sum+isum+i;i+;i+;C Programming Language1616(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:如:for(sumfor(sum=0,i=1=0,i=1;i=100ib & xy ;)3.字符表达式字符表达式: for (; (c=getchar() != n;) printf(“%c”,c);C Programming Language1818例例 输入入30个个09的字符数字,的字符数字,计算数字算数字串中有多少个奇数,偶数和零串中有多少个奇数,偶数和零 .思路:1.输入30个字符数字charn

10、um,而不是整数2.30个字符的输入和30个数字的输入的区别字符可以连续输入30个009764146589.数字输入必须是用空格,Tab键或回车隔开0097641465893.将字符变成数字后判断奇偶i=num-0;字符数字的ASCII码:48495051525354555657C Programming Language1919步骤:1.计数变量n1,n2,n3初始值设为零;2.输入1个字符num;3.循环变量初值为1;4.若i=30,重复字符变成数字,num=num-0判断num是否为0判断num2的值循环变量i+再输入1个字符num5.输出n1,n2,n3的值。输入输入输入输入num n

11、1=0,n2=0,n3=0i=1i=30num=num-0num%2n1+n2+ n3+输出输出输出输出n1,n2,n3 的值的值的值的值num=0YNi+输入输入输入输入num YNC Programming Language2020259718528637908300264710031993 there are 9 evens,5 zeros, 16 odds.main() int i, n1=0,n2=0,n3=0; char num; scanf(“%c”,&num); for (i=1;i=30;i+) num=num-0; if (num=0) n1+; else if (num%

12、2) n2+; else n3+; scanf(“%c”,&num); printf(There are %2d evens, %2d odds, %2d zeros ”,n3,n2,n1);C Programming Language2121解题思路解题思路1.每当我们读入一张选票,只有每当我们读入一张选票,只有6种种情况,将它们加到相应的人选上。情况,将它们加到相应的人选上。2.-1结束循环结束循环3.case语句作为开关。语句作为开关。例例 统计选票。票。现有有选票如下票如下3,1,2,1,1,3,3,2,1,2,3,3,2,1,1, 3,2,0,1,4,-1. -1是是结束束标志。志。

13、设1选李李, 2选张,3选王,王,0和和4为废票,票,谁会当会当选?C Programming Language2222main() int vote,l_vote,z_vote,w_vote, invalidvote; l_vote=0; z_vote=0; w_vote=0; invalidvote=0; scanf(“%d”,&vote); while (vote!=-1) switch (vote) case 1: l_vote+;break; case 2: z_vote+;break; case 3: w_vote+;break; case 0: case 4: invalidvo

14、te+;break; scanf(“%d”,&vote); printf(Li%2d,zhang%d2d,wang%2d,invalid%2d”, l_vote,z_vote,w_vote,invalidvote); C Programming Language2323 例 输入一个整数,计算它的位数.并反向输出.分析:设一个数13579,一位一位地切下末位循环结束条件:num=0;同时计数count=count+1;135 135 1357 1357 1357913579 7 7bitbitbitbit 9 9 5 5bitbit1313bitbit1 1 bitbitbit=num%10

15、num=num/101357 1357 9 9135 135 7 713 13 5 5count=0;输入输入numnum!=0输出输出num%10count+num=num/10输出输出count 3 31 1 3 3C Programming Language2424main()main() long num; long num; int count = 0; int count = 0; printf(“Please enter an integer:n”); printf(“Please enter an integer:n”); scanf(“%ld”,&num); scanf(“%

16、ld”,&num); do do printf(“%d”,num%10); printf(“%d”,num%10); num = num /10; num = num /10; count + +; count + +; while (num !=0 ); while (num !=0 ); printf(“ %d digits.”, count); printf(“ %d digits.”, count); Please enter an integer:Please enter an integer: 3829 3829 9283 4 digits.9283 4 digits.C Prog

17、ramming Language2525例例 请说明程序功能。请说明程序功能。main() inti;for(i=32;i256;i+)if(i%8=0)printf(“n”);printf(“%4d%c”,i,i);C Programming Language2626例例 求求fibonacci数列数列1,1,2,3,5,8, 的前的前20项。项。fibonacci数列满足下面数列满足下面递归关系递归关系: F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n3) a=1,b=1for i=1 to 10输出输出a,ba=a+bb=b+a分析:分析: 1 1 2 3 5 8

18、 131 1 2 3 5 8 13 a+ a+ b ba a b+ a b+ a b b a + ba + b a a b + a b + a b b C Programming Language2727main()inti,a,b,k=0;a=b=1;for(i=1;i=10;i+)printf(%10d%10d,a,b);a=a+b;b=a+b;k+=2;if(k%4=0)printf(n); 1123581321345589144233377610987C Programming Language28285.4 goto语句语句1、无条件转移语句;形式:goto标号;2、有标号的语句称为

19、标号语句;形式:标号:语句;3、goto语句在使用时只能转移到goto所在的函数内的标号处,不能转移到该函数外;4、可以从多重循环的内层转移到最外层,而break只能跳出一层循环。满足标识符的规定满足标识符的规定满足标识符的规定满足标识符的规定C Programming Language2929main()main()inti=1,sum=0;inti=1,sum=0;loop:if(i101)loop:if(i101)sum=sum+i;sum=sum+i;i+;i+;gotoloop;gotoloop;printf(“SUM=%fn”,sum);printf(“SUM=%fn”,sum);

20、loop: sum=sum+i; i+; if(i101) goto loop;C Programming Language30305.5 break语句和语句和continue语句语句break语句一般形式一般形式:break;break;功能功能: :跳出所在的多分支跳出所在的多分支switchswitch语语句句跳出所在的跳出所在的whilewhile、do-whiledo-while、forfor循循环语环语句(提句(提前前结结束循束循环环)。)。continue语句一般形式一般形式:continue;continue;功能功能: :提前提前结结束本次循束本次循环环体的体的执执行,接着

21、行,接着进进行下一次行下一次循循环环条件的判条件的判别别。C Programming Language3131break语句语句main()main()inti;inti;for(i=1;i=5;i+)for(i=1;i=5;i+)printf(n%5d,i);printf(n%5d,i);printf(%5d,i);printf(%5d,i); main()main()inti;inti;for(i=1;i=5;i+)for(i=1;i=5;i+)printf(n%5d,i);printf(n%5d,i);if(i=3)break;if(i=3)break;printf(%d,i);prin

22、tf(%d,i); 1 11 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 1 11 1 2 2 2 2 3 3当当当当i=3i=3时时时时, ,结束循环结束循环结束循环结束循环C Programming Language3232continue语句语句main()main()inti;inti;for(i=1;i=5;i+)for(i=1;i=5;i+)printf(n%5d,i);printf(n%5d,i);printf(%5d,i);printf(%5d,i); main()main()inti;inti;for(i=1;i=5;i+)for(i=1;i=5;i+

23、) printf(n%5d,i);printf(n%5d,i);if(i=3)if(i=3)continue;continue;printf(%d,i);printf(%d,i); 1 11 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 1 11 1 2 2 2 2 3 3 4 4 4 4 5 5 5 5当当当当i=3i=3时时时时, ,结束本次结束本次结束本次结束本次循环体循环体循环体循环体的执行的执行的执行的执行C Programming Language3333break与与continue的区别的区别for(e1;e2;e3)for(e1;e2;e3)if(eif

24、(e)break;)break; for(e1;e2;e3)for(e1;e2;e3)if(eif(e)continue;)continue; 计算计算计算计算e1e1e2e2语句语句语句语句非00e e非0语句语句语句语句计算计算计算计算e3e30breakbreak语句语句语句语句0计算计算计算计算e1e1e2e2语句语句语句语句非00e e非0语句语句计算计算e3e3continuecontinue语句语句循循环环体体C Programming Language3434例(ch5_05.c)输出110中不是3的倍数的数。main()main()intintn;n;for(n=1;n=10

25、;n+)for(n=1;n=10;n+)if(n%3=0)if(n%3=0)breakbreak;printf(“%d,”,nprintf(“%d,”,n); ); 输出:输出:1,2,continue;输出:输出:1,2,4,5,7,8,10,C Programming Language3535main()inti,num=0,a;floatsum=0;for(i=1;i=10;i+) scanf(%d,&a);if(a=0)continue;num+;sum+=a;printf(“num=%d,aver=%6.2fn,num,sum/num);例例 求输入的十个整数中正数个数及其平均值。求

26、输入的十个整数中正数个数及其平均值。num=0, sum=0num=0, sum=0输入整数输入整数输入整数输入整数a ai=10i=10a=0a=0Y YN Nnum+num+sum+=asum+=ai+i+i=1i=1C Programming Language36365.6 循环的嵌套循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环嵌套循环的执行流程嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环C Programming Language3737()当当外外层层循循环环结结构构每每执执行行一一次次循循环环时时,内内层层循循环环结结构构在在一一般般情情况况下下要要从

27、从循循环环的的开开始始到到循循环环的的正正常常结结束束从从头头到尾执行一遍到尾执行一遍。 例例1 ()在在内内层层循循环环结结构构中中使使用用break语语句句可可以以提提前前结结束束本本次次内内层层循循环环结结构构的的执执行行,而而不不影影响响外外层层循循环环结结构构的的继继续执行续执行。例例2 ()如如果果程程序序因因某某种种原原因因需需要要从从内内层层循循环环体体跳跳出出整整个个循环结构,此时才可考虑使用循环结构,此时才可考虑使用 goto 语句。语句。例例3 ()()对于并列的循环结构,控制循环执行的变量名字对于并列的循环结构,控制循环执行的变量名字可以相同。可以相同。在嵌套循环结构中

28、,在嵌套循环结构中,内、外层控制循环执行内、外层控制循环执行的变量名字不能相同。的变量名字不能相同。 例例4 对于嵌套循环结构的几点说明:对于嵌套循环结构的几点说明:C Programming Language3838例例1:main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); printf(n); 运行后,运行后,输出:输出: 1 2 3 4 1 2 3 4 1 2 3 4例例2:main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); if( ! (j

29、%3) ) break; printf(n); 运行后,运行后,输出:输出: 1 2 3 1 2 3 1 2 3 C Programming Language3939例例4: main() int i, j; for( i=0; i3; i+) printf( %d, i ); printf(n ) ; for( i=1; i=4; i+) printf(%d, i ) ; 运行后,运行后,输出:输出:例例3:main() int i, j; for( i=0; i3; i+) for( j=1;j=4;j+) printf( %d,j); if( ! (j%3) ) goto l; prin

30、tf(n); l: ;运行后,运行后,输出:输出: 1 2 3 0 1 2 1234C Programming Language4040分析分析: :求累加和求累加和s ss=0s=0for(kfor(k=1;k=1;k=n;kn;k+)+)求求t tk ks=s=s+ts+tk k 求累乘积求累乘积t tk k=k!=k!t tk k=1=1for(ifor(i=1;i=1;i=k;ik;i+)+)t tk k= =t tk k*i *imain()main() inti,k,n;inti,k,n;longs,t;longs,t;printf(nInputn:);printf(nInputn

31、:);scanf(%d,&n);scanf(%d,&n);s=0;s=0;for(k=1;k=n;k+)for(k=1;k=n;k+) t=1;t=1;for(i=1;i=k;i+)for(i=1;i=k;i+)t=t*i;t=t*i;s=s+t;s=s+t; printf(ns=%ld,s);printf(ns=%ld,s); 例例 求求1!+2!+n! 内外层循环控制变量内外层循环控制变量内外层循环控制变量内外层循环控制变量不要同名。不要同名。不要同名。不要同名。C Programming Language4141main()main()inti,k,n;inti,k,n;longs,t;

32、longs,t;printf(nInputn:);printf(nInputn:);scanf(%d,&n);scanf(%d,&n);s=0;s=0;for(for(k=1;k=n;k+k=1;k=n;k+) )t=1;t=1;for(for(i=1;i=k;i+i=1;i=k;i+) )t=t*i;t=t*i;s=s+t;s=s+t;printf(ns=%ld,s);printf(ns=%ld,s); n=3n=3skk3skk3外循外循tiiktiik内循内循 Input n:Input n: 3 3 s=9s=9 1 12 20 01 1 2 21 12 21 11 11 11 1 1

33、 12 21 12 2 2 23 30 03 3 3 31 13 31 11 11 11 1 1 12 21 12 2 2 23 31 13 3 6 64 40 09 9 4 40 0 0 0 1 11 11 11 11 11 11 1C Programming Language42421 12 23 34 45 56 67 78 89 91 12 24 43 36 69 99 918182727363645455454636372728181.例例 循环嵌套,输出九九表。循环嵌套,输出九九表。ijC Programming Language4343#include #include main

34、()main() int i,j; int i,j; for(i=1;i=9;i+) for(i=1;i=9;i+) printf(%4d,i); printf(%4d,i); printf(n-n); printf(n-n); for(i=1;i=9;i+) for(i=1;i=9;i+) for(j=1;j=i;j+)for(j=1;j=i;j+) printf(%4d,i*j); printf(%4d,i*j); printf(n);printf(n); C Programming Language4444* * * * * * * * * * * * * * * * * * * * *

35、 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1 14 43 32 2for(i=1;i=5;i+) for(j=1;j=5;j+) printf( ); printf(n“);*for(i=1;i=5;i+) for(j=1;j=i;j+) printf( ); printf(n“);*for(i=1;i=5;i+) for(j=1;j=5-i+1;j+) printf( ); printf(n“);*for(i=1;i=5;i+) for(j=1;ji;j+) printf(

36、); for(j=1;j=5-i+1;j+) printf( ); printf(n“);*for(i=1;i=5;i+) for(j=1;j5-i+1;j+) printf( ); for(j=1;j=i;j+) printf( ); printf(n);*C Programming Language4545 分析分析分析分析: : uu 行的控制行的控制行的控制行的控制 i i: :1919uu * *的个数的个数的个数的个数j j与当前行的关系与当前行的关系与当前行的关系与当前行的关系: : j=2*i-1j=2*i-1uu * *前面的空格前面的空格前面的空格前面的空格k k与行的关系

37、与行的关系与行的关系与行的关系: : 开始时开始时开始时开始时, ,第一行有第一行有第一行有第一行有8 8个空格个空格个空格个空格 每多一行每多一行每多一行每多一行, ,少一个空格少一个空格少一个空格少一个空格k=9-ik=9-iwhile (i=9)while (i=9) for (k=1;k=9-i;k+)for (k=1;k=9-i;k+) 输出空格输出空格输出空格输出空格; ; for (j=1;j=2*i-1;j+)for (j=1;j=2*i-1;j+) 输出输出输出输出* *; ; *C Programming Language4646main() int i,j,k; i=1;

38、 while (i=9) for(k=1;k=9-i;k+) printf(“ ”); for(j=1;j=2*i-1;j+) printf(“*”); printf(“n”); i+; i=1 i=9k=1k=9-i输出空格输出空格k=k+1j=1j=2*i-1输出输出*j=j+1 换行换行,i=i+1 C Programming Language4747 11 i i控制控制行行: : i19i19空格数空格数:9-9-i i112 211j j控制列控制列: :第第i i行行左左边边: 1 1ii12123 32121右右边边:i-11:i-11.12345678123456789 98

39、765432187654321例例 编程输出下面的数字金字塔编程输出下面的数字金字塔(1到到9)。C Programming Language4848 (ch5_09.cch5_09.c)main()main()intint i,j,k,mi,j,k,m; ;for(i=1;i=9;i+)for(i=1;i=9;i+)for(j=1;j=9-i;j+)/*for(j=1;j=9-i;j+)/*输输出出9-i9-i个空格个空格*/ */putcharputchar();(); for(j=1;j=for(j=1;j0;j-)/*for(j=i-1;j0;j-)/*输输出出i-1i-1到到1*/1

40、*/ printf(“%dprintf(“%d”,j);”,j);printf(“nprintf(“n”);”);C Programming Language4949本章重点本章重点三种循三种循环语环语句句whilewhile,do-while,do-while和和forfor建立循建立循环环通常有以下情况通常有以下情况: :1.1.给给定次数定次数,for,for比比较较适用适用 for(ifor(i=1;i100;i+)=1;i100;i+)2.2.给给定条件定条件,while,while比比较较适用适用 while(x+ywhile(x+y)z)a&ca&cA&cA&c=1.0e-6)p

41、i=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(“pi=%10.6fn”,pi);C Programming Language5151方法一:数列是正、负相间的,在这里可用一方法一:数列是正、负相间的,在这里可用一个个“开关开关”变量变量 t 来解决符号的问题。来解决符号的问题。main() float s=0; int t=1,i ; for(i=1;i101;i+) s+=1.*t / i ; t= -t ; printf(s=%fn,s); 在处理循环时应注意在处理循环时应注意初、终值初、终值的设定!的设定!例例 求求 s=1-1/2+1/3-1/4+ +1

42、/99-1/100。C Programming Language5252方方法法二二:分分别别求求出出正正项项和和s1(奇奇数数倒倒数数)与与负负项项和和s2(偶数倒数偶数倒数),则,则s=s1-s2 main() float s,s1=0,s2=0; int i; for(i=1;iE, W-A.非字母字符忽略。非字母字符忽略。思路思路: :1.1.建建 立立 循循 环环 , , 循循 环环 结结 束束 以以 输输 入入 回回 车车 符符 为为 准准 while(while((c=c=getchargetchar() ())!=n)!=n)2.2.判断判断输输入是否是字符入是否是字符, ,否

43、否则则忽略忽略 if(c=a&c=A&c=a&c=A&c=a & c=A & c=a & c=A & cZ & cz) c=c-26; if (cZ & cz) c=c-26; printf(“%c”,cprintf(“%c”,c); ); abdEgWefhIkAC Programming Language5555 例例 梯形法求数值积分梯形法求数值积分。0 0y yx xa a a+ha+ha+iha+ih a+(i+1)ha+(i+1)hb bf(x)f(x)=4-x2dxbaC Programming Language5656main() floata,b,h,n1,n2,s=0;in

44、ti;printf(“请输入积分限a和b:”);scanf(“%f%f”,&a,&b);h=(b-a)/1000;for(i=0;i1000;i+)n1=4-(a+i*h)*(a+i*h);n2=4-(a+(i+1)*h)*(a+(i+1)*h);s+=(n1+n2)*h/2;printf(“s=%10.2fn”,s);C Programming Language5757#include#include#defineGOAL39#defineGOAL39main()main() intinti;i;printf(“Pleaseprintf(“Pleaseinputaintegernumber:

45、n);inputaintegernumber:n);dodo scanf(%d,&iscanf(%d,&i););if(iif(iGOAL)GOAL)printf(%dprintf(%d istoobig,inputagainistoobig,inputagain. . n,in,i); );elseelse if(iif(iGOAL)GOAL)printf(%dprintf(%distooistoosamll,inputsamll,input again.again.n,in,i););elseelseprintf(OK!nprintf(OK!n););while(iwhile(i!=GOA

46、L);!=GOAL); 例例例例 猜数游戏的最简化版。猜数游戏的最简化版。猜数游戏的最简化版。猜数游戏的最简化版。C Programming Language5858#include#include#include#includemain()main()intinti;i;intint GOAL,numGOAL,num=0;=0;randomize();randomize();printf(Pleaseprintf(Pleaseinputanumberfrom0to99,or-1toinputanumberfrom0to99,or-1toexit:n);exit:n);GOAL=random(

47、100);GOAL=random(100);/*产生0到99的随机数*/dodo scanf(%d,&iscanf(%d,&i););if(iif(i=-1)=-1)printf(nExitprintf(nExitgame!);game!);break;break;C Programming Language5959num+;num+;if(iif(iGOAL)GOAL)printf(%dprintf(%distoobig,inputagain.istoobig,inputagain.n,in,i); );elseelse if(iif(iGOAL)GOAL)printf(%dprintf(%

48、distooistoosamllsamll,input,inputagain.again.n,in,i););elseelse printf(OK!nprintf(OK!n);); printf(Youprintf(Youtake%dtimestotake%dtimestopass!,numpass!,num);); while(iwhile(i!=GOAL);!=GOAL); C Programming Language6060例例 枚举问题枚举问题或称为或称为穷举法穷举法。一般用于不。一般用于不定方程求非负整数解的问题。它将方程中定方程求非负整数解的问题。它将方程中未知数可以取的到的非负整

49、数逐个进行验未知数可以取的到的非负整数逐个进行验证找出所有满足方程的解。证找出所有满足方程的解。例如:例如:一元人民币兑换成一元人民币兑换成1分、分、2分、分、5分共有分共有多少种方法?多少种方法?若若5分、分、2分、分、1分的个数分别为分的个数分别为x个、个、y个、个、z 个,则个,则x的取值为的取值为020,y的取值为的取值为050,z的取值为的取值为0100。于是有不定方程:于是有不定方程: 5x+2y+z=100。C Programming Language6161main()inti,j,k,m=0;for(i=0;i21;i+) for(j=0;j51;j+)for(k=0;k10

50、1;k+)if(5*i+2*j+k=100)m+=1;printf(m=%dn,m);运行结果:运行结果:m=54130考虑程序的优化问题?考虑程序的优化问题?C Programming Language6262 上面程序的循环次数超过上面程序的循环次数超过10万次,且大量的循环万次,且大量的循环都不满足方程。可对程序进行优化,由于随着都不满足方程。可对程序进行优化,由于随着5分个数分个数的增加,的增加,2分个数就会减少,因此循环变量分个数就会减少,因此循环变量j可控制在可控制在(100-5i)/2以内以内,这样使得这样使得5i+2j=100。若不足。若不足100则则补充补充1分,分,将问题转

51、换成为求循环次数的问题了将问题转换成为求循环次数的问题了。main() int i,j,m=0; for(i=0;i21;i+) for(j=0;j=(100-5*i)/2;j+) m+=1; printf(m=%dn,m);因为该不定方程中,如因为该不定方程中,如果有两个未知数确定后,果有两个未知数确定后,第三个未知数也随之确第三个未知数也随之确定。即确定了一种分法。定。即确定了一种分法。例如:例如:i=20时,时,j=0i=19时,时,j=0,1,2i=18时,时,j=0,1,2,3,4,5C Programming Language6363例汽车里程表上的读数是95859,7小时之后里程

52、表的读数是一个对称数(最大是5位数),问汽车的速度(是一个整数)。解题思路:检查所有的在95859到99999之间的对称数,如果它与95859的差能被7整除,则商是速度。/*第一种算法*/C Programming Language6464main()/*第一种算法*/longi,a,b,c,e,d;floatf,g;i=95859;while(i=99999)a=i/10000;b=(i-a*10000)/1000;c=(i-a*10000-b*1000)/100;d=(i-a*10000-b*1000-c*100)/10;e=i-a*10000-b*1000-c*100-d*10;if(a

53、=e)&(b=d)if(i-95859)%7)=0)printf(Thespeedis%d,(i-95859)/7);i+;该程序需要执行循环该程序需要执行循环99999-95859次!次!C Programming Language6565main()/*第二种算法*/longi,distance,a,b,c,d,e;for(i=1;i=200;i+)distance=95859+i*7;a=distance/10000;b=(distance-a*10000)/1000;c=(distance-a*10000-b*1000)/100;d=(distance-a*10000-b*1000-c

54、*100)/10;e=distance-a*10000-b*1000-c*100-d*10;if(a=e)and(b=d)printf(“Thespeedis%d”,i);循环次数为循环次数为 200次次C Programming Language6666/*/*第三种算法第三种算法* */ /main() long i,j,distance; for(i=6;i=9;i+) for (j=0;j=9;j+) distance=90000+i*1000+j*100+i*10+9; if (distance-95959)%7=0) printf(“The speed is %d”,(distan

55、ce-95959)/7); 该程序需要循环该程序需要循环(9-6+1)*10次!次!C Programming Language6767分析分析:( 1) 因因 为为 新新 出出 现现 的的 数数 ( dcbcd) 是是 :个个位位数数字字(d)与与万万位位数数字字、十十位位数数字字(c)与与千千位位数数字字相相同同,而而百百位位数数字字(b)只只能能是是,表表示示万万位位和和千千位位的的变变量量a取取值值范范围围为为:9599。所所以以,要要将将a分分隔隔出出的的十十位位数数字字和和个个位位数数字字分分别别赋予赋予d和和c 。(2)约束条件是:公里数对称且车速为整数。)约束条件是:公里数对称

56、且车速为整数。 注意:注意:9585995859超过了整型量的范围,应使超过了整型量的范围,应使用长整型量。用长整型量。C Programming Language6868循环循环a=95;a=99;a+求出万、千位上的数字求出万、千位上的数字循环百位数字循环百位数字b=0;b=99找出对称的数字找出对称的数字计算路程、车速计算路程、车速车速为整且路程车速为整且路程 为正为正跳出并输出跳出并输出非非非非0 00 0C Programming Language6969main() int a,b,c,d,n,v; long int m; for(a=95;a=99;a+) d=a/10; c=a

57、-d*10; /*分别求出万、千位上的数字分别求出万、千位上的数字 */ for(b=0;b0) goto loop; loop: printf(v=%dkm/h m=%ldkmn,v,m); 车速为整数且路程为正车速为整数且路程为正时转出循环并输出结果时转出循环并输出结果找出对称找出对称的数字的数字C Programming Language7070 在在本本例例这这样样的的情情况况下下,从从内内循循环环体体直直接接使使用用goto语语句句跳跳出出整整个个循循环环结结构构,收收到到了了事事半半功功倍倍的的效效果果。但但我我们们再再次次强强调调,要要限制、最好不使用限制、最好不使用goto语句。语句。 思考:思考: (1)若若将将if语语句句后后goto语语句句改改为为break语语句,结果如何?句,结果如何? ( 2) 若若 将将 printf(v=%d m=%ldn,v,m);直直接接放放在在if语语句句后后,结结果果又又如何?如何?

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号