第一篇:《C语言程序设计教程(第二版)》习题答案
第1章 程序设计基础知识
一、单项选择题(第23页)1-4.CBBC 5-8.DACA
二、填空题(第24页)
1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 7.有穷性 8.直到型循环 9.算法 10.可读性 11.模块化 12.对问题的分析和模块的划分
三、应用题(第24页)2.源程序:
main()
{int i,j,k;/* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf(“cock hen chickn”);for(i=1;i<=20;i++)for(j=1;j<=33;j++)for(k=1;k<=33;k++)
if(i+j+k*3==100&&i*5+j*3+k==100)printf(“ %d %d %dn”,i,j,k*3);} 执行结果:
cock hen chick 4 18 78 8 11 81 12 4 84
3.现计算斐波那契数列的前20项。
递推法 源程序:
main()
{long a,b;int i;a=b=1;
for(i=1;i<=10;i++)/*要计算前30项,把10改为15。*/ {printf(“%8ld%8ld”,a,b);a=a+b;b=b+a;}}
递归法 源程序:
main(){int i;
for(i=0;i<=19;i++)printf(“%8d”,fib(i));} fib(int i)
{return(i<=1?1:fib(i-1)+fib(i-2));}
执行结果:
1 2 3 5 8 13 21 34 55
233 377 610 987 1597 2584 4181 6765 4.源程序:
#include “math.h”;main()
{double x,x0,deltax;x=1.5;
do {x0=pow(x+1,1./3);deltax=fabs(x0-x);x=x0;
}while(deltax>1e-12);printf(“%.10fn”,x);} 执行结果:
1.3247179572
5.源程序略。(分子、分母均构成斐波那契数列)结果是32.66026079864 6.源程序:
main()
{int a,b,c,m;
printf(“Please input a,b and c:”);scanf(“%d %d %d”,&a,&b,&c);if(a
printf(“%d %d %dn”,a,b,c);} 执行结果:
Please input a,b and c:123 456 789 789 456 123 7.源程序:
main(){int a;
scanf(“%d”,&a);
printf(a%21==0?“Yes”:“No”);} 执行结果:
Yes 第2章 C语言概述
一、单项选择题(第34页)1-4.BDCB 5-8.AABC
二、填空题(第35页)
1.主 2.C编译系统 3.函数 函数 4.输入输出 5.头 6..OBJ 7.库函数 8.文本
三、应用题(第36页)
5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。
8.源程序: main(){int a,b,c;
scanf(“%d %d”,&a,&b);c=a;a=b;b=c;
printf(“%d %d”,a,b);} 执行结果:34 34 12 第3章 数据类型与运算规则
一、单项选择题(第75页)
1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB
二、填空题(第77页)
1.补码 2.±(10^-308~10^308)3.int(整数)4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65,89
三、应用题(第78页)1.10 9
2.执行结果: 0 0 12 1 第4章 顺序结构程序设计
一、单项选择题(第90页)1-5.DCDAD 6-10.BACBB
二、填空题(第91页)
1.一 ;2.5.169000 3.(1)-2002500(2)I=-200,j=2500(3)i=-200 j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf(“%lf%lf%lf”,&a,&b,&c);9.13 13.000000,13.000000 10.a=a^c;c=c^a;a=a^c;(这种算法不破坏b的值,也不用定义中间变量。)
三、编程题(第92页)
1.仿照教材第27页例2-1。
2.源程序:
main(){int h,m;
scanf(“%d:%d”,&h,&m);printf(“%dn”,h*60+m);} 执行结果:
9:23 563
3.源程序:
main()
{int a[]={-10,0,15,34},i;for(i=0;i<=3;i++)
printf(“%d370C=%g370Ft”,a[i],a[i]*1.8+32);} 执行结果:
-10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序:
main()
{double pi=3.14***9,r=5;
printf(“r=%lg A=%.10lf S=%.10lfn”,r,2*pi*r,pi*pi*r);} 执行结果:
r=5 A=31.4159265359 S=49.3480220054 5.源程序:
#include “math.h”;main()
{double a,b,c;
scanf(“%lf%lf%lf”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){double s=(a+b+c)/2;
printf(“SS=%.10lfn”,sqrt(s*(s-a)*(s-b)*(s-c)));} else printf(“Data error!”);} 执行结果:5 6
SS=9.9215674165 6.源程序:
main()
{int a=3,b=4,c=5;float d=1.2,e=2.23,f=-43.56;
printf(“a=%3d,b=%-4d,c=**%dnd=%gne=%6.2fnf=%-10.4f**n”,a,b,c,d,e,f);} 7.源程序:
main()
{int a,b,c,m;
scanf(“%d %d %d”,&a,&b,&c);m=a;a=b;b=c;c=m;
printf(“%d %d %dn”,a,b,c);} 执行结果:6 7 6 7 5 8.源程序:
main(){int a,b,c;
scanf(“%d %d %d”,&a,&b,&c);
printf(“average of %d,%d and %d is %.2fn”,a,b,c,(a+b+c)/3.);执行结果: 7 9
average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下:
main()
{int a,b,c,x,y;
scanf(“%d %d %d”,&a,&b,&c);x=a*b;y=x*c;
printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“x=%d,y=%dn”,x,y);} 第5章 选择结构程序设计
一、单项选择题(第113页)1-4.DCBB 5-8.DABD
二、填空题(第115页)1.非0 0 2.k==0
3.if(abs(x)>4)printf(“%d”,x);else printf(“error!”);
4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf(“%d”,x);5.k=1(原题最后一行漏了个d,如果认为原题正确,则输出k=%。)6.8!Right!11 7.$$$a=0 8.a=2,b=
1三、编程题(第116页)1.有错。正确的程序如下:
main(){int a,b,c;
scanf(“%d,%d,%d”,&a,&b,&c);
printf(“min=%dn”,a>b?b>c?c:b:a>c?c:a);} 2.源程序:
main()
{unsigned long a;scanf(“%ld”,&a);
for(;a;printf(“%d”,a%10),a/=10);} 执行结果:
12345 54321
3.(1)源程序: main(){int x,y;
scanf(“%d”,&x);if(x>-5&&x<0)y=x;if(x>=0&&x<5)y=x-1;if(x>=5&&x<10)y=x+1;printf(“%dn”,y);}(2)源程序:
main(){int x,y;
scanf(“%d”,&x);
if(x<10)if(x>-5)if(x>=0)if(x>=5)y=x+1;else y=x-1;else y=x;printf(“%dn”,y);}(3)源程序:
main(){int x,y;
scanf(“%d”,&x);
if(x<10)if(x>=5)y=x+1;else if(x>=0)y=x-1;else if(x>-5)y=x;printf(“%dn”,y);}(4)源程序:
main(){int x,y;
scanf(“%d”,&x);switch(x/5)
{case-1:if(x!=-5)y=x;break;case 0:y=x-1;break;case 1:y=x+1;} printf(“%dn”,y);}
4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。
现给出Delphi源程序和C++ Builder源程序。
Delphi源程序:
procedure TForm1.Button1Click(Sender: TObject);begin
edit3.Text:=format('%.0f天',[strtodate(edit2.text)-strtodate(edit1.text)]);end;
procedure TForm1.FormCreate(Sender: TObject);begin
Edit2.Text:=datetostr(now);button1click(form1)end;
C++ Builder源程序: void __fastcall TForm1::Button1Click(TObject *Sender){
Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+“天”;}
void __fastcall TForm1::FormCreate(TObject *Sender){
Edit2->Text=DateToStr(Now());Button1Click(Form1);}
执行结果:(运行于Windows下)http://img378.photo.163.com/nxgt/41463572/1219713927.jpg
5.源程序:
main()
{unsigned a,b,c;
printf(“请输入三个整数:”);
scanf(“%d %d %d”,&a,&b,&c);
if(a&&b&&c&&a==b&&a==c)printf(“构成等边三角形n”);else if(a+b>c&&a+c>b&&b+c>a)
if(a==b||a==c||b==c)printf(“构成等腰三角形n”);else printf(“构成一般三角形n”);else printf(“不能构成三角形n”);} 执行结果:
请输入三个整数:5 6 5 构成等腰三角形
6.源程序:
main(){int x,y;
scanf(“%d”,&x);if(x<20)y=1;else switch(x/60)
{case 0:y=x/10;break;default:y=6;}
printf(“x=%d,y=%dn”,x,y);} 7.源程序:
main()
{unsigned m;float n;scanf(“%d”,&m);if(m<100)n=0;
else if(m>600)n=0.06;else n=(m/100+0.5)/100;
printf(“%d %.2f %.2fn”,m,m*(1-n),m*n);} 执行结果:
450 450 429.75 20.25
8.2171天(起始日期和终止日期均算在内)
本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。
9.源程序:
#include “math.h”;main()
{unsigned long i;scanf(“%ld”,&i);
printf(“%ld %dn”,i%10,(int)log10(i)+1);} 执行结果:
99887 7 5
10.源程序:
main()
{unsigned long i;unsigned j[10],m=0;scanf(“%ld”,&i);
for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1];printf(“%ldn”,i);} 执行结果:
6987 8109
(注:要加密的数值不能是0或以0开头。如果要以0开头需用字符串而不能是整数。)第6章 循环结构程序设计
一、单项选择题(第142页)1-4.BCCB 5-8.CBCA
二、填空题(第143页)
1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。3.20 4.11 5.2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x 三、编程题(第145页)1.源程序: main() {int i=1,sum=i; while(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf(“%dn”,sum);} 执行结果: 51 2.源程序: main() {double p=0,n=0,f;int i;for(i=1;i<=10;i++){scanf(“%lf”,&f); if(f>0)p+=f;else n+=f;} printf(“%lf %lf %lfn”,p,n,p+n);} 3.源程序: main() {unsigned a;scanf(“%ld”,&a); for(;a;printf(“%d,”,a%10),a/=10);printf(“b n”);} 执行结果: 23456 6,5,4,3,2 4.源程序: main() {unsigned long a,b,c,i;scanf(“%ld%ld”,&a,&b);c=a%1000; for(i=1;i 57 009 5.略 6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2!+ 1/3!+ … + 1/n!+ …(1)源程序: main() {double e=1,f=1;int n; for(n=1;n<=20;n++){f/=n;e+=f;} printf(“e=%.14lfn”,e);} 执行结果: e=2.7***05(2)源程序: main() {double e=1,f=1;int n; for(n=1;f>1e-4;n++){f/=n;e+=f;} printf(“e=%.4fn”,e);} 执行结果: e=2.7183 7.源程序: main() {unsigned long a=0,b=1,c=0;int i,d;scanf(“%d”,&d); for(i=1;i<=(d+2)/3;i++) printf(“%10ld%10ld%10ld”,a,b,(a+=b+c,b+=c+a,c+=a+b));} 本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i) {return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main() {int i,d;scanf(“%d”,&d);for(i=1;i<=d;i++) printf(“%10ld”,fun(i));} 执行结果: 68 230 423 778 1431 2632 4841 8.源程序: main(){int i; for(i=1010;i<=9876;i+=2) if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10!=i%10)printf(“ %d”,i);} 执行结果: 1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main(){int i,j,k; printf(“apple watermelon pearn”);for(i=1;i<=100;i++)for(j=1;j<=10;j++) if((k=100-i-j)*2==400-i*4-j*40)printf(“%4d%7d%9dn”,i,j,k);} 执行结果: apple watermelon pear 5 5 90 24 4 72 43 3 54 62 2 36 81 1 18 10.源程序: #include “stdio.h”; #define N 4 /* N为阶数,可以改为其他正整数 */ main(){int m=N*2,i,j; for(i=1;i putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** * 作者:宁西贯通 2006-5-7 23:41 回复此发言 ------------------说明 注意:上面最后一题的输出结果应该是由星号组成的一个菱形,第7章 数 组 一、单项选择题(第192页)1-4.BBCC 5-8.AABA 二、填空题(第194页) 1.1 2 4 8 16 32 64 128 256 512 2.①a[age]++ ②i=18;i<26 3.①break ②i==8 4.①a[i]>b[j] ②i<3 ③j<5 5.①b[j]=a[j][0] ②b[j] 三、编程题(第196页)1.源程序: main() {int a[4][4],i,j,s=0;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf(“%d”,&a[i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++) if(i==j||i+j==3)s+=a[i][j]; printf(“%dn”,s);} /* 注:5×5矩阵不能照此计算!*/ 执行结果: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 68 2.源程序: main() {int i,a[36];a[0]=2; for(i=1;i<=29;i++)a[i]=a[i-1]+2;for(;i<=35;i++)a[i]=a[(i-30)*5+2];for(i=0;i<=35;i++)printf(“%dt”,a[i]);} 执行结果: 4 6 8 10 12 14 16 18 20 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 6 16 26 36 46 56 3.源程序: #include “stdlib.h” #include “time.h” main() {int a[30],i,m=0;randomize(); for(i=0;i<=29;i++){a[i]=rand();if(m for(i=0;i<=29;i++)if(a[i]==m)a[i]=-1;printf(“n-----------------n”);for(i=0;i<=29;i++) if(~a[i])printf(“%dt”,a[i]);printf(“n”);} 执行结果: 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 32499 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210----------------- 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210 4.源程序: main() {int i,n=0,b[16];scanf(“%d”,&i); for(;i;i>>=1)b[n++]=i&1;for(;n;)printf(“%d”,b[--n]);} 执行结果: 9876 10011010010100 本题也可以不用数组。源程序如下: #include “stdio.h” main(){int i,n; scanf(“%d”,&i);for(n=16;n;n--){asm ROL i,1 putchar(i&1|48);} } /* ROL是循环左移的汇编指令 */ 5.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main() {int a[M][N],i,j,t[M];randomize(); /*生成M行N列随机数*/ for(i=0;i printf(“%4d”,a[i][j]=random(50)); /*找出每行的最小数,t[M]是第M行的最小数所在的列数*/ for(i=0;i if(a[i][t[i]]>a[i][j])t[i]=j; /*比较每个最小数在其所在的列上是否也是最小*/ for(j=0;j printf(“-------------------n”); /*输出在行和列上均为最小的数*/ for(i=0;i printf(“a[%d,%d]=%dn”,i,t[i],a[i][t[i]]);} 执行结果: 13 20 0 1 20 41 6 16 35 30 3 5 37 8 23 15 6 36 24 29 18 1 1 5 28 21 46 34-------------------a[0,4]=0 a[1,2]=6 a[3,5]=1 a[4,0]=1 6.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 7 main() {int a[M][N],i,j,t=0;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(91)+10);a[i][N-1]+=a[i][j];} printf(“%4dn”,a[i][N-1]);} for(i=1;i if(a[i][N-1]>a[t][N-1])t=i;if(t)for(j=0;j {i=a[0][j];a[0][j]=a[t][j];a[t][j]=i;} printf(“-----------------n”);for(i=0;i 第7章 数 组 for(j=0;j 执行结果: 17 32 95 35 20 288 39 48 22 27 73 22 231 51 87 39 71 84 46 378 84 94 97 77 27 26 405 69 50 56 89 37 46 347----------------- 77 27 26 405 39 48 22 27 73 22 231 51 87 39 71 84 46 378 89 17 32 95 35 20 288 69 50 56 89 37 46 347 7.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main() {int a[M][N],i,j; struct data{int value,x,y;}max,min;max.value=0;min.value=100;randomize(); for(i=0;i {printf(“%4d”,a[i][j]=random(100)+1);if(max.value {max.value=a[i][j];max.x=i;max.y=j;} if(min.value>a[i][j]) {min.value=a[i][j];min.x=i;min.y=j;} } printf(“-----------------n”); i=a[0][N-1];a[0][N-1]=max.value;a[max.x][max.y]=i;i=a[M-1][0];a[M-1][0]=min.value;a[min.x][min.y]=i;for(i=0;i 执行结果: 65 30 40 30 26 50 6 61 27 47 16 54 58 76 19 57 74 44 92 71 48 73 57 60 32 73 67----------------- 65 30 92 30 26 50 73 61 27 47 16 54 58 76 19 57 74 44 40 71 48 6 57 60 32 73 67 9.源程序: main() {char s[255];int i,j,b=1;printf(“Input a string:”);scanf(“%s”,s);i=strlen(s); for(j=1;j<=i/2;j++)b=b&&(s[j-1]==s[i-j]);printf(b?“Yesn”:“Non”);} 执行结果: Input a string:level Yes 10.源程序: main() {char s[255],t,max=0,min=0,l,i;printf(“Input a string(length>4):”);gets(s);l=strlen(s); for(i=0;i {if(s[max] t=s[1];s[1]=s[max];s[max]=t;if(min==1)min=max;t=s[l-2];s[l-2]=s[min];s[min]=t;printf(“%sn”,s);} 执行结果: Input a string(length>4):C++Builder Cu+Beild+r 11.源程序: main() {char m[13][10]={“****”,“January”,“February”,“March”, “April”,“May”,“June”,“July”,“August”,“September”, “October”,“November”,“December”};int i,j,k,a,s,n; printf(“Please input an integer(100..999):”);scanf(“%d”,&n); printf(“%d:%d+%d+%d=%d, %d%%13=%d, %sn”, n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)]);} 执行结果: Please input an integer(100..999):539 539:5+3+9=17, 17%13=4, April 第8章 函 数 一、单项选择题(第241页) 1-5.BCCAA 6-10.CCDDD 11-15.ACACB 二、填空题(第243页) 1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0)②return(n+sum(n-1))根据题意,如下程序较为合理: int sum(int n) {if(n<=0)return(-1);/*-1是出错标志 */ else if(n==1)return(1);else return(n+sum(n-1));} 2.①return(1)②return(n*facto(n-1)) 三、编程题(第244页)3.源程序: main() {int i,a,b,c; for(i=100;i<999;i++) if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i)printf(“%dt”,i);} 执行结果: 153 370 371 407 8.源程序(非递归算法): #define P 13 /* P可以改为其他正整数 */ main() {int a[P],r,c; for(r=0;r<=P;r++){a[r]=1; for(c=r-1;c>=1;a[c--]+=a[c-1]);printf(“%*d”,(P-r)*3+1,a[0]); for(c=1;c<=r;printf(“%6d”,a[c++]));printf(“n”);} } 执行结果: (应该排列成一个三角形,是贴吧造成现在这个样子的,不是程序有问题)1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 126 84 36 9 1 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 9.源程序(递归算法): #include “stdio.h” void printOCT(unsigned long n){unsigned long i; if(i=n>>3)printOCT(i);putchar((n&7)+48);} main() {unsigned long i;scanf(“%ld”,&i);printOCT(i);} 执行结果: 1234567890 11145401322 本题也可以不用递归算法,源程序请参考第7章第三题4。回复:【C语言】《C语言程序设计教程(第二版)》习题答案 但是不同时间印刷的版本课后题不太一样呢,象我们的是1999年12月第2版,2005年12月第69次印刷的。没有选择填空,应用题和楼主不知道有多少相同的,因为看不到原题。这个比较麻烦呢。 作者:210.77.204.* 2006-5-9 18:38 回复此发言 ------------------回复:【C语言】《C语言程序设计教程(第二版)》习题答案 你对照一下主编和出版社,看看对吗?(见说明的第一条。)14 第9章 指 针 一、单项选择题(第276页) 1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD 二、填空题(第278页)1.①int * ②*z 2.*p++ 3.①' ' ②++ 4.①q=p+1 ②q max ④*q 三、编程题(第280页)7.源程序: main() {int i=0;char c[20]; do{scanf(“%s”,&c);i++;} while(strcmp(c,“stop”));printf(“%dn”,i);} 执行结果: This car ran form Nanyang to Luoyang without a stop 10 9.源程序: main() {char s[255],c[255]={0};int i;gets(s); for(i=0;s[i];c[s[i++]]++);for(i=0;i<255;i++) if(c[i])printf(“%c=%dt”,i,c[i]);} 执行结果: abcedabcdcd a=2 b=2 c=3 d=3 e=1 《C语言程序设计教程(第二版)》习题答案 说 明 1.本习题答案是我自己做的,错误和疏漏在所难免。编程题全部调试通过,但选择题和填空题不敢保证全对。 2.凡未指明解题所用的程序设计语言的,均指C语言。 3.凡未指明执行程序所需的操作系统的,均可在DOS下执行。4.本文中文字下面划线的表示输入。 第1章 程序设计基础知识 一、单项选择题(第23页)1-4.CBBC 5-8.DACA 二、填空题(第24页)1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 7.有穷性 8.直到型循环 9.算法 10.可读性 11.模块化 12.对问题的分析和模块的划分 三、应用题(第24页)2.源程序: main(){int i,j,k;/* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf(“cock hen chick ”);for(i=1;i<=20;i++)for(j=1;j<=33;j++) for(k=1;k<=33;k++) if(i+j+k*3==100&&i*5+j*3+k==100) printf(“ %d %d %d ”,i,j,k*3);} 执行结果: cock hen chick 3.现计算斐波那契数列的前20项。 递推法 源程序: main(){long a,b;int i;a=b=1;for(i=1;i<=10;i++)/*要计算前30项,把10改为15。*/ {printf(“%8ld%8ld”,a,b);a=a+b;b=b+a;}} 递归法 源程序: main(){int i;for(i=0;i<=19;i++)printf(“%8d”,fib(i));} fib(int i){return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果: 233 377 610 987 1597 2584 4181 6765 4.源程序: #include “math.h”;main(){double x,x0,deltax;x=1.5;do {x0=pow(x+1,1./3);deltax=fabs(x0-x);x=x0;}while(deltax>1e-12);printf(“%.10f ”,x);} 执行结果: 1.3247179572 5.源程序略。(分子、分母均构成斐波那契数列)结果是32.66026079864 6.源程序: main(){int a,b,c,m;printf(“Please input a,b and c:”);scanf(“%d %d %d”,&a,&b,&c);if(a Please input a,b and c:123 456 789 789 456 123 7.源程序: main(){int a;scanf(“%d”,&a);printf(a%21==0?“Yes”:“No”);} 执行结果: 42 Yes 第2章 C语言概述 一、单项选择题(第34页)1-4.BDCB 5-8.AABC 二、填空题(第35页)1.主 2.C编译系统 3.函数 函数 4.输入输出 5.头 6..OBJ 7.库函数 8.文本 三、应用题(第36页)5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。 8.源程序: main(){int a,b,c;scanf(“%d %d”,&a,&b);c=a;a=b;b=c;printf(“%d %d”,a,b);} 执行结果: 12 34 34 12 第3章 数据类型与运算规则 一、单项选择题(第75页)1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB 二、填空题(第77页)1.补码 2.±(10-308~10308)3.int(整数)4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65,89 三、应用题(第78页)1.10 9 2.执行结果: 11 0 0 12 1 第4章 顺序结构程序设计 一、单项选择题(第90页)1-5.DCDAD 6-10.BACBB 二、填空题(第91页)1.一 ;2.5.169000 3.(1)-2002500(2)I=-200,j=2500(3)i=-200 j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf(“%lf%lf%lf”,&a,&b,&c);9.13 13.000000,13.000000 10.a=a^c;c=c^a;a=a^c;(这种算法不破坏b的值,也不再定义中间变量。) 三、编程题(第92页)1.仿照教材第27页例2-1。2.源程序: main(){int h,m;scanf(“%d:%d”,&h,&m);printf(“%d ”,h*60+m);} 执行结果: 9:23 563 3.源程序: main(){int a[]={-10,0,15,34},i;for(i=0;i<=3;i++)printf(“%d370C=%g370Ft”,a[i],a[i]*1.8+32);} 执行结果: -10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F 4.源程序: main(){double pi=3.14***9,r=5;printf(“r=%lg A=%.10lf S=%.10lf ”,r,2*pi*r,pi*pi*r);} 执行结果: r=5 A=31.4159265359 S=49.3480220054 5.源程序: #include “math.h”;main(){double a,b,c;scanf(“%lf%lf%lf”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){double s=(a+b+c)/2;printf(“SS=%.10lf ”,sqrt(s*(s-a)*(s-b)*(s-c)));} else printf(“Data error!”);} 执行结果: 4 5 6 SS=9.9215674165 6.源程序: main(){int a=3,b=4,c=5;float d=1.2,e=2.23,f=-43.56;printf(“a=%3d,b=%-4d,c=**%d d=%g e=%6.2f f=%-10.4f** ”,a,b,c,d,e,f);} 7.源程序: main(){int a,b,c,m;scanf(“%d %d %d”,&a,&b,&c);m=a;a=b;b=c;c=m;printf(“%d %d %d ”,a,b,c);} 执行结果: 5 6 7 6 7 5 8.源程序: main(){int a,b,c;scanf(“%d %d %d”,&a,&b,&c);printf(“average of %d,%d and %d is %.2f ”,a,b,c,(a+b+c)/3.);执行结果: 6 7 9 average of 6,7 and 9 is 7.33 9.不能。修改后的源程序如下: main(){int a,b,c,x,y;scanf(“%d %d %d”,&a,&b,&c);x=a*b;y=x*c;printf(“a=%d,b=%d,c=%d ”,a,b,c);printf(“x=%d,y=%d ”,x,y);} 第5章 选择结构程序设计 一、单项选择题(第113页)1-4.DCBB 5-8.DABD 二、填空题(第115页)1.非0 0 2.k==0 3.if(abs(x)>4)printf(“%d”,x);else printf(“error!”);4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf(“%d”,x);5.k=1(原题最后一行漏了个d,如果认为原题正确,则输出k=%。)6.8!Right!11 7.$$$a=0 8.a=2,b=1 三、编程题(第116页)1.有错。正确的程序如下: main(){int a,b,c;scanf(“%d,%d,%d”,&a,&b,&c);printf(“min=%d ”,a>b?b>c?c:b:a>c?c:a);} 2.源程序: main(){unsigned long a;scanf(“%ld”,&a);for(;a;printf(“%d”,a%10),a/=10);} 执行结果: 12345 54321 3.(1)源程序: main(){int x,y;scanf(“%d”,&x);if(x>-5&&x<0)y=x;if(x>=0&&x<5)y=x-1;if(x>=5&&x<10)y=x+1;printf(“%d ”,y);}(2)源程序: main(){int x,y;scanf(“%d”,&x);if(x<10)if(x>-5)if(x>=0)if(x>=5)y=x+1;else y=x-1;else y=x;printf(“%d ”,y);}(3)源程序: main(){int x,y;scanf(“%d”,&x);if(x<10)if(x>=5)y=x+1;else if(x>=0)y=x-1; else if(x>-5)y=x;printf(“%d ”,y);}(4)源程序: main(){int x,y;scanf(“%d”,&x);switch(x/5){case-1:if(x!=-5)y=x;break;case 0:y=x-1;break;case 1:y=x+1;} printf(“%d ”,y);} 4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。现给出Delphi源程序和C++ Builder源程序。Delphi源程序: procedure TForm1.Button1Click(Sender: TObject);begin edit3.Text:=format('%.0f天',[strtodate(edit2.text)-strtodate(edit1.text)]);end;procedure TForm1.FormCreate(Sender: TObject);begin Edit2.Text:=datetostr(now);button1click(form1)end;C++ Builder源程序: void __fastcall TForm1::Button1Click(TObject *Sender){ Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+“天”;} void __fastcall TForm1::FormCreate(TObject *Sender){ Edit2->Text=DateToStr(Now());Button1Click(Form1);} 执行结果:(运行于Windows下) 5.源程序: main(){unsigned a,b,c;printf(“请输入三个整数:”);scanf(“%d %d %d”,&a,&b,&c);if(a&&b&&c&&a==b&&a==c)printf(“构成等边三角形 ”);else if(a+b>c&&a+c>b&&b+c>a)if(a==b||a==c||b==c)printf(“构成等腰三角形 ”); else printf(“构成一般三角形 ”); else printf(“不能构成三角形 ”);} 执行结果: 请输入三个整数:5 6 5 构成等腰三角形 6.源程序: main(){int x,y;scanf(“%d”,&x);if(x<20)y=1;else switch(x/60){case 0:y=x/10;break;default:y=6;} printf(“x=%d,y=%d ”,x,y);} 7.源程序: main(){unsigned m;float n;scanf(“%d”,&m);if(m<100)n=0;else if(m>600)n=0.06; else n=(m/100+0.5)/100;printf(“%d %.2f %.2f ”,m,m*(1-n),m*n);} 执行结果: 450 450 429.75 20.25 8.2171天(起始日期和终止日期均算在内) 本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。9.源程序: #include “math.h”;main(){unsigned long i;scanf(“%ld”,&i);printf(“%ld %d ”,i%10,(int)log10(i)+1);} 执行结果: 99887 7 5 10.源程序: main(){unsigned long i;unsigned j[10],m=0;scanf(“%ld”,&i);for(;i;){j[m++]=(i+2)%10;i/=10;} for(;m;m--)i=i*10+j[m-1];printf(“%ld ”,i);} 执行结果: 6987 8109(注:要加密的数值不能是0或以0开头)第6章 循环结构程序设计 一、单项选择题(第142页)1-4.BCCB 5-8.CBCA 二、填空题(第143页)1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。 3.20 4.11 5.2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x 三、编程题(第145页)1.源程序: main(){int i=1,sum=i;while(i<101){sum+=i=-i-2;sum+=i=-i+2;} printf(“%d ”,sum);} 执行结果: 51 2.源程序: main(){double p=0,n=0,f;int i;for(i=1;i<=10;i++){scanf(“%lf”,&f); if(f>0)p+=f;else n+=f;} printf(“%lf %lf %lf ”,p,n,p+n);} 3.源程序: main(){unsigned long a;scanf(“%ld”,&a);for(;a;printf(“%d,”,a%10),a/=10);printf(“b ”);} 执行结果: 23456 6,5,4,3,2 4.源程序: main(){unsigned long a,b,c,i;scanf(“%ld%ld”,&a,&b);c=a%1000;for(i=1;i 6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2!+ 1/3!+ „ + 1/n!+ „(1)源程序: main(){double e=1,f=1;int n;for(n=1;n<=20;n++){f/=n;e+=f;} printf(“e=%.14lf ”,e);} 执行结果: e=2.7***05(2)源程序: main(){double e=1,f=1;int n;for(n=1;f>1e-4;n++){f/=n;e+=f;} printf(“e=%.4f ”,e);} 执行结果: e=2.7183 7.源程序: main(){unsigned long a=0,b=1,c=0;int i,d;scanf(“%d”,&d);for(i=1;i<=(d+2)/3;i++)printf(“%10ld%10ld%10ld”,a,b,(a+=b+c,b+=c+a,c+=a+b));} 本题还可以用递归算法(效率很低),源程序如下: unsigned long fun(int i){return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3);} main(){int i,d;scanf(“%d”,&d);for(i=1;i<=d;i++)printf(“%10ld”,fun(i));} 执行结果: 15 125 230 423 778 1431 2632 4841 8.源程序: main(){int i;for(i=1010;i<=9876;i+=2)if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10!=i%10)printf(“ %d”,i);} 执行结果: 1024 1026 1028 1032 1034 1036 …… …… 9874 9876 9.源程序: main(){int i,j,k;printf(“apple watermelon pear ”);for(i=1;i<=100;i++)for(j=1;j<=10;j++) if((k=100-i-j)*2==400-i*4-j*40) printf(“%4d%7d%9d ”,i,j,k);} 执行结果: apple watermelon pear 10.源程序: #include “stdio.h”;#define N 4 /* N为阶数,可以改为其他正整数main(){int m=N*2,i,j;for(i=1;i putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'));} 如果把N值改为5,则执行结果如下: * *** ***** ******* ********* ******* ***** *** * 第7章 数 组 一、单项选择题(第192页)1-4.BBCC 5-8.AABA 二、填空题(第194页)1.1 2 4 8 16 32 64 128 256 512(每个数占一行)2.①a[age]++ ②i=18;i<26 3.①break ②i==8 4.①a[i]>b[j] ②i<3 ③j<5 5.①b[j]=a[j][0] ②b[j] */ 三、编程题(第196页)1.源程序: main(){int a[4][4],i,j,s=0;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf(“%d”,&a[i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j||i+j==3)s+=a[i][j];printf(“%d ”,s);} /* 注:5×5矩阵不能照此计算!*/ 执行结果: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 68 2.源程序: main(){int i,a[36];a[0]=2;for(i=1;i<=29;i++)a[i]=a[i-1]+2;for(;i<=35;i++)a[i]=a[(i-30)*5+2];for(i=0;i<=35;i++)printf(“%dt”,a[i]);} 执行结果: 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 6 26 36 46 56 3.源程序: #include “stdlib.h” #include “time.h” main(){int a[30],i,m=0;randomize();for(i=0;i<=29;i++){a[i]=rand(); if(m printf(“%dt”,a[i]);} for(i=0;i<=29;i++)if(a[i]==m)a[i]=-1;printf(“-----------------”);for(i=0;i<=29;i++)if(~a[i])printf(“%dt”,a[i]);printf(“ ”);} 执行结果: 20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 32499 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210-----------------20679 29377 18589 9034 27083 4959 3438 5241 32278 23344 29305 22340 5927 13031 2161 2583 31855 22977 14283 4851 22038 6992 11394 20887 27381 6293 18347 16414 10210 4.源程序: main(){int i,n=0,b[16];scanf(“%d”,&i);for(;i;i>>=1)b[n++]=i&1;for(;n;)printf(“%d”,b[--n]);} 执行结果: 9876 10011010010100 本题也可以不用数组。源程序如下: #include “stdio.h” main(){int i,n;scanf(“%d”,&i);for(n=16;n;n--){asm ROL i,1 putchar(i&1|48);} } /* ROL是循环左移的汇编指令 */ 5.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main(){int a[M][N],i,j,t[M];randomize();/*生成M行N列随机数*/ for(i=0;i printf(“%4d”,a[i][j]=random(50));/*找出每行的最小数,t[M]是第M行的最小数所在的列数*/ for(i=0;i if(a[i][t[i]]>a[i][j])t[i]=j;/*比较每个最小数在其所在的列上是否也是最小*/ for(j=0;j for(i=0;i {if(i==j)continue; if(a[j][t[j]]>a[i][t[j]]) {t[j]=-1;break;} } printf(“-------------------”);/*输出在行和列上均为最小的数*/ for(i=0;i printf(“a[%d,%d]=%d ”,i,t[i],a[i][t[i]]);} 执行结果: 19 13 20 0 41 16 35 30 37 23 15 36 24 29 18 28 21 46 34-------------------a[0,4]=0 a[1,2]=6 a[3,5]=1 a[4,0]=1 6.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 7 main(){int a[M][N],i,j,t=0;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(91)+10); a[i][N-1]+=a[i][j];} printf(“%4d ”,a[i][N-1]);} for(i=1;i printf(“%4d”,a[i][j]);} 执行结果: 17 32 95 35 20 288 48 22 27 73 22 231 87 39 71 84 46 378 94 97 77 27 26 405 50 56 89 37 46 347----------------- 94 97 77 27 26 405 48 22 27 73 22 231 87 39 71 84 46 378 17 32 95 35 20 288 50 56 89 37 46 347 7.源程序: #include “stdlib.h” #include “time.h” #define M 5 #define N 6 main(){int a[M][N],i,j;struct data{int value,x,y;}max,min;max.value=0;min.value=100;randomize();for(i=0;i for(j=0;j {printf(“%4d”,a[i][j]=random(100)+1); if(max.value {max.value=a[i][j];max.x=i;max.y=j;} if(min.value>a[i][j]) {min.value=a[i][j];min.x=i;min.y=j;} } printf(“-----------------”);i=a[0][N-1];a[0][N-1]=max.value;a[max.x][max.y]=i;i=a[M-1][0];a[M-1][0]=min.value;a[min.x][min.y]=i;for(i=0;i printf(“%4d”,a[i][j]);} 执行结果: 53 74 65 30 40 26 50 61 27 16 54 58 76 19 74 44 92 71 48 57 60 32 73 67----------------- 53 74 65 30 92 26 50 73 61 27 16 54 58 76 19 74 44 40 71 48 57 60 32 73 67 9.源程序: main(){char s[255];int i,j,b=1;printf(“Input a string:”);scanf(“%s”,s);i=strlen(s);for(j=1;j<=i/2;j++)b=b&&(s[j-1]==s[i-j]);printf(b?“Yes ”:“No ”);} 执行结果: Input a string:level Yes 10.源程序: main(){char s[255],t,max=0,min=0,l,i;printf(“Input a string(length>4):”);gets(s);l=strlen(s);for(i=0;i Input a string(length>4):C++Builder Cu+Beild+r 11.源程序: main(){char m[13][10]={“****”,“January”,“February”,“March”, “April”,“May”,“June”,“July”,“August”,“September”, “October”,“November”,“December”};int i,j,k,a,s,n;printf(“Please input an integer(100..999):”);scanf(“%d”,&n);printf(“%d:%d+%d+%d=%d, %d%%13=%d, %s ”, n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)]);} 执行结果: Please input an integer(100..999):539 539:5+3+9=17, 17%13=4, April 第8章 函 数 一、单项选择题(第241页)1-5.BCCAA 6-10.CCDDD 11-15.ACACB 二、填空题(第243页)1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0)②return(n+sum(n-1))根据题意,如下程序较为合理: int sum(int n){if(n<=0)return(-1);/*-1是出错标志 */ else if(n==1)return(1); else return(n+sum(n-1));} 2.①return(1)②return(n*facto(n-1)) 三、编程题(第244页)3.源程序: main(){int i,a,b,c;for(i=100;i<999;i++)if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i)printf(“%dt”,i);} 执行结果: 153 370 371 407 8.源程序(非递归算法): #define P 13 /* P可以改为其他正整数 */ main(){int a[P],r,c;for(r=0;r<=P;r++){a[r]=1; for(c=r-1;c>=1;a[c--]+=a[c-1]); printf(“%*d”,(P-r)*3+1,a[0]); for(c=1;c<=r;printf(“%6d”,a[c++])); printf(“ ”);} } 执行结果: 126 126 120 210 252 210 120 165 330 462 462 330 165 220 495 792 924 792 495 220 286 715 1287 1716 1716 1287 715 286 9.源程序(递归算法): #include “stdio.h” void printOCT(unsigned long n){unsigned long i;if(i=n>>3)printOCT(i);putchar((n&7)+48);} main(){unsigned long i;scanf(“%ld”,&i);printOCT(i);} 执行结果: 1234567890 11145401322 本题也可以不用递归算法,源程序请参考第7章第三题4。第9章 指 针 一、单项选择题(第276页)1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD 二、填空题(第278页)1.①int * ②*z 2.*p++ 3.①' ' ②++ 4.①q=p+1 ②q max ④*q 三、编程题(第280页)7.源程序: main(){int i=0;char c[20];do{scanf(“%s”,&c);i++;} while(strcmp(c,“stop”));printf(“%d ”,i);} 执行结果: This car ran form Nanyang to Luoyang without a stop 10 9.源程序: main(){char s[255],c[255]={0};int i;gets(s);for(i=0;s[i];c[s[i++]]++);for(i=0;i<255;i++)if(c[i])printf(“%c=%dt”,i,c[i]);} 执行结果: abcedabcdcd a=2 b=2 c=3 d=3 第10章 结构、联合与枚举类型 一、单项选择题(第326页)1-4.DDAA e=1 C语言程序设计教程课后习题答案 第一章 C语言程序设计概述 -习题答案 算法的描述有哪些基本方法? 答 1、自然语言 2、专用工具C语言程序的基本结构是怎样的?举一个例子说明。 答 1、C语言程序由函数构成; 2、“/*”与“*/”之间的内容构成C语言程序的注释部分; 3、用预处理命令#include、#define可以包含有关文件或预定义信息; 4、大小写字母在C语言中是有区别的; 5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。C语言有什么特点? 答 1、具有结构语言的特点,程序之间很容易实现段的共享; 2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化; 3、运算符丰富,包含的范围很广; 4、数据类型丰富; 5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能; 6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚; 7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。★指出合法与不合法的标识符命名。 答 AB12--√ leed_3--a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--× XYZ43K2--√ AVE#XY--× _762--√ #_DT5--× C.D--×说明下列Turbo C热键的功能。 答 F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。 ①main() {printf(“********************n”);printf(“ welcome you n”);printf(“ very good n);printf(”********************n“);} ②main() { int a,b,c,t;printf(”please input three numbers;“);scanf(”%d,%d,%d“,&a,&b,&c);/*教材S是错误的*/ t=max(max(a,b),c);printf(”max number is:%dn“,t);} int max(int x, int y){ int z;if(x>y)z=x;else z=y;return(z);} 答 运行结果: ******************** welcome you very good ******************** 运行结果: please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/ max number is:4 7 一个C程序是由若干个函数构成的,其中有且只能有一个___函数。 答 main()8 在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。 答 1、User screen 2、Alt+F5 9 ★C语言对标识符与关键字有些什么规定? 答 1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。 2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。C源程序输入后是如何进行保存的? 答 是以C为扩展名保存的纯文本文件。 第二章 C语言程序的基本数据类型与表达式 -习题答案 ★指出下列常数中哪些是符合C语法规定的。 答 ''--× '101'--× ”“--× e3--× 019--√ 0x1e--√ ”abn“--√ 1.e5--×(2+3)e(4-2)--× 5.2e2.5--×请找出下列程序中的错误,改正后写出程序运行结果。 ①void main(){int x,y=z=5,aver;x=7 AVER=(x+y+z)/3 printf(”AVER=%dn“,aver);} ②void main() { char c1='a';c2='b';c3='c';int a=3.5,b='A' printf(”a=%db='“endn”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 答 main(){int x,y=5,z=5,aver;x=7;aver=(x+y+z)/3;printf(“AVER=%dn”,aver);} 运行结果:AVER=5 ②main() { char c1='a', c2='b', c3='c';int a=3,b='A';printf(“a=%d,b='%c'”end“n”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 运行结果:a=3,b='A'“end” aabcc abc 3 写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。int 99 -1 char 'h' unsigned int float 55.78 long int 答 int 99 104 66 55 68-1 char 'c' 'h' 'B' '7' 'D' unsigned int 99 104 66 55 68 65535 float 99.00 104.00 66.00 55.78 68.00-1.00 long int 99 104 66 55 68-1 ★写出程序运行结果。 ①void main(){int i,j;i=8,j=10;printf(“%d,%d,%d,%dn”,i,j,++i,j++);} ②main() { int a=1,b=2,c=30;;printf(“%d,%d,%d,%dn”,a=b=c,a=b==c,a==(b=c),a==(b==c));} 注意:a=b=c,a=b==c之间应为逗号,教材有误 答 运行结果: 9,11,9,10 运行结果: 30,1,0,0 ③void main() {int a=10,b=20,c=30,d;d=++a<=10||b-->=20||c++;printf(“%d,%d,%d,%dn”,a,b,c,d);} 答 运行结果: 11,19,30,1 ★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。⑴a%=(b%=3) ⑵n++,a+=a-=a*=a ⑶(float)(a+c)/2+(int)x%(int)y ⑷a*=b+c ⑸++a-c+b++ ⑹++a-c+++b ⑺a ⑼a+b,18+(b=4)*3,(a/b,a%b) ⑽x+a%3*(int)(x+y)%2/4+sizeof(int)⑾a 答 ⑴0 ⑵0 ⑶9.500000 ⑷90 ⑸10 ⑹10 ⑺'A' ⑻2 ⑼4.5 ⑽1 ⑾0 ⑿20 ⒀0 下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)? ①m=(a=4,4*5)与m=a=4,4*5 ②(float)(a/b)与(float)a/b ③(int)a+b与(int)(a+b)④m%=2+a*3与m=m%2+a*3 ⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b 答 ①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同; ②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。 ③因为a、b均为整数,其前后两个表达式的计算结果是一致的。 ④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。⑤前后表达式的计算结果应该是一致的:a=2, b=3, m=6 7 条件表达式x>0?x:-x的功能是什么? 答 如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。用一个条件表达式描述从a、b、c中找出最大都赋给max.答 max=a>(b>c?b:c)?a:(b>c?b:c);9 ★若x为int型变量,则执行以下语句后x的值为()。x=6;x+=x-=x*x;A.36 B.-60 C.60 D.-24 答 B.10 ★若有以下类型说明语句: char w;int x;float y;double z;则表达式w*x+z-y的结果为()类型。A.float B.char C.int D.double 答 D.第三章 顺序结构程序设计 -习题答案 变量k为float类型,调用函数scanf(“%d”,&k),不能使变量k得到正确数值的原因是___。 答 格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。★a=1234,b=12,c=34,则执行“printf(“|%3d%3d%-3d|n”,a,b,c);”后的输出是___。 答 |1234 1234 | 分析如下: ①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。 ②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。★设有“int a=255,b=8;”,则“printf(“%x,%on”,a,b);”输出是___。答 ff,10 ①如果“printf(“%X,%on”,a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。 ②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf(“%#x,%on”,a,b);”为或“printf(“%#X,%on”,a,b);”。本条解释不必须掌握。★以下程序输出的结果是___。main(){ int a1=1,a2=0,a3=2;printf(“%d,%d,%dn”,a1,a1+a2+a3,a3-a1);} 答 1,3,1 5 printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。 答 ①实际 ②左端补空格 6 ★已定义变量如下: int a1,a2;char c1,c2;若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。 答 scanf(“%d,%d,%c,%c”,&a1,&a2,&c1,&c2);7 输入两个整型变量a、b的值,输出下列算式以及运算结果___。a+b、a-b、a*b、a/b、(float)a/b、a%b 每个算式占一行。如a=10,b=5,a+b输出为:10+5=15 答 设int a=10,b=5;以下为输出语句及结果: ①printf(“%d+%d=%dn”,a,b,a+b);10+5=15 ②printf(“%d-%d=%dn”,a,b,a-b);10-5=5 ③printf(“%d*%d=%dn”,a,b,a*b);10*5=50 ④printf(“%d/%d=%dn”,a,b,a/b);10/5=2 ⑤printf(“%(float)d/%d=%fn”,a,b,(float)a/b);(float)10/5=2.000000 ⑥printf(“%d%%%d=%dn”,a,b,a%b);10%5=0 8 ★输入一个非负数,计算以这个数为半径的圆周长和面积。答 #define PI 3.1415926 main(){ float r,l,area;printf(“Input a positive:”);scanf(“%f”,&r);l=2*PI*r;area=PI*r*r;printf(“l=%ftarea=%fn”,l,area);} 9 输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。 答 main(){ int x,y;printf(“Input a number(100-999):”);scanf(“%d”,&x);y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/ 1、li 300.0 chang 30 200.0 chang 2、#include char sid[100]; char name[100]; float score[3];}student;void main(){ int i;float j; printf(“nPlease input sid: ”); scanf(“%s”,student.sid); printf(“nPlease input name: ”); scanf(“%s”,student.name); printf(“nPlease input 3 score:(like1,1,1)”);/*输入逗号隔开*/ scanf(“%f,%f,%f”,&student.score[0],&student.score[1],&student.score[2]); printf(“nsid = %s”,student.sid); printf(“nname = %s”,student.name); j=(student.score[0]+student.score[1]+student.score[2])/3.0; printf(“naverage = %.2f”,j); getch();} 3、#include do { n++; printf(“nnPlease input %d student message: nn”,n); printf(“t%d student sid: ”,n); p1=(student *)malloc(F);p1->next=NULL; scanf(“%s”,p1->sid); printf(“nt%d student name: ”,n); scanf(“%s”,p1->name); printf(“nt%d student scores(englesh,math,c_language): ”,n); scanf(“%d,%d,%d”,&p1->score.english,&p1->score.math,&p1->score.c_language); p1->score.all=p1->score.english+p1->score.math+p1->score.c_language; if(n==1) { head->next=p1;p2=p1;} else { p2->next=p1; p2=p1; } printf(“nntttContinue or back(press y/n): ”); ch=getch(); }while(ch=='y'||ch=='Y');return head;} void average1(student *head){ student *p;int j;clrscr();p=head->next; while(p) { j=p->score.all/3; printf(“nnname: %staverage: %d”,p->name,j); p=p->next; } printf(“nnnPress eny key return.”);getch();} void average2(student *head){ student *p;int n=0,temp1=0,temp2=0,temp3=0;p=head->next;while(p){ temp1+=p->score.english; temp2+=p->score.math; temp3+=p->score.c_language; p=p->next;n++;} printf(“nnaverage english is : %dnaverage math is : %dnaverage c_language is : %dt”,temp1/n,temp2/n,temp3/n);} student *sort(student *head){ student *head1,*p,*q,*r;int temp1=0,temp2=0,temp3=0,temp4;char s[15],n[15];head1=head;for(p=head1->next;p->next!=NULL;p=p->next){ r=p; for(q=p->next;q;q=q->next) if(q->score.all>r->score.all) r=q; if(r!=p) { strcpy(s,p->sid);strcpy(n,p->name); temp1=p->score.english; temp2=p->score.math; temp3=p->score.c_language; temp4=p->score.all; strcpy(p->sid,r->sid);strcpy(p->name,r->name); p->score.english=r->score.english; p->score.math=r->score.math; p->score.c_language=r->score.c_language; p->score.all=r->score.all; strcpy(r->sid,s);strcpy(r->name,n); r->score.english=temp1; r->score.math=temp2; r->score.c_language=temp3; r->score.all=temp4; } } return head1;} void output(student *head){ student *head2,*p;int i=1;clrscr();head2=sort(head);for(p=head2->next;p!=NULL;p=p->next) printf(“nnname: %stsid: %stenglish: %dtmath: %dtc_language: %dtaverage: %dtmingci: %d”,p->name,p->sid,p->score.english,p->score.math,p->score.c_language,p->score.all/3,i++); average2(head); printf(“nnnttPress eny key back.”);getch();} void main(){ student *head,*p1,*p2;int i=0,j=1;head=input();do { clrscr(); printf(“nn(1): average1.nn(2): average2.nn(3): sort.nn(4): output.nnn Please choose: ”); scanf(“%d”,&i); switch(i) { case 1: average1(head);break; case 2: clrscr();average2(head);printf(“nnnPress eny key retuen.”);getch();break; case 3: clrscr();p1=sort(head);for(p2=p1->next;p2!=NULL;p2=p2->next)printf(“nttname: %stmingci:%d”,p2->name,j++);printf(“nnnPress eny key back.”);getch();break; case 4: output(head);break; default: printf(“nYour choose is not right.”);break; } }while(i!=-1);} 4、#include p=(worker *)malloc(F);p->next=0; printf(“nntPlease input %d worker message : ”,n); printf(“n%d worker sid: ”,n);scanf(“%s”,p->sid); printf(“n%d worker name: ”,n);scanf(“%s”,p->name); printf(“n%d worker money: ”,n);scanf(“%d”,&p->money); if(n==1) { head->next=p;q=p; max=p->money;strcpy(a,p->name); min=p->money;strcpy(b,p->name); } else { q->next=p; if(p->money>max){max=p->money;strcpy(a,p->name);} if(p->money q=p; } printf(“ntty/n”);ch=getch();}while(ch=='y'||ch=='Y');return head;} void output(){ clrscr();printf(“nThe max money is: %dttname is: %snn”,max,a);printf(“nThe min money is: %dttname is: %s”,min,b);} void main(){ input();output();getch();} 5、6、#include“stdio.h” #define F sizeof(stu)#define NULL 0 typedef struct student { int sid;int average;struct student *next;}stu;stu *head;stu *create(){ stu *p1,*p2;int n=0;char ch;head=(stu *)malloc(F);head->next=NULL; do { n++; printf(“nnPlease input %d student message: nn”,n); printf(“t%d student sid: ”,n); p1=(stu *)malloc(F);p1->next=NULL; scanf(“%d”,&p1->sid); printf(“nt%d student average: ”,n); scanf(“%d”,&p1->average); if(n==1) { head->next=p1;p2=p1;} else { p2->next=p1; p2=p1; } printf(“nntttContinue or back(press y/n): ch=getch(); }while(ch=='y'||ch=='Y');return head;} stu *select(stu *head,int x){ stu *s;s=head->next;while(s){ if(s->sid==x) break; s=s->next;} return s;} stu *insert(stu *head,int x,int y){ stu *p,*r,*q;clrscr();p=head->next;r=(stu *)malloc(sizeof(stu));r->sid=x;r->average=y;if(p==NULL)/*如果插入空表*/ { p=r; r->next=NULL; ”); printf(“ninsert success!”); } else { while(x>p->sid)/*找到插入的位置,按学号大小。(找到位置或者到了表尾都会跳出循环)*/ { if(p->next==NULL)break;p=p->next; } if(x sid) /*插到中间位置*/ { r->sid=p->sid; r->average=p->average; p->sid=x; p->average=y; r->next=p->next; p->next=r; printf(“ninsert success!”); } else if(x==p->sid)/*学号不能相同*/ printf(“nError--->your input this same sid.”); else /*插到末尾*/ { p->next=r; r->next=NULL; printf(“ninsert success!”); } } return head;} stu *get(stu *head,int n)/*得到位置为n的结点的指针*/ { stu *p;int i;p=head->next;if(n==0)return head;else { for(i=1;i p=p->next; return p;} } stu *delete(stu *head,int sid){ stu *p,*q;int temp=0,i=0;p=head->next;if(!p) { printf(“nlist is empty.press eny key back.”);getch();return head;}/*表空*/ else { while(p) /*查找学号为sid的结点的指针*/ {i++;/*标记学号为sid的结点的位置*/ if(p->sid==sid) {temp=1;break;} /*temp=1标记找到了*/ p=p->next;} if(temp==1)/*如果有学号为sid的结点*/ { q=get(head,i-1);/*得到sid的前一个结点的指针*/ q->next=p->next; free(p); printf(“nndelete sucess!!”); return head; } else /*没有找到*/ { printf(“nnNO this data.n”); return head; } } } void print(stu *head){ stu *p;p=head->next;if(!p){printf(“nlist is empty.press eny key back.”);getch();} while(p){ printf(“n%d :t%d ”,p->sid,p->average); p=p->next;} } main(){ stu *p1,*p2;char ch1;int n,i=0,j=0;head=create();do {clrscr();printf(“n1.insert.”);printf(“n2.select.”);printf(“n3.delect.”);printf(“n4.print list.”);printf(“n5.EXIT ”);printf(“n ............choice(1-5).............”);ch1=getch();switch(ch1){ case '1': { clrscr(); printf(“nplease input insert sid.and average(like 1,1):”); scanf(“%d,%d”,&i,&j); head=insert(head,i,j); printf(“nnnPress eny key back.”);getch(); break; } case '2': { clrscr(); printf(“ninput you want to selete sid: ”); scanf(“%d”,&n); p1=select(head,n); { if(p1)printf(“nsid:%dtaverage:%d”,p1->sid,p1->average); else printf(“nNo this data.”); } printf(“nnnPress eny key back.”);getch(); break; } case '3': { clrscr();printf(“nPlease input you want delete sid: ”); scanf(“%d”,&n); head=delete(head,n); printf(“nnnPress eny key back.”);getch(); break; } case '4': { clrscr(); printf(“All information :”); print(head); printf(“nnnPress eny key back.”);getch(); break; } case '5': return; default: printf(“nnYour enter is not right.press eny key back.”);getch();} }while(n);} 7、#include char data; struct list *next;}L;L *set_list(){ L *head,*p1,*p2; char c; int n=0; head=(L *)malloc(F);head->next=0; /*建立链表*/ p1=p2=head; printf(“nPlease input char(press * finish):”); scanf(“%c”,&c); while(c!='*') { n++; if(n==1) p1->data=c; else { p1=(L *)malloc(F); p1->data=c; p2->next = p1; p2 = p1; p1->next = 0; } scanf(“%c”,&c); } p1=head; while(p1) { printf(“%c ”,p1->data);p1=p1->next; } printf(“nnn”); return head;} void change_list(L *head1) /*算法:p2指向最后一个元素,p1指向第一个元素。交换他们的值,p1,p2同时往中间靠拢。*/ { L *p1,*p2,*p3; int i,j,k,n=1; char temp; p1=head1;p2=head1;p3=head1; while(p3->next) { p3=p3->next;n++; }/*求链长*/ for(i=n;i>(n/2);i--)/*外循环使p1后移,p2前移。*/ { p2=head1;for(j=1;j p2=p2->next;/*p2指向最后一个元素*/ temp=p1->data;p1->data=p2->data;p2->data=temp;/*交换他们的值*/ p1=p1->next;/*p1向后移*/ } while(head1) { printf(“%c ”,head1->data);head1=head1->next;} } void main(){ L *head;head=set_list();change_list(head);getch();} 《C语言程序设计教程》习题参考答案 默认分类 2007-09-10 12:38:44 阅读6618 评论13 字号:大中小 订阅 【习题1】 一、简答题(在课本中寻找答案,略)1.1 C程序的基本结构包括哪些内容? 1.2 如何定义标识符? 1.3 输入格式、输出格式的组成包括哪些内容? 1.4 C语言函数分为哪两类? 1.5 计算表达式的值应该考虑哪些方面? 1.6 上机调试程序的步骤如何? 二、判断并改错 1.7 C程序执行的入口是main()函数,所以main函数必须放在程序的开头。错误:main函数可以放在程序的任何位置。并不限定在程序的开头。1.8 定义一个函数包括数据说明部分和执行语句部分,两者可以交叉出现。错误:不可以交叉出现,数据说明部分在执行语句部分的前面。1.9 编辑与编译不是一回事。 错误:不是一回事。编辑完成源程序的输入和修改;编译是对源程序进行语法检查,如果无语法错误,则生成目标程序。 1.10 scanf(“%d,%d”,&x,&y);的正确输入格式:3,4<回车>。正确 1.11 注释内容太多会影响程序的执行效率。 错误:不会影响程序的执行效率。因为在编译时,编译系统将注释内容删除或用空格代替,所以注释内容不会编译到目标程序中。 1.12 所有的数学公式可以直接出现在源程序中。 错误:数学公式需要转换成C语言能够接受的公式才能出现在源程序中。 三、编程题 1.13 在屏幕上输出自己名字的拼音。 提示:中文名字叫“张三”,对应的拼音为“Zhang San”,输出用printf()函数。1.14 输入圆的半径,求圆的周长,并将结果保留两位小数输出到屏幕上。提示:定义圆的半径r,圆的周长:2*3.14*r,输出结果保留2位小数可以用%.2f 1.15 输入两个整数,输出其中最大者。提示:模仿例1.3 1.16 输入三个整数,输出其中最小者。提示: min(min(a,b),c);【习题2】 一、简答题(在课本中寻找答案,略)2.1 常量与变量的区别? 2.2 C语言中的标识符的定义规则? 2.3 变量为什么要“先定义,后使用”? 2.4 字符常量'a'与字符串常量“a”有何区别? 2.5 大小写字母转换的规则是什么? 2.6 变量的具有哪三种属性? 二、单项选择题 2.7 C语言中,int型数据在内存中的存储形式是(D)。A)ASCII码 B)原码 C)反码 D)补码 2.8 下面四个选项中,均是不合法的用户标识符的选项是(C)。A)BA、x_0、do B)float、1a0、_Y C)x-y、goto、123 D)_123、tmp、CHAR 2.9 下列选项中不正确的常数的选项是(D)。A)0x12F B)-1.23E-2 C)12.0 D)0388 2.10 下面正确的字符常量是(B)。A)“a” B)'' C)“n” D)“376” 2.11 下面正确的字符串常量是(C)。A)'a' B)'376' C)“" D)376 2.12 表达式'A'+4*25.0-'b'的正确结果是(B)。A)67 B)67.0 C)不确定 D)67L 2.13 执行printf(”%x“,100);后的输出结果是(C)。A)100 B)0x100 C)0X64 D)64 2.14 int型的-1在内存中的存储形式是(A)。A)1111 1111 1111 1111 B)0000 0000 0000 0001 C)1111 1111 1111 1110 D)1000 0000 0000 0001 2.15 存储字符串”'abc376“需要的字节数是(D)。A)11 B)13 C)6 D)7 【习题3】 一、计算题 3.1 2.8+7%3*11%2/4(答案:2.8)3.2 5/2+5.0/2+7%6(答案:5.5)3.3 a=12,a*=2+3(答案:a=60)3.4 a=3,b=4,c=5,a+b>c&&b= =c(答案:0)3.5 3>5?3:5<8?25:40(答案:25)3.6 设a=1,b=2,c=3,d=4,m=n=1,有表达式(m=a>b)&&(n=c>d),计算表达式后m,n的值?(答案:m=0,n=1)3.7 设int b=7;float a=2.5,c=4.7;求下面表达式的值。a+(int)(b/2*(int)(a+c)/2)%4(答案:4.5) 二、单项选择题 3.8 若有代数式,则不正确的C语言表达式是(C)。A)x/b/c*y*8 B)8*x*y/b/c C)8*x*y/b*c D)x*y/c/b*8 3.9 有如下类型说明: int k,a,b;unsigned long w=8;double x=2.9 则以下不符合C语言语法的表达式是(A)。A)x%(-3)B)w*=-2 C)k=(a=6,b=4,a-b)D)a*=a+=a-=(b=4)*(a=3)3.10 有如下类型说明: float n;int m;则以下能实现将n中的数值保留小数点后两位,第三位四舍五入的表达式是(B)。A)n=(n*100+0.5)/100.0 B)m=n*100+0.5,n=m/100.0 C)n=n*100+0.5/100.0 D)n=(n/100+0.5)*100.0 3.11 设k=7,x=12;则下列表达式值为3的是(D)。A)x%=(k%=5)B)x%=(k-k%5)C)x%=k-k%5 D)(x%=k)-(k%=5)3.12 已知m=48,ch='a',n=0;则表达式(m>=n&&ch<'b'&&!n)的值是(B)。A)0 B)1 C)真 D)非0 3.13 下面哪个式子在b为奇数时结果为假(C)。 A)a%2==1 B)!(a%2==0)C)!(a%2)D)a%2 3.13 执行printf(”%f“,(x=3,y=5,x>y?1:1.5));后的输出结果是(D)。A)语法错误 B)1 C)1.5 D)1.500000 3.14 能表示条件0≤x≤100的表达式是(D)。A)0<=x<=100 B)x>=0,x<=100 C)0≤x≤100 D)x>=0&&x<=100 3.15 判断char型变量ch为数字的正确表达式是(B)。A)ch>=”0“&&ch<=”9“ B)ch>='0'&&ch<='9' C)'0'≤ch≤'9' D)ch>='0'||ch<='9' 三、编程题(应用条件运算) 3.16 输入一个整型成绩x,3.17 如果大于等于60分,3.18 输出“pass”,3.19 否则输出“fail”。提示:printf(”%s“,x>60?”pass“:”fail“);3.17 输入一个年份y,如果是闰年,输出“y is a leap year”,否则输出“y is not a leap year.” 提示:printf(”%d is %s“,y%4==0&&y%100!=0||y%400==0?”a leap year.“:”not a leap year.“);3.18 输入三条边a,b,c,如果它们能构成一个三角形,输出“Yes”,否则输出“No”。提示:printf(”%s“,a+b>c&&a+c>b&&b+c>a?”Yes“:”No“);3.19 输入三个数x,y,z,按从小到大的输出结果。 提示:分别用max0,min0代表最大、最小值,mid0表示中间值。max0=(x>y?x:y)>z?(x>y?x:y):z;max0=(x 提示:分别用x,y代表平面上一个点。printf(”%s“,x*x+y*y<=0?”Yes“:”No“);【习题4】 以下的编程题目要求首先画出程序的传统流程图或N-S流程图,再编写程序代码。上机实验时再输入到计算机中进行调试,并将调试过程中出现的问题和测试情况记录下来。(流程图请读者自己参考课本自己画,略)4.1 编程实现,输入一个整数,判断它是否为偶数,并显示相应的信息。提示:x代表输入的整数,if(x%2==0)printf(”neven“);else printf(”nodd“);4.2 编程实现,输入一个平面上的点,判断它是否落在单位圆上,并显示相应的信息。提示:x,y代表平面坐标,if(x*x+y*y==1)printf(”nYes“);else printf(”nNo“);4.3 编程实现,输入一个成绩等级(A-E),显示相应的百分制成绩段。 A: 90-100 B: 80-89 C: 70-79 D: 60-69 E: <60 提示:char grade;if(grade=='A')printf(”n90-100“);else if(grade=='B')printf(”n80-89“);....4.4 写出下面程序的运行结果: #include if((t>0)&&(t<=10))if((t>=3)&&(t<=6))x=2;else if((t>1)||(t>8))x=3;else x=1;else x=0;提示:int t;if(t<=0||t>10)c=0;else c=t;switch(t){ case 0: x=0;break;case 1: case 2: x=3;case 3:case 4:case 5: case 6: x=2;case 7:case 8: case 9: x=3;case 10: x=2;} 4.7 编程实现一个具有简单四则运算功能的计算器。 提示:参照例4.18,随机产生3个数,其中一个数用来判断是哪种运算。 4.8 编程实现,输入一行字符,将其中的数字字符对应的整数值加起来并输出结果。如: a45b8&*3 则是4+5+8+3,结果为20。提示:char c;int sum=0;while((c=getchar())!='n')if(c>='0'&&c<='9')sum=sum+c-'0';4.9 编程实现,求 的值。 提示:先计算n!,再在计算阶乘的外面套上一层循环。注意:20!是一个很大的值,float s=1;int i;例如:计算6!: for(i=1;i<=6;i++)s=s*i;4.10 编程实现,找出1000之内的所有完数,并按下面格式输出其因子:its factors are 1,2,3,所谓“完数”是指一个数如果恰好等于它的因子之和,因子是指能够整除该数的数。提示:先判断数是否为完数,如果是再考虑输出因子。以6为例输出因子: for(i=1;i<6;i++)if(6%i==0)printf(”%d,“,i);4.11 编程实现,计算序列的前20项之和,,,,...提示:这是一个累加式,每项是一个分式,用a、b分别表示分子、分母。注意:如果a、b都是整数,则是整除。float sum=0,a=2,b=1;int i;for(i-1;i<=20;i++){sum=sum+a/b;a=a+b;b=a-b;} 4.12 编程实现,求Sn=a+aa+aaa+...+ aa...a之值,其中a是一个数字。如:2+22+222+2222+22222(此时n=5),n,a由键盘输入。 提示:这是一个累加式,后1项可以由前一项表示,譬如:第2项可以由第1项表示: 第1项 t=a;第2项:t=t*10+a;4.13 编程实现,把从键盘输入的金额数(以圆为单位)按人民币面额划分,然后显示支付该金额的各种面额人民币的数量。 提示:譬如:123.58元可以表示100元:1张;20元:1张;2元:1张;1元:1张;5角:1张;5分:1枚;2分:1枚;1分:1枚。 为了简单可以只完成整数部分转换,即输入的金额数为整数。4.14 编程实现,使用循环结构打印以下图案。 * * * * * * * * * * * * * * * * * * * * * * * * * 提示:输出时,本图案要按向上三角形和向下三角形进行输出。每行输出中包括空格输出,„*‟号输出。输出空格和„*‟号个数要与行循环控制变量关联起来。 4.15 编程实现,以菜单方式实现猜数游戏系统。(功能自己设定)提示:模仿例4.14和例4.18完成。功能可以包括猜数范围,人数等设置。4.16 编程实现,以菜单方式实现四则运算辅助教学系统。 提示:随机产生两个操作数和运算符+、-、*、/,由使用者输入一个数,判断计算结果与输入的数是否相等,如果相等,表示正确,否则是错误的。【习题5】 填空题 5.1 若有定义int a[3][5];则排列在数组中的第9个元素是(a[1][3])。5.2 strlen(”How are youn“)的值是(12)。5.3 C语言中字符串结束的标志是(' ')。 5.4 写出一个名为s的单精度实型一维数组,长度是6,所有元素初值均为0,其数组定义语句是(float s[6]={0};)。 5.5 strcmp(”how“,”How“)的值是(32 或>0)。选择题 5.6 若有int s[4]={1,2,3,4};,则s[s[0]+2*s[2]-s[3]]的值是(D) A.1 B.2 C.3 D.4 5.7 对数组的描述正确的是(B)。 A.数组一旦定义其大小是固定的,但数组元素的类型可以不同。 B.数组一旦定义其大小是固定的,但数组元素的类型必须相同。 C.数组一旦定义其大小是可变的,但数组元素的类型可以不同。 D.数组一旦定义其大小是可变的,但数组元素的类型必须相同。5.8 对字符串”Boy“进行完整赋值的操作是(B)。 A.char s[3] = {'B','o','y'};B.char s[] = ”Boy“;C.char s[3] = {”Boy“};D.char s[3];s=”Boy“;5.9在c语言中引用数组元素时,其数组下标的数据类型允许是(C)。 A.整型常量 B.整型表达式 C.整型常量或整型表达式 D.任何类型的表达式 5.10对以下说明语句的正确理解是(B)。 int a[10]={6,7,8,9,10};A.将5个初值依次赋给a[1]至a[5] B.将5个初值依次赋给a[0]至a[4] C.将5个初值依次赋给a[6]至a[10] D.因为数组长度与初值的个数不相同,所以此语句不正确 三、看程序写结果 5.11 main(){int a[3][3] = {{1,0,2}, {2,2},{0,2}}, c[3][3],i,j;for(i=0;i<3;i++){ for(j=0;j<3;j++){ c[i][j] = a[a[i][j]][a[j][i]];printf(”%5d“,c[i][j]);} } printf(”n“);} 运行结果为: 2 2 0 0 0 2 2 0 1 5.12当运行以下程序时,从键盘输入:Ah2MA A3ha,请写出输出结果。main(){ char s[80], c='a';int i=0;scanf(”%s“,s);while(s[i++]!=' ')if(s[i] == c)s[i]=s[i]-32;else if(s[i]==c-32)s[i]=s[i]+32;puts(s);} 运行结果为:AH2Ma 四、编程题 5.13 用数组方法定义一个矩阵,求其转置矩阵。 提示:已知a[3][2],转置后的结果存放在b[2][3];则b[j][i]=a[i][j];5.15 从键盘输入9个不同的整数,组成三行三列的二元数组,找出每一列中的最大元素,并输出其行、列下标。 提示:已知a[3][3],max,row,col分别用来存放一列的最大值,行下标和列下标。5.15利用一个二维数组,打印出以下杨辉三角形,要求打印出10行。1 11 1 1 510 10 ∶ ∶ 提示:定义一个10行10列的二维数组,并且通过两重循环对第1列所有元素赋值1,主对角线也赋值。根据a[i][j]=a[i-1][j]+a[i-1][j-1]求出其它元素的值。 5.16 从键盘上输入一串字符(长度小于50个字符),找出其中最前面的一个X和最后面的一个X之间的子串,并输出子串的长度。 提示:定义一个长度为81的字符数组,从左边查找第一字符'X'的下标,从右边查找第一个字符'X'的下标。5.17 矩阵A是一个3×3的矩阵,B是一个3×2的矩阵,编程求C=A´B。 提示:定义一个3X2的数组c[3][2],该数组的元素值由A数组的一行元素分别与B的一列元素相乘得到。譬如:c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]。 5.18 把30个学生的学号和两门课程的成绩输入到一个二维数组中,求出的每个学生的两门课程的总成绩也放于此数组中,请按学生总分的高低打印出成绩单(包括学号、两门课程成绩和总分)。 提示:定义一个30行4列的数组。为了先快速测试算法是否正确?可以定义一个3行4列的数组,并且通过赋初始值,减少调试程序时反复输入数据的麻烦,算法调试成功后在加上输入数据部分。实现从高到低打印出成绩可以通过排序(降序);也可以通过另外定义1个一维数组作为索引,再通过索引打印成绩。5.19 不用现有的函数求计算字符串长度的程序。 提示:通过循环从前到后计算字符个数,遇到字符串结束标志' '结束。5.20 从键盘上输入一串字符,将其逆向显示。 提示:首先计算字符串的长度,在从右边逐一显示字符,直到下标等于0为止。 5.21 找出一个二位数组中的鞍点的位置,即该位置上的元素在该行上最大,在该列上最小。如果有,输出其所在的行、列号,如果没有,则输出提示信息。 提示:先找出行的最大元素,根据列下标找出列的最大元素。 5.22 从键盘上输入一串字符,将字符串中的所有A去掉后组成新的字符串,并将两字符串输出。提示:简单的方法是通过定义两个一维数组,逐个读出原字符串的字符,如果不为'A',则存入目的数组。当然也可以只用一个一维数组实现,通过两个下标指示来实现。 【习题6】 填空题 6.1 C语言程序执行的开始处是 main函数。 6.2 C程序中的一个函数由两部分组成,即 声明部分 和 执行部分。6.3为了保证被调用函数不返回任何值,其函数定义的类型应为 void。 6.4若一个局部变量的存储类型是static,则该变量的值在 程序执行完成 时被释放。6.5预处理命令#include的作用是 文件包含。 6.6定义一个宏,功能是判断两个数是否相等,相等为1,不等为0。 #define EQU(a,b)(a)==(b)?1:0 6.7 变量的存储类别有 自动型、静态型、寄存器型、和 外部类型 共4种,它们分别用 auto、static、register、extern 标识。选择题 6.8下述函数定义形式正确的是(C)。A.int f(int x;int y)B.int f(int x,y)C.int f(int x, int y)D.int f(x,y: int)6.9 关于函数参数,说法正确的是(A)。A.实参与其对应的形参各自占用独立的内存单元 B.实参与其对应的形参共同占用一个内存单元 C.只有当实参和形参同名时才占用同一个内存单元 D.形参是虚拟的,不占用内存单元 6.10 用数组名作为函数的实参时,传递给形参的是(A)。A.数组的首地址 B.数组的第1个元素 C.数组中的全部元素 D.数组的元素个数 6.11复合语句中定义的变量的作用范围是(D)。A.整个源文件 B.整个函数 C.整个程序 D.所定义的复合语句 6.12一个函数的返回值由(D)确定。 A.return语句中的表达式 B.调用函数的类型 C.系统默认的类型 D.被调用函数的类型 6.13在一个C源文件中,若要定义一个只允许本源文件所有函数使用的全局变量,其他文件中不允许使用,则该变量需要使用的存储类别是(D)。A.auto B.register C.extern D.static 判断题 6.14若定义的函数没有参数,则函数名后的圆括号可以省略。(´)6.15函数的函数体可以是空语句(Ö)。6.16只有main函数才能调用其他函数。(Ö) 6.17return语句中表达式的类型必须与函数定义的类型一致。(´)6.18函数的实参和形参可以是相同的名字。(Ö) 6.19函数调用中,形参与实参的类型和个数必须保持一致。(Ö)6.20外部类型的变量只能定义一次,但可在不同地方声明多次。(Ö)6.21外部类型的变量作用范围大,编程中应多用外部变量。(´)6.22预处理命令行必须以#开头,且最后要用分号结尾。(´)6.23宏命令的处理占用编译时间,而不占用运行时间。(Ö)看程序写结果 6.24 int fun(int n){int f=1;f = f*n*2;return(f);} main(){ int i,j;for(i=1;i<=5;i++)printf(”%dt“, fun(i));} 程序运行结果:2 4 6 8 10 6.25 int x1=30, x2=40;main(){int x3=10,x4=20;sub(x3,x4);sub(x2,x1);printf(”x1=%d,x2=%d,x3=%d,x4=%d“, x1,x2,x3,x4);} sub(int x,int y){int x1=x;x=y;y=x1;} 程序运行结果:x1=30,x2=40,x3=10,x4=20 6.26 #define A 4 #define B(x)A*x/2 main(){float c, a = 4.5;c=B(a);printf(”c=%5.1f“, c);} 程序运行结果:c= 9.0 编程题 6.25写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 提示:最大公约数可以采用“辗转相除法”,最小公倍数将两数乘积除于最大公约数。“辗转相除法”:设两个数分别用m,n表示且m>n,临时变量t,t=m%n;m=n;n=t;直到n等于0。6.26有3´3的矩阵A和3´2的矩阵B,编制一个函数,求C=AX´B。提示:参照习题5.17,A,B,C三个数组作为函数参数。 6.27编写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。 提示:一维字符数组用来存放字符串,并且将它传递到函数,在函数中通过元素值交换来完成反序存放。 6.28编制一个函数,由参数传入一个字符串,统计此字串中字母、数字、和其他字符的个数,在主函数中输入字符串并显示统计结果。提示:参照例题6.10。 6.29 定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,并显示结果。提示:带参数宏,swap(a,b,t)....6.30编写以下函数:①输入职工的姓名和职工号;②按职工号由小到大排序,姓名顺序也随之调整;③输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。提示:定义一个二维数组来存放职工信息;用数组名作函数的参数传递;通过“起泡算法”或“选择算法”;折半查找法先决条件是数据已经有序。【习题7】 1.1 语句int a,*p=&a;的含义是什么? 答:定义整型变量a,和整型指针变量p,并且p指向变量a。1.2 写出下列数组元素的指针法表示。 (1)num[3](2)data[4][2] 答:(1)*(num+3)(2)*(*(data+4)+2)1.3 写出下列数组元素的下标法表示。 (1)*(*(a+1)+2)(2)(*(a+3))[4](3)*(a[2]+5) 答:(1)a[1][2](2)a[3][4](3)a[2][5] 1.4 分析程序,写出程序输出结果。(1)main(){ int a[5]={1,2,3,4,5};int *p=&a[1];printf(”%d“,p[2]);} 输出结果:4(2)main(){ char a[]=”I love China!“;char *p=a;p=p+2;printf(”%s“,p);} 输出结果:love China!(3)main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int(*pa)[4]=a;pa++;printf(”%d“,*(*(pa+1)+2));} 输出结果:11(4)main(){ char *str[]={”zhao“,”qian“,”sun“,”li“};int i;for(i=0;i<4;i++)printf(”%c“,str[i][0]);} 输出结果:zqsl(5)void sub(int x,int y,int *z){ *z=y-x;} main(){ int a,b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4dn“,a,b,c); } 输出结果:-5,-12,-7(6)#include 答:int *f();表示函数返回一个整型指针;int(*f)();表示f是函数指针,指向整型函数。1.6 在二维数组中存放有4个学生,5门课程的成绩,用指针编程实现:(1)求出每门课程的平均成绩。(2)求每个学生的总成绩和平均成绩。 (3)在屏幕上列出各课成绩在85分以上的学生名单。(4)在屏幕上列出补考通知单。 提示:(1)(2)(3)略,(4)根据成绩小于60分,由于有5门课程的成绩,所以需要使用else if结构。1.7 输入一个字符串,内有数字和非数字字符,例如: a345dsaf412 x?371+89tah74 编程将其中连续的数字作为一个证书,一次存放到一个数组d中,例如:345放在d[0],412放在d[1],......。统计共有多少个证书,并输出这些整数。 提示:从字符串中提取”345“:t=ch-'0';t=t*10+(ch-'0');t=t*10+(ch-'0');t='3'-'0'=3;t=3*10+('4'-'0')=34;t=34*10+('5'-'0')=345 1.8 编写把十六进制数字字符串变换成整数的函数: int htoi(char *s)。提示:同1.7 1.9 编写把十进制整数变换成二进制数字字符串的函数: char *itob(int n)。提示:同1.7 1.10 用字符指针实现字符串拷贝功能,不能使用库函数。提示:定义两个字符数组a,b,复制操作b[i]=a[i];1.11 用字符指针实现字符串连接功能,不能使用库函数。 提示:定义两个字符数组a,b,先将下标定位到a的末尾' ',在将b的元素赋值给a的对应元素,注意:别忘了添加字符串结束标志' '。 1.12 用指向指针的指针的方法对5个字符串排序并输出。提示:一个指针数组和一个指向指针的指针变量。【习题8】 8.1 定义复数结构体,并写出复数的加、减、乘、除、的计算函数。提示:复数包括两个部分:实部和虚部。 8.2 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天。注意闰年问题。提示:计算该日是本年中的第几天,是从本年1月1日起。 8.3 有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入5个学生数据,要求在屏幕上显示出3门课程的平均成绩,以及最高分数的学生的数据(包括学号、姓名、3门课程成绩、平均分)。提示:定义结构体数组。最高分数是指每个学生3门课程的平均分最高。8.4 编写求链表长度的函数。 提示:从链表指针头往表尾移动计算结点的个数。 8.5 已有两个链表a、b,每个链表的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。提示:可以定义一个新的链表,先从链表a,再从链表b中取出结点,依次按学号升序插入到新的链表中。8.6 利用8.8节中的struct card结构编写一个程序实现5个人员数据输入和在屏幕上显示的功能:如果job项为't',则在position项为教师的职称(助教、讲师、副教授、教授);如果job项为's',则class项为学生的班级号,如501。 提示:在结构体中嵌入共用体position,根据job成员确定position的具体值。 8.7 口袋中有红、黄、兰3中颜色的球若干个。每次从口袋中取出1个球,根据颜色的不同,输入相应的颜色英文字符串。要求用枚举变量实现。提示:参照例8.8。【习题9】 一、简答题 9.1文件分为哪些类型?各有何特点? 答:文件分为二进制文件和文本(ASCII码)文件。二进制文件在内存和外存的形式是一样的,无需进行数据转换,用记事本打开该文件,看到得可能是乱码;文本(ASCII码)文件在内存是按二进制形式存在,在外存是以文本(ASCII码)形式存在,存在数据的转换,用记事本打开该文件,可以读懂其中的内容。9.2什么是文件类型指针?什么是文件位置指针?各有何用途? 答:文件类型指针就是用FILE结构体定义的指针变量。文件位置指针是文件存取操作的位置。前者指向被打开的文件;后者在文件存取操作后移动到下一个存取位置。9.3什么是设备文件?常用的设备文件有哪些? 答:在操作系统中,设备也被看作一个文件进行管理,即设备文件。常用的设备文件有:stdin,stdout,PRN等。 二、选择题 9.4 若想对文本文件只进行读操作,打开此文件的方式为(A)。A.”r“ B.”W“ C.”a“ D.”r+“ 9.5如果要打开C盘file文件夹下的abc.dat文件,fopen函数中第一个参数应为(D)。A.c:fileabc.dat B.c:fileabc.dat C.”c:fileabc.dat“ D.”c:fileabc.dat" 9.6用(A)函数打开文件,操作完毕后用(C)函数关闭它。 A.fopen B.open C.fclose D.close 三、编程题 9.7 有两个磁盘文件a.dat和b.dat,要求产生一个新的文件c.dat,将b.dat中的数据追加到a.dat后面,并存入到c.dat中。 提示:设两个磁盘文件为文本文件。以读的方式打开a.dat和b.dat,以写的方式创建c.dat。先将b.dat的数据复制到c.dat,再将a.bat的数据复制到c.dat。 9.8 从键盘输入一些字符,逐个把它们存入磁盘文件test中去,直到输入一个#为止。提示:利用fputc函数将字符写入到磁盘文件中。9.9 读入一个文件,输出其中最长的一行的行号和内容。提示:以硬回车键'n'作为行的结束标志。 9.10.编写程序将全班同学的姓名、地址和电话号码写到一个文件class.dat中。提示:学生的信息可以存放到结构体数组,以fwrite函数写数据到文件中。 9.11将9.10题产生的class.dat文件中的数据按姓名从低到高排列输出到显示器上,并把排了序的数据重新写入到文件class1.dat中。 提示:以fread函数从文件中读入学生的信息,并存放到结构体数组,在数组中进行排序。排序完毕再写入文件中。 9.12 利用9.11题产生的class1.dat文件,编程实现从中直接读取第三个同学的数据。提示:参照例9.5 9.13 在9.11题产生的class1.dat文件中插入一个新生的数据,要求插入后的文件数据仍然按姓名顺序排列。 提示:先将数据读入到数组中,插入新的数据后,再写入到文件中。【习题10】 一、编程题: 10.1 绘制y=x2的曲线。其中变量x的变化范围在-2~2之间,变化步长为0.01。 提示:屏幕的左上角是图形系统的绝对坐标原点(0,0),向右表示x坐标,向下表示y坐标。为了正确显示图形,需要另外定义相对坐标原点(0,0),譬如以绝对坐标(300,200)表示相对坐标的原点。10.2 改进例10.2,在模拟实时时钟合适的位置加上3、6、9、12的时钟数字。提示:参照例10.2,在第15行处恰当添加数字输出的程序。10.3 编程实现图形菜单。菜单的功能自定。 提示:菜单用图形方式显示,菜单选择时确定当前位置,在根据键盘按键重画菜单。10.4 BIOS功能调用INT 10H的09H号功能用于显示彩色字符,要求使用的寄存器如下: 调用前: AH=09H BH=当前显示页(图形方式下为0)AL=要显示字符的ASCII码 BL=字符及其背景颜色 CX=字符显示次数 利用系统调用函数编制彩色字符显示函数:void write_char(int asc,int atr)。其中参数asc为要显示字符的ASCII代码,art为字符颜色。该函数每次显示一个字符。提示:参照例10.5 10.5 有如下C语言程序: main(){ int x, y, z, max;int get_max(intx,int y,int z);printf(“please input x,y,z=”); scanf(“%d%d%d”,&x,&y,&z); max=get_max(x,y,z);printf(“max=%d”,max); getch();} 程序中get_max函数的作用是求三个整数中最大值。请用汇编语言实现函数get_max,并将C语言程序和汇编子程序连接,生成一个可执行文件。提示:参照例10.13s[i])min=i;}第二篇:《C语言程序设计教程(第二版)》习题答案
第三篇:C语言程序设计教程课后习题答案
第四篇:C语言程序设计教程第九章习题答案
第五篇:《C语言程序设计教程》习题参考答案