5_习题课_程序流程控制_第1页
5_习题课_程序流程控制_第2页
5_习题课_程序流程控制_第3页
5_习题课_程序流程控制_第4页
5_习题课_程序流程控制_第5页
已阅读5页,还剩74页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、第 2 页l本习题课的目的本习题课的目的通过程序复习基本语句通过程序复习基本语句进行编程练习进行编程练习通过例题开阔思路通过例题开阔思路介绍程序设计的基本思想介绍程序设计的基本思想n穷举法的基本思路和关键穷举法的基本思路和关键n输出输出简单图形简单图形第 3 页1.分析题意,明确问题的性质分析题意,明确问题的性质数值计算数值计算/事务处理事务处理/逻辑分析逻辑分析/等等2.建立问题的描述模型建立问题的描述模型数学模型数学模型/过程模型过程模型3.设计设计/确定算法确定算法数学问题:分析解数学问题:分析解/数值解的求解算法数值解的求解算法非数学问题:非数学问题:n数据结构数据结构/算法分析与设计

2、算法分析与设计n一般方法:穷举一般方法:穷举/递推递推/递归递归/分治分治/回溯回溯/.4.编程调试编程调试5.分析运行结果,如有必要,进一步优化分析运行结果,如有必要,进一步优化第 4 页l例例1 1:怎样存钱获利最多:怎样存钱获利最多银行定期存款:假设不同期限的月息利率分别为:银行定期存款:假设不同期限的月息利率分别为:0.63% 0.63% 期限期限 一年一年0.66% 0.66% 期限期限 二年二年0.69% 0.69% 期限期限 三年三年0.75% 0.75% 期限期限 五年五年0.84% 0.84% 期限期限 八年八年利息本金月息利率利息本金月息利率1212存款年限存款年限现在某人

3、手中有现在某人手中有 2000 2000 元,请通过计算选择一种存钱元,请通过计算选择一种存钱方案,使得钱存入银行方案,使得钱存入银行 20 20 年后得到的利息最多(假年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。定银行对超过存款期限的那部分时间不付利息)。第 5 页l问题分析与算法设计问题分析与算法设计 为了得到最多的利息,存入银行的钱应在到期时马为了得到最多的利息,存入银行的钱应在到期时马上转存。由于存款的利率不同,所以不同的存款方上转存。由于存款的利率不同,所以不同的存款方法(年限组合)得到的利息也是不一样的。法(年限组合)得到的利息也是不一样的。l设设 2000

4、2000 元存元存 20 20 年,其中年,其中 1 1年存年存 i1 i1 次,次,2 2年存年存 i2 i2 次,次,3 3年存年存 i3 i3 次,次,5 5年存年存 i5 i5 次,次,8 8年存年存 i8 i8 次,次,则到期时应得的本利合计:则到期时应得的本利合计:20002000* *(1+(1+r1)r1)i1i1* *(1+r2)(1+r2)i2i2* *(1+r3)(1+r3)i3i3* *(1+r5)(1+r5)i5i5* *(1+r8)(1+r8)i8i8l根据题意还可得到以下限制条件:根据题意还可得到以下限制条件: 0 = 0 = i8 = 20/8i8 = 20/8

5、 0 = i5 = (20-8 0 = i5 = (20-8* *i8)/5i8)/5 0 = i3 = (20-8 0 = i3 = (20-8* *i8-5i8-5* *i5)/3i5)/3 0 = i2 = (20-8 0 = i2 = (20-8* *i8-5i8-5* *i5-3i5-3* *i3)/2i3)/2 0 = i1 = 20-8 0 = i1 = 20-8* *i8-5i8-5* *i5-3i5-3* *i3-2i3-2* *i2i2l可用穷举所有的可用穷举所有的i8i8、i5i5、i3i3、i2i2和和i1i1的组合。的组合。第 6 页# #include includ

