《循环结构C程序设计》由会员分享,可在线阅读,更多相关《循环结构C程序设计(76页珍藏版)》请在金锄头文库上搜索。
1、第六章第六章 循环结构的循环结构的C程程序设计序设计第一节第一节 循环的基本概念循环的基本概念第二节第二节 whilewhile语句语句第三节第三节 do-whiledo-while语句语句第四节第四节 forfor语句语句第五节第五节 breakbreak、continuecontinue、gotogoto语句语句第六节第六节 几种循环语句比较几种循环语句比较第七节第七节 循环的嵌套循环的嵌套第八节第八节 程序举例程序举例循环的必要性循环的必要性int result1,result2,result3;int result4,result5;result1 = 1 * 10;printf(1
2、10 %d n,result1);result2 = 2 * 10;printf(2 10 %d n,result2);result3 = 3 * 10;printf(3 10 %d n,result3);result4 = 4 * 10;printf(4 10 %d n,result4);result5 = 5 * 10;printf(5 10 %d n,result5); 1 10 102 10 203 10 304 10 405 10 50输出结果重复语句6.1 6.1 概述概述循环的必要性循环的必要性1 10 = 102 10 = 203 10 = 304 10 = 405 10 =
3、500 + 11 + 12 + 1上个数字 + 1.重复 (上个数字 +1) 10C 语言中的各种循环语言中的各种循环需要多次重复执行一个或多个任务的问题考虑使用循环来解决 C语言可实现循环的语句:用goto 和 if 构成循环while 语句do while 语句for 语句循环型程序设计循环型程序设计6.2 while6.2 while语句语句v一般形式一般形式:while(表达式) 循环体语句;v执行流程:计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。 工作原理表达式表达式循环体循环体假假(0
4、)真真(非非0)开始说明:说明:语句语句部分可以是部分可以是简单语句简单语句也可以是也可以是复合语句复合语句。不成立不成立表达式表达式?执行语句语句成立成立执行while循环之后的语句循环体循环体例 用while循环求 #includemain()inti,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);循环初值循环初值循环终值循环变量增值循环变量增值循环条件循环体循环体i1;sum0i=100sumsum+1i+输出sumv说明:l循环体有可能一次也不执行l循环体可为任意类型语句,一个以上的语句用括起来l下列情况,退出while循环u条件表
5、达式不成立(为零)u循环体内遇break,gotol无限循环: while(1) 循环体;l例:例:分析程序的运行结果分析程序的运行结果 #include #include main ( )main ( ) int i=1,sum=0;int i=1,sum=0;while ( i=100 )while ( i=100 )printf(“i=%d,sum=%d”,i,sum += i);printf(“i=%d,sum=%d”,i,sum += i);i+;i+;printf(”Sum=%dn”,sum);printf(”Sum=%dn”,sum); 结果:结果:程序将不停的打印程序将不停的打
6、印“i=1,sum=.”。l无法正常终止的程序,称为无法正常终止的程序,称为“死循环死循环”。结论:结论:在在while语句语句循环体循环体中,一定要有能够中,一定要有能够对循环控制条件产生影对循环控制条件产生影响的语句。避免出现响的语句。避免出现“死循环死循环”现象。现象。例例 显示显示1 11010的平方的平方#includemain()inti=1;while(i=10)printf(%d*%d=%dn,i,i,i*i);i+;运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=1006.3dowhile语句v一般形
7、式:do循环体语句;while(表达式);v执行流程:循环体expr假(0)真(非0)它先执行循环体中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。 工作原理v特点:先执行循环体,后判断表达式v说明:l至少执行一次循环体ldowhile可转化成while结构分别用dowhile和while求 main()inti,sum=0;i=1;dosum+=i;i+;while(i=10);printf(%d,sum);main()inti,sum=0;i=1;while(i number) printf(太大n); else if (guess number) printf
8、(太小n); while (guess != number); printf(您猜中了! 答案为 %dn,number);猜一个介于猜一个介于 1 与与 10 之间的数之间的数请输入您猜测的数:请输入您猜测的数:3太小太小请输入您猜测的数:请输入您猜测的数:5您猜中了您猜中了! 答案为答案为 5输入数字 5 后,dowhile 循环中的条件为假, 输出结果消息后,程序终止。比较比较 while 和和 do-while循环循环while(循环条件) 循环体;do 循环体; while( 循环条件);do-while 循环是先执行后判断,所以,即使开始条件为假,循环体也至少会被执行一次。while
9、循环是先判断后执行,所以,如果条件为假,则循环体一次也不会被执行。q 比较 while 和 do-while 循环的工作原理编程:辗转相除法求任意两个整数间的最大公约数编程:辗转相除法求任意两个整数间的最大公约数 3:输入一个正整数,要求以相反的顺序输出该数。例:输入一个正整数,要求以相反的顺序输出该数。例如:输入如:输入1234512345,则输出为,则输出为5432154321。 基本思路:可以从个位开始,按位输出整数的每一位基本思路:可以从个位开始,按位输出整数的每一位Input an integer to numberUntil number = 0Output number%10nu
10、mber = number /10 main( ) main( ) unsigned int number; unsigned int number; printf (Input the number:); printf (Input the number:); scanf (%d, &number); scanf (%d, &number);do do printf(%d, number%10); printf(%d, number%10); number/=10; number/=10; /* number/* number缩小缩小1010倍倍 */ */ while while (num
11、ber!=0); (number!=0); 思考:使用思考:使用whilewhile或或forfor语句,如何实现?语句,如何实现?两个程序有何区别?前面的程序可以处理数字0,后面的程序不能处理123456.4for语句v一般形式:for(expr1 ; expr2 ; expr3) 循环体语句;循环体语句;v执行流程:expr2循环体假(0)真(非0)forexpr1expr3for( 表达式1 ; 表达式2 ; 表达式3 ) 语句; for 循环的一般语法:for 循环循环counter = 0;n u m = 1 ;cnt = 100;counter = 10;n u m 0c o u
12、n t e r + + ;num = num + 1;cnt-分号用于分隔 for 循环的三个表达式1、计算表达式1的值,通常为循环变量赋初值;2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次, 否则跳出循环;3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;工作原理1234语句语句表达式表达式3N表达式表达式1表达式表达式2表达式表达式1表达式表达式2表达式表达式3语句语句表达式表达式1表达式表达式2Y表达式表达式2for循环循环YN表达式表达式3例例 用用for循环求循环求 #include main() int i,sum=0; fo
13、r(i=1;i=100;i+) sum+=i; printf(%d,sum);for 循环示例循环示例#include void main() int number,i,fac=1; printf(n 请输入任意一个正整数:); scanf(%d,&number); for(i = 1; i=number; i+)fac=fac*i; printf(n %d的阶乘 = %dn,number,fac);请输入任意一个正整数:5内存内存numberifac51121206循环执行五次5的阶乘 = 120for 循环的表达式循环的表达式lfor 循环中有三个表达式lfor 语句中的各个表达式都可以省
14、略l分号分隔符不能省略for( ; ; ) ;可省略不能省略省略表达式省略表达式1int num=0;for(;num 0;a+,n-) printf(%d ,a*2); l相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值省略表达式省略表达式2for(num=1;num+) . l 即不判断循环条件,也就是认为表达式2始终为真, 这时应在循环体内设法结束循环,否则将成为死循环省略表达式省略表达式3for(i=1;i=100;) sum=sum+1; i+; l即省去修改循环变量的值,但此时应在循环体内设法结束循环 省略三个表达式省略三个表达式for( ; ; ) print
15、f(这将一直进行下去这将一直进行下去); i = getchar(); if(i = X | i = x)break; l即不为循环变量赋初值,不设置循环条件(认为表达式2为真值),不修改循环变量的值,无终止地执行循环体。此时应在循环体内设法结束循环,否则会成为死循环v说明:lexpr1也可以是给其它变量赋初值;expr1和expr3也可以是逗号表达式例:for(sum=0,i=1;i=100;i+,i+)for(sum=0,i=1;i=100;i=i+2)lfor语句可以转换成while结构expr1;while(expr2)循环体语句;expr3;例:#includemain()inti=
16、0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij例:#includemain()inti=0;for(;i10;i+)putchar(a+i);例:#includemain()inti=0;for(;i10;)putchar(a+(i+);例:#includemain()inti=0;for(;i10;putchar(a+i),i+);main()inti,j,k;for(i=0,j=100;i=j;i+,j-)k=i+j;printf(%d+%d=%dn,i,j,k);#includemain()charc;for(;(c=getchar()!=n;
17、)printf(%c,c);0+100=1001+99=1002+98=10050+50=100 :数列:数列1 1、1 1、2 2、3 3、5 5、8 8、1313、2121、是著名的菲波那是著名的菲波那奇数列,其递推通项公式为:奇数列,其递推通项公式为:F F1 1 F F2 2 F Fn n F Fn-1n-1 F Fn-2n-2(n=3n=3)为求出第为求出第N N项的值,请编写程序。项的值,请编写程序。根据递推通项公式,可用根据递推通项公式,可用递推法递推法编写程序,计算第编写程序,计算第N N项的项的值。值。l递推法递推法:由初始的已知条件开始,先计算出第:由初始的已知条件开始,先
18、计算出第( (N N1)1)步的步的结果,再利用前面已知的结果,再利用前面已知的(N(N1)1)项结果,按照递推公式项结果,按照递推公式(或遵照递推规则),推出第(或遵照递推规则),推出第N N步结果。步结果。递推法是程序设计中最常用的方法之一,使用递推法必须递推法是程序设计中最常用的方法之一,使用递推法必须有明确的有明确的递推初始值递推初始值和和递推规则递推规则(递推公式)。(递推公式)。 6.5 break、continue、goto语句lbreak语句v功能:在循环语句和switch语句中,终止并跳出循环体或switchv说明:break只能终止并跳出最近一层的结构break不能用于循环
19、语句和switch语句之外的任何其它语句之中continue语句语句v功能:结束本次循环,跳过功能:结束本次循环,跳过循环体中循环体中尚未尚未执行的语句,进行下一次是否执行循环体的执行的语句,进行下一次是否执行循环体的判断判断v仅用于循环语句中仅用于循环语句中break 语句语句跳出 for 循环for( ; ; ) printf(这将一直进行下去这将一直进行下去); i = getchar(); if(i = X | i = x)break; 跳出 while 循环while(1) if(x = 10)break; 跳出 do-while 循环do if (x = 10)break;whil
20、e (x 15);continue 语句语句lcontinue 语句的作用是跳过循环体中剩余的语句语句的作用是跳过循环体中剩余的语句而执行下一次循环而执行下一次循环l对于对于while和和do-while循环,循环,continue 语句执行之语句执行之后的动作是条件判断;对于后的动作是条件判断;对于for循环,随后的动作循环,随后的动作是变量更新是变量更新 v功能:结束本次循环,跳过功能:结束本次循环,跳过循环体中循环体中尚未执尚未执行的语句,进行下一次是否执行循环体的判断行的语句,进行下一次是否执行循环体的判断v仅用于循环语句中仅用于循环语句中continue 语句语句while() co
21、ntinue; while() break; 跳出整个循环继续下一次循环例例6.5 6.5 把把100100200200之间的不能被之间的不能被3 3整除的数输出整除的数输出main() int n; for(n=100;n200;n+) if(n%3= =0) continue;printf(%d ,n); main() int n; for(n=100;n200;n+) if(n%3= =0) break;printf(%d ,n); 100 101 103 104 106 107200100 101 :求:求555555555555的约数中最大的三位数是多少?的约数中最大的三位数是多少?
22、 main( ) main( ) int j; int j; long n=555555; long n=555555;/*/*所求的约数的可能取值是从所求的约数的可能取值是从999999到到100100,j j从大到小从大到小*/*/ for (j=999; j=100; j-) for (j=999; j=100; j-) if ( n%j if ( n%j=0 ) 0 ) /* /* 若能够整除若能够整除j j,则,则j j是约数是约数 */ */ printf(”3 digits in %ld=%dn”, n, j ); printf(”3 digits in %ld=%dn”, n,
23、 j ); break; break; /* /* 控制退出循环控制退出循环 */ */ main ( )main ( ) int i, count=0, j, sum=0; int i, count=0, j, sum=0; for ( i=1; i=10; i+) for ( i=1; i=10; i+) printf (Input integer:); printf (Input integer:); scanf (%d, &j); scanf (%d, &j); if (j=0) if (j=0) /* /* 若为负数若为负数 */ */ continue; continue; /*/
24、*则结束本次循环,不进行后续操作则结束本次循环,不进行后续操作*/*/ count +; count +; /* /* 计数器计数器 */ */ sum += j; sum += j; /* /* 求累加和求累加和 */ */ if ( count ) if ( count ) printf(Plus numer:%d,average value:%.2f, printf(Plus numer:%d,average value:%.2f, count, 1.0*sum/count); count, 1.0*sum/count); else printf(Plus numer: 0, avera
25、ge value: 0); else printf(Plus numer: 0, average value: 0); :输入:输入1010个整数,求其中正数的个数及平均值,精个整数,求其中正数的个数及平均值,精确到小数点后两位。确到小数点后两位。gotogoto语句及用语句及用gotogoto构成循环构成循环lgoto语句一般格式:goto语句标号;.标号:语句;n功能功能:使系统转向标号所在的语句行执行:使系统转向标号所在的语句行执行n说明:语句标号用标识符表示,要符合标识符命说明:语句标号用标识符表示,要符合标识符命名规则名规则goto loop;goto 255; #includema
26、in()inti,sum=0;i=1;loop:if(i=100)sum+=i;i+;gotoloop;printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循环初值循环终值循环变量增值循环条件循环体n用用if if 和和gotogoto语句构成循环语句构成循环C不主张使用不主张使用goto循环循环 从键盘输入一组数据,以从键盘输入一组数据,以0结束输入,求结束输入,求数据和数据和#includemain()intnumber,sum=0;read_loop:scanf(%d,&number);if(!number)go
27、toprint_sum;sum+=number;gotoread_loop;print_sum:printf(Thetotalsumis%dn,sum);6-6 几种循环语句的比较几种循环语句的比较lC语言三种循环语句的特点如下:1.for和while先判断循环条件后执行循环体, do-while语句先执行循环体后判断循环条件。2.while和do-while语句的条件表达式只有一个, for语句有三个。3.while、do-while、for可以相互替换使用。4.while语句多用于不需要赋初值的或循环次数不定的情况。for语句多用于要赋初值或循环次数固定的情况。 do-while语句多用于
28、至少要运行一次的循环控制。5.循环语句可以嵌套,循环可以并列,但不能交叉。l为了保证循环体正常运行,应该特别注意:为了保证循环体正常运行,应该特别注意:l 循环控制条件循环控制条件l 控制条件的初始状态(初始值)控制条件的初始状态(初始值)l 循环体内部对控制条件的影响循环体内部对控制条件的影响以上三个方面相互配合,相互影响,共同完成循环控制以上三个方面相互配合,相互影响,共同完成循环控制6.7 循环的嵌套v定义:一个循环体内又包含了另一个完整的循环结构v三种循环可互相嵌套,层数不限(1)while()while().(2)dodowhile();.while();(3)while()dowh
29、ile();.(4)for(;)dowhile();while().内循环外循环内循环程序举例main() int i,j; for(i=1;i=2;i+) printf(“ni=%dn”,i); for(j=1;j=3;j+) printf(“j=%d,”,j); 程序举例内层循环终止内层循环终止j=2j=3j=4main() int i,j; for(i=1;i=2;i+) printf(“ni=%dn”,i); for(j=1;j=3;j+) printf(“j=%d,”,j); 程序举例运行结果:循环全部终止循环全部终止i=2i=3main() int i,j; for(i=1;i=2
30、;i+) printf(“ni=%dn”,i); for(j=1;j=3;j+) printf(“j=%d,”,j); v嵌套循环的跳转禁止:l从外层跳入内层l跳入同层的另一循环l向上跳转v三种循环可互相嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9- 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假设:
31、行号为i ,列号为ji=6i=6j=5j=5i*ji*j(1=i=9)(1=i=9)(1=j=i)(1=j=i) 则则:第:第 i i 行中要输出行中要输出 j j 个乘积个乘积输出项输出项aij和行和行(i)、列、列(j)的关系的关系#include #include main ( )main ( ) int i=1, j; int i=1, j; /* i:/* i:行计数器行计数器 j: j:列计数器列计数器 */ */ while( i= 9 ) while( i= 9 ) /* /* 控制打印表头控制打印表头 */ */ printf ( %4d, i+); printf ( %4d
32、, i+); printf (n-n); printf (n-n); i=1; i=1; while ( i= 9 ) while ( i= 9 ) /* /* 行控制行控制 */ */ j = 1; j = 1; /* /* 列计数器置列计数器置1 */1 */ while ( j = i ) while ( j = i ) /* /* 嵌套的二重循环。输出第嵌套的二重循环。输出第i i行行 */ */ printf (%4d, i*j ); printf (%4d, i*j ); j +; j +; /* /* 列计数器列计数器+1 */+1 */ printf (n); printf (
33、n); /* /* 一行输出结束后,输出一行输出结束后,输出n */n */ i +; i +; /* /* 行计数器行计数器+1 */+1 */ 外层外层循环体循环体执行执行1次,次,内层内层循环要输出循环要输出1行行程序设计的一般步骤1.分析题意,明确问题的性质 数值问题 / 非数值问题2.建立问题的描述模型 数学模型 / 过程模型3.设计/确定算法 数学问题:数值分析 非数学问题:数据结构 / 算法分析与设计一般方法:穷举 / 递推 / 递归 /.4.编程调试5.分析运行结果6-8 程序举例程序举例 :判断输入的整数是否是素数:判断输入的整数是否是素数l算法算法 使用穷举法,从使用穷举法
34、,从2 2开始尝试能否整除整数开始尝试能否整除整数m m。 #include “” #include “” main() main() int m,i; int m,i; scanf(“%d”,&m); scanf(“%d”,&m); for(i=2;im;i+) for(i=2;i= m) if(i = m) printf(“%d is a prinme number.n”,m); printf(“%d is a prinme number.n”,m); else else printf(“%d is not a prinme number.n”,m); printf(“%d is not
35、a prinme number.n”,m); l程序的优化程序的优化 对于穷举法来说,为了提高程序的效率,就要对于穷举法来说,为了提高程序的效率,就要减少尝试次数。减少尝试次数。#include “math.h”#include “math.h”main( )main( ) int m,i,k; int m,i,k; scanf(“%d”,&m); scanf(“%d”,&m); k=sqrt(m); k=sqrt(m); for(i=2;i=k;i+) for(i=2;i=k+1) printf(“%d is a prime number.n”,m); if(i=k+1) printf(“%
36、d is a prime number.n”,m); else printf(“%d is not a prime number.n”,m); else printf(“%d is not a prime number.n”,m);15 = 3 * 5;15 = 3 * 5;尝试尝试 15 % 3 15 % 3 以后,没有必以后,没有必要再尝试要再尝试 15 % 5 15 % 5。k k是尝试的终点。是尝试的终点。 :如何判断一个整数是另一个整数的平方:如何判断一个整数是另一个整数的平方 从从键键盘盘上上任任意意输输入入一一个个正正整整数数,要要求求判判断断该该正正整整数数是是否否是是另另一一
37、个个整整数数的平方。的平方。l问题分析与算法设计问题分析与算法设计设:输入的正整数为设:输入的正整数为i i,若若i i满足:满足:i = = i = = m * mm * m (m m为整数为整数00)则则i i为整数为整数m m的平方。的平方。main( )main( ) int i, m; int i, m; scanf (“%d”, &i); scanf (“%d”, &i);for( m = 1; m * m i; m + +) for( m = 1; m * m i; m + +) ;if( i = = m * m)if( i = = m * m) printf(“% d * %
38、d = % d n”, i, i, m); printf(“% d * % d = % d n”, i, i, m); :抓交通肇事犯 一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征: 甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,说:四位的车号刚好是一个整数的平方。 请根据以上线索求出车号。l问题分析与算法设计 按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。得到: (1)0i=9 0=j=31)main( )main( ) int i,j,k,m; int i,j
39、,k,m; for(i=1;i=9;i+) for(i=1;i=9;i+) /* i:/* i:车号前二位的取值车号前二位的取值 */ */ for(j=0;j=9;j+) for(j=0;j=9;j+) /* j:/* j:车号后二位的取值车号后二位的取值 */ */ if(i!=j) if(i!=j) /* /* 判断两位数字是否相异判断两位数字是否相异 */ */ k=i*1000+i*100+j*10+j; k=i*1000+i*100+j*10+j; for(m=31;m*mk;m+) for(m=31;m*mk;m+) ; if(m if(m * * m m = = = = k)
40、k) /* /* 判断是否为整数的平方判断是否为整数的平方 */ */ printf(Lorry_No. is %d.n, k); printf(Lorry_No. is %d.n, k); l运行结果运行结果:Lorry_No. is 7744.Lorry_No. is 7744.:百钱百鸡问题 中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?l问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x + y + z = 100 5 x + 3 y + z / 3 = 100 取值范
41、围:0 = x、y、z = 100 可以采用穷举法求解。main( )main( ) int x,y,z,j=0; int x,y,z,j=0; for(x=0;x=100;x+) for(x=0;x=100;x+) for(y=0;y=100;y+) for(y=0;y=100;y+) for(z=0;z=100;z+) for(z=0;z=100;z+) if(x+y+z=100 & 5*x+3*y+z/3=100 ) if(x+y+z=100 & 5*x+3*y+z/3=100 ) printf(%2d:cock=%2d hen=%2d chicken=%2dn, printf(%2d:
42、cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); +j,x,y,z); 运行结果:运行结果: 1: cock= 0 hen=25 chicken=75 1: cock= 0 hen=25 chicken=75 2: cock= 3 hen=20 chicken=77 2: cock= 3 hen=20 chicken=77 7: cock=12 hen= 4 chicken=84 7: cock=12 hen= 4 chicken=84l丢失重要条件:z应该能够被整除。main( ) int x,y,z,j=0; for(x=0;x=100;x+) for(y
43、=0;y=100;y+) for(z=0;z=100;z+) if(z%3= =0&x+y+z=100&5*x+3*y+z/3=&x+y+z=100&5*x+3*y+z/3= =100=100 ) ) printf(%2d:cock=%2d hen=%2d chicken=%2dn,printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); +j,x,y,z);l运行程序,正确的结果: 1: cock= 0 hen=25 chicken=751: cock= 0 hen=25 chicken=752: cock= 4 hen=18 chicken=
44、782: cock= 4 hen=18 chicken=783: cock= 8 hen=11 chicken=813: cock= 8 hen=11 chicken=814: cock=12 hen= 4 chicken=844: cock=12 hen= 4 chicken=84 l优化程序:优化程序: main( )main( ) int x, y, z, j=0; int x, y, z, j=0; for(x=0; x=20; x+) for(x=0; x=20; x+) for(y=0; y=33; y+) for(y=0; y=33; y+) for(z=0; z=100; z+
45、) for(z=0; z=100; z+) if( if(z%3=0&x+y+z=100 & 5*x+3*y+z/3=100)z%3=0&x+y+z=100 & 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn,printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); +j,x,y,z); l再优化再优化 程序程序: for(x=0; x=20; x+) for(x=0; x=20; x+) for(y=0; y=(100-5*x)/3; y+) for(y=0; y=(100-5
46、*x)/3; y+) z=100-x-y; z=100-x-y; if( z%3=0 & 5*x+3*y+z/3=100) if( z%3=0 & 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn,printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); +j,x,y,z); 穷举法的关键穷举法的关键l数学模型数学模型l适宜进行穷举的数学模型适宜进行穷举的数学模型l决定程序是否正确决定程序是否正确l穷举的范围穷举的范围l明确的穷举终止条件明确的穷举终止条件l决定穷举的效率,范围过大
47、,则效率太低。决定穷举的效率,范围过大,则效率太低。:打印边长为m的正方型要求:从键盘输入m值,输出m行每行m个*号。例:输入m=4,输出的图形如下:* * * * * * * * * * * * *l算法分析与设计:1. 输入m,2. 重复打印m行,每行打印m个 *; 加细: 1. 输入m; 2. for ( k=1; k=m; k+) 打印一行中的 m 个 * ;l算法分析与设计: 加细:1. 输入m;2. for( k=1; k=m; k+) 打印 m 个 * ; 换新行; 加细:1. 输入m;2. for( k=1; k=m; k+) for( j=1; j=m; j+) printf
48、 (“*”); printf(“n”) ; #include main ( ) int k, m, j; scanf( “%d”, &m); for(k=1; k=m; k+) /* 控制打印m行 */ for(j=1; j=m; j+) /*打印一行中的m个*号*/ printf (“*”); printf(“n”) ; l分析方法 逐步求精法。对于复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出程序。:打印数字魔方 要求:从键盘输入 m 值,输出 m 行的数字方阵。例:输入 m=5 ,输出的图形如下:1 2 3 4 5 2 3 4 5 13
49、4 5 1 24 5 1 2 35 1 2 3 4 l分析: 1. 重复打印m行。 2. 2. 第第j j行的第一个数字为行的第一个数字为j j,之后依次递增,之后依次递增, 但以但以m m为模为模: : a aijij = ( i + j - 2 ) % m + 1 = ( i + j - 2 ) % m + 1输出项和行、列的关系输出项和行、列的关系#include #include main ( )main ( ) int i, j, m ; int i, j, m ; printf(Enter M:); printf(Enter M:); scanf(%d, &m); scanf(%d
50、, &m); for(i=1;i=m;i+ ) for(i=1;i=m;i+ ) /* /* 控制打印控制打印m m行行 */ */ for(j=1;j=m;j+ ) for(j=1;j=m;j+ ) /* /* 打印一行中的数字打印一行中的数字 */ */ printf( %d, (i+j-2)%m + 1 ); printf( %d, (i+j-2)%m + 1 ); printf(n); printf(n); 问题描述:用“*”输出一个菱形图案,图案如下:*main()int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf( ); for(
51、k=1;k=2*i-1;k+) printf(*); printf(n); for(i=1;i=3;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=7-2*i;k+) printf(*); printf(n); 嵌套循环示例嵌套循环示例输出:*控制打印的行数控制每行打印的空格数控制每行打印的*号数控制打印的行数控制每行打印的空格数控制每行打印的*号数问题描述:打印输出100至200之间的全部素数。分析:素数是指只能被1和它本身整除的数。算法比较简单,先将这个数被2除,如果能整除,且该数又不等于2,则该数不是素数。如果该数不能被2整除,再看则是否能被3整除。如果
52、被3整除,并且该数不等于3,则该数不是素数,否则再判断是否被4整除,依此类推,该数只要是能被小于本身的某个数整除时,就不是素数。main() int i,j,n; n=0; for(i=100;i=200;i+) j=2; while(i%j!=0) j+; if(i=j) printf(%4d,i); n+; if(n%8=0) printf(n); printf(n); 嵌套循环示例嵌套循环示例输出:从100到200之间所有的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 19
53、7 199控制每行输出8个素数如果第一个能被整除的数等于该数本身,则说明该数为素数从2到i之间寻找第一个能被整除的数嵌套循环示例嵌套循环示例main() int i,num; char answer; do printf(请输入一个数:);scanf(%d,&num);printf(n);for (i = 1; i = 10; i+) printf(=);printf(n 该数是 %d,num);printf(nn 您是否还要输入其他的数(y/n)?);fflush(stdin);answer = getchar(); while (answer != n);输出:请输入一个数: 58该数是
54、58您是否还要输入其他的数(y/n)? y请输入一个数: 64该数是 64您是否还要输入其他的数(y/n)? n译密码例如Hello,world!译成密码:Lipps,asvph! #includemain() char c; while(c=getchar()!=n) if (c=a&c=A&cZ&cz) c=c-26; printf(“%c”,c); 例求sn=a+aa+aaa+aaa 其中a是一个数字,n由键盘输入。2+22+222+2222+main()int a,n,count=1,sn=0,tn=0; scanf(“%d%d”,&a,&n);while(count=n) tn=tn
55、+a; sn=sn+tn; a=a*10; count+;printf(“%dn”,sn);l1.求多项式11/21/31/41/100 的值。l2.从键盘输入一行字符,统计其中各类字符的个数。l3.求两个整数m,n的最大公约数和最小公倍数。l4.韩信点兵又称为中国剩余定理,相传汉高祖刘邦问大将军韩信统御兵士多少,韩信答说,每3人一列余1人、5人一列余2人、7人一列余4人、13人一列余6人。刘邦茫然而不知其数。(兵数范围在1000内) l5.输出100-200之间凡是包含数字5的数。l6.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6123,因此6是“完
56、数”。编程序找出1000之内的所有完数,并输出。练习l7.试编程序,找出10000以内的所有同构数。同构数是这样一组数:它出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。l8.每个苹果0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直到购买的苹果个数达到不超过100的最大值,每天平均花多少钱?l9.两个不同的整数a,b,如果a的所有因子之和等于b,b的所有因子之和等于a,则a与b互称为亲密数。打印出1000以内所有的亲密数对。10.输出如下图案: ABBBCCCCCBBB At=1,pi=0,n=1.0,s=1当|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出pi分子:1,-1,1,-1分母:1,3,5,7,.