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

下载本文档

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

文档简介

1、程序流程控制语句 习 题 课,流程控制语句习题课,本习题课的目的 通过程序复习基本语句 进行编程练习 通过例题开阔思路 介绍程序设计的基本思想 穷举法的基本思路和关键 输出简单图形,程序设计的一般步骤,分析题意,明确问题的性质 数值计算/事务处理/逻辑分析/等 建立问题的描述模型 数学模型/过程模型 设计/确定算法 数学问题:分析解/数值解的求解算法 非数学问题: 数据结构/算法分析与设计 一般方法:穷举/递推/递归/分治/回溯/. 编程调试 分析运行结果,如有必要,进一步优化,典型数值问题-例1,例1:怎样存钱获利最多 银行定期存款:假设不同期限的月息利率分别为: 0.63% 期限 一年 0

2、.66% 期限 二年 0.69% 期限 三年 0.75% 期限 五年 0.84% 期限 八年 利息本金月息利率12存款年限 现在某人手中有 2000 元,请通过计算选择一种存钱方案,使得钱存入银行 20 年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。,典型数值问题-例1,问题分析与算法设计 为了得到最多的利息,存入银行的钱应在到期时马上转存。由于存款的利率不同,所以不同的存款方法(年限组合)得到的利息也是不一样的。 设 2000 元存 20 年,其中 1年存 i1 次,2年存 i2 次,3年存 i3 次,5年存 i5 次,8年存 i8 次,则到期时应得的本利合计: 2000

3、*(1+r1)i1*(1+r2)i2*(1+r3)i3*(1+r5)i5*(1+r8)i8 根据题意还可得到以下限制条件: 0 = i8 = 20/8 0 = i5 = (20-8*i8)/5 0 = i3 = (20-8*i8-5*i5)/3 0 = i2 = (20-8*i8-5*i5-3*i3)/2 0 = i1 = 20-8*i8-5*i5-3*i3-2*i2 可用穷举所有的i8、i5、i3、i2和i1的组合。,典型数值问题-例1,#include main( ) int i8,i5,i3,i2,i1,n8,n5, n3,n2,n1; float max=0, term; for (i

4、8=0; i8max ) /* 记录可能的年限组合 */ max=term; n1=i1; n2=i2; n3=i3; n5=i5; n8=i8; printf(%d,%d,%d,%d,%dn, n8, n5, n3, n2, n1); printf(Total: %.2fn, max); ,典型数值问题-例2,例1:从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。 问题分析与算法设计 设:输入的正整数为i,若i 满足: i=m*m (整数m 0) 则 i 为整数的平方。 可以采用试探的方法: 令 m 从1开始逐步增加进行试探。,m=m+1,成立,不成立,输入一个整数 i,

5、输出 m 和 i,开始,结束,设试探初值 m = 1,成立,不成立,典型数值问题-例2,scanf (”%d”, , int i, m;,典型数值问题-例2,#include ”stdio.h” int main ( ) int i, m; scanf(”%d”, ,for ( m=1; m*mi; m+) ;,如果采用 for 语句该如何修改?,表达式1,表达式2,表达式3,for 语句的循环体是什么?,循环体为空语句,典型数值问题-例3,例3:某地,车牌4位数字,首位非0.一辆卡车违犯交通规则逃逸。现场3人目击但都没有记住车号,只记得一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后

6、两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索尝试找出车号。 问题分析与算法设计 按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。 0 =31),典型数值问题-例3,0 =31),i = 9 ?,j = 0,成立,不成立,i = 1,k = 1100*i + 11*j,i != j ?,成立,不成立,k是平方?,成立,不成立,输出:k,i,j,j+,j = 9 ?,成立,不成立,i+,结束,for ( i=1; i=9; i+ ) ,for ( j=0; j=9; j+ ) ,if ( i != j ) ,

