六章节循环结构C程序设计ppt课件_第1页
六章节循环结构C程序设计ppt课件_第2页
六章节循环结构C程序设计ppt课件_第3页
六章节循环结构C程序设计ppt课件_第4页
六章节循环结构C程序设计ppt课件_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章第六章 循环构造的循环构造的C程程序设计序设计循环的必要性循环的必要性int result1,result2,result3;int result4,result5;result1 = 1 * 10;printf(1 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)

2、; 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 = 500 + 11 + 12 + 1上个数字 + 1.反复 (上个数字 +1) 10C 言语中的各种循环言语中的各种循环需求多次反复执行一个或多个义务的问题思索运用循环来处理 C言语可实现循环的语句:用goto 和 if 构成循环while 语句do while 语句for 语句循环型程序设计循环型程序设计6.2 while6.2 while语句语句普通方式:普通方式:whi

3、le(表达式) 循环体语句;v执行流程:计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停顿执行循环体。假设条件在开场时就为假,那么不执行循环体语句直接退出循环。 任务原理表达式表达式循环体循环体假假(0)真真(非非0)开场阐明:语句部分可以是简单语句也可以是复合语句。阐明:语句部分可以是简单语句也可以是复合语句。不成立不成立表达式表达式?执行语句成立成立执行while循环之后的语句循环体循环体例 用while循环求 1001nn#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,s

4、um);循环初值循环初值循环终值循环变量增值循环变量增值循环条件循环体循环体i1; sum0i=100sumsum+1i+输出sumv阐明:v循环体有能够一次也不执行v循环体可为恣意类型语句,一个以上的语句用括起来v以下情况,退出while循环v条件表达式不成立为零v循环体内遇break,gotov无限循环: while(1)v 循环体;l例:分析程序的运转结果例:分析程序的运转结果l #include lmain ( )l int i=1,sum=0;lwhile ( i=100 )lprintf(“i=%d,sum=%d,i,sum += i);li+;lprintf(Sum=%dn,su

5、m);ll结果:程序将不停的打印结果:程序将不停的打印“i=1,sum=.。l无法正常终止的程序,称为无法正常终止的程序,称为“死循环。死循环。l结论:在结论:在while语句循环体中,一定要有可以对循环控制条件产语句循环体中,一定要有可以对循环控制条件产生影响的语句。防止出现生影响的语句。防止出现“死循环景象。死循环景象。 例例 显示显示1 11010的平方的平方#include main() int i=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=

6、649*9=8110*10=1006.3 dowhile语句普通方式:do 循环体语句; while(表达式);v执行流程:循环体expr假(0)真(非0)它先执行循环体中的语句,然后再判别条件能否为真,假设为真那么继续循环;假设为假,那么终止循环。 任务原理v特点:先执行循环体,后判别表达式v阐明:v至少执行一次循环体vdowhile可转化成while构造分别用dowhile和while求 101nnmain() int i,sum=0; i=1; do sum+=i;i+; while(i=10); printf(%d,sum);main() int i,sum=0; i=1; while

7、(i number) printf(太大n); else if (guess number) printf(太小n); while (guess != number); printf(您猜中了! 答案为 %dn,number);猜一个介于猜一个介于 1 与与 10 之间的数之间的数请输入您猜测的数:请输入您猜测的数:3太小太小请输入您猜测的数:请输入您猜测的数:5您猜中了您猜中了! 答案为答案为 5输入数字 5 后,dowhile 循环中的条件为假, 输出结果音讯后,程序终止。比较比较 while 和和 do-while循环循环while(循环条件) 循环体;do 循环体; while( 循环

8、条件);do-while 循环是先执行后判别,所以,即使开场条件为假,循环体也至少会被执行一次。while循环是先判别后执行,所以,假设条件为假,那么循环体一次也不会被执行。q 比较 while 和 do-while 循环的任务原理编程:辗转相除法求恣意两个整数间的最大公约数编程:辗转相除法求恣意两个整数间的最大公约数 3:输入一个正整数,要求以相反的顺序输出该数。例:输入一个正整数,要求以相反的顺序输出该数。例如:输入如:输入1234512345,那么输出为,那么输出为5432154321。 根本思绪:可以从个位开场,按位输出整数的每一位根本思绪:可以从个位开场,按位输出整数的每一位Inpu