6、e main( )main( ) int i8,i5,i3,i2,i1,n8,n5, n3,n2,n1; float max=0, term; int i8,i5,i3,i2,i1,n8,n5, n3,n2,n1; float max=0, term; forfor (i8=0; i8=20/8; i8+ ) (i8=0; i8=20/8; i8+ ) / /* * 穷举全部可能的存款方式穷举全部可能的存款方式 * */ / for ( i5=0; i5=(20-8for ( i5=0; i5=(20-8* *i8)/5; i5+ )i8)/5; i5+ ) for for ( i3=0; i

7、3=(20-8( i3=0; i3=(20-8* *i8-5i8-5* *i5)/3; i3+ )i5)/3; i3+ ) for for ( i2=0; i2=(20-8 ( i2=0; i2max ) ( termmax ) / /* * 记录可能的年限组合记录可能的年限组合 * */ / max=term; n1=i1; n2=i2; n3=i3; n5=i5; n8=i8;max=term; n1=i1; n2=i2; n3=i3; n5=i5; n8=i8; printf(%d printf(%d,%d,%d,%d,%dn, n8, n5, n3, n2, n1);%d,%d,%d,

8、%dn, n8, n5, n3, n2, n1); printf(Total: %.2fn, max); printf(Total: %.2fn, max); 第 7 页l例例1 1:从键盘上任意输从键盘上任意输入一个正整数,要求判入一个正整数,要求判断该正整数是否是另一断该正整数是否是另一个整数的平方。个整数的平方。l问题分析与算法设计问题分析与算法设计 设:输入的正整数为设:输入的正整数为i i,若若i i 满足:满足:i=m* *m (整数整数m 0) 则则 i 为整数的平方。为整数的平方。可以采用试探的方法可以采用试探的方法:令令 m 从从1开始逐步增开始逐步增加进行试探。加进行试探。

9、m*m i ?m=m+1成立成立不成立不成立输入一个整数输入一个整数 i输出输出 m 和和 i开始开始结束结束设试探初值设试探初值 m = 1m*m = i ?成立成立不成立不成立第 8 页scanf (”%d”, &i);m=0;while ( m*mi ) m+;if ( m*m=i ) printf(”%d%d”,m,i);m*m i ?m=m+1成立成立不成立不成立输入一个整数输入一个整数 i输出输出 m 和和 i开始开始结束结束设试探初值设试探初值 m = 1m*m = i ?成立成立不成立不成立 int i, m;第 9 页#include #include ”s st t

10、dio.hdio.h”int int main ( )main ( ) int i, m;int i, m;scanf(scanf(”%d%d”, &, &i i););m=1;while ( m*mi )m+;if ( m*m=i )printf printf ( (“%d%d* *%d=%dn%d=%dn”,m,m,m,m,i i);); return 0;return 0; forfor ( m=1; m ( m=1; m* *mi; m+) mi; m+) ;如果采用如果采用 for 语句该如何修改?语句该如何修改?表达式表达式1表达式表达式2表达式表达式3 for 语

11、句的语句的循环体循环体是什么?是什么?循环体为循环体为空语句空语句第 10 页l例例3 3:某地,车牌:某地,车牌4 4位数字,首位非位数字,首位非0.0.一辆卡车违犯一辆卡车违犯交通规则逃逸。现场交通规则逃逸。现场3 3人目击但都没有记住车号,只人目击但都没有记住车号,只记得一些特征。甲说:牌照的记得一些特征。甲说:牌照的前两位数字是相同的前两位数字是相同的;乙说:牌照的乙说:牌照的后两位数字是相同的后两位数字是相同的,但,但与前两位不与前两位不同同;丙是位数学家,他说:;丙是位数学家,他说:四位的车号刚好是一个四位的车号刚好是一个整数的平方整数的平方。请根据以上线索尝试找出车号。请根据以上

12、线索尝试找出车号。l问题分析与算法设计问题分析与算法设计 按照题目的要求造出一个前两位数按照题目的要求造出一个前两位数( (i)i)相同、后两位相同、后两位数数( (j)j)相同且相互间又不同的整数。相同且相互间又不同的整数。0 0 i =9i =90 = j =90 = j =31=31)第 11 页0 0 i i =9=90 = 0 = j j =9=31=31)i = 9 ?j = 0成立成立不成立不成立i = 1k = 1100*i + 11*ji != j ?成立成立不成立不成立k是平方是平方?成立成立不成立不成立输出:输出:k,i,jj+j = 9 ?成立成立不成立不成立i+结束结

13、束for ( i=1; i=9; i+ )for ( j=0; j=9; j+ )if ( i != j )k=1100*i+11*j;判断判断k是否平方是否平方;第 12 页 # #include include ”stdio.hstdio.hvoid main( )void main( )int i, j, k, m;int i, j, k, m; forfor (i=1; i=9; i+ ) (i=1; i=9; i+ ) / /* * i: i:车号前二位的取值车号前二位的取值 * */ / for for (j=0; j=9; j+ ) (j=0; j=9; j+ ) / /* *