7、k=1100*i+11*j; 判断k是否平方;,典型数值问题-例3,#include ”stdio.h void main( ) int i, j, k, m; for (i=1; i=9; i+ ) /* i:车号前二位的取值 */ for (j=0; j=9; j+ ) /* j:车号后二位的取值 */ if ( i!=j ) /* 判断两位数字是否相异 */ k = i*1100+j*11; for ( m=31; m*mk; m+ ) /* 31*31=961 */ ; /* 判断是否为整数的平方 */ if ( m*m = k ) printf(Lorry_No. is %d.n,

8、k); 运行结果:Lorry_No. is 7744.,典型数值问题-例4-IQ游戏,设有一个数 X,当 X 加上100后得到的数 Y 是一个正整数的平方,然后用 Y 再加上68,又是另外一个正整数的平方,你能算出 X 为多少吗? 问题分析与算法设计 根据题目直接列方程: y = x + 100 y = m * m y + 68 = n * n 取值范围:x0;nm10的整数 采用穷举法求解。,典型数值问题-例4-IQ游戏,void main ( ) int x, y, m, flag; /* flag:标志变量 */ for ( x=0,flag=1; flag ; x+ ) /* 穷举x

9、*/ y = 100+x; /* 计算y */ for ( m=1; m*m y; m+ ) ; if ( m*m = y )/* 判断y是否为一个数的平方 */ for ( ; m*m y+68; m+ ) ; if ( m*m = y+68 ) /* 判断 y+68 */ printf(%dn, x); flag = 0; /* flag置0,结束循环 */ ,例200-IQ,典型数值问题-例4-IQ游戏1,void main ( ) int y, m, flag; /* flag:标志变量 */ for ( y=101,flag=1; flag; y+ ) /* 穷举y */ for (

10、 m=1; m*m y; m+ ) ; if ( m*m = y )/* 判断y是否为一个数的平方 */ for ( ; m*m y+68; m+ ) ; if ( m*m = y+68 ) /* 判断 y+68 */ printf(”%dn”, y-100); flag = 0; /* flag置0,结束循环 */ ,例200-IQ1,典型数值问题-例4-IQ游戏2,#include void main ( ) int m, n, flag; /* flag:标志变量 */ for ( m=10,flag=1; flag; m+ ) /* 通过穷举m,直接构造平方数 y */ for ( n