9、t an integer to numberUntil number = 0Output number%10number = 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;

10、 / number/=10; /* * number number减少减少1010倍倍 * */ / while (number!=0); while (number!=0); 思索:运用思索:运用whilewhile或或forfor语句,如何实现?语句,如何实现?两个程序有何区别?前面的程序可以处置数字0,后面的程序不能处置123456.4 for语句普通方式:for(expr1 ; expr2 ; expr3) 循环体语句;循环体语句;v执行流程:expr2循环体假(0)真(非0)forexpr1expr3for( 表达式1 ; 表达式2 ; 表达式3 ) 语句; for 循环的普通语法:

11、循环的普通语法:for 循环循环counter = 0;num = 1;cnt = 100;counter = 10;num 0counter +;num = num + 1;cnt-分号用于分隔 for 循环的三个表达式1、计算表达式1的值,通常为循环变量赋初值;2、计算表达式2的值,即判别循环条件能否为真,假设值为真那么执行循环体一次, 否那么跳出循环;3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步反复执行;任务原理1234语句语句表达式表达式3N表达式表达式1表达式表达式2表达式表达式1表达式表达式2表达式表达式3语句语句表达式表达式1表达式表达式2Y表达式表达

12、式2for循环循环YN表达式表达式3例例 用用for循环求循环求 1001nn#include main() int i,sum=0; for(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内存内存numberif

13、ac51121206循环执行五次5的阶乘的阶乘 = 120for 循环的表达式循环的表达式lfor 循环中有三个表达式lfor 语句中的各个表达式都可以省略l分号分隔符不能省略for( ; ; ) ;可省略不能省略省略表达式省略表达式1int num=0;for(;num 0;a+,n-) printf(%d ,a*2); l相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值省略表达式省略表达式2for(num=1;num+) . l 即不判别循环条件,也就是以为表达式2一直为真,l 这时应在循环体内设法终了循环,否那么将成为死循环省略表达式省略表达式3for(i=1;i=1

14、00;) sum=sum+1; i+; l即省去修正循环变量的值,但此时应在循环体内设法终了循环 省略三个表达式省略三个表达式for( ; ; ) printf(这将不断进展下去这将不断进展下去); i = getchar(); if(i = X | i = x)break; l即不为循环变量赋初值,不设置循环条件(以为表达式2为真值),不修正循环变量的值,无终止地执行循环体。此时应在循环体内设法终了循环,否那么会成为死循环v阐明:vexpr1也可以是给其它变量赋初值;expr1和expr3也可以是逗号表达式v例:for(sum=0,i=1;i=100;i+,i+)vfor(sum=0,i=1

15、;i=100;i=i+2)vfor语句可以转换成while构造expr1;while(expr2)循环体语句;expr3;例:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); 运转结果:abcdefghij例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); 例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 例:#include main( ) int i=0; for( ;i10; putchar(a+i),i+)

16、; main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); #includemain() char c; for(;(c=getchar()!=n;) printf(%c ,c);0+100=1001+99=1002+98=100 50+50=100 :数列:数列1 1、1 1、2 2、3 3、5 5、8 8、1313、2121、是著名的菲波那是著名的菲波那奇数列,其递推通项公式为:奇数列,其递推通项公式为:F1 F1 F2 F2 Fn Fn Fn-1 Fn-1 Fn-2 Fn-2n=3n=3为求出第