14、j: j:车号后二位的取值车号后二位的取值 * */ / ifif ( i!=j ) ( i!=j ) / /* * 判断两位数字是否相异判断两位数字是否相异 * */ / k = ik = i* *1100+j1100+j* *11;11; for for ( m=31; m( m=31; m* *mk; m+ ) /m0 x0;nm10nm10的整数的整数 采用穷举法求解。采用穷举法求解。第 14 页void main (void main ( ) ) int x, y, m int x, y, m, , flag; flag; / /* * flag flag:标志变量:标志变量 * *

15、/ / for for ( x=0,flag=1; flag ; x+ )( x=0,flag=1; flag ; x+ ) / /* * 穷举穷举x x * */ / y = 100+x; y = 100+x; / /* * 计算计算y y * */ / forfor ( m=1; m ( m=1; m* *m y; m+ )m y; m+ ) ; ; if if ( m( m* *m m = y ) y )/ /* * 判断判断y y是否为一个数的平方是否为一个数的平方 * */ / forfor ( ; m ( ; m* *m y+68; m+ )m y+68; m+ ) ; ; ifi

16、f ( m ( m* *m m = y+68 ) y+68 ) / /* * 判断判断 y+68y+68 * */ / printf(%dn, x); printf(%dn, x); flag = 0; flag = 0; / /* * flag flag置置0 0,结束循环,结束循环 * */ / 第 15 页void main (void main ( ) ) int y, m int y, m, , flag; flag; / /* * flag flag:标志变量:标志变量 * */ / for for ( ( y y= =1 10101,flag=1; flag; ,flag=1;

17、flag; y y+ )+ ) / /* * 穷举穷举y y * */ / forfor ( m=1; m ( m=1; m* *m y; m+ )m y; m+ ) ; ; if if ( m( m* *m m = y ) y )/ /* * 判断判断y y是否为一个数的平方是否为一个数的平方 * */ / forfor ( ; m ( ; m* *m y+68; m+ )m y+68; m+ ) ; ; ifif ( m ( m* *m m = y+68 ) y+68 ) / /* * 判断判断 y+68y+68 * */ / printf( printf(”%dn%dn”, , y y-

18、100-100);); flag = 0; flag = 0; / /* * flag flag置置0 0,结束循环,结束循环 * */ / 第 16 页#include #include void main (void main ( ) ) int m int m, , n,n, flag; flag; / /* * flag flag:标志变量:标志变量 * */ / for for ( ( m m= =1 10,flag=1; flag; 0,flag=1; flag; m m+ )+ ) / /* * 通过穷举通过穷举m m,直接构造平方数,直接构造平方数 y y * */ / for

19、for ( ( n n=1=1; ; n n* *n n 0)n(n0)的最大素数。的最大素数。l问题分析与算法设计问题分析与算法设计素数:只能被素数:只能被1 1或自身整除的整数。或自身整除的整数。判断整数判断整数n n是否为素数是否为素数采用穷举法求解。采用穷举法求解。基本算法:基本算法:若若 k%mk%m=0 0 则说明则说明 k k 不是素数。其中不是素数。其中 m m 的取值范围为:的取值范围为:2 2k/2k/2。2 k 伪语言描述:伪语言描述:标志变量标志变量flagflag,=1=1为素数,为素数,=0=0为合数。为合数。forfor ( ( flagflag=1,m=2; =

20、1,m=2; flagflag & mk/2; m+ ) & m=2 ?成立成立不成立不成立输入一个整数输入一个整数 nk=k-1开始开始结束结束设试探初值设试探初值 k = nk是素数是素数?是是不是不是输出输出 k判断判断k的性质的性质伪语言描述:伪语言描述:scanf(scanf(”%d%d”, &n);, &n);k=n;k=n;while ( k=2 )while ( k=2 ) flagflag=1; m=2; =1; m=2; whilewhile ( ( flagflag & mk/2 ) & mk/2 ) if ( k % m

21、if ( k % m = = 0 )0 ) flagflag = 0; = 0; else m+; else m+; if (if (flagflag) ) 输出输出k,k,结束结束; ;else kelse k- -; ; 第 19 页l例例4 4:百钱百鸡问题。百钱百鸡问题。中国古代数学家张丘建在他的中国古代数学家张丘建在他的算经中提出了著名的算经中提出了著名的“百钱百鸡问题百钱百鸡问题”:鸡翁一,:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何百鸡,翁、母、雏各几何? ?l问题分析与算法设计问题分析与算法设计 设

22、:要买设:要买x x只公鸡,只公鸡,y y只母鸡,只母鸡,z z只小鸡,可得到方程只小鸡,可得到方程: :x+y+z=100 x+y+z=100 5x+3y+z/3=100 5x+3y+z/3=100 取值范围:取值范围:0 = 0 = x x、y y、z = 100z = 100 可以采用穷举法求解。可以采用穷举法求解。将变量将变量 x、y、z 的所有取值可能代入方程进行计算的所有取值可能代入方程进行计算第 20 页l穷举法基本思路穷举法基本思路当当x=0 x=0, ,y y= =0 0, ,z=0z=0时:是否满足方程时:是否满足方程 z=1z=1时:是否满足方程时:是否满足方程 z=2z

23、=2时:是否满足方程时:是否满足方程 . z=100z=100时:是否满足方程时:是否满足方程当当x=0 x=0, ,y y= =1 1, ,z=0z=0时:是否满足方程时:是否满足方程 z=1z=1时:是否满足方程时:是否满足方程 . z=100z=100时:是否满足方程时:是否满足方程当当x=0 x=0, ,y y= =2 2, ,z=0z=0时:是否满足方程时:是否满足方程 .当当x=100 x=100, ,y y= =100100, ,z=100z=100时:时:.z=100满足方满足方程?程?Y N输出输出z+z = 0y=100y+y = 0 x=100 x+x = 0开始开始结束

24、结束第 21 页l程序程序z=100满足方满足方程?程?Y N输出输出z+z = 0y=100y+y = 0 x=100 x+x = 0开始开始结束结束# #include include void main( )void 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+) forfor (y=0; y=100; y+) (y=0; y=100; y+) for for (z=0; z=100; z+) (z=0; z=100; z+) ifif ( x+y+z ( x+y+

25、z=100 &100 &5 5* *x+3x+3* *y+z/3=100 )y+z/3=100 ) printf(.,+j,x,y,z);printf(.,+j,x,y,z); 第 22 页# #include include void main( )void 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+) forfor (y=0; y=100; y+) (y=0; y=100; y+) for for (z=0; z=100; z+) (z=0; z=1

26、00; z+) ifif ( x+y+z( x+y+z=100 & 5100 & 5* *x+3x+3* *y+z/3y+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); 运行结果:运行结果: 1: 1: cock= 0 hen=25 chicken=75cock= 0 hen=25 chicken=75 2: cock= 3 hen=20 chicken=77 2: cock= 3 he

27、n=20 chicken=77 3: cock= 4 hen=18 chicken=78 3: cock= 4 hen=18 chicken=78 4: cock= 7 hen=13 chicken=80 4: cock= 7 hen=13 chicken=80 5: cock= 8 hen=11 chicken=81 5: cock= 8 hen=11 chicken=81 6: cock=11 hen= 6 chicken=83 6: cock=11 hen= 6 chicken=83 7: cock=12 hen= 4 chicken=84 7: cock=12 hen= 4 chick

28、en=84第 23 页l丢失重要条件:丢失重要条件:z 应该能够被应该能够被整除。整除。 #include void main( ) int x, y, z, j=0; for (x=0; x=20; x+) for (y=0; y=33; y+) for (z=0; z=100; z+) if ( z%3=0 & x+y+z=100 &5* *x+3* *y+z/3=100 ) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z ) ;l运行程序,正确的结果:运行程序,正确的结果: 1: cock= 0 hen=25 c

29、hicken=75 2: cock= 4 hen=18 chicken=78 3: cock= 8 hen=11 chicken=81 4: cock=12 hen= 4 chicken=84z+=3)第 24 页l优化程序:优化程序:forfor (x=0; x=20; x+) (x=0; x=20; x+) forfor (z=0; z100; z+=3)(z=0; z100; z+=3) y = 100-x-z; y = 100-x-z; if if ( 5( 5* *x+3x+3* *y+z/3y+z/3=100)100) printf(%2d:cock=%2d hen=%2d chi

30、cken=%2dn, printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z ) ; +j, x, y, z ) ; l优化程序:优化程序:forfor (x=0; x=20; x+) (x=0; x=20; x+) forfor (y=0; (y=0; y=(100-5y=(100-5* *x)/3x)/3; y+); y+) z = 100-x-y; z = 100-x-y; if if ( z%3 ( z%3=0 & 50 & 5* *x+3x+3* *y+z/3y+z/3=100)100) printf(%2d:coc

31、k=%2d hen=%2d chicken=%2dn, printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z ) ; +j, x, y, z ) ; 第 25 页百例百例8 8:借书方案知多少:借书方案知多少? ?l问题问题 小明有小明有5 5本新书,要借给、三位小朋友,若本新书,要借给、三位小朋友,若每人每次只能借一本,则可有多少种不同的借法?每人每次只能借一本,则可有多少种不同的借法?l问题分析与算法设计问题分析与算法设计 这是一个这是一个排列排列问题,即求从问题,即求从中取中取的排列数。的排列数。 对对5 5本书从本书从1 1至至5