11、=1; n*n m*m+68; n+ ) ; /* 判断 m*m+68 是否为平方数 */ if ( n*n = m*m+68 ) printf(”%dn”, m*m-100); flag = 0; /* flag置0,结束循环 */ ,例200-IQ2,典型数值问题-例5,例3:求素数。求不超过整数n(n0)的最大素数。 问题分析与算法设计 素数:只能被1或自身整除的整数。 判断整数n是否为素数采用穷举法求解。 基本算法:若 k%m=0 则说明 k 不是素数。其中 m 的取值范围为:2k/2。,伪语言描述:标志变量flag,=1为素数,=0为合数。 for ( flag=1,m=2; fla

12、g ,典型数值问题-例5,例3:求素数。,成立,不成立,输入一个整数 n,k=k-1,开始,结束,设试探初值 k = n,是,不是,输出 k,判断k的性质,伪语言描述: scanf(”%d”, ,典型数值问题-例6,例4:百钱百鸡问题。中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 问题分析与算法设计 设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x+y+z=100 5x+3y+z/3=100 取值范围:0 = x、y、z = 100 可以采用穷举法求解。,将变量 x、y、z 的所有取值可能代入

13、方程进行计算,典型数值问题-例6,穷举法基本思路 当x=0,y=0,z=0时:是否满足方程 z=1时:是否满足方程 z=2时:是否满足方程 . z=100时:是否满足方程 当x=0,y=1,z=0时:是否满足方程 z=1时:是否满足方程 . z=100时:是否满足方程 当x=0,y=2,z=0时:是否满足方程 . 当x=100,y=100,z=100时:.,z=100,z+,z = 0,y=100,y+,y = 0,x=100,x+,x = 0,开始,结束,典型数值问题-例6,程序,#include void main( ) int x, y, z, j=0; for (x=0; x=100;

14、 x+) for (y=0; y=100; y+) for (z=0; z=100; z+) if ( x+y+z=100 ,典型数值问题-例6,#include void main( ) int x, y, z, j=0; for (x=0; x=100; x+) for (y=0; y=100; y+) for (z=0; z=100; z+) if ( x+y+z=100 ,x,运行结果: 1: cock= 0 hen=25 chicken=75 2: cock= 3 hen=20 chicken=77 3: cock= 4 hen=18 chicken=78 4: cock= 7 he

15、n=13 chicken=80 5: cock= 8 hen=11 chicken=81 6: cock=11 hen= 6 chicken=83 7: cock=12 hen= 4 chicken=84,例C3,典型数值问题-例6,丢失重要条件: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 运行程序,正确的结果: 1: cock= 0 hen=25 chicken=75 2: cock= 4 h

16、en=18 chicken=78 3: cock= 8 hen=11 chicken=81 4: cock=12 hen= 4 chicken=84,典型数值问题-例6,优化程序: for (x=0; x=20; x+) for (z=0; z100; z+=3) y = 100-x-z; if ( 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z ) ; 优化程序: for (x=0; x=20; x+) for (y=0; y=(100-5*x)/3; y+) z = 100-x-y; if ( z

17、%3=0 ,典型数值问题-百例8:借书方案知多少?,问题 小明有5本新书,要借给、三位小朋友,若每人每次只能借一本,则可有多少种不同的借法? 问题分析与算法设计 这是一个排列问题,即求从中取的排列数。 对5本书从1至5编号,假设三个人分别借这5本书中的1本。当 a=i 时,表示a借了编号为i的书。 当3个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。 假设:三个人为 a、b、c,则它们的取值范围为: 1 = a、b、c = 5 且当:a!=b for ( a=1; a=5; a+ ) for ( b=1; b=5; b+ ) for ( c=1; a!=b /* 60种 */,例C1

18、00_8,趣味程序百例40:三色球问题,问题 若一个口袋中放有 12 个球,其中有 3 个红的, 3 个白的和 6 个黑的,问从中任取 8 个共有多少种不同的颜色搭配? 问题分析与算法设计 设:任取的红球个数为i,白球个数为j,则黑球个数为: 8 - i - j 据题意红球 i和白球j个数的取值范围是 03, 在红球和白球个数确定的条件下,黑球个数取值应为 8-i-j=6。,趣味程序百例40:三色球问题,程序说明与注释 void main( ) int i, j, count=0; printf( RED BALL WHITE BALL BLACK BALLn); printf(-n); fo

19、r (i=0; i=3; i+) /* 任取红球的个数03 */ for (j=0; j=3; j+) /* 任取白球的个数03 */ if ( (8-i-j)=6 ) printf(%2d:%d %d %dn,+count,i, j, 8-i-j); ,例C100_40,趣味程序百例48:新娘和新郎,问题 三对情侣参加婚礼,三个新郎为、,三个新娘为、。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:说他将和结婚;说她的未婚夫是;说他将和结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。 问题分析与算法设计 设:a、b、c三人用1、2、3表示,将x和a结

20、婚表示为x1,将y不与a结婚表示为y!=1。则: x!=1 不与结婚 x!=3 的未婚夫不是 z!=3 不与结婚 题意还隐含:x!=y 且 x!=z 且 y!=z,趣味程序百例48:新娘和新郎,程序与说明 void main ( ) int x, y, z; for (x=1; x=3; x+) /* 穷举X的全部可能配偶 */ for (y=1; y=3; y+) /* 穷举Y的全部可能配偶 */ for (z=1; z=3; z+) /* 穷举Z的全部可能配偶 */ if (x!=1 ,例C100_48,典型数值问题-穷举法的关键,数学模型 适宜进行穷举的数学模型 决定程序是否正确 穷举的

21、范围 明确的穷举终止条件 决定穷举的效率,范围过大,则效率太低。,典型非数值(图型)问题-例1,例1:在一行中输出 m 个 * 号。 要求:从键盘输入m值,输出一行 m 个*号。 例:输入 m=4,输出的图形如下: * * * *,基本语句: 输出一个 * 号:ptintf(”*”); 或 putchar(*); 基本算法: 1.输入 m 2.重复输出 m 个 *; 3.输出一个 n,scanf (”%d”, ,典型非数值(图型)问题-例1,#include int main ( ) int m; scanf (”%d”, ,#include void main ( ) int m; scan

22、f (”%d”, ,C语言中的一行都是以 n 为标志,典型非数值(图型)问题-例2,例2:输出边长为 m 的正方型 要求:从键盘输入 m 值,输出 m 行每行 m 个*号。 例:输入 m=4,输出的图形如下: * * * * * * * * * * * * * * * * 算法分析与设计: 1. 输入 m , 2. 重复输出 m 行,每行输出 m 个 *; 细化1: 1. 输入 m ; 2. for ( k=1; k=m; k+ ) 输出一行中的 m 个 * ;,典型非数值(图型)问题-例2,细化2: 1. 输入m; 2. for ( k=1; k=m; k+ ) 输出 m 个 * ; 换新行

23、; 细化3: 1.输入m; 2. for ( k=1; k=m; k+ ) for ( j=1; j=m; j+ ) printf (”*”); printf(”n”) ; ,典型非数值(图型)问题-例2,整理,得到程序如下: #include void main ( ) int k, m, j; scanf( ”%d”, j+ ) /* 输出一行中的m个*号 */ printf(”*”); printf(”n”); 分析方法逐步求精法 对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。,例C3_2,典型非数值(图型)问题-例3,

24、例3:输出边长为 m 的菱型 例:输入 m=4,输出的图形如下: * * * * * * * * * * * * * * * *,算法分析与设计: 在正方型每行 * 号的前面先多输出若干个空格。 对于第 k 行,0km,则应先输出 个空格。, ,m-k,典型非数值(图型)问题-例2,输出正方型程序: #include int main ( ) int k, m, j; scanf( ”%d”, ,for ( i=1; i=m-k; i+ ) printf(” ”);,int i;,典型非数值(图型)问题-例2,输出菱型程序: #include int main ( ) int k, m, j,

25、 i; scanf( ”%d”, ,典型非数值(图型)问题-例3,例3:从键盘输入h值,输出h行用*号组成等腰三角形。例:输入 h=4,输出的图形如下: * * * * * * * * * * * * * * * *,1 * 2 * * * 3 * * * * * 4 * * * * * * *,要输出 个 空格 和 个 *,分析: 1、按行输出。输出 h 行。 2、程序的关键是:找出每一行中要输出 空格 的数量和 * 的数量 3、对于图形中的第 k 行(1=k=h):,h-k,2k-1,典型非数值(图型)问题-例3,分析: 要输出 h-k 个 空格 和 2k-1 个 * 算法设计 1.输入

26、h; 2.重复打印h行。对于第 k 行,每行 h-k 个空格和 2k-1 个* 对第2步进行加细: 2.0 for ( k=1; k=h; k+ ) /* h行 */ 重复打印 h-k 个空格; 重复打印 2k-1 个 *; 换行; ,典型非数值(图型)问题-例3,程序: #include void main ( ) int h, k, j; scanf(”%d”, ,例C3_7302,怎样输出一个等腰梯型?,典型非数值(图型)问题-例3,* * * * * * * * * * * * * * * * h=4 换一个思路分析: 对于第 k 行 ( 1=k=h ): 需要输出 h+k-1 个字符

27、(空格 或 * 号) 对第 k 行的第j个字符,若 j=h-k 输出 空格 其它情况 输出 * 算法设计 for ( k=1; k=h; k+) /* 重复打印 h 行 */ for ( j=1; j=h+k-1; j+) /* 输出一行内的字符 */ if ( j=h-k ) 打印 空格; else 打印 * 号; 换行; ,典型非数值(图型)问题-例3,程序: #include void main ( ) int h, k, j; scanf(”%d”, ,例C3_73021,典型非数值(图型)问题-例4,例4:从键盘输入 h 值,输出用 * 号组成的正菱形。例:输入 h=4 ,输出的图形

28、如下: * * * * * * * * * * * * * * * * * * * * * * * * *,分析: 1. h为上三角形的高度,总行数为 。 2. 对于第 j 行,若要输出 m 个空格和 n 个*号。 3. 当 j=h 时,为上三角,则:m= , n= 4. 当 时,为下三角,则: m = n =,1 2 3 4 5 6 7,空格数量 3 *号数量 1 2 3 1 5 0 7 1 5 2 3 3 1,2h-1 h-j 2j-1 hj=2h-1 j-h 总宽度 - 空格 = 2h-1 - 2(j-h) = 4h-1-2j,典型非数值(图型)问题-例4,算法设计 for (j=1;

29、j=2*h-1; j+) 控制打印行 若 为上三角 j=h 则: m = h-j; n = 2j-1 否则:m = j-h; n = 4h-1-2j 重复打印 m 个 空格 重复打印 n 个 *; 换行; 加细循环体 if ( j=h ) m=h-j; n=2*j-1; else m=j-h; n=4*h-1-2*j; for ( k=1; k=m; k+ ) printf( ); for ( k=1; k=n; k+ ) printf(*); printf(n); ,典型非数值(图型)问题-例4,程序: #include void main ( ) int h, k, j, m, n ; p

30、rintf(Enter H:); scanf(%d, ,例C3_7303,典型非数值(图型)问题-例4,程序2: #include void main ( ) int h, k, j, m, n ; printf(Enter H:); scanf(%d, ,例C3_73031,典型非数值(图型)问题-例4,例4:从键盘输入 h 值,输出用 * 号组成的正菱形。例:输入 h=4 ,输出的图形如下: * * * * * * * * * * * * * * * * * * * * * * * * *,分析: 1. h为上三角形的高度,行范围 。 2. 对于第 j 行,若要输出 m 个空格和 n 个*

31、号。 3. 则:m = , n =,-3 -2 -1 0 1 2 3,空格数量 3 *号数量 1 2 3 1 5 0 7 1 5 2 3 3 1,-(h-1)h-1 |j| 2(h-m)-1,典型非数值(图型)问题-例4,程序3: #include void main ( ) int h, k, j, m, n ; printf(Enter H:); scanf(%d, ,例C3_73032,例5:打印数字魔方。要求:从键盘输入m,输出m行的数字方阵。例:输入 m=5 ,输出的图形如下: 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 分析:

32、 1. 重复打印m行。,典型非数值(图型)问题-例5,2. 第 i 行的第一个数字为 i,之后依次递增, 但以 m 为模: aij = ( i + j - 2 ) % m + 1,输出项 aij 与行i、列j的关系,典型非数值(图型)问题-例5,程序: #include void main ( ) int i, j, m ; printf(Enter M:); scanf(%d, ,例C3_7304,例6:打印回形方阵 要求:从键盘输入边长m,输出回形方阵。例:输入 m=5 ,m=6,输出的图形如下: 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 2 2 2 1 1

33、2 3 2 1 1 2 3 3 2 1 1 2 2 2 1 m=5 1 2 3 3 2 1 m=6 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 分析:关键是找出 aij 与行 i 和列 j 的关系,典型非数值(图型)问题-例6,将图形分为四个区: 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 2 2 2 1 1 2 3 2 1 1 2 3 3 2 1 1 2 2 2 1 m=5 1 2 3 3 2 1 m=6 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1,典型非数值(图型)问题-例6,1.i=(m+1)/2 j=(m+1)

34、/2 min(i,j),2.i(m+1)/2 min(i,m-j+1),3.i(m+1)/2 j=(m+1)/2 min(m-i+1,j),4.i(m+1)/2 j(m+1)/2 min(m-i+1,m-j+1),#define min(x,y) ( (x)(y) ? (x) : (y) ) void main ( ) int k, j, m; printf(Enter M:); scanf(%d, ,典型非数值(图型)问题-例6,例C3_7305,例7:打印数字三角形。输入高 m,输出如下图形: m=6 1 3 6 10 15 21 2 5 9 14 20 4 8 13 19 7 12 18

35、 11 17 16,典型非数值(图型)问题-例7,分析: 1.第 i 行打印 个数字;,m-i+1,2.若:a1,1=1 则:ai+1,1= (i=1),例:a21=a11+1=1+1=2 ,a61=a51+5=11+5=16 3.若: 已知ai,1,则:ai,j+1=,ai,1+i,例:a22=a21+2+1=2+2+1=5 ,a23=a22+2+2=5+2+2=9 a62=a61+6+1=16+6+1=23 , a63=a62+6+2=23+6+2=31,ai,j+i+j,1 2 3 4 5 6,1 2 3 4 5 6,递推公式 a1,1 = 1 当:i,j=1时 ai+1,1 = ai,

36、1+i ai,j+1 = ai,j+i+j,递推公式: a1,1 = 1 ai+1,1 = ai,1+i (i,j=1) ai,j+1 = ai,j+i+j 程序 void main ( ) int i, j, m, n, k=1; /* k 是第一列元素的值 */ scanf ( %d, /* 计算下一行中第1个元素 */ ,典型非数值(图型)问题-例7,例C3_7306,例8:打印0-360度的 sin(x) 曲线 -*- | * | * | * | * | * | * | * | * | * | * | * | * | * | * | * | * | * * * | * | * | *

37、| * | * | * | * | * | * | * | * | * | * | * | * | * | *,典型非数值(图型)问题-例8,程序的关键在于: 设计图形,算法分析: 1、坐标的 x 轴沿列 自顶向下,y 轴 自左向右 增加 2、屏幕每行为 80 列,y 轴以第 40 列为 0 点 3、sin(x) 的值在 -11 之间,图形中对应以 40 列为中心的 1070 列 4、将角度 0360 度以 10 度为一个步长等分,只考察37 个点 sin(x) 函数对应点的位置,即图形总共打印 37 行 算法设计: 设定义i、j分别控制行和列 1、则行对应的角度为:i*10/180*PAI

38、2、每行打印四种字符:空格、|、*、n 3、行对应的sin值的位置,及 * 的位置为: 40 + 30 * sin(i*10/180*PAI) | 在40列 n 要视 *、| 的位置决定(取“最远”的值),典型非数值(图型)问题-例8,典型非数值(图型)问题-例8,#define PAI 3.14159 void main( ) double x; int y, i, yy; for(i=1; iy ? 40 : y; /* 下一行要打印的字符总数 */ for (i=1; i=yy; i+) /* 控制输出图形中的一行 */ if (i=y) printf(*); /* i控制打印的列位置

39、*/ else if (i=40) printf(|);/* 打印中心的竖线 */ else printf( ); printf(n); ,例C3_7307,例9:打印cos(x)曲线 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,典型非数值(图型)问题-例9,算法分析 1、从图形看,x轴自左向右与行平行,y轴自下向上与列平行 2、在0360度区间内每一个 y 值有两个点,必须在 1 行中输出 2 个 *。利用图形的对称性,我们只考虑 0180 度的情况 3、若定义图形的总宽度

40、为 62 列,对应 0360 度的 x 轴 算法设计 1、程序中利用反余弦函数 acos 计算坐标(x,y)的对应关系。 2、对x点的坐标 m,则在同一行与之对称的180360度的 y 点的坐标就应为 62-m。 3、图中的 y 值从 1 -1 (自上向下),我们以 0.1 为一个步长,共考察21个 y 坐标,即打印21行。 4、每一行打印的字符可以分为 5 部分 第一个*号以前的空格、第一个*号、 第一个*号到第二个*号中间的空格、 第二个*号 回车符,典型非数值(图型)问题-例9,#include main( ) double y; int x, m; for(y=1; y=-1; y-=

41、0.1) /* y为列方向,1到-1 */ m = acos(y)*10; /* 计算y对应的弧度m */ for (x=1; xm; x+) printf( ); printf(*); /* 控制打印左侧的*号 */ for (; x62-m; x+) printf( ); printf(*n); /* 控制打印同一行中对称的右侧*号 */ ,典型非数值(图型)问题-例9,例C3_7308,趣味程序百例6:求1320的最后三位,问题分析与算法设计 最直接的方法:将13累乘20次后截取最后3位即可。 但由于整数的范围有限,不可能得到正确的结果。 乘积的最后三位只与乘数和被乘数的后三位有关 程序

42、说明与注释 main( ) int i, x, y, last=1; printf(Input X and Y (X*Y):); scanf (%d*%d, ,例C100_6,趣味程序百例18,问题 个位数为6且能被3整除的五位数共有多少? 问题分析与算法设计 满足条件的五位数的范围是10006、10016、.、99996。 设:基础数i=1000,通过计算i*10+6即可得到个位数为6的5位候选整数; 再判断该数能否被3整除。 使用穷举法。 1000 = i = 9999,趣味程序百例18,程序说明与注释 void main( ) long int i; int count=0; /* co

43、unt 统计满足条件的五位数的个数 */ for ( i=1000; i=9999; i+ ) if (!(i*10+6)%3) /* 判断能否整除 */ count+; printf(count=%dn, count ); ,例C100_18,趣味程序百例20:一个奇异三位数,问题 一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。 问题分析与算法设计 设七进制数形式为kji:则九进制表示的形式就为ijk。 取值范围: 1 = i、k = 6 0 = j = 6 将9进制数转化为十进制:,将7进制数转化为十进制:,i

44、*9*9 + j*9 + k,i + j*7 + k*7*7,使用穷举法,趣味程序百例20:一个奇异三位数,程序说明与注释 void main( ) int i,j,k; for (i=1; i7; i+) /* 穷举9进制的第1位数 */ for (j=0; j7; j+) /* 穷举9进制的第2位数 */ for (k=1; k7; k+)/* 穷举9进制的第3位数 */ if ( i*9*9+j*9+k = i+j*7+k*7*7 ) printf(%d%d%d(7)=%d%d%d(9)=%d(10)n, k,j,i, i,j,k, i*9*9+j*9+k ); 运行结果 503(7)

45、= 305(9) = 248(10),例C100_20,趣味程序百例21:4位反序数,问题 设N是一个4位数,它的9倍恰好是其反序数,求N。 反序数就是将整数的数字倒过来形成的整数。 例如:1234的反序数是4321。 问题分析与算法设计 设整数的千、百、十、个位为i、j、k、l,则满足: (i*103+j*102+10k+l)*9=(l*103+k*102+10j+i) 程序说明与注释 main ( ) int i; for (i=1002; i1111; i+) /* 穷举可能的值 */ if (i%10*1000+i/10%10*100+i/100%10*10+i/1000=i*9) p

46、rintf (The number is: %dn, i); ,例C100_21,趣味程序百例26:求3000以内的亲密数,问题 如果整数A的全部因子(包括1,不包括A本身)之和等于 B;且整数 B 的全部因子之和等于 A,则将整数 A 和 B 称为亲密数。 问题分析与算法设计 要判断数 a 是否有亲密数: 1.计算出 a 的全部因子的累加和为 b, 2.计算 b 的全部因子的累加和为 n, 3.判断:若 n 等于 a,则 a 和 b 是亲密数。 求整数所有因子的算法: 用 a 依次对 i (1=i=a/2) 进行模运算,若模运算结果等于 0,则 i 为a 的一个因子。,趣味程序百例26:,程

47、序说明与注释 void main( ) int a, i, b, n; for ( a=1; a3000; a+ ) for ( b=0, i=1; i=a/2; i+ ) /* 计算数a的因子 */ if ( ! ( a%i ) ) b += i; /* 因子之和存在 b 中 */ for ( n=0, i=1; i=b/2; i+ ) if ( !( b%i ) ) n += i; if ( n=a ,例C100_26,趣味程序百例30:求素数,问题 求1000以内的素数。 问题分析与算法设计 素数是仅能被和它自身整除的整数。 判断一个整数 n 是否为素数: 判断整数 n 能否被除和自身之外的任意整数整除,若都不能整除,则 n 为素数。 可以从开始,到该整数 n

温馨提示

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

评论

0/150

提交评论