17、为求出第N N项的值,请编写程序。项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第根据递推通项公式,可用递推法编写程序,计算第N N项的项的值。值。递推法:由初始的知条件开场,先计算出第递推法:由初始的知条件开场,先计算出第(N(N1)1)步的结果,步的结果,再利用前面知的再利用前面知的(N(N1)1)项结果,按照递推公式或遵照递项结果,按照递推公式或遵照递推规那么,推出第推规那么,推出第N N步结果。步结果。递推法是程序设计中最常用的方法之一,运用递推法必需递推法是程序设计中最常用的方法之一,运用递推法必需有明确的递推初始值和递推规那么递推公式。有明确的递推初始值和递推规那么

18、递推公式。 6.5 break、continue、goto语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或switch阐明:break只能终止并跳出最近一层的构造break不能用于循环语句和switch语句之外的任何其它语句之中continue语句语句功能:终了本次循环,跳过循环体中尚未执行功能:终了本次循环,跳过循环体中尚未执行的语句,进展下一次能否执行循环体的判别的语句,进展下一次能否执行循环体的判别仅用于循环语句中仅用于循环语句中break 语句语句跳出 for 循环for( ; ; ) printf(这将不断进展下去); i = getchar(); if(i

19、 = X | i = x)break; 跳出 while 循环while(1) if(x = 10)break; 跳出 do-while 循环do if (x = 10)break;while (x 15);continue 语句语句lcontinue 语句的作用是跳过循环体中剩余的语句语句的作用是跳过循环体中剩余的语句而执行下一次循环而执行下一次循环l对于对于while和和do-while循环,循环,continue 语句执行之语句执行之后的动作是条件判别;对于后的动作是条件判别;对于for循环,随后的动作循环,随后的动作是变量更新是变量更新 v功能:终了本次循环,跳过循环体中尚未执功能:终

20、了本次循环,跳过循环体中尚未执行的语句,进展下一次能否执行循环体的判别行的语句,进展下一次能否执行循环体的判别v仅用于循环语句中仅用于循环语句中continue 语句语句while() continue; 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) brea

21、k;printf(%d ,n); 100 101 103 104 106 107200100 101 :求:求555555555555的约数中最大的三位数是多少?的约数中最大的三位数是多少? 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=0 ) / if ( n%j=0 ) /* * 假设可

22、以整除假设可以整除j j,那么,那么j j是约数是约数 * */ / printf( printf(3 digits in %ld=%dn3 digits in %ld=%dn, n, j );, n, 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 in

23、teger:); scanf (%d, &j); scanf (%d, &j); if (j=0) / if (j=0) /* * 假设为负数假设为负数 * */ / continue; / continue; /* *那么终了本次循环,不进展后续操作那么终了本次循环,不进展后续操作* */ / count +; / count +; /* * 计数器计数器 * */ / sum += j; / sum += j; /* * 求累加和求累加和 * */ / if ( count ) if ( count ) printf(Plus numer:%d,average value:

24、%.2f, printf(Plus numer:%d,average value:%.2f, count, 1.0 count, 1.0* *sum/count);sum/count); else printf(Plus numer: 0, average value: 0); else printf(Plus numer: 0, average value: 0); :输入:输入1010个整数,求其中正数的个数及平均值,准个整数,求其中正数的个数及平均值,准确到小数点后两位。确到小数点后两位。gotogoto语句及用语句及用gotogoto构成循环构成循环lgoto语句普通格式: goto

25、语句标号; .标号:语句; n功能:使系统转向标号所在的语句行执行功能:使系统转向标号所在的语句行执行n阐明:语句标号用标识符表示,要符合标识符阐明:语句标号用标识符表示,要符合标识符命名规那么命名规那么goto loop;goto 255; #include main() int i,sum=0; i=1;loop: if(i=100) sum+=i; i+; goto loop; printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循环初值循环终值循环变量增值循环条件循环体n用用if if 和和gotogoto语句