32、5编号,假设三个人分别借这编号,假设三个人分别借这5 5本书本书中的中的1 1本。当本。当 a=i a=i 时,表示时,表示a a借了编号为借了编号为i i的书。的书。 当当3 3个人所借的书的编号都不相同时,就是满足个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。题意的一种借阅方法。假设:假设:三个人为三个人为 a a、b b、c c,则它们的取值范围为:则它们的取值范围为:1 = 1 = a a、b b、c c = 5 = 5且且当:当:a!=b & a!=c & b!=ca!=b & a!=c & b!=c 时,即为时,即为 1 1 种借书种借书

33、的方法。的方法。第 26 页百例百例8 8:借书方案知多少:借书方案知多少? ?l程序说明与注释程序说明与注释void main( )void main( )int a, b, c, count=0;int a, b, c, count=0; for for ( a=1; a=5; a+ ) ( a=1; a=5; a+ ) forfor ( b=1; b=5; b+ ) ( b=1; b=5; b+ ) forfor ( c=1; ( c=1; a!=ba!=b & c=5; c+) & c=5; c+) / /* * 当前两个人借不同的书时,当前两个人借不同的书时,穷举第三

34、个人的借本情况穷举第三个人的借本情况 * */ / ifif ( ( c!=ac!=a & & c!=bc!=b ) ) printf( count%8 printf( count%8 ? ? %2d:%d,%d,%d %2d:%d,%d,%d : : %2d:%d,%d,%dn,%2d:%d,%d,%dn,+count, a, b, c ); +count, a, b, c ); / /* * 60 60种种 * */ /第 27 页趣味程序趣味程序百例百例4040:三色球问题:三色球问题l问题问题若一个口袋中放有若一个口袋中放有 12 12 个球,其中有个球,其中有 3 3

