《高级语言程序设计 编写程序题+答案.pdf》由会员分享,可在线阅读,更多相关《高级语言程序设计 编写程序题+答案.pdf(84页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1已知银行整存整取存款不同期限的月息利率分别为:0.315%期限一年0.330%期限二年月息利率=0.345%期限三年0.375%期限五年0.420%期限八年要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。2输入年份year和月month,求该月仃多少天。判断是否为闰年,可用如下C语言表达式:year%4=0&year%100!=0|year%400=0o若表达式成立(即表达式值为1),则year为闰年;否则,表 达式不成立(即值为0),year为平年。3编写一个简单计算器程序,输入格式为:datal opdata2其中datal和data2是参加运算的两个 数,op为运算符
2、,它的取值只能是+、-、*、九4输入n值,输出如图所示矩形。*图4.1 n=6时的矩形5输入n值,输出如图所示平行四边形。*图4.2 6时的平行四边形6输入n值,输出如图所示高为n的等腰3角形。*图4.3 n=6时的等腰三角形7输入n值,输出如图所示高为n的等腰3角形。*图4.4 n=6时的倒等腰三角形8输入n值,输出如图所示高和上底均为n的等腰梯形。*Us:瑟熹藕形*9输入n值,输出如图所示高和上底均为n的等腰空心梯形。*图4.6 5时的空心等腰梯形10输入n值,输出如图所示边长为n的空心正六边型。*图4.7 n=5时的空心正六边型11输入n值,输出如图所示图形。*图4.8 n=5时的X形1
3、2输入n值,输出如图所示图形。*图4.9 n=5时的Z形13输入n值,输出如图所示图形。*图4.10 n=3时的K形14输入n值,输出如图所示图形。*图4.12 n=5时的N形15输入n值,输出如图所示图形。*图4.12 n=3时的菱形16输入n值,输出如图所示图形。(例为n=6时)*图4.13 n=5时的上禊形17编写程序,输出如图所示sin(x)函数0到2tt的图形。-*-*18编写程序,在屏幕上输出一个由*号围成的空心圆。19编写程序,在屏幕上绘制如图余弦曲线和直线。若屏幕的横向为x轴,纵向为y轴,在屏幕上显示0360度的cos(x)曲线与直线x=f(y尸45*(y-l)+31的迭加图形
4、。其中cos图形用*表示,f(y)用+表示,在两个图形的交点 处则用f(y/l形的符号。*+*+*+*+*+*+*+*图4.15余弦曲线和直线20编写程序,输出如图所示高度为n的图形。123456789101112131415161718192021222324252627282930313233343536图4.16 n=6时的数字正方形21编写程序,输出如图所示高度为n的图形。1 3 6 10 15 212 5 9 14 204 8 13 197 12 1811 1716图4.17 n=6时的数字倒三角22输入n值,输出如图所示图形。1234511234111231111211111图4.
5、18 n=5时的数字矩形23输入n值,输出如图所示的nXn(nl),n a qX X X X 直到某一项A=0.000001时为止。输出最后C的值。35从键盘输入任意的字符,按下列规则进行分类计数。第一类O,T,2,3,4,5,6,7,8,9 第二类7,=第三类其它字符当输入字符时先计数,然后停止接收输入,打印计数的结果。36对从键盘上输入的行、单词和字符进行计数。我们将单词的定义进行化简,认为单词是不包含空格、制表符(t)及换行符的字符序列。例如:a+b+c,认为是1个单词,它由5个字符组成。又如:xyabc,为2个单词,6个 字符。一般用CTRL+D作为文件结束标记,其字符码值为-1,当输
6、入CTRL+D时表示文件输入结束,停止计数。37编写程序计算当x=0.5时下述级数和的近似值,使其误差小于某一指定的值ep述。n(例如:epsilon=0.000001):3 S TX XXX-+-+.3*1J 5*2!7*3!38编写程序计算下式的值:100 50 10 1Sk+Sk*k+S k=l k=l k=l k39编写程序计算下列序列的值:1111 11+-1X2 2X3 3X4 4 X5 NX(N+1)要求最后一项小于0.001时、或者当N=20时尚未达到精度要求,则停止计算。40已知求正弦sin(x)的近似值的多项式公式为:sin(x)=x+-+.+(-1)-+3!5!7!(2n
7、+l)1编写程序,要求输入*和,按上述公式计算sin(x)的近似值,要求计算的误差小于给定的。41从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。42输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。43编写程序,读入一个整数N;若N为非负数,则计算N到2XN之间的整数和;若N为一个负数,则求2XN到 N之间的整数和。分别利用for和while写出两个程序。44求解爱因斯坦数学题。有一一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩2阶,若每 步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶,若每步跨7阶,最
8、后才正好一阶不剩。请问,这条阶梯共 有多少阶?45一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。46编写程序,用二分法求一元二次方程2x3-4x2+3x-6=0在(10,10)区间的根。47中国古代科学家祖冲之采用正多边形逼近的割圆法求出了TT的值。请编写一程序,采用割圆法 求出TT的值,要求精确到小数点之后的第十位。48A、B、C、D、E五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡 觉。日上:竿,A第一个醒来,他将鱼分为五份
9、,把多余的一条鱼扔掉,拿走自己的一份。B第 二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按 同样的方法拿鱼。编写程序求出他们合伙至少捕了多少条鱼。49 一辆卡车违犯交通规则,撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些 特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。50若一个口袋中放有12个球,其中有3个红的,3个白的和6个黑的,每次从中任取8个球,编 写程序求出共有多少种不同的颜色搭配。51100匹马驮100担货,大马一匹驮3担,中马一匹
10、驮2担,小马两匹驮1担。试编写程序计算 大、中、小马的数目。52编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。53显示200以内的完全平方数和它们的个数。(完全平方数:A2+B2=C2,求A、B、C)54设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。55将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为 对称数。求不超过1993的最大的二进制的对称数。56编写程序求解下式中各字母所代表的数字。PEAR ARAPEA57 一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这
11、两个三位数的数码顺序正好相反,求这个三位数。58请验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和。59如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如 407=43+03+73就是一个阿姆斯特朗数。编写程序求1000以内的所有阿姆斯特朗数。60任意输入一个偶数,请将它分解为两个素数之和。61如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。62猜数游戏。由计算机想一个数请人猜,如果人猜对了,则结束游戏,否则计算机给出提
12、示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此可以反映出猜 数者猜的水平。63编写程序求出1000!后有多少个零。64求矩阵A2*3的转置矩阵B3*2O设矩阵A为:r 1 2 3-I r 1 4-IA=|I B=|25|L 4 5 6 J L 3 6 J65十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第 九个小孩14块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样儿次调整后大
13、家手中的糖的块数都一样?每人各 有多少块糖?66输入5 X5的数组,编写程序实现:求出对角线上各元素的和;求出对角线上行、列下标均为偶数的各元素的积;找出对角线上其值最大的元素和它在数组中的位置。67编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。68编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。69编写程序,输出1000以内的所有完数及其因子。所谓完数是指一个整数的值等于它的因子之和,例如6的因子是1、2、3,而6=1+2+3,故6是一个完数。70对数组A中的N(0N100=个整数从小到大进行连续编号,输出各个元素的编号。要求不 能改变数组A中
14、元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6)则 输出为:(3,1,2,5,1,3,4)71现将不超过2000的所有素数从小到大排成第一行,第二行上的每个数都等于它右肩上的素数 与左肩上的素数之差。请编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和 恰好是1898?假如存在的话,又有儿种这样的情况?第一行:2 3 5 7 1 1 13 17.1979 1987 1993 第二行:1 2 2 4 2 4.8 672将1、2、3、4、5、6、7、8、9九个数字分成一组,每个数字只能用一次,即每组:个数不许 有重复数字,也不许同其它组的:个数字重
15、复,要求将每组中的三位数组成一个完全平方数。73 一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个3位数,且这 两个三位数的数码顺序正好相反,求这个三位数。74使用数组精确计算M/N(0MN 1)个元素的一维数组中,数组的每个元 素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中,依次类推。这样可使用数组来表示计算的结果。75使用数组完成两个超长(长度小于1 0 0)正整数的加法。为了实现高精度的加法,可将正整数M存放在有N(N 1)个元素的一维数组中,数组的每个 元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中,依次类
16、推。这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。76使用数组完成两个超长(长度小于1 0 0)正整数的加法。为了实现高精度的加法,可将正整数M存放在有N(N 1)个元素的一维数组中,数组的每个 元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中,依次类推。这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。77使用数组完成两个超长(长度小于1 0 0)正整数的乘法。78马步遍历问题:已知国际象棋棋盘有8*8共64个格子。设计一个程序,使棋子从某位置开始跳马,能够把棋盘上的格子走遍。每个格子只允许走一次。79八皇后问题:在一个8 X 8的国际象棋盘
17、,有八个皇后,每个皇后占一格;要求棋盘上放上八个皇后时不会出 现相互攻击的现象,即不能有量个皇后在同一行、列或对角线上。问共有多少种不同的方法。80编制一个计算函数y=f(x)的值程序,其中:-X+2.5 0=x 2y=2-1.5(x-3)*(x-3)2=x 4x/2-1.5 4=x l)请编写递归程序实现。88编写函数,采用递归方法实现将输入的字符串按反序输出。89编写函数,采用递归方法在屏幕上显示如下杨辉:角形:11 11 2 113 3 1 14 6411 5 10 10 5 190编写函数,采用递归方法将任一整数转换为二进制形式。91设有字母a、b、c,请编程用递归的方法产生由这些字母
18、组成的,且长度为n的所有可能的字 符串。例如,输入n=2,则输出:aa ab ac ba bb be ca cb cc9 2将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称 它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。93从1到n(n1000)个自然数中选出r个数进行组合,并按指定的格式输出组合的结果。例如:n=5,r=3时,共有10种组合,运行程序,要按下面的格式输出:1 2 3453 454 52 3 454 53 4 5请用递归算法实现。94从键盘输入十个整数,用合并排序法对输入的数据按照从小到大的顺序进行排序,将排序后的
19、结果输出。95编写程序,读入一个以符号.结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:读入句子:MADAM IM ADAM,它是回文,所以输出:YES读入句子:ABCDBA).它不是回文,所以输出:NO96编写程序,其中包括一个函数,此函数的功能是:对一个长度为N的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M=80,K=N)。例如输入字符串We are poor students.,利用此函数进行删除poor的处理,输出处理后的字符串是We are students.%97编写函数,通过指针将一个字符串
20、反向。98编写一个函数insert(sl,s2,ch),实现在字符串si中的指定字符ch位置处插入字符串s2。99编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。100编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串:abcedabcdcd则输出:a=2 b=2 c=3 d=3 e=1 o101 利用结构:struct complx int real;int im;卜编写求两个复数之积的函数cmult,并利用该函数求下列复数之积:(1)(3+4i)X(5+6i)(10+20i)X(30+40i102编写成绩排序程序。按学生的序号输入
21、学生的成绩,按照分数由高到低的顺序输出学生的名 次、该名次的分数、相同名次的人数和学号;同名次的学号输出在同一行中,一行最多输出10个 学号。103编写程序,实现输入的时间屏幕显示一秒后的时间。显示格式为HH:MM:SS。程序需要处理 以下:种特殊情况:若秒数加1后为60,则秒数恢复到01分钟数增加1;若分钟数加1后为60,则分钟数恢复到0,小时数增加1;若小时数加1后为24,则小时数恢复到0。104编写程序,从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。105编写程序,从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一 个磁
22、盘文件test中保存。106编写程序,读入磁盘上C语言源程序文件test8.c,删去程序中的注释后显示。【编写程序题参考答案1参考答案:#include main()int year;float money,rate,total;/*money:本金 rate:月利率 total:本利合计*/printf(nInput money and year=?);scanf(n%f%du,&money,&year);/*输入本金和存款年限*/if(year=l)rate=0.003 15;/*根据年限确定利率*/else if(year=2)rate=0.00330;else if(year=3)ra
23、te=0.00345;else if(year=5)rate=0.00375;else if(year=8)rate=0.00420;else rate=0.0;total=money+money*rate*12*year;/*计算到期的本利合计*/printf(n Total=%.2fnn,total);2参考答案:#include main()int year,month,days;printf(uEnter year and month:1);scanf(,%d%dn,&year,&month);switch(month)case 1:case 3:case 5:case 7:case
24、8:case 10:case 12:days=31;break;/*处理“大”月*/case 4:case 6:case 9:case 11:days=30;break;/*处理“小”月*/case 2:if(year%4=0&year%100!=0|year%400=0)days=29;/*处理闰年平月*/else days=28;/*处理不是闰年平月*/break;default:printf(nInput error!nn);/*月份错误*/days=0;if(days!=0)printf(%d,%d is%d daysn,year,month,days);3参考答案:#include
25、main()float datal,data2;/*定义两个操作数变量*/char op;/*操作符*/printf(Enter your expression:);scanf(%f%c%f,&datal,&op,&data2);/*输入表达式*/switch(op)/*根据操作符分别进行处理*/case+:/*处理加法*/printf(%.2f+%.2f=%.2fn,datal,data2,datal+data2);break;case 处理减法*/printf(%.2f-%.2f=%.2fn,datal,data2,datal-data2);break;case:/*处理乘法*/print
26、f(%.2f*%.2f=%.2fn,datal,data2,datal*data2);break;case 7:/*处理除法*/if(data2=0)/*若除数为 0*/printf(Divis沁n by zeroAn);elseprintf(%.2f/%.2f=%.2fn,datal,data2,datal/data2);break;default:/*输入了其它运算符*/printf(Unknown operaterAn);)4分析:打印此图形用两重循环实现。图形要重复n行,故采用循环结构实现循环n次,循环体内部打印一行号,把上述思路表示为:for(i=l;i=n;i+)打印一行”号;每行
27、有n个”号,再采用循环结构实现n次循环,循环内部用格式输出语句打印一个”号,即:for(j=l;j=n;j+)printf(*);按照上述思路,实现打印矩形。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n;j+)printf(*);printf(n);)5分析:此图形和上题的区别在于在每一行先要打印空格,然后再打印n个3号,在上题第一层循环体内打印中号的 循环前面增加一个循环打印空格。每行空格的个数是逐行减少的,由于第一层循环的控制变量i是逐行增1,所以 用一个固定值的数
28、减去i就可实现对空格个数的控制,在此题中固定值可使用变量n。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n-i;j+)printf();forG=l:j=n;j+)printf(*);printf(n);)6分析:此题和上题的区别在于每行中的数量逐行减少,可以使用上题控制空格个数的思路来控制”号的个数,请 注意每行”的个数都是奇数。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;
29、i+)for(j=l;j=n-i;j+)printf();for(j=l;j=2*i-l;j+)printf(*);printf(n);)7分析:此题图形是第3题图形的垂直反转,在编程上我们可以变换一个思路。对于图形中的第i行(iWiWn),共需要输出2n-i个字符,其中前面的i-l个字符为空格,后面的字符为”号。按照这一思路可以编写出如下程序。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)/*重复输出图形的n行*/for(j=l;j=2*n-i;j+)/*重复输出图形一行中的每个字符*/if
30、G=i-l)printf();/*输出前面的空格*/else printf(*);/*输出后面的*号*/printf(n);)8分析:此题和第3题的区别仅是每行的“个数增加n-1个。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n-i;j+)printf();for(j=l;j=2*i-l+(n-l);j+)printf(*);printf(n);)9分析:对于空心图形,我们可以在上题的基础上,对于打印*号的循环进行修改,仅在循环开始值(j=l)和循环结 束值(j=2*(i
31、-l)+n)时打印”号,其它位置都打印空格。另一种思路是将每行打印的空格和“的两个循环合为一体考 虑,在判断出需要打印*的两个位置及第一行和最后一行相应位置外,其余位置都打印空格。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;jn-i+l&(i=l|i=n)printf(*);else printf();printf(*n);)10分析:此图形可以理解为两个空心梯形反向连接而成,因此可以利用上题的思路进行输出。参考答案:main()int i,j,n;printf(nPleas
32、e Enter n:);scanf(%d,&n);for(i=l;i=n;i+)/*输出图形的上半部分(含中心行)*/for(j=l;j=2*n-i-l;j+)if(j=i)printf(*);else printf();printf(*n);for(i=l;in;i+)/*输出图形的下半部分(不含中心行)*/for(j=l;j=n+i;j+)if(j=n-i)printf(*);else printf();printf(*n);11分析:此题与上题的区别在于打印”号的位置不同,编程时要找出应打印”号的位置和两个循环变量i、j以及行 数n的关系。参考答案:main()int i,j,n;pri
33、ntf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)/*输出图形的上半部分(含中心行)*/for(j=l;jn-i+l&i=l)printf(*);else printf();printf(*n);)for(i=l;in;i+)/*输出图形的下半部分(不含中心行)*/for(j=l;ji+l&i=n-l)printf(*);else printf();printf(*n);)12参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n
34、;j+)if(j=n-i+l|i=l|i=n)printf(*);else printf();printf(n);13参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)/*输出图形的上半部分(含中心行)*/for(j=l;j=n-i;j+)if(j=l|j=n-i+l)printf(*);else printf();printf(n);for(i=l;in;i+)/*输出图形的下半部分(不含中心行)*/for(j=l;j=i+l;j+)ifC=l|j=i+l)printf(*);else prin
35、tf();printf(n);)14参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n;j+)ifC=l llj=i|j=n)printf(*);else printf();printf(n);)15参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;jn-i)printf(*);else printf();printf(n);for(i=l;in;i+)for(j
36、=l;ji)printfC*);else printf():printf(n);)16参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n+i-2;j+)if(j=n-i+l)printfC*);else printf();printf(*n);)17分析:首先对图形进行设计,坐标的X轴和Y轴分别对应屏幕的列和行,一个正弦函数的周期为0360度,我 们把一个步长定义为10度,打印时每换一行等于函数的自变量增加10度;屏幕的列宽为80,函数值为0对应屏 幕的第40歹U,sin(x
37、)的值在-11,变换成列数为以0为中心的-3030,对应屏幕上第1070歹限设计程序时,控 制换行的自变量i乘以10得到正弦函数的X值,调用库函数sin()求出函数值再乘以30输出的列宽,因为我们以屏 幕的第40列为0点,故再加上40得到应在屏幕上显示的点。参考答案:#define PAI 3.1415 9#include main()double x;int y,i,yy;for(i=l;i80;i+)/*打印图形的第一行*/if(i=40)printf(*);/*i 控制打印的列位置*/else printf(-);printf(n);for(x=10.0;xy?40:y;/*下一行要打印
38、的字符总数*/for(i=l;i=yy;i+)/*控制输出图形中的一行*/if(i=y)printf(*);/*i 控制打印的列位置*/else if(i=40)printf(|)?/*打印中心的竖线*/else printf();printf(n);18分析:首先设计屏幕图形,如果预计圆形在屏幕上打印20行,所以定义圆的直径就是20,半径为10,圆的方 程是X2XY2=R2,因为图形不是从中心开始打印而是从边沿开始,所以Y从10变化到-10,根据方程求出X,对求得 的X值再根据屏幕行宽进行必要的调整得到应打印的屏幕位置。参考答案:#include main()double y;int x,m
39、;for(y=10;y=-10;y-)/*圆的半径为 10*/m=2.5*sqrt(100-y*y);/*计算行y对应的列坐标m*/for(x=l;x30-m;x+)printf():/*输出圆左侧的空白*/printf(*);/*输出圆的左侧*/for(;x30+m;x+)printf():/*输出圆的空心部分*/printf(*n);/*输出圆的右侧*/19参考答案:#include#include main()double y;int x,m,n,yy;for(yy=0;yy=20;yy+)y=0.1*yy;m=acos(l-y)*10;n=45*(y-l)+31;for(x=0;x=6
40、2;x+)if(x=m&x=n)printf(+);else if(x=n)printf(+);else if(x=m|x=62-m)printf(*);else printf();printf(n);)20分析:编程的关键为两点,一是使用控制输出的行和列,这方面的内容在前面已经叙述,另一点是输出的数字 和所在行、列关系。此题第一行输出的数字恰好是列数,从第二行起每行的数字均比上一行增n。参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)forO=l:j=n;j+)printf(%4d,(i-l)
41、*n+j);printf(n);21分析:此题的关键是找到输出数字和行、列数的关系。审查图形中每行中数字的关系发现,右边数字和前面数 字之差逐次增1;同列数字依然是这样的关系,编程的关键转换为找到每一行左方的第一个数字,然后利用行和列 的循环变量进行运算就可得到每个位置的数字。用ai,j此表示第i行第j列的数字,则all=l;由第i行第一列的数 字推出第i+1行第一列的数字是ai+1,1=ai,l+i;同样由第j列推出第j+1列的数字是ai,j+l=ai,j+i+j。另外只有当 ji时才输出数字。参考答案:main()int i,j,m,n,k=l;/*k 是第一列元素的值*/printf(P
42、lease enter m=);scanf(%d,&m);for(i=l;i=m;i+)n=k;/*n第i行中第1个元素的值*/for(j=l;j=m-i+l;j+)printf(%3d,n);n=n+i+j;/*计算同行下一个元素的值*/)printf(n);k=k+i;/*计算下一行中第1个元素*/)22参考答案:main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)forO=l;j=n;j+)ifC=i 且 j=n-i+l;下区:j=n-i+l;左区:ji 且 ji 且 jn-i+l。现在问题是,如果知道
43、一行在不同区域开始第一个位置的数字,然后该区后续的数字就可利用前面分析的规律得到。对于右区开始各行第一个数字最易求出,为4*(n-l)-i+lo后续一个和同行前一个数字之差是4*n-l-(j-l)*2+l,其中 方括号内是每边的数字个数。对角线上的数字是分区点,对角线上相临数字仍然相差一圈数字个数,读者自行分析得到计算公式。右区开始的第一个数字可以从上区结束时的数字按规律求出。下述程序用变量s保存分区对角线上的数字。参考答案一:main()int i,j,k,n,s,m,t;printf(Please enter n:);scanf(%d,&n);for(i=l;i=n;i+)s=(i=(n+
44、l)/2)?l:3*(n-(n-i)*2-l)+l;m=(i=(n+l)/2)?i:n-i+l;/*m-1 是外层圈数*/for(k=l;km;k+)s+=4*(n-2*k+l);for(j=l;j=n-i+l&j=i&ji&jn-i+l)/*右区*/t-=4*(n-2*(n-j+1)+1;if(ji&jn-i+l)/*左区*/if(j=l)t=4*(n-l)-i+2;else t+=4*(n-2*j+l)+l;printf(%4d,t);)printf(n);)方案二:根据本题图形的特点,我们可以构造一个递归算法。我们可以将边长为N的图形分为两部分:第一部分最外层的 框架,第二部分为中间的边
45、长为N-2的图形。对于边长为N的正方型,若其中每个元素的行号为i(liN),列号为j(ll)若令:ai,j=fun(ai-l,i-l+4(N-2i-l),当:iV(N+l)/2 且 j(N+l)/2 时,min=MIN(i,j),则有:a2,2=fun(al,l,min,min,n)ai,j=fun(a2,2,i-min+1,j-min+1,n-2*(min-l)我们可以根据上述原理,分别推导出i和j为其它取值范围时的min取值。根据上述递归公式,可以得到以下参考 程序。参考答案二:#include#define MIN(x,y)(xy)?(y):(x)fun(int al 1,int i,i
46、nt j,int n)int min,a22;if(i=j&i=l)return(all);else if(i=j&i=(n+l)/2&j=(n+l)/2)min=MIN(n-i+l,n-j+l);else if(i=(n+l)/2)min=MIN(i,n-j+l);else if(i=(n+l)/2&j(n+l)/2)min=MIN(n-i+l,j);else min=MIN(i,j);a22=fun(al l,min,min,n);retum(fun(a22,i-min+1,j-min+1,n-2*(min-l);main()int all=l,i,j,n;printf(nEnter n=
47、u);scanf(,%dM,&n);for(i=l;i=n;i+)for(j=l;j=n;j I I)printf(%4d,fun(all,i,j,n);printf(nnn);)24分析:此题的关键还是要找到输出数字aij和行列数i、j的关系。为此将图形分为四个区域如下图:3 3 3 3 33 2 2 2 33 2 12 33 2 2 2 33 3 3 3 3(此图n为5)在左上区域,即i=(n+l)/2、j=(n+l)/2时,输出数字为(n+l)/2-i+l和(n+l)/2-j+l中的大者,记为max(n+1)/2-i+1,(n+1)/2-j+1;在右上区,即 i(n+l)/2 时,输出数
48、字为 max(n+l)/2-i+l,j-n/2;在左下 区,即 i(n+l)/2、j(n+l)/2、j(n+l)/2 时,输出 数字为 maxi-n/2,j-n/2。参考答案:#define max(x,y)(x)(y)?(x):(y)main()int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n;j+)if(i=(n+l)/2)ifG=(n+l)/2)printf(%4d,max(n+l)/2-i+l,(n+l)/2-j+l);elseprintf(%4d,max(n+1)/2-i+1,j-n/
49、2);else if(j=(n+l)/2)printf(%4d,max(i-n/2,(n+l)/2-j+l);elseprintf(%4d,max(i-n/2,j-n/2);printf(n);25分析:前面我们已经见到过上下对称的图形,这是一个左右对称的图形,垂直中心线上的数字恰好是行号,在每行位于图形垂直中心线左方的数字是逐渐增加的,而右方是逐渐减小的。j=i是分区的标志,左方输出数字就是 列数j,而右方的数字从i开始逐步减小1。参考答案:main()int i,j;for(i=l;i=9;i+)for(j=l;j=9-i;j+)printf();for(j=l;j=l;j-)printf
50、(%2d,j);printf(n);)26分析:这类输出字符的图形和输出数字的图形考虑是近似的,因为字符的ASCH码就是一个整数。在字符码值 的变化过程中,应该注意应该判断码值是否超出字符的范围,进行必要的处理,为了保持程序的简洁,本题没有考 虑这个问题,在下题里对这个问题进行了处理。参考答案:main()char c=Z;int i,j,n;printf(nPlease Enter n:);scanf(%d,&n);for(i=l;i=n;i+)for(j=l;j=n+i-2;j+)if(j=n-i+l)printf(%c,c);else printf();printf(%cn,c-);)f