1、1C 语言程序设计习题答案习题一 C 语言程序设计概述一、名词解释(1)程序 P1 (2)程序设计 P1 (3)机器语言 P1 (4)汇编程序 P2(5)高级语言 P2 (6)编译程序 P3 (7)解释程序 P3 (8)算法 P4(9)结构化的程序设计 P9二、简述题1. 设计程序时应遵循哪些基本原则?P4答:正确性、可靠性、简明性、有效性、可维护性、可移植性。2. 算法的要素是什么?算法具有哪些特点?答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。3. 算法的表示形式有哪几种?答:算法的表示形式有:自然语言、传统流程图、伪代码、结构
2、化的流程图(N_S 流程图,盒图)。4. 有哪三种基本结构?答:三种基本结构是:顺序结构、选择结构和循环结构。5. 传统流程图与 N-S流程图最大的区别是什么?答:N-S 流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。三、用传统流程图、N-S 图分别表示求解以下问题的算法。1. 有 3个数 a,b,c,要求按由大到小的顺序把它们输出。2. 依次将 10个数输入,求出其中最大的数和最小的数并输出。3. 求 1+2+3+100的值。 输入三个数 给 a,b,c如果 axYes Nomin = xn = n + 1输出 max,min 的值s=0; i=1当 i 小于等于
3、 100 时s=s+i; i = i+1;输出 s 的值s=1; i=1当 i 小于等于 10 时s=s*i; i = i+1;输出 s 的值24. 求 12310的值。5. 求下列分段函数的值。6. 求 100200 之间的所有素数。7. 求一元二次方程 ax2+bx+c=0的根。分别考虑 d=b2-4ac大于0、等于 0和小于 0三种情况。四、注释下面 C程序的各个组成部分。main() /*主函数 */ /*程序开始 */int a,k,m; /*定义三个用来存放整数的变量 */a=10; /*将整数 10赋值给变量a */k=2; /*将整数 2赋值给变量 k */m=1; /*将整数
4、 1赋值给变量 1 */a=(k+m)*k/(k-m); /*先求出算术表达式的值,并将其赋值给变量 a */printf(“%dn“,a); /*在屏幕上打印出变量 a 的值 */ /*程序结束 */习题二 数据类型、运算符与表达式一、选择题110:BCDCB DDBCA1120: ADDAA DBADCY= 3X (X=a else if(x100) n=3;else if(x10) n=2;else n=1;printf(“%dn“,n);5. 当一个人的月收入在 2000 元以下时免税;月收入在 2000 元到5000 元之间时,超过 2000 的部分纳税8%;月收入在 5000 元以
5、上时,2000 至5000 之间的部分纳税 8%,超过 5000 的部分纳税 15%。编写程序从键盘输入月收入 income,计算并输出应交税款 tax。答:程序参见文件 Cprogramxt4_4_5.c #include “stdio.h“main()int income;float tax;scanf(“%d“,if(income=100;k-)a=k/100;b=k/10%10;c=k%10;if(k=a*a*a+b*b*b+c*c*c) printf(“%5d“,k);/求最大或最小“水仙花数 ”时增加一个语句:break;printf(“n“);2. 编写程序,输出从公元1980
6、年至 2880年所有闰年的年号。每输出 5个年号换一行。答:程序参见文件 Cprogramxt5_4_02.c #include “stdio.h“main()int k,flag,n=0;for(k=1980;k0.00001);printf(“x=%f,f=%fn“,x,f);8. 用弦截法求高次方程 2x3-3x2+7x-13=0的根。答:程序参见文件 Cprogramxt5_4_08.c #include “stdio.h“#include “math.h“main()float a,b,c,fa,fb,fc;doprintf(“Enter a,b:“);scanf(“%f,%f“,f
7、a=2*a*a*a-3*a*a+7*a-13;fb=2*b*b*b-3*b*b+7*b-13;while(fa*fb0);doc=(a*fb-b*fa)/(fb-fa);fc=2*c*c*c-3*c*c+7*c-13;if(fa*fc0)a=c;fa=fc;elseb=c;fb=fc;while(fabs(fc)0.0001);printf(“x=%f,y=%fn“,c,fc);9. 有这样一些真分数:其分子和分母都是两位正整数,且分子的个位数与分母的十位数相同,如果把该分数的分子的个位数与分母的十位数同时去掉,所得到的新的分数正好与原分数的值相等,如26/65=2/5。试编程求出所有满足上述
8、条件的真分数。答:程序参见文件 Cprogramxt5_4_09.c #include “stdio.h“main()int a,b,c; /设这个分数为 ab/bcfor(a=1;aai) i+;elsewhile(si;j-)aj=aj-1;aj=s;for(i=0;i=j)ak+1=ak;k-;aj=bi;i+;18printf(“string3: %sn“,a);16. 将已按升序排列的两个字符串 a和b 中的字符按升序归并到字符数组c 中。答:程序参见文件 Cprogramxt6_3_16.c #include “stdio.h“#include “string.h“main()in
9、t i,j,k;char a81=“acdfhjklmopxz“;char b81=“abdnx“;char c81;printf(“string1: %sn“,a);printf(“string2: %sn“,b);i=0;j=0;k=0;while(ai!=0main() int n;for (n=1987;n#include float fun(float a,float b,float c)float f,s;s=(a+b+c)/2;if(scelsef=sqrt(s*(s-a)*(s-b)*(s-c);return f;main() float a,b,c;scanf(“%f%f%f
10、“,printf(“area is:%fn“,fun(a,b,c);3. 编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。答:程序参见文件 Cprogramxt7_3_03.c #include #include int fmax(int m,int n)int r;r=m%n;while (r!=0)20m=n;n=r;r=m%n;return n;int fmin(int m,int n) return m*n/fmax(m,n);main() int a,b;scanf(“%d%d“,printf(“fmax is:%dn“
11、,fmax(a,b);printf(“fmin is:%dn“,fmin(a,b);4. 编写函数,根据整型形参 m的值,计算公式t=1- - - 的值。例如,若 m=5,则应输出 0.536389。2*13*1答:程序参见文件 Cprogramxt7_3_04.c #include float fun(int m)float t=1;int i;for(i=2;ifloat fun(int m)int i;float s=0,t=1;for(i=1;idouble fun()int n; double pi=1,t=1;21n=1;dot=t*n/(2*n+1); pi=pi+t; n+;w
12、hile(t1e-5);return 2*pi;main() printf(“pi=%fn“,fun();7. 编一函数,判断某一整数是否为回文数,若是返回 1,否则返回 0。所谓回文数就是该数正读与反读是一样的。例如 12321就是一个回文数。答:程序参见文件 Cprogramxt7_3_07.c #include #include int huiwen(int m)int t,n=0;t=m;while(t)n+; t=t/10; /求出 M 是几位的数t=m;while(t)if(t/(int)pow(10,n-1)!=t%10) /比较其最高位和最低位return 0;elset=t%
13、(int)pow(10,n-1); /去掉其最高位t=t/10; /去掉其最低位n=n-2; /位数去掉了两位return 1;main() int x;scanf(“%d“,if (huiwen(x)printf(“%d is a huiwen!n“,x);elseprintf(“%d is not a huiwen!n“,x);8. 编写一个求水仙花数的函数,然后通过主函数调用该函数求 100到 999之间的全部水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如:153 就是一个水仙花数:153=1*1*1+5*5*5+3*3*3答:程序参见文件 Cprogramx
14、t7_3_08.c #include #include int fun8(int m)int a,b,c;a=m/100; b=m/10%10; c=m%10;if(m=a*a*a+b*b*b+c*c*c)22return 1;elsereturn 0;main() int i;for(i=100;i#include void primedec(int m)int n=2;while(m1)while(m%n=0)printf(“%d “,n);m=m/n;n+;printf(“n“);main() int x; scanf(“%d“, primedec(x); 10. 求 100200 之间
15、的所有素数,按每行 6个输出。答:程序参见文件 Cprogramxt7_3_10.c #include #include int prime(int m)int n,f=1;for(n=2;n#include int reverse(int m)int x=0;while(m)x=x*10+m%10;m=m/10;return x;main() int w;scanf(“%d“,printf(“%d=%dn“,w,reverse(w);12. 编一函数,将一个字符数组中的数字字符存于另一个字符数组中。答:程序参见文件 Cprogramxt7_3_12.c #include #include v
16、oid fun12(char a,char b)int i=0,j;for(j=0;j=0char c;for(i=0;(c=si)!=0;i+)if(c= ) sp+;else if(c=0if(m=1)w=1;else w=fun14(m-1)+m;return w;main() int x,i;scanf(“%d“,printf(“1+2+.+%d=%dn“,x,fun14(x);15. 用递归的方法将一个整数转换成字符串。例如:输入 345,应输出字符串“345”。答:程序参见文件 Cprogramxt7_3_15.c #include #include void fun15(int
17、m) if(m!=0)fun15(m/10);printf(“%c “,0+m%10);main() int x;scanf(“%d“,printf(“%d=“,x);fun15(x);printf(“n“);16. 用递归的方法计算下列函数的值:p(x,n)=x-x2+x3-x4+(-1)n-1xn n0答:程序参见文件 Cprogramxt7_3_16.c #include “stdio.h“#include “math.h“float p(float x,int n)float f;25if(n=0)f=0;elsef=p(x,n-1)+pow(-1,n-1)*pow(x,n);retu
18、rn f;main()printf(“p(2,3)=%f“,p(2,3);17. 采用递归的方法计算 x的 n次方。答:程序参见文件 Cprogramxt7_3_17.c #include “stdio.h“#include “math.h“float p(float x,int n)float f;if(n=0)f=1;elsef=p(x,n-1)*x;return f;main()printf(“p(2,8)=%f“,p(2,8);18. 根据勒让德多项式的定义计算 Pn(x)。n 和 x为任意正整数,把计算 Pn(x)定义成递归函数。1 n=0Pn(x) = x n=1(2n-1)Pn-
19、1(x)-(n-1)Pn-2(x)/n) n1 答:程序参见文件 Cprogramxt7_3_18.c #include “stdio.h“float p(float x,int n)float f;if(n=0)f=1;else if(n=1)f=x;elsef=(2*n-1)*p(x,n-1)-(n-1)*p(x,n-2)/n;return f;main()printf(“p(2,8)=%f“,p(2,8);习题八 用户标识符的作用域和存储类一选择题26110:ADBBC CABDB11-20: DBABC CCDAC二填空题1. 静态局部变量的作用域是 从定义点到函数体(或复合语句)结束
20、 。2. 凡在函数中未指定存储类别的变量,其隐含的存储类别为 auto 。3. 变量的作用域是指变量的有效范围,在作用域内可以引用该变量。按作用域来说,变量可分为 局部 变量和 全局 变量。4. 根据函数能否被其它源文件调用,函数可分为 外部函数和 静态(或内部)函数。5. 下列程序的输出结果是 2468 。#include #define MAX_COUNT 4void fun();main() int count; for(count=1; countstatic int a=5;main() printf(“a=%dn”,a); p1(); p2();p1() printf(“a*a=%
21、dn”,a*a); a=2;p2() printf(“a*a*a=%dn”,a*a*a);8. 下列程序的输出结果是 20,10 。#include main() int x=10; int x=20; printf(“%d,”,x); printf(“%dn”,x);9. 下列程序由两个文件组成,其运行结果是 x=2 。/* 文件 1 */int x;sub()x=4; /* 文件 2 */static int x=2;a=5a*a=25a*a*a=827main()sub();printf(“x=%dn”,x); 10. 下列程序由两个文件组成,其运行结果是 x=25,y=25 。/* 文
22、件 1 */#include int x=10;int y=10;void add(void) y=x+10; x*=2;main() extern void sub(); x+=5; add(); sub();printf(“x=%d,y=%dn”,x,y);/* 文件 2 */void sub(void) extern int x; x-=5;11. 下列程序由两个文件组成,其运行结果是 。/* 文件 1 */#include int x=10;int y=10;extern void sub();void add(void) int y=5; y=x+10; x*=2; printf(“
23、add:y=%d; ”,y);main() x+=5; add(); sub();printf(“main:x=%d; main:y=%dn”,x,y);/* 文件 2 */extern int x;void sub(void) int y=5; x-=y; printf(“sub:y=%d; ”,y);12. 下列程序由两个文件组成,其运行结果是 。/* 文件 1 */#include static int x=2;int y=3;extern void add2();void add1();main() add1(); add2();add1();add2();printf(“in mai
24、n x=%d y=%dn”,x,y);void add1(void) x+=2; y+=3; printf(“in add1 x=%d y=%d”,x,y);/* 文件 2 */static int x=10;void add2(void) extern int y; x+=10; y+=2; printf(“in add2 x=%d y=%dn”,x,y); 习题九 编译预处理一 选择题110: DDCBC CABBB 11-20: BBCBB 二 填空题add: y=25; sub:y=5; main: x=25; main: y=10in add1 x=4 y=6in add2 x=20
25、 y=8in add1 x=6 y=11in add2 x=30 y=13in main x=6 y=13281. 下列程序的输出结果是 1000 10 。#define N 10#define s(x) x*x#define f(x) (x*x)main() int i1,i2;i1=1000/s(N);i2=1000/f(N);printf(“%d %dn”,i1,i2);2. 设有如下宏定义:#define MYSWAP(z,x,y) z=x;x=y;y=z;以下程序段通过宏调用实现变量 a、b 内容交换,请填空。float a=5,b=16,c;MYSWAP( c ,a,b);3. 下
26、列程序的输出结果是 11 。#define NX 2+3#define NY NX*NXmain() int i=0,m=0; for(;i(y)?(x):(y)main() int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%dn”,t);5. 下列程序的输出结果是 MIN 。#define MAX(a,b) ab#define EQU(a,b) a=b#define MIN(a,b) avoid main() int m,n;printf(“enter two integers:n“);scanf(“%d%d“,printf(“remain
27、der=%dn“,R(m,n);2. 分别用函数和带参的宏,从 3个数中找出最大者。29#include #define MAX(a,b) (a)(b)?(a):(b) / implementation by MACROint max3(int a,int b,int c) /implementation by functionint m;m=ab?a:b;m=mc?m:c;return m;void main() int m,n,k;printf(“enter 3 integer:n“);scanf(“%d%d%d“,printf(“1. MACRO max=%dn“,MAX(MAX(m,n
28、),k);printf(“2. function max=%dn“,max3(m,n,k);3. 输入一个整数 m,判断它能否被 3整除。要求利用带参的宏实现。#include #define DIVIDEDBY3(m) (m)%3=0void main() int m;printf(“enter a integer:n“);scanf(“%d“,if(DIVIDEDBY3(m)printf(“%d is divided by 3n“,m);elseprintf(“%d is not divided by 3n“,m);习题十 指针一填空题1. 指针变量是把内存中另一个数据的 首地址 作为其值
29、的 变量。2. 能够直接赋值给指针变量的整数是 0 。3. 如果程序中已有定义:int k;1) 定义一个指向变量 k的指针变量 p的语句是 int *p= 。2) 通过指针变量,将数值 6赋值给 k的语句是 *p=6; 。3) 定义一个可以指向指针变量 p的变量 pp的语句是 int *pp; 。4) 通过赋值语句将 pp指向指针变量p 的语句是 pp= 。5) 通过指向指针的变量 pp,将 k的值增加一倍的语句是 (*pp)*=2; 。4. 当定义某函数时,有一个形参被说明成 int *类型,那么可以与之结合的实参类型可以是 整型数组名 、 指向整型数据的指针值 等。5. 以下程序的功能是
30、:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数 366。请填空。#include main( ) char *p,s6; int n; p=s; gets(p); n=*p-0;30while( *(p+ ) != 0) n=n*8+*p-0; printf(“%d n“,n); 二选择题110: BCADC AAABB 11-15: CBCDC 16. 以下 count函数的功能是统计substr 在母串 str中出现的次数。int count(char *str,char *substr) int i,j,k,num=0;for(i=0;
31、;i+)for( ,k=0;substrk=strj;k+,j+)if(substr =0)num+;break;return num; A) stri=substri B) stri!=0C) stri=0 D) strisubstri A) j=i+1 B) j=i C) j=i+10 D) j=1 A) k B) k+ C) k+1 D) +k17. 以下 Delblank函数的功能是删除字符串 s中的所有空格(包括 Tab、回车符和换行符)。void Delblank(char *s) int i,t;char c80;for(i=0,t=0; ;i+)if(!isspace( )ct
32、+=si;ct=0;strcpy(s,c); A) si B) !si C) si=0 D) si=0 A) s+i B) *ci C) *(s+i)=0 D) *(s+i)18. 以下 conj函数的功能是将两个字符串 s和t 连接起来。char *conj(char *s,char *t) char *p=s;while(*s) ;while(*t)*s= ;s+;t+;*s=0; ; A) s- B) s+ C) s D) *s A) *t B) t C) t- D) *t+ A) return s B) return t C) return p D) return p-t19. 下列程序的输出结果是 。#include main()int *k,*a,b=100;a= k=printf(“%dn”,*k);A) 运行出错 B) 100 C) a 的地址 D) b 的地址20. 下列程序的输出结果是 。