35、 个个红红的,的, 3 3 个个白白的和的和 6 6 个个黑黑的,问从中任取的,问从中任取 8 8 个共有多少个共有多少种不同的颜色搭配?种不同的颜色搭配?l问题分析与算法设计问题分析与算法设计设:任取的红球个数为设:任取的红球个数为i i,白白球个数为球个数为j j,则黑球个则黑球个数为:数为:8 -8 - i i - - j j据题意红球据题意红球 i i和白球和白球j j个数的取值范围是个数的取值范围是 0 03 3,在红球和白球个数确定的条件下,黑球个数取值在红球和白球个数确定的条件下,黑球个数取值应为应为 8-8-i-i-j j=6 6。第 28 页趣味程序趣味程序百例百例4040:

36、三色球问题:三色球问题l程序说明与注释程序说明与注释void main( )void main( ) int i, j, count=0; int i, j, count=0; printf( RED BALL WHITE BALL BLACK BALLn); printf( RED BALL WHITE BALL BLACK BALLn); printf(-n); printf(-n); forfor (i=0; i=3; i+) (i=0; i=3; i+) / /* * 任取红球的个数任取红球的个数0 03 3 * */ / forfor (j=0; j=3; j+) (j=0; j=3

37、; j+) / /* * 任取白球的个数任取白球的个数0 03 3 * */ / ifif ( (8-i-j)=6 ) ( (8-i-j)=6 ) printf(%2d:%d %d %dn,+count,i, j, 8-i-j); printf(%2d:%d %d %dn,+count,i, j, 8-i-j); 第 29 页趣味程序趣味程序百例百例4848:新娘和新郎:新娘和新郎l问题问题三对情侣参加婚礼,三个新郎为、,三个三对情侣参加婚礼,三个新郎为、,三个新娘为、。有人不知道谁和谁结婚,于是新娘为、。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:询问了六位新人中

