C语言程序设计习题答案 杜有福.doc
C语言程序设计习题答案习题一 C语言程序设计概述一、名词解释(1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2(5)高级语言P2 (6)编译程序P3 (7)解释程序P3 (8)算法P4(9)结构化的程序设计P9二、简述题1. 设计程序时应遵循哪些基本原则P4 答正确性、可靠性、简明性、有效性、可维护性、可移植性。2. 算法的要素是什么算法具有哪些特点 答算法的要素是操作与控制结构;算法的特点有有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。3. 算法的表示形式有哪几种答算法的表示形式有自然语言、传统流程图、伪代码、结构化的流程图(N_S流程图,盒图)。4. 有哪三种基本结构 答三种基本结构是顺序结构、选择结构和循环结构。5. 传统流程图与N-S流程图最大的区别是什么答N-S流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。三、用传统流程图、N-S图分别表示求解以下问题的算法。1. 有3个数a,b,c,要求按由大到小的顺序把它们输出。输入一个数给xmaxx;minx;n1;当n小于10时输入下一个数给x如果maxxYes Nomax x如果minxYes Nomin xn n 1输出max,min的值输入三个数给a,b,c如果abyes no将a与b的值互换 如果acYes no将a与c的值互换 如果bcyes no将b与c的值互换输出a,b,c的值2. 依次将10个数输入,求出其中最大的数和最小的数并输出。3. 求123100的值。 s1; i1当i小于等于10时ss*i; i i1;输出s的值s0; i1当i小于等于100时ssi; i i1;输出s的值4. 求12310的值。5. 求下列分段函数的值。输入一个数给x X1Yes noX1 x5Yes no yes noY3x y4x-1 y5x1 y6-3x输出s的值Y 3X (X1)4X-1 (X1)5X-16 (1X5)6-3X (X5) 6. 求100200之间的所有素数。i 100当i200时n2; flag1;当n i时i能否被n整除yes noflag0n n1flag1yes no输出i的值i i17. 求一元二次方程ax2bxc0的根。分别考虑db2-4ac大于0、等于0和小于0三种情况。四、注释下面C程序的各个组成部分。main /*主函数 */ /*程序开始 */ int a,k,m; /*定义三个用来存放整数的变量 */a10; /*将整数10赋值给变量a */k2; /*将整数2赋值给变量k */m1; /*将整数1赋值给变量1 */ akm*k/k-m; /*先求出算术表达式的值,并将其赋值给变量a */ printfdn,a; /*在屏幕上打印出变量a 的值 */ /*程序结束 */习题二 数据类型、运算符与表达式一、 选择题 110BCDCB DDBCA 1120 ADDAA DBADC 2128 DABAD CDD二、填空题1字母 L 或字母 l 2 字符或c 、 整数或d 3在程序运行过程中,其值可以在一定的范围内变化的量。4 0 5 小数形式 、 指数形式 6 关键字 、 预定义标识符 、 用户标识符 7 字母 、 数字 、 下划线 、 数字 8 18 9 2 、 1 、 30 10 双精度实数或double 11 赋值 、 逗号 、20、 20 、 20、 4 12 4 习题三 顺序程序设计一、 选择题 110BCCBC CCDCC 二、 填空题1. printf 、 scanf 2. l 注long的第1个字符3. 域宽,即在格式字符前加一个整数,如5d4. 0 5. e 、 g 6. 6 7. s 、 c 8. * 9. - 、 10. i 三、 编程题1. 编写程序,从键盘输入一个以秒为单位的时间数,将其换算成几小时几分几秒,然后进行输出。例如输入的时间为4258秒,则输出结果为1小时10分58秒。 答程序参见文件Cprogramxt3_3_01.cinclude stdio.hmainint x,h,m,s; scanfd, hx/3600; mx3600/60; sx60; printfdsdddn,x,h,m,s;2. 编写程序,读入三个整数给变量a、b、c,然后交换它们中的数,把a中原来的值给b,把b中原来的值给c,把c中原来的值给a。 答程序参见文件Cprogramxt3_3_02.cinclude stdio.hmainint a,b,c,t; printf a b c; scanfddd, printfad,bd,cdn,a,b,c; ta;ac;cb;bt; printfad,bd,cdn,a,b,c;习题四 选择结构程序设计一、 填空题1 1 、 0 2 3 x0 4 0,2 5 20 、 0 、 0 二、 选择题17DDCAD DC三、 程序阅读题1 595959 2 0.500000 3 1 4 2 5 6 6 a2,b1 7 pass warn 8. 1 四、 编程题1. 设a为整型变量且其值大于零,请将以下if语句改写成switch语句。 if a60 m1; else ifa70 m2; else ifa80 m3; else ifa90 m4; else m5; 答程序参见文件Cprogramxt4_4_1.c 或Cprogramxt4_4_1b.cinclude stdio.hmainint a,m; scanfd, switcha/10 case 0case 1case 2case 3 case 4case 5m1;break; case 6m2;break; case 7m3;break; case 8m4;break; defaultm5;break; printfmdn,m;Cprogramxt4_4_1b.cinclude stdio.hmainint a,m; scanfd, m0; switcha/10 defaultm; case 8m; case 7m; case 6m; case 5case 4case 3case 2 case 1case 0m; printfmdn,m;2. 编写程序,从键盘输入一个整数,打印出它是奇数还是偶数。 答程序参见文件Cprogramxt4_4_2.c include stdio.hmainint a; scanfd, ifa21 printfd is a odd number n,a; else printfd is a even number n,a;3. 编写程序,从键盘输入一个字符,判别它是否是小写字母,如果是,将它转换为大写字母;如果不是,不转换。然后输出最后得到的字符。 答程序参见文件Cprogramxt4_4_3.c include stdio.hmainchar ch; scanfc, ifcha chz chch-32; printfcn,ch;4. 编写程序,从键盘输入一个不多于4位的正整数,打印出它是几位数。 答程序参见文件Cprogramxt4_4_4.c include stdio.hmainint x,n; scanfd, ifx1000 n4; else ifx100 n3; else ifx10 n2; else n1; printfdn,n;5. 当一个人的月收入在2000元以下时免税;月收入在2000元到5000元之间时,超过2000的部分纳税8;月收入在5000元以上时,2000至5000之间的部分纳税8,超过5000的部分纳税15。编写程序从键盘输入月收入income,计算并输出应交税款tax。 答程序参见文件Cprogramxt4_4_5.c include stdio.hmainint income; float tax; scanfd, ifincome2000 tax0; else ifincome5000 tax0.08*income-2000; else tax0.08*5000-20000.15*income-5000; printftaxfn,tax;6. 回文是指正读和反读都一样的数或字符串。例如12321、55455、35553等都是回文。请编写一个程序,从键盘上读取一个包含五位数字的长整数,并判断它是否是回文。(提示用除法运算和求余运算把一个数的个位、十位、百位、千位等分别分离出来。) 答程序参见文件Cprogramxt4_4_6.c include stdio.hmainlong x; int a,b,d,e; scanfld, ax/10000; bx10000/1000; dx100/10; ex10; ifae bd printfld is huiwenn,x; else printfld is not huiwenn,x;习题五 循环结构程序设计一、 阅读题1 8 2 4321 3 X 4 -1 5 23 6 52 7 5 8 3 二、 填空题1 18 2 2 3 bi1 4 17 5 i9 、 j30 6 d1.0 、 kk1 、 k10 三、 选择题18ADDAB DDA四、 编程题1. 编写程序,打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方之和等于该数本身。例如,407是一个“水仙花数”,因为407430373。(注若将题意改为打印出最大的或最小的“水仙花数”,则应将循环语句作如何调整)。 答程序参见文件Cprogramxt5_4_01.c include stdio.hmainint a,b,c,k; fork100;k999;k 求最大的“水仙花数”改用fork999;k100;kak/100;bk/1010;ck10; ifka*a*ab*b*bc*c*c printf5d,k; 求最大或最小“水仙花数”时增加一个语句break; printfn;2. 编写程序,输出从公元1980年至2880年所有闰年的年号。每输出5个年号换一行。 答程序参见文件Cprogramxt5_4_02.c include stdio.hmainint k,flag,n0; fork1980;k2880;k flagk40k1000k4000; ifflag printf5d,k; n; ifn100 printfn; printfn;3. 编写程序,求1-35-7-99101的值。 答程序参见文件Cprogramxt5_4_03.c include stdio.hmainint n,t1,s1; forn3;n101;n2 t-t; sst*n; printfsdn,s;4. 编写程序,计算并输出下列级数的前n项之和Sn。n的值从键盘输入。 答程序参见文件Cprogramxt5_4_04.c include stdio.hmainint fz,fm,n,i; float s,t; fz2;fm1;s0; scanfd, fori1;in;i t1.0*fz/fm; sst; fzfzfm; fmfz-fm; printfsfn,s;5编写程序,求e的值e11/11/21/31/41/n 答程序参见文件Cprogramxt5_4_05.c include stdio.hvoid mainint n,i; float t,fm1,e1; scanfd, fori1;in;i fmfm*i; t1.0/fm; eet; printfnd,efn,n,e;6. 已知某球从80米高度自由落下,落地后反复弹起,每次弹起的高度都是上次高度的一半。求此球8次落地所经过的总路程。 答程序参见文件Cprogramxt5_4_06.c include stdio.hvoid mainint n; float s80,hs/2; forn2;n8;n ss2*h; hh/2; printfsfn,s;7. 用牛顿迭代法求高次方程fX2x3-4x25x-180的根。牛顿迭代公式为XnXn-1-fXn-1/fXn-1,其中fXn-1为导函数在点Xn-1的值。 答程序参见文件Cprogramxt5_4_07.c include stdio.hinclude math.hmainfloat x,f,f1; x8; x的初值可为任意值 dof2*x*x*x-4*x*x5*x-18; f16*x*x-8*x5; xx-f/f1;whilefabsf0.00001; printfxf,ffn,x,f;8. 用弦截法求高次方程2x3-3x27x-130的根。 答程序参见文件Cprogramxt5_4_08.c include stdio.hinclude math.hmainfloat a,b,c,fa,fb,fc; do printfEnter a,b; scanff,f, fa2*a*a*a-3*a*a7*a-13; fb2*b*b*b-3*b*b7*b-13; whilefa*fb0; do ca*fb-b*fa/fb-fa; fc2*c*c*c-3*c*c7*c-13; iffa*fc0 ac;fafc; else bc;fbfc; whilefabsfc0.0001; printfxf,yfn,c,fc;9. 有这样一些真分数其分子和分母都是两位正整数,且分子的个位数与分母的十位数相同,如果把该分数的分子的个位数与分母的十位数同时去掉,所得到的新的分数正好与原分数的值相等,如26/652/5。试编程求出所有满足上述条件的真分数。 答程序参见文件Cprogramxt5_4_09.c include stdio.hmainint a,b,c; 设这个分数为ab/bc fora1;a9;a forb1;b9;b forc1;c9;c ifac1.0*a/ca*10.0b/b*10.0c printfd/ddd/ddfn,a,c,a,b,b,c,1.0*a/c;10. 编写程序,求数列1、(11/2)、(11/21/3)、(11/21/31/4)、(11/21/31/41/5)的前10项之和。 答程序参见文件Cprogramxt5_4_10.c include stdio.hmainfloat s,t; int i; s0,t0; fori1;i10;i tt1.0/i; sst; printfsfn,s;11. 编写程序,求3到100之间的所有素数之和。 答程序参见文件Cprogramxt5_4_11.c include stdio.hmainint s,i,k,flag; s0; fori3;i100;i flag1; fork2;ki;k ifik0 flag0;break; ifflag ssi;printf4d,i; printfnsumdn,s;12. 编写程序,求Fibonacci数列中大于800的最小的一个数。 答程序参见文件Cprogramxt5_4_12.c include stdio.hvoid mainint f11,f21,f3; whilef3800 f3f1f2; f1f2; f2f3; printfFibonacci数列中大于800的最小数是5dn,f3;习题六 数组一、 选择题110 BDBCD CDBAB1120BCDCC DABBC2130CCADC ABBCB3141BDDDD CDCCB A二、 填空题1 9 、 0 2 先行后列 3 连续的存储空间中 4 QuickC 5. cgetchar 、 Ai或65i 6. 0 、 str1i-str2i 7 CDABC 8 10 14 9 6 10 1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 111 600 12 AzyD 13 4 some string *test 三、 编程题1. 定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。 答程序参见文件Cprogramxt6_3_01.c include stdio.hinclude math.hmainint i,s00,s10,a20; fori0;i20;i airand100; fori0;i20;i2printf3d,ai; s0s0ai; printf sum isd avefn,s0,s0/10.0; fori1;i20;i2printf3d,ai; s1s1ai; printf sum isd avefn,s1,s1/10.0; 2. 设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第一次出现的位置,否则,输出no found。 答程序参见文件Cprogramxt6_3_02.c include stdio.hinclude math.hmainint i,s,a20; fori0;i20;i airand100; scanfd, fori0;i20;iifaisprintffoundaddn,i,ai; break; ifi20 printfno foundn; fori0;i20;iprintf3d,ai; printfn;3. 设有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入到数组中。 答程序参见文件Cprogramxt6_3_03.c include stdio.hdefine N 10mainint i,j,s; int aN1,3,5,7,9,11,13,15,17; int aN17,15,13,11,9,7,5,3,1; scanfd, i0; if a0a1 whilesai i; else whilesai i; forjN-1;ji;jajaj-1; ajs; fori0;iN;iprintf3d,ai; printfn;4. 编一程序,从一个已排好序的数组中删去某个位置上的元素。 答程序参见文件Cprogramxt6_3_04.c include stdio.hdefine N 10mainint i,j; int aN1,3,5,7,9,11,13,15,17,19; fori0;iN;iprintf3d,ai; printfn; scanfd, forji;jN-1;jajaj1; aj0; fori0;iN;iprintf3d,ai; printfn;5. 将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。 答程序参见文件Cprogramxt6_3_05.c include stdio.hmainint i,j; int a341,3,5,7,9,11,13,15,17,19,21,23,b43; fori0;i4;iforj0;j3;j bijaji; printfarray an; fori0;i3;iforj0;j4;j printf5d,aij; printfn; printfarray bn; fori0;i4;iforj0;j3;j printf5d,bij; printfn; 6. 编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列号。 答程序参见文件Cprogramxt6_3_06.c include stdio.hmainint i,j,flag; int a341,3,5,7,9,11,13,-15,17,19,-21,23; flag0; fori0;i3;i forj0;j4;j ifaij0flag1; printffoundadddn,i,j,aij; ij100;可使双重循环提前结束 ifflag0 printfno found ; printfarray an; fori0;i3;iforj0;j4;j printf5d,aij; printfn;7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。 答程序参见文件Cprogramxt6_3_07.c include stdio.hinclude string.hmainchar t,sABCDIVBHFBVCNLKFDB; int i,j,n; putss; nstrlens; fori0;in-1;i forji1;jn;j ifsisj tsi;sisj;sjt; putss;8. 输入一行字符,统计其中有多少个英语单词,单词之间用空格隔开。 答程序参见文件Cprogramxt6_3_08.c include stdio.hinclude string.hmainchar s81; int w,i,n; getss; i0;n0;w0; whilesi0 ifsi w0; /*end of a word*/ elseifw0w1;n; /*begin of a word*/ i; printfnumber of worddn,n;9. 编程将两个一维数组中的对应元素的值相减后进行输出。 答程序参见文件Cprogramxt6_3_09.c include stdio.hinclude math.hmainint i,a10,b10; fori0;i10;iairand100; printf4d,ai; printfn; fori0;i10;ibirand100; printf4d,bi; printfn; fori0;i10;i printf4d,ai-bi; printfn;10. 有n个无序的数放在数组a中,请将相同的那些数删得只剩得一个,输出经过删除后的数据。 答程序参见文件Cprogramxt6_3_10.c include stdio.hmainint i,j,k,a1090,20,40,30,50,50,50,50,20,80; fori0;i10;i printf4d,ai; printfn; fori0;i9;i forji1;j10;j ifajaiaj-888;k0;fori0;i10;i ifai-888 printf4d,ai; akai; 不相同的有效元素只有K个了 printfn; 11. 求二维数组中这样一个元素的位置它在行上最小,在列上也最小。如果没有这样的元素则输出相应的信息。 答程序参见文件Cprogramxt6_3_11.c include stdio.hinclude math.hmainint j,i,k,flag,fz0,a45; fori0;i4;i forj0;j5;j aijrand100; printf4d,aij; printfn; fori0;i4;i forj0;j5;j flag1; fork0;k5;k ifaikaij flag0;break; fork0;k4flag;k ifakjaij flag0;break; ifflag fz; printfmin adddn,i,j,aij; iffz0 printfno found;12. 在一个二维数组中形成并输出如下矩阵 1 1 1 1 1 2 1 1 1 1 A 3 2 1 1 1 4 3 2 1 1 5 4 3 2