1、第 1 页 共 52 页C 语言答案()第一章 C 语言程序设计基础习题参考答案1-1 冯诺依曼体系结构的基本原理:五大构成部分:输入、输出、CPU、控制器、存储器;程序存储、自动执行、逻辑判断功能;二进制的信息表示。1-6 编辑、编译、链接、执行。1-7 必须有一个主函数,它是程序执行的起点;一个 C 语言程序由函数构成;每一条可执行语句都必须由分号结束;函数的代码段必须由花括号对括住。一个函数中的语句组由声明区和可执行语句区两部分构成。1-8 三个一缩;每遇到一个结构时均缩格,每结束一个结构时回退;缩格格式必须对齐。1-9 试给出以下问题的程序设计过程描述:1) 求两个数中之最大者。#in
2、cludeint main(void)float fA,fB;clrscr();printf(“Please input two values(fA,fB):“); /*输入要比较的两个数 fA,fB*/scanf(“%f,%f“, /*格式化输入 fA,fB*/if(fA=fB) printf(“the max is %f“,fA);if(fAint main(void)float fA,fB,fC,fMax;printf(“Please input three values(fA,fB,fC):“); /*fA,fB,fC 是输入的 3 个数,fMax 存放最大值*/scanf(“%f,%
3、f,%f“,fMax=fA;/* 假定 fA 最大*/if(fMaxint main(void)int i,nSum;/*声明变量 i,循环的总和*/for(i=1,nSum=0;iint main(void)float a,b;printf(“Please input two real values(a,b):“);scanf(“%f,%f“,printf(“n%f+|%f|=%fn“,a,b,b0?a+b:a-b);/*利用三元条件运算,详见 P52*/return 0;1-13 试编写一个在五个整数中找出最大数的程序。#include第 3 页 共 52 页int main(void)f
4、loat val_1,val_2,val_3,val_4,val_5,fMax;/*声明要比较的 5 个变量*/printf(“Please input 3 values(val_1,val_2,val_3,val_4,val_5):“);scanf(“%f,%f,%f,%f,%f“,fMax=val_1;/* 假设最大值为 val_1*/if(fMax#include/*包含数学函数文件,详见 P391*/int main(void)double val;printf(“Please input the value:“);scanf(“%f“,printf(“the result is %l
5、f“,cos(val);/*调用数学函数中的 double cos(double x)函数*/return 0;(2) log 90#include#includeint main(void)double val;printf(“Please input the val:“);scanf(“%lf“,printf(“the result is %lfn“,log(val);第 4 页 共 52 页return 0;(3) #include#includeint main(void)double val;printf(“Please input the value(val):“);scanf(“
6、%lf“,printf(“the result is %lfn“,sqrt(val);/*调用 double sqrt(double x)函数*/return 0;(4) #include#includeint main(void)double val;printf(“Please input the value(val):“);scanf(“%lf“,printf(“the result is %lf“,exp(val);/*调用 double exp(double x)函数*/return 0;1-16 见名知义;变量名和函数名小写,符号常量一般大写;多个单词构成标识符名时,一般单词的第一
7、个字母大写,或者用下划线连接;在不影响阅读的情况下,可以使用简单的符号变量名,如 a,b,c,d,x,y,z 等;注意一些容易混淆的字母的使用;匈牙利前缀数据类型表示法的运用及 i,j,k,l,m,n 的整型约定规则。第二章 C 语言中的数据类型及其基本操作习题参考答案2-1 为什么 C 的每个数据都必须属于某种特定的数据类型?解:变量存储空间中的值必须属于某种特定的数据类型才有意义,同时,数据的类型不同,其取值范围、所占存储空间大小、能够参加的运算类型等才有意义。例如:一个 char型数据占用一个字节空间,一个 float 型数据占用 4 个字节空间。另外,作为 C 语言中的数据类型,大部分
8、都可以用 signed, unsigned, long, short 进行修饰,以表示数据的取值范围和数据所占存储空间的字节数变化。2-2 浮点数和定点数的区别在哪里 ?第 5 页 共 52 页解:在于小数点位置是否固定不变。2-3 计算机中的数是精确的表示吗?解:不完全是。对整型数据,在不超出表示值范围时一般是精确表示的。对浮点数,则一般是不能精确表示。原因在于计算机内表示浮点数的存储空间大小是固定的,因此,它所能表示出来的精度是有限的。例如,无限循环小数 3.33333333333333333333333在计算机内部只能近似表示。2-4 为测试数据类型所占存储空间的大小,C 提供了专门的运
9、算符 sizeof(),它用于返回或计算给定数据变量或数据类型所占存储空间的大小。请编写程序能够测试 C 的基本数据类型所占存储空间的大小。解:这里以 int 型为例。其它数据类型所占存储空间大小的测试方法相似。#include void main()int nSize=sizeof(int);printf(“%d“,nSize);getch();2-9 为什么要强调“先声明、后定义、再使用 ”的原则?请阐述其理由。解: 因为变量使用前必须要有存储空间分配给它用来保存其值,对变量存储空间的分配就是通过变量的声明完成的。变量在被引用之前,其中的值应当是确定的某一个值,但变量的声明并不能保证变量存
10、储空间中有一个合适的初始状态值,而是一个随机值。当以错误的初始值开始变量的引用时,会导致程序的执行逻辑错误。为此,一般需要在变量被引用之前赋予其一个合理的初始值。因此,在变量的使用上,一般应当遵循先声明、后定义、在引用的基本原则。2-12 解:(1)ABC DEFGH(2)12+20=32(3)ch1(S)+ch2(x)=203(4)nX=2 nY=5 nZ=12nX=1830 nY=28 nZ=38nX=3 nY=6 nZ=22-13 解:(1)1;(2)0;(3)0;第 6 页 共 52 页(4)0;(5)2,2,5;(6)10;(7)3;(8)12,8,30,20,0,0;(9)15,5
11、,324;2-14 解:m=0 n=0 k=-1m=1 n=1 k=-1m=0 n=0 k=0m=0 n=0 k=1m=1 n=0 k=12-15 解:(1)mnfloat fX;double dY,dZ;printf(“i =%dn“,i);printf(“i =%5dn“,-i);printf(“i =%5on“,i);printf(“i =%5xn,i“);printf(“i =%ldn“,i);fX=dY=333.12345678901234567890;dZ=-555.1234567890123456789e-9;printf(“%fn“,fX);printf(“%fn“,dZ);p
12、rintf(“%en“,dZ);printf(“%.4fn“,fX);printf(“%.8fn“,dY);printf(“%.3en“,dZ);printf(“%.18fn”,dY);printf(“%10.3en“,dY);printf(“%2.5fn“,dY);printf(“%2en“,dZ);rerturn 0; /*main()函数结束*/第 9 页 共 52 页(分析略) 。3-15 编写一个程序显示如下的方框,椭圆,箭头,或者菱形图* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
13、* * * * * * * * * * * * * * * int main(void)printf(“*n“);printf(“* *n“);printf(“* *n“);printf(“* *n“);printf(“* *n“);printf(“* *n“);printf(“*n“);return 0; /*其余的照例或者用 for 循环来做*/3-17 int main()int num;int square11;int cube11;for(num=0; numint main(void)float fa,fb,fc,max; /声明 fa,fb,fc,max 四个变量.clrscr(
14、); /清屏.printf(“please input three values(fa,fb,fc):“);scanf(“%f,%f,%f“, /依次输入 fa,fb,fc 的值.if(faint main(void)float fa,fb,fc,temp,max; /声明 fa,fb,fc,temp,max 五个变量.clrscr(); /清屏.printf(“please input three values(fa,fb,fc):“);scanf(“%f,%f,%f“, /依次输入 fa,fb,fc 的值.if(fafc) /如果中间变量 tempfc,则将 temp 的值赋给 max,即
15、 max=temp;max=temp;else /否则,将 fc 的值赋给 max,即 max=fc;max=fc;printf(“the max is %fn“,max); /输出 fa,fb,fc 三个数的最大值 max.return 0;运行测试结果:4-12 对例 4-9 所示的流程图(图 4-8) ,请分析其算法执行步骤过程。解:1)给出参数 n 的值;2)如果 ,转 3) ;否则转 4) ;3)如果 ,输出 n 值非法的提示信息,然后转 7) ;否则转 6) ;4)初始化 fac=1;i=1 ;然后转 5) ;5)计算 n!的值:即当 ;求出 n!的值 fac,然后转 7) ;6)
16、fac=1,然后转 7) ;7)输出 n!的值(n 非法时写 非法 )4-15 解:阶梯共有 119 步。问题分析:设阶梯数为 steps,则依据题意有:由此,知道 steps 整除 7,且为正整数,那么 steps 的最小取值至少为 7,因而我们假定其初始值为 7,即初始化 steps=7;N-S 流程图:传统流程图:程序代码:#includeint main(void)int steps=7; /初始化clrscr(); /清屏while(1) /当为真时if(steps%2=1 /如果满足上述公式,则退出 while 循环.else steps+; /否则,steps 加 1,继续 wh
17、ile 循环.printf(“there are %d steps!n“,steps); /输出求解结果:阶梯数目 steps.return 0;运行测试结果:4-16 解:算法描述:1)输入一个门限值 ,及精确值 e,并初始化:i=1;sum=0;第 14 页 共 52 页2)计算 i!;3)计算 1/i!;4)对 1/i!累计求和;5)判断求解的误差(e-sum)是否小于门限值 ;6)若是,则转 7) ;否则,做 i+,然后转 2);7)输出满足条件时 i 的取值.传统流程图:伪代码:#includeint main(void)float e;float eps;float fac=1;f
18、loat sum=0;int i=1; /声明及初始化clrscr(); /清屏printf(“please input the eps and e(eps,e):“);scanf(“%f,%f“, /输入门限值 =eps,及精确值 e;while(e-sum)=eps) /当精确值与近似值间误差大于门限值时fac*=i; /求 i!;printf(“the %d fac is %fn“,i,fac); /输出 i!的值 fac;sum+=1/fac; /对 i!的倒数累加求和i+; /i 自加 1;/输出满足误差小于门限值时的 n 的值(i-1);printf(“when the error
19、 is less than %f,the n is %dn“,eps,i-1); return 0;运行测试结果:4-18 解:问题分析:对于本次绿化活动的树苗费用,由于每棵树苗的价格一定(为 8 元) ,那么只要确定了绿化所栽的树苗总数就行了,而所用树苗总数又取决于树与树之间的间距以及道路的全长,这两个因素都是确定的,因此我们可以先求出单侧大道绿化所需树苗数,再乘以2,即得到所需树苗总数,然后乘以单棵树苗价格,即该次绿化活动树苗费用。问题求解假设:假定 r_length 表示大道全长,r_length=2000 米(1 公里=1 千米) ,t_price 表示单棵树苗第 15 页 共 52
20、页价格,t_price=5 元/棵,spacing 表示树苗间距,spacing=5 米。传统流程图:程序代码:#includeint main(void)/*变量声明,r_length,price,spacing 分别表示大道长度,树苗单价,树苗间距 */int r_length,t_price,spacing; int i=0,j=0,sum=0; /*j 记录单侧大道绿化所需树苗数*/clrscr(); /清屏 printf(“please input the information(r_length,t_price,spacing):“);scanf(“%d %d %d“,/*依次输入
21、大道长度、树单价、树间距 .*/for(i=0;i#includeint main(void)int i,j;clrscr();for(i=1;iint main()long pear=1;int i;clrscr();for(i=17;i0;i-)pear=(pear+1)*2;printf(“Day:%2d Pears:%ldn“,i,pear);return 0;5-2 请给出 2 个整数的最大公约数和最小公倍数的算法描述和程序实现。第 18 页 共 52 页#includeint main(void)int num1,num2,temp,p,r;printf(“Please input
22、 two nums:“);scanf(“%d,%d“,if(num1/* 最大公约数 */int gcd(int a, int b)int t;if(a int main()int platter=0;int x=1,y=1,z=1,i;for(i=1;iint main(void)int nCock,nHen,nChick;int flag=0;/*换行控制标记,取值范围 0,1,2*/for(nCock=0;nCockint main(void)int ncock,nhen,nchick;/*ncock:鸡翁数,nhen:鸡母数, nchick:鸡雏数*/clrscr();ncock=0;
23、donhen=0;donchick=0;do第 21 页 共 52 页if(ncock+nhen+nchick=100)nchick+;while(nchickint main(void)int ncock,nhen,nchick;clrscr();ncock=0;while(ncockint main(void)第 22 页 共 52 页char c;int letters=0,space=0,digit=0,others=0;printf(“Please input a string:n“);while(c=getchar()!=n)if(c=aint i;printf(“Please i
24、nput a,n:“);scanf(“%d%d“,result=0;for(i=1;iint main(void)int i,j,k,num;/*i 表示百位,j 表示十位,k 表示个位,num 表示该三位数*/第 23 页 共 52 页int s=0;/*s 表示结果个数*/clrscr();for(i=1;iint main(void)int num,s,fac;for(num=2;numint factorial(int n)/*求 n 的阶乘*/int a=1,i;for(i=0;iint main(void)int i,t,n=20;第 25 页 共 52 页float Den=2,
25、Mol=1,s=0;for(i=1;iint main(void)int num1,num2,num3,num4,temp;printf(“Please input 4 nums:“);scanf(“%d,%d,%d,%d“,printf(“num1=%d,num2=%d,num3=%d,num4=%dn“,num1,num2,num3,num4);if(num1num2)temp=num1;num1=num2;num2=temp;if(num1num3)temp=num1;num1=num3;num3=temp;if(num1num4)temp=num1;num1=num4;num4=tem
26、p;if(num2num3)temp=num2;num2=num3;num3=temp;if(num2num4)temp=num2;num2=num4;num4=temp;if(num3num4)temp=num3;num3=num4;num4=temp;printf(“The sort of 4 nums is:“);printf(“%d,%d,%d,%dn“,num1,num2,num3,num4);5-16 输入四分整数,要求按大小顺序输出。如果是 n 个数又如何实现?分析:对 n 个数的排序用冒泡法实现实现代码:#include#define TRUE 1第 26 页 共 52 页#d
27、efine FALSE 0#define MAX 4void bubble_sort(int *a,int n)int i,j,temp;for(i=n-1;i=1;-i)for(j=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;void input(int *p,int n)int i;printf(“Input the sequence(MAX=%d):“,MAX);for(i=0;i#includeint main(void)第 27 页 共 52 页float x0,x1,f,f1;/*x0 代表前一次的近似根,x1 代表后一次的近似根*/x1=1.5;/*对 X
28、1 赋初值 */dox0=x1; f=(2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3; /*f 的导函数*/x1=x0-f/f1;/* */while(fabs(x1-x0)=1e-5);printf(“The root is%5.2fn“,x1); 5-18 试用二分法求方程 在 之间的根。#include#includeint main(void)float x0,x1,x2,fx0,fx1,fx2;doprintf(“Please input x1,x2:“);scanf(“%f,%f“,fx1=x1*(2*x1-4)*x1+3)-6;fx2=x2*(2*x2-
29、4)*x2+3)-6;while(fx1*fx20);dox0=(x1+x2)/2;fx0=x0*(2*x0-4)*x0+3)-6;if(fx0*fx1)=1e-5);printf(“x=%6.2fn“,x0);return 0;第 28 页 共 52 页5-19.给出一个不多于 5 位的正整数。要求: (1)输出它是几位数;(2)分别打印出每一位数;(3)按逆序打印各位数字(如 321 的逆序是 123)实现代码:#includevoid main()int N,arr5;/*arr5对应存放输入的数的每位数*/int i=10,j=10,t=1;printf(“Input the numb
30、er:“);scanf(“%d“,while(i=10)/*求位数*/i=N/j;j*=10;t+;printf(“Median is :%dn“,t);for(i=0;ivoid main()long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;printf(“Input the profit:“);scanf(“%ld“,bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(iint main(void)char ch;ch=getchar();while(ch!=?)putchar(ch);ch=getchar();return 0;输出为:qwertuvapabc分析:while 循环限制为输入字符为“?“时不进入循环,所以输出不含“?“(2) #includeint main(void)char ch;while(ch=getchar()!=?)putchar(+ch);return 0;