38、的三位,但听到的回答是这样的:说他将和结婚说他将和结婚;说她的未婚夫是说她的未婚夫是;说他说他将和结婚将和结婚。这人听后知道他们在开玩笑,全是假。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。话。请编程找出谁将和谁结婚。l问题分析与算法设计问题分析与算法设计设:设:a a、b b、c c三人用三人用1 1、2 2、3 3表示,将表示,将x x和和a a结婚表示结婚表示为为x x1 1,将将y y不与不与a a结婚表示为结婚表示为y y!=1!=1。则:。则: x!=1x!=1 不与结婚不与结婚 x!=3x!=3 的未婚夫不是的未婚夫不是 z!=3z!=3 不与结婚不与结婚题意还隐

39、含:题意还隐含:x!=y x!=y 且且 x!=z x!=z 且且 y!=zy!=z第 30 页趣味程序趣味程序百例百例4848:新娘和新郎:新娘和新郎l程序与说明程序与说明void main ( )void main ( )int x, y, z;int x, y, z; for (x=1; x=3; x+) for (x=1; x=3; x+) / /* * 穷举穷举X X的全部可能配偶的全部可能配偶 * */ / for (y=1; y=3; y+) for (y=1; y=3; y+) / /* * 穷举穷举Y Y的全部可能配偶的全部可能配偶 * */ / for (z=1; z=3;

40、 z+) for (z=1; z0) printf (”*”); m-;printf (”n”);第 33 页#include int main ( ) int m; scanf (”%d”, &m); while ( m0 ) printf (”*”); m-; printf (”n”); return 0;#include void main ( ) int m; scanf (”%d”, &m); for ( ; m0; m- ) printf (”*”); printf (”n”); return 0;C语言中的语言中的一行一行都是以都是以 n 为标志为标志第 34 页

41、l例例2 2:输出边长为输出边长为 m m 的正方型的正方型要求:从键盘输入要求:从键盘输入 m m 值,输出值,输出 m m 行每行行每行 m m 个个* *号。号。例:输入例:输入 m=4m=4,输出的图形如下:输出的图形如下:* * * * * * * * * * * * * * * * * * * * * * * * * * * * *l算法分析与设计:算法分析与设计:1. 1. 输入输入 m m ,2. 2. 重复输出重复输出 m m 行,每行行,每行输出输出 m m 个个 * *;细化细化1 1:1. 1. 输入输入 m m ;2. for ( k=1; k=2. for ( k=

42、1; k=m m; k+ ); k+ ) 输出输出一行中的一行中的 m m 个个 * * ;第 35 页细化细化2 2:1. 1. 输入输入m m;2. 2. for ( k=1; k=for ( k=1; k=m m; k+ ); k+ ) 输出输出 m m 个个 * * ;换新行换新行; ; 细化细化3 3:1.1.输入输入m m;2. 2. for ( k=1; k=for ( k=1; k=m m; k+ ); k+ ) for ( j=1; j=for ( j=1; j=m m; j+ ); j+ ) printf ( printf (”* *”) );printf(printf(”

43、nn”) ;) ; 第 36 页l整理,得到程序如下:整理,得到程序如下: # #include include void void main ( )main ( ) int k, m, jint k, m, j;scanf(scanf( ”%d%d”, &m ), &m );forfor ( k=1; k=m; k+ ) ( k=1; k=m; k+ ) / /* * 控制输出控制输出 m m 行行 * */ / forfor ( j=1; j=m; j+ ) ( j=1; j=m; j+ ) / /* * 输出输出一行中的一行中的m m个个* *号号 * */ /print

44、fprintf( (”* *”) ); printf(printf(”nn”) ); l分析方法分析方法逐步求精法逐步求精法 对于比较复杂问题,不可能一下得到程序,可对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。行细化,一步一步推出完整程序。第 37 页l例例3 3:输出边长为输出边长为 m m 的菱型的菱型例:输入例:输入 m=4m=4,输出的图形如下:输出的图形如下: * * * * * * * * * * * * * * * * * * * * * * * * * * * *

45、* * * *l算法分析与设计:算法分析与设计:在正方型每行在正方型每行 * * 号的前面先多输出若干个号的前面先多输出若干个空格空格。对于第对于第 k k 行,行,00k k m m,则应先输出则应先输出 个个空格空格。 m-m-k k第 38 页l输出正方型程序:输出正方型程序: # #include include int int main ( )main ( ) int k, m, jint k, m, j;scanf(scanf( ”%d%d”, &m ), &m );forfor ( k=1; k=m; k+ ) ( k=1; k=m; k+ ) / /* * 控制