26、构成循环语句构成循环C不主张运用不主张运用goto循环循环 从键盘输入一组数据,以从键盘输入一组数据,以0终了输入,终了输入,求数据和求数据和#include main() int number,sum=0;read_loop: scanf(%d,&number); if(!number) goto print_sum; sum+=number; goto read_loop;print_sum: printf(The total sum is %dn,sum);lC言语三种循环语句的特点如下:lfor和while先判别循环条件后执行循环体,l do-while语句先执行循环体后判别循

27、环条件。lwhile和do-while语句的条件表达式只需一个,l for语句有三个。lwhile、do-while、for可以相互交换运用。lwhile语句多用于不需求赋初值的或循环次数不定的情况。lfor语句多用于要赋初值或循环次数固定的情况。l do-while语句多用于至少要运转一次的循环控制。l循环语句可以嵌套,循环可以并列,但不能交叉。l为了保证循环体正常运转,应该特别留意:为了保证循环体正常运转,应该特别留意:l 循环控制条件循环控制条件l 控制条件的初始形状初始值控制条件的初始形状初始值l 循环体内部对控制条件的影响循环体内部对控制条件的影响l以上三个方面相互配合,相互影响,共

28、同完成循环控以上三个方面相互配合,相互影响,共同完成循环控制制6.7 循环的嵌套定义:一个循环体内又包含了另一个完好的循环构造三种循环可相互嵌套,层数不限(1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4) for( ; ;) do while(); 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); 程序举例内层循环终止内

29、层循环终止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;i+) printf(“ni=%dn,i); for(j=1;j=3;j+) printf(“j=%d,j); v嵌套循环的跳转制止:从外层跳入内层跳入同层的另一循环向上跳转v三种循环可相互嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程l:输出下三角形乘法九九

30、表。l 1 2 3 4 5 6 7 8 9l-l 1l 2 4l 3 6 9l 4 8 12 16l 5 10 15 20 25l 6 12 18 24 30 36l 7 14 21 28 35 42 49l 8 16 24 32 40 48 56 64l 9 18 27 36 45 54 63 72 81l 假设:行号为i ,列号为ji=6i=6j=5j=5i i* *j j(1=i=9)(1=i=9)(1=j=i)(1=j=i) 那么:第那么:第 i i 行中要输出行中要输出 j j 个乘积个乘积输出项输出项aij和行和行(i)、列、列(j)的关系的关系#include #include

31、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, i+); printf (n-n); printf (n-n); i=1; i=1; while ( i= 9 ) / while ( i= 9 ) /* * 行控制行控制 * */ / j = 1; / j = 1; /* * 列计数器置列计数器置1 1

32、* */ / while ( j = i ) / while ( j = i ) /* * 嵌套的二重循环。输出第嵌套的二重循环。输出第i i行行 * */ / printf (%4d, i printf (%4d, i* *j );j ); j +; / j +; /* * 列计数器列计数器+1 +1 * */ / printf (n); / printf (n); /* * 一行输出终了后,输出一行输出终了后,输出n n * */ / i +; / i +; /* * 行计数器行计数器+1 +1 * */ / 外层循环体执行外层循环体执行1次,内层循环要输出次,内层循环要输出1行行程序设计

33、的普通步骤1.分析题意,明确问题的性质 数值问题 / 非数值问题2.建立问题的描画模型 数学模型 / 过程模型3.设计/确定算法 数学问题:数值分析 非数学问题:数据构造 / 算法分析与设计普通方法:穷举 / 递推 / 递归 /.4.编程调试5.分析运转结果6-8 程序举例程序举例 :判别输入的整数能否是素数:判别输入的整数能否是素数算法算法 运用穷举法,从运用穷举法,从2 2开场尝试能否整除整数开场尝试能否整除整数m m。 #include #include “stdio.hstdio.h main() main() int m,i; int m,i; scanf( scanf(“%d%d,

34、&m);,&m); for(i=2;im;i+) for(i=2;i= m) if(i = m) printf( printf(“%d is a prinme number.n%d is a prinme number.n,m);,m); else else printf( printf(“%d is not a prinme number.n%d is not a prinme number.n,m);,m); l程序的优化程序的优化l 对于穷举法来说,为了提高程序的效率,就要减少尝试次数。对于穷举法来说,为了提高程序的效率,就要减少尝试次数。l#include #inclu

35、de “math.hmath.hlmain( )main( )l int m,i,k; int m,i,k;l scanf( scanf(“%d%d,&m);,&m);l k=sqrt(m); k=sqrt(m);l for(i=2;i=k;i+) for(i=2;i=k+1) printf( if(i=k+1) printf(“%d is a prime number.n%d is a prime number.n,m);,m);l else printf( else printf(“%d is not a prime number.n%d is not a prime nu

36、mber.n,m);,m);l 15 = 3 15 = 3 * * 5; 5;尝试尝试 15 % 3 15 % 3 以后,没有以后,没有必要再尝试必要再尝试 15 % 515 % 5。k k是尝试的终点。是尝试的终点。 :如何判别一个整数是另一个整数的平方:如何判别一个整数是另一个整数的平方 从键盘上恣意输入一个正整数,要求判别该正整数能否是另一个整数从键盘上恣意输入一个正整数,要求判别该正整数能否是另一个整数的平方。的平方。问题分析与算法设计问题分析与算法设计设:输入的正整数为设:输入的正整数为i i,假设,假设i i满足:满足:i = = m i = = m * * m m m m为整数为

37、整数00那么那么i i为整数为整数m m的平方。的平方。main( )main( ) int i, m; int i, m; scanf ( scanf (“%d%d, &i);, &i);for( m = 1; m for( m = 1; m * * m i; m + +) ; m i; m + +) ;if( i = = m if( i = = m * * m) m) printf( printf(“% d % d * * % d = % d n % d = % d n, i, i, m);, i, i, m); :抓交通肇事犯 一辆卡车违犯交通规那么,撞人后逃跑。现场有三

38、人目击事件,但都没有记住车号,只记下车号的一些特征: 甲说:牌照的前两位数字是一样的;乙说:牌照的后两位数字是一样的,但与前两位不同;丙是位数学家,说:四位的车号刚好是一个整数的平方。 请根据以上线索求出车号。问题分析与算法设计 按照标题的要求造出一个前两位数(i)一样、后两位数(j)一样且相互间又不同的整数。得到: 10i=9 0=j=31main( )main( ) int i,j,k,m; int i,j,k,m; for(i=1;i=9;i+) / for(i=1;i=9;i+) /* * i: i:车号前二位的取值车号前二位的取值 * */ / for(j=0;j=9;j+) / f