46、输出控制输出 m m 行行 * */ / for for ( j=1; j=m; j+ ) ( j=1; j=m; j+ ) / /* * 输出输出一行中的一行中的m m个个* *号号 * */ /printfprintf( (”* *”) ); printf(printf(”nn”) ); return 0;return 0; forfor ( i=1; i=m-k; i+ ) ( i=1; i=m-k; i+ ) printf( printf(” ”); ); int i;int i;第 39 页l输出菱型程序:输出菱型程序: # #include include int int main

47、 ( )main ( ) int k, m, jint k, m, j, i, i;scanf(scanf( ”%d%d”, &m ), &m );forfor ( k=1; k=m; k+ ) ( k=1; k=m; k+ ) / /* * 控制输出控制输出 m m 行行 * */ / forfor ( i=1; i=m-k; i+) ( i=1; i=m-k; i+) / /* * 控制输出控制输出m-km-k个空格个空格 * */ / printf( printf(” ”); ); for for ( j=1; j=m; j+ ) ( j=1; j=m; j+ ) / /

48、* * 输出输出一行中的一行中的m m个个* *号号 * */ /printfprintf( (”* *”) ); printf(printf(”nn”) ); return 0;return 0; 第 40 页l例例3 3:从键盘输入:从键盘输入h h值,输出值,输出h h行用行用* *号组成等腰号组成等腰三角形。例:输入三角形。例:输入 h h=4=4,输出的图形如下:输出的图形如下:* * * * * * * * * * * * * * * * * * * * * * * * * * * * *1 1 * *2 2 * * * * * *3 3 * * * * * * * * * *4

49、4 * * * * * * * * * * * * * *要输出要输出 个个 空格空格 和和 个个 * *l分析:分析: 1 1、按行输出。输出、按行输出。输出 h h 行。行。 2 2、程序的关键是:找出每一行中要输出、程序的关键是:找出每一行中要输出 空格空格 的的数量和数量和 * * 的数量的数量 3 3、对于图形中的第、对于图形中的第 k k 行行(1=(1=k k=h)=h):h h- -k k2 2k k-1-1第 41 页l分析:分析: 要输出要输出 h-k h-k 个个 空格空格 和和 2 2k-1 k-1 个个 * *l算法设计算法设计1.1.输入输入 h;h;2.2.重复重

50、复打印打印h h行。对于第行。对于第 k k 行,行,每行每行 h h- -k k 个个空格空格和和 2 2k-1 k-1 个个* * 对第对第2 2步进行步进行加细加细: 2. 2.0 0 for ( k=1; k=h; k+ ) /for ( k=1; k=h; k+ ) /* * h h行行 * */ / 重复打印重复打印 h-kh-k 个空格;个空格; 重复打印重复打印 2 2k-1 k-1 个个 * *; 换行;换行; 第 42 页l程序:程序: # #include include void void main ( )main ( ) int h, k, j; int h, k,

51、j; scanf( scanf(”%d%d”, &, &h h);); forfor ( ( k k=1; =1; k k=h h; ; k k+ ) + ) / /* * 控制打印控制打印 h h 行行 * */ / forfor ( j=1; j= ( j=1; j=h h- -k k; j+ ) ; j+ ) / /* * 打印空格打印空格 * */ / printf(printf(” ”);); forfor ( j=1; j=2( j=1; j=2* *k k-1; j+ )/-1; j+ )/* * 打印打印 * * 号号 * */ / printf(printf(

52、”* *”) ); printf(printf(”nn”) ;) ; 怎样输出一个等腰梯型?怎样输出一个等腰梯型?第 43 页 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * h=4h=4l换一个思路分析:换一个思路分析: 对于第对于第 k k 行行 ( 1= ( 1=k k=h )=h ): 需要输出需要输出 h h+ +k k-1-1 个字符(个字符(空格空格 或或 * * 号)号) 对第对第 k k 行的第行的第j j个字符,个字符,若若 j=j=h h- -k k 输出输出 空格空格 其它情况其它情况 输出输出 *

53、 *l算法设计算法设计 for ( k=1; k=h; k+) for ( k=1; k=h; k+) / /* * 重复重复打印打印 h h 行行 * */ / for ( j=1; j=h+k-1; j+) for ( j=1; j=h+k-1; j+) / /* * 输出一行内的字符输出一行内的字符 * */ / if ( j=h-k ) if ( j=h-k ) 打印打印 空格空格; else else 打印打印 * * 号号; 换行;换行; 第 44 页l程序:程序: # #include include void void main ( )main ( ) int h, k, j;