39、or(j=0;j=9;j+) /* * j: j:车号后二位的取值车号后二位的取值 * */ / if(i!=j) / if(i!=j) /* * 判别两位数字能否相异判别两位数字能否相异 * */ / k=i k=i* *1000+i1000+i* *100+j100+j* *10+j;10+j; for(m=31;m for(m=31;m* *mk;m+) ; mk;m+) ; if(m if(m * * m = = k) / m = = k) /* * 判别能否为整数的平方判别能否为整数的平方 * */ / printf(Lorry_No. is %d.n, k); printf(Lor

40、ry_No. is %d.n, k); 运转结果:运转结果:Lorry_No. is 7744.Lorry_No. is 7744.:百钱百鸡问题 中国古代数学家张丘建在他的中提出了著名的“百钱百鸡问题: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x + y + z = 100 5 x + 3 y + z / 3 = 100 取值范围:0 = x、y、z = 100 可以采用穷举法求解。main( )main( ) int x,y,z,j=0; int x,y,z,j=0; for(x=0

41、;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 if(x+y+z=100 & 5* *x+3x+3* *y+z/3=100 )y+z/3=100 ) p r i n t f ( % 2 d : c o c k = % 2 d h e n = % 2 d p r i n t f ( % 2 d : c o c k = % 2 d h e n = % 2 d chicken=%2dn, chick

42、en=%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应该可以被整除。lmain( )l int x,y,z,j=0;l for(x=0;x=100;x+)l for(y=0;y=100;y+)l for(z

43、=0;z=100;z+)l if(z%3= =0&x+y+z=100&5*x+3*y+z/3= =100 )l printf(%2d:cock=%2d hen=% 2 d chicken=%2dn,l +j,x,y,z);ll运转程序,正确的结果:l 1: cock= 0 hen=25 chicken=75l2: cock= 4 hen=18 chicken=78l3: cock= 8 hen=11 chicken=81l4: cock=12 hen= 4 chicken=84l l优化程序:优化程序:l main( ) main( )l int x, y, z, j=0; i

44、nt x, y, z, j=0;l for(x=0; x=20; x+) for(x=0; x=20; x+)l for(y=0; y=33; y+) for(y=0; y=33; y+)l for(z=0; z=100; z+) for(z=0; z=100; z+)l if(z%3=0&x+y+z=100 & 5 if(z%3=0&x+y+z=100 & 5* *x+3x+3* *y+z/3=100)y+z/3=100)l printf(%2d:cock=%2d hen=%2d chicken=%2dn, printf(%2d:cock=%2d hen=%2

45、d chicken=%2dn, l +j,x,y,z); +j,x,y,z);l l再优化再优化 程序:程序:l for(x=0; x=20; x+) for(x=0; x=20; x+)l for(y=0; y=(100-5 for(y=0; y=(100-5* *x)/3; y+)x)/3; y+)l z=100-x-y; z=100-x-y;l if( z%3=0 & 5 if( z%3=0 & 5* *x+3x+3* *y+z/3=100)y+z/3=100)l printf(%2d:cock=%2d hen=%2d chicken=%2dn, printf(%2d:c

46、ock=%2d hen=%2d chicken=%2dn,l +j,x,y,z); +j,x,y,z);l 穷举法的关键穷举法的关键数学模型数学模型适宜进展穷举的数学模型适宜进展穷举的数学模型决议程序能否正确决议程序能否正确穷举的范围穷举的范围明确的穷举终止条件明确的穷举终止条件决议穷举的效率,范围过大,那么效率太低。决议穷举的效率,范围过大,那么效率太低。:打印边长为m的正方型要求:从键盘输入m值,输出m行每行m个*号。例:输入m=4,输出的图形如下:* * * * * * * * * * * * *算法分析与设计:1. 输入m,2. 反复打印m行,每行打印m个 *; 加细: 1. 输入m;

47、 2. for ( k=1; k=m; k+) 打印一行中的 m 个 * ;l算法分析与设计:l 加细:l1. 输入m;l2. for( k=1; k=m; k+)l 打印 m 个 * ;l 换新行;l l 加细:l1. 输入m;l2. for( k=1; k=m; k+)l for( j=1; j=m; j+)l printf (“*);l printf(“n) ;l #include main ( ) int k, m, j; scanf( “%d, &m); for(k=1; k=m; k+) /* 控制打印m行 */ for(j=1; j=m; j+) /*打印一行中的m个*号

48、*/ printf (“*); printf(“n) ; 分析方法 逐渐求精法。对于复杂问题,不能够一下得到程序,可以先将简单的部分明确出来,再逐渐对复杂部分进展细化,一步一步推出程序。:打印数字魔方 要求:从键盘输入 m 值,输出 m 行的数字方阵。例:输入 m=5 ,输出的图形如下:1 2 3 4 5 2 3 4 5 13 4 5 1 24 5 1 2 35 1 2 3 4 分析: 1. 反复打印m行。 2. 2. 第第j j行的第一个数字为行的第一个数字为j j,之后依次递增,之后依次递增, 但以但以m m为模为模: : aij = ( i + j - 2 ) % m + 1 aij =

49、 ( 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, &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+ ) /* * 打印一行中的数字打印一行中的数字 *

50、 */ / 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(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和它本身整除的数。算法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论