54、 int h, k, j; scanf( scanf(”%d%d”, &, &h h);); forfor ( ( k k=1; =1; k k=h h; ; k k+ ) + ) / /* * 控制打印控制打印 h h 行行 * */ / for for (j=1;j=(j=1;j=h h+ +k k-1;j+-1;j+ ) ) / /* * 输出行内字符输出行内字符 * */ / ifif ( ( j j = h h- -k k ) printf( );) printf( ); elseelse printf(printf(* *);); printf(printf(”nn

55、”) ;) ; 第 45 页l例例4 4:从键盘输入:从键盘输入 h h 值,输出用值,输出用 * * 号组成的正菱号组成的正菱形。例:输入形。例:输入 h=4h=4 ,输出的图形如下:输出的图形如下: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *l分析:分析: 1. 1. h h为上三角形的高度,总行数为为上三角形的高度,总行数为 。 2. 2. 对于第对于第 j j 行行,若,若要输出要输出 m m 个空格和个空格和 n n 个个* *号

56、。号。 3. 3. 当当 j=j=h h 时,为上三角,则:时,为上三角,则:m m= , = , n n= = 4. 4. 当当 时,为下三角,则:时,为下三角,则: m m = = n n = =1234567空格数量空格数量 3 3 * *号数量号数量 1 1 2 3 2 3 1 5 1 5 0 7 0 7 1 5 1 5 2 3 2 3 3 1 3 1 2 2h-1h-1 h-j h-j 2j2j-1-1 hj=2hj=2h-1h-1 j-hj-h 总宽度总宽度 - - 空格空格 = = 2 2h h-1 - 2(j-h) -1 - 2(j-h) = = 4h-1-2j4h-1-2j第

57、 46 页l算法设计算法设计for (j=1; j=2for (j=1; j=2* *h-1; j+)h-1; j+) 控制打印行控制打印行 若若 为上三角为上三角 j=j=h h 则则: m m = = h-jh-j; n n = = 2j2j-1-1 否则否则:m m = = j-hj-h; n n = = 4h-1-2j4h-1-2j 重复打印重复打印 m m 个个 空格空格 重复打印重复打印 n n 个个 * *; 换行;换行; l加细循环体加细循环体 ifif ( j=h ) ( j=h ) m=h-j; n=2 m=h-j; n=2* *j-1; j-1; elseelse m=j

58、-h; n=4 m=j-h; n=4* *h-1-2h-1-2* *j; j; for for ( k=1; k=m; k+ ) printf( ); ( k=1; k=m; k+ ) printf( ); for for ( k=1; k=n; k+ ) printf( ( k=1; k=n; k+ ) printf(* *);); printf(n); printf(n); 第 47 页l程序:程序: # #include include void main ( )void main ( ) int h, k, j, m, n ; int h, k, j, m, n ; printf(En

59、ter H:); printf(Enter H:); scanf(%d, &h); scanf(%d, &h); forfor ( j=1; j=2 ( j=1; j=2* *h-1; j+ ) h-1; j+ ) / /* * 行控制行控制 * */ / ifif ( j=h ) ( j=h ) m=h-j; n=2 m=h-j; n=2* *j-1; j-1; elseelse m=j-h; n=4 m=j-h; n=4* *h-1-2h-1-2* *j; j; forfor ( k=1; k=m; k+ ) ( k=1; k=m; k+ ) / /* * 打印空格打印空格

60、 * */ / printf( );printf( ); for for ( k=1; k=n; k+ ) ( k=1; k=n; k+ ) / /* * 打印打印 * * * */ / printf(printf(* *);); printf(n); printf(n); 第 48 页l程序程序2: # #include include void main ( )void main ( ) int h, k, j, m, n ; int h, k, j, m, n ; printf(Enter H:); printf(Enter H:); scanf(%d, &h); scanf(%d, &h); forfor ( j=1; j=2 ( j=1; j=2* *h-1; j+ ) h-1; j+ ) / /* * 行控制行控制 * */ / ifif ( j=h ) ( j=h ) m=h-j; n=2 m=h-j; n=2* *j-1; j-1; elseelse m=j-h; n=4 m=j

温馨提示

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

评论

0/150

提交评论