资源描述
c语言程序设计教程(第2版)参考答案
习题1
1-1 单选题
1~5 BBBAC
1-2 填空题
1. 函数
2. 主函数main(),主函数main()
3. 主函数main()
4. 函数首部,函数体
5. {, }
6. 顺序结构,选择结构,循环结构
7. .c, .obj, .exe
第2章
2.1 单选题
1~5 DBDCA 6~10 DCABA 11~15 CADBD 16~20CAABC
21~25ADAAA 26~30ACBAC 31~35BADDA 36~40BBCCC
41~45BDABA 46~49ABBB
2.1 填空题
1.2.000000
2.1,0.5
3.9,2
4.6
5.100,d
6.(1)20 (2)0 (3)60
7. (1)10,6,4 (2)6,9,15 (3)3,60,83
8. 55
9. 11 6 4
10.5
11. double
12..整型 字符型 实型 枚举类型
13.数据类型 数据类型
14. 字母 数字 下划线 字母 下划线
15. 单精度 双精度
16. 变量初始化
17. 双引号
18. ’\0
19. x=3.600000,i=3
习题3
3-1 选择题
1-5 BDABC 6-10 ADCAC 11-15 BBBCC 16-20 CDCDA
21-25 CACAA 26-29 BCBA
3-2 填空题
1. 3
2. 0261
3. 0x10
4. 2, 1 互换a,b的值
5. 6.6
6. –003
7. 5.0,4,c=3<Enter>
8. i=10,j=20<Enter>
9. (1) 65
(2) 65,A
(3) 56.123400,123.456001
(4) 3.141600
(5) 8765.432
(6) 5.864000e+002
(7) 3.141600e+000
(8) 3.1416
(9) 8765
(10) 3.1416,8765.43
10. a=2 b=5x=8.8 y=76.34c1=65 c2=97
11. B66
12. n1=%d\nn2=%d\n
13. 12
14. 11
15. 25 21 37
16. 10030
17. 1B
18. 88
19. 2 20.000000
20 67 G
习题4
4-1单选题
1~5 AADAD 6~10 ACB BB 11~15BADAD 16~20BADBA
21~25CDBDD 26~30DCDCA 31~35DAACB 36~40BDBAD
41~42AA
4-2填空题
1. 1
2. (1) a>0 || b>0 (2) x>0 && x<=10
(3) a==1.5 && b==1.5 && c==1.5 (4)p<a || p<b || p<c
3.(1)0 (2)1 (3)1 (4)0 (5)1
4. (max=a>b?a:b)>c?max:c
5.-4
6.1
7.5,0,3
8. (1) (a==0) (2) (b==0) (3) (disc<0)
9. 1 1 0 1
10. 10 20 0
11. yes
12.X==0
13. x=1 y=0
x=2
14. ch>=’A’&& c<=’Z’ ch=ch-32
15. -1
16.0 1
习题5
5-1单选题
1~5 CDABA 6~10 ABDDB 11~15 DBCBC 16-21 DBCBCD
5-2填空题
1.20
2.333
3.(1) i<10 (2) j%3!=0
4. (1) flag*(float)k/(k+1) (2) flag=-flag
5.(1) max=x (2) x!=-1 (3) scanf("%d", &x)
6.0
7.22
8.t*10
习题6
6-1单选题
1~5CBBAD 6~10 DBCCD 11~15DCABC 16~20ABBBC
21~25CCBAA 26~30ABBDB 31~35BDADD 36~40ADCAA
41~43BBB
6.2 填空题
1. 120
2. x
3 . 3,2,2,3
4. fac/i
5. 8,17
6. 9
7. 1.0/(i*i)
8. fun-in:30,20,10
fun-end:1015,35,1050
10,20,30
9. 012345
10. 93636
11. –f
12. 0 10 1 11 2 12
13. 4 3 3 4
14. x
15. void fun(double b[ ])
16. (1) j
(2) str[j-1
17. A+B=9
18.246
19. 1:a=1,b=1
2:a=1,b=2
20. x=9
x=10
21. 9
22.777
习题7
7-1单选题
1-5 DBCCB 6-8 BDCAD
7-2填空题
1. c
2. 60
3. 1000 10
4. 16
5. 81
6. 100, 144
习题8
8-1单选题
1~15 CADAC 6~10 CCDAB 11~15 CBBCD 16~20CAABA
21~25 DACDA 26~30BDCAD 31~35ADACD 36~37AC
10000
01000
00100
00010
00001
8-2填空题
1 (1) 2 3 4 5 (2) 10010 (3) QuickC (4)
2. (1) j+=2 (2) a[i]>a[j]
3. (1) r+b[k] (2) *x
4. 1 3 7 15
5. &a[i]
a[i] 或 *(a+i)
6. m-1,n-1
7. (1)i<10
(2)a[i]-a[i-1]
(3)i%3= =0
8. (1)a[i][j]+b[i][j]
(2)printf(“\n”)
9.0
习题9
9-1单选题
1~5 DDACB 6~10 ACBAD 11~15 CDBCC
16~20 DADAC 21~25 ACDAC 26~30 DDDAA
31~33 ABC
9-2填空题
1 . 2,1
2. 10#30#
3. FOUR,O
4. 60
5. 49
6. 2
7. 2
8. 7 5 3 1 9
9. 15
1,1,1, 1,1
3,3,3, 3,3
10.
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
11.
12. (1) *x (2) t
13. (1) '\0'或0 (2) n++或n+=1或n=n+1
14. 024
习题10
10-1单选题
1-5 CDBBB 6-10 BBBAD 11-15 CCBDA 16-20BDCBB
21-25CDDCD 26-30CADBB
10-2填空题
1. 所有结构体成员所占存储空间的总和
2. 与占用存储空间最大的那个成员相等
3. (1) 结构体 (2) 3 (3) sa.a (4) 9 (5) psa=&sa
4. 80
5. struct node
6. 0
7. 2 3
8.22
9. 10,x
10. 2,3
习题11
11-1单选题
1-6 BADDAA
11-2填空题
1. 3d3d330
2. (1) 28 (2) 20 (3) 0 (4) -9
3. (1) 251 (2) 42 (3) 209 (4) –295 (5) 848
4. 2 4 6
习题12
12-1单选题
1-5 BCDCA 6-10 ADABC 11-14BDDA
12-2 填空题
1. rewind(文件指针)
2. "d1.dat","rb"
3. stdin
4. 文本文件 二进制文件
5. (1)"w" (2) str[i]-32 (3) "r"
6. fopen
7. Hell
8. (1) "r" (2) fgetc(fp) (3) time++
9. 文本文件 二进制文件
10. 非零值 0
习题12
12-1单选题
1-5 BCDCA 6-8 ADA
12-2 填空题
1. rewind(文件指针)
2. "d1.dat","rb"
3. stdin
4. 文本文件 二进制文件
5. (1)"w" (2) str[i]-32 (3) "r"
6. fopen
7. Hell
8. (1) "r" (2) fgetc(fp) (3) time++
实验篇
实验1 熟悉Visual C++6.0可视化集成开发环境
略
实验2 顺序结构程序设计
略
实验3 选择结构程序设计
(1) 略
(2) 略
(3) #include "stdio.h"
main()
{
float a,b;
printf("Please input the data a and b:\n");
scanf("%f%f",&a,&b);
if(a>10.0)
a=a-10.0;
else
{ a=a+10.0;
if(b>a) ;
else b=a-b;
}
printf("a=%f, b=%f\n",a,b);
}
实验4 循环结构程序设计
(1) 略
(2) 略
(3)编写一个程序,打印输出半径为1~10的圆的面积,若面积为40~90则予以打印,否则,不予打印。
#include "stdio.h"
main()
{ float r=0, area=0;
while(r<10 && area<90)
{ if (area>40)
printf("r=%f, area=%f\n",r,area);
r=r+1;
area=3.1415926*r*r;
}
}
(4)从键盘输入一批整数,统计其中不大于100的非负数数值的个数。(用while循环实现。)
#include "stdio.h"
main()
{ int x,i=0;
scanf("%d",&x);
while(x>=0)
{ if(x<=100)
i++;
scanf("%d",&x);
}
printf("the number is:%d\n",i);
}
(5)用p/4=1-1/4+1/5-1/7+1/9-…公式求p的近似值,直到最后一项的绝对值小于10-4为止。
#include "math.h"
main()
{ double k=1.0,n=1.0,pi=0,t=1.0;
while (fabs(t)>=1e-4)
{ pi=pi+t;
n=n+2.0;
k=-k;
t=k/n;
}
pi=pi*4;
printf("pi=%lf\n",pi);
}
(6)解决猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩一个桃子了。求第一天猴子共摘了多少个桃子。
#include <stdio.h>
main()
{ int i,m,n;
for (n=1,i=1;i<10;i++)
{ m=2*n+2;
n=m; }
printf("total=%d\n",m);
}
(7)取彩球问题。现有12个彩球——3个白球、3个红球、6个黑球,从中任意取n(2≤n≤12)个球,求所有不同的取法。
#include "stdio.h"
main()
{
int n,white,red,yellow,count=0;
printf("Please input the number of ball took:");
scanf("%d",&n);
printf("white red yellow\n");
for(white=0;white<=3;white++)
for(red=0;red<=3;red++)
{ yellow=n-white-red;
if(yellow>=0 && yellow<=6)
{ printf("%6d%6d%6d\n",white,red,yellow);
count++; }
}
printf("Total:%d\n",count);
}
实验5 函数
(1) 略
(2) 略
(3)求两个整数的最大公约数和最小公倍数,要求:用一个函数求最大公约数,用另一个函数求最小公倍数,分别采用用全局变量和不用全局变量两种方法做。
l 使用全局变量:
#include "stdio.h"
int x,y;
int hef()
{ int u=x,v=y,a,b;
if(u>v)
{ a=u; u=v; v=a; }
while((b=u%v)!=0)
{ u=v; v=b; }
return(v);
}
int led(int x,int y,int h)
{ return(x*y/h);}
main()
{
int h,l;
scanf("%d%d",&x,&y);
h=hef(x,y);
printf("HCF=%d\n",h);
l=led(x,y,h);
printf("LCD=%d\n",l);
}
l 不用全局变量:
#include "stdio.h"
int hef(int x,int y)
{
int a,b;
if(y>x)
{ a=x; x=y; y=a; }
while((b=x%y)!=0)
{ x=y; y=b; }
return(y);
}
int led(int x,int y,int h)
{ return(x*y/h);}
main()
{ int x,y,h,l;
scanf("%d%d",&x,&y);
h=hef(x,y);
printf("HCF=%d\n",h);
l=led(x,y,h);
printf("LCD=%d\n",l);
}
(4)计算s = 1/1-1/2+1/3-…+1/9999-1/10000,分别采用下列各种方法,每种方法单独用一个函数实现,最后加以比较:
① 从左到右各项相加;
② 从右到左各项相加;
③ 从左到右各个正项和负项分别相加;
④ 从右到左各个正项和负项分别相加。
#include "stdio.h"
void lsum(int n);
void rsum(int n);
void lsumc(int n);
void rsumc(int n);
main()
{ lsum(10000);
rsum(10000);
lsumc(10000);
rsumc(10000);
}
void lsum(int n)
{ int i,k=1;
double sum=0,t;
for(i=1;i<=n;i++)
{ t=1.0*k/i;
sum+=t;
k=-k;
}
printf("the lsum is:%lf\n",sum);
}
void rsum(int n)
{ int i,k=-1;
double sum=0,t;
for(i=n;i>=1;i--)
{ t=1.0*k/i;
sum+=t;
k=-k;
}
printf("the rsum is:%lf\n",sum);
}
void lsumc(int n)
{ int i; double sum=0;
for(i=1;i<=n-1;i++,i++)
sum+=1.0/i;
for(i=2;i<=n;i++,i++)
sum-=1.0/i;
printf("the lsumc is:%lf\n",sum);
}
void rsumc(int n)
{ int i; double sum=0;
for(i=n;i>=2;i--,i--)
sum-=1.0/i;
for(i=n-1;i>=1;i--,i--)
sum+=1.0/i;
printf("the rsumc is:%lf\n",sum);
}
(5)猴子吃桃问题的函数化。把猴子吃桃问题写成一个函数,使它能够求得指定一天开始时的桃子数。
#include "stdio.h"
int monkey(int k)
{ int i,m,n;
for(n=1,i=1;i<=10-k;i++)
{ m=2*n+2;
n=m; }
return(n);
}
main()
{ int day;
printf("Please input the day(1<=day<=10):\n");
scanf("%d",&day);
printf("day: %d, total:%d",day, monkey(day)); }
(6)菜单程序。编写一个菜单程序,运行后首先在屏幕显示如图所示的菜单,当输入数值1时,调用显示“@”图案的函数;当输入数值2时,调用显示“$”图案的函数;当输入数值3时,程序结束。
#include "stdio.h"
void view1();
void view2();
main()
{
int op;
printf("\n************************************\n");
printf(" Menu section \n");
printf(" 1.view(@) \n");
printf(" 2.view($) \n");
printf(" 3.exit \n");
printf("************************************\n");
printf("\nPlease input selection:\n");
while(1)
{
scanf("%d",&op);
if(op==1)
{ view1();
printf("\nPlease input selection:");
}
else if(op==2)
{ view2();
printf("\nPlease input selection:");
}
else return;
}
}
void view1()
{ int i;
for(i=1;i<15;i++)
putchar('@');
return;
}
void view2()
{ int i,j;
for(i=1;i<5;i++)
{ for(j=1;j<i;j++)
putchar(' ');
for(j=1;j<10;j++)
putchar('$');
printf("\n");
}
return;}
实验6 数组
(1) 略
(2) 略
(3)设有含10个元素的一维整型数组,其中偶数和奇数各占一半,将该数组变换为2´5的二维数组,且偶数和奇数各成一行。
#include "stdio.h"
main()
{ int a[10],b[2][5],i,j=0,k=0;
printf("Please input the array a:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
{ if(a[i]%2==0)
{ b[0][j]=a[i];
j++; }
else
{ b[1][k]=a[i];
k++; }
}
for(j=0;j<=1;j++)
for(k=0;k<=4;k++)
printf("b[%d][%d]=%d ",j,k,b[j][k]);
}
(4)找出一个二维数组的鞍点,即该位置上的元素在所在行上最大,在所在列上最小,注意也可能没有鞍点。
#include "stdio.h"
#define M 3
#define N 4
main()
{ int a[M][N],i,j,k;
printf("Please input the array a:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++)
{ k=0;
for(j=1;j<N;j++)
if(a[i][j]>a[i][k]) k=j;
for(j=0;j<M;j++)
if(a[j][k]<a[i][k]) break;
if(j==M)
printf("%d %d,%d\n",a[i][k],i,k);
}
}
(5)有n个人围成一圈,顺序编号。从第1个人开始报数(从1到m),凡报到m的人退出圈子,求最后一个圈中的人的编号。
#include "stdio.h"
main()
{ int i = 0; int k = 0;
int quit_num = 0;
int n; //总人数
int m; //报数的最大数
int num[100]; //保存所有人的编号
int *p = num; //初始化指针,使其指向num数组
printf("Please input number of person: n = ");
scanf("%d", &n);
printf("Please input the number m = ");
scanf("%d", &m);
/*给所有的人编号为1到n */
for (i = 0 ; i < n ; i ++ )
{ *(p + i) = i + 1; }
i = 0;
/*当未退出人数大于1时 执行循环*/
while(quit_num < n - 1)
{ while (i<n)
{ if(*(p+i)==0)
{ k++;
if(k==m) {*(p+i)=0; quit_num++; k=0; }
}
i++;
}
i=0;
}
while (*p == 0) p ++; //查找留在圈中的人
printf("The last one’s number is : %d\n" , *p);
}
实验7 指针
(1) 略
(2) 略
(3) 用指针作函数参数求4个整数中的最大者。
#include "stdio.h"
void max(int *,int *);
main()
{ int a,b,c,d,*pa,*pb,*pc,*pd;
pa=&a;pb=&b;pc=&c;pd=&d;
printf("Please input the data a,b,c,d:\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
max(pa,pb);
max(pa,pc);
max(pa,pd);
printf("the max number of the datas is:%d\n",*pa);
}
void max(int *p,int *q)
{ int t;
if(*p<*q)
{ t=*p; *p=*q; *q=t; }
}
(4)编写一个对含有n个元素的一维数组求和的函数sum( ),要求用指针作为此函数的参数,并在主函数中调用此函数,实现对含有任意多个元素的一维数组求和的功能。
#include "stdio.h"
#define N 5
int sum(int *);
main()
{ int a[N],s=0,*p=a,i;
printf("Please input the array a:\n");
for(i=0;i<N;i++)
scanf("%d",a+i);
s=sum(p);
printf("the sum of the array a is:%d\n",s);
}
int sum(int *p)
{ int s,i;
for(i=0;i<N;i++)
s+=*(p+i);
return s;
}
(5)编写一个在一维有序数组中插入数据的函数insert( ),并在主函数中调用它实现数据的插入。有序数组在主函数中给出,可以通过初始化获得,也可以通过键盘输入任意数据。
#include "stdio.h"
void insert(int *,int,int);
main()
{ int i, a[6],x;
printf("Please input the array a:\n");
for(i=0;i<5;i++)
scanf("%d",&a[i]);
printf("Please input the insert data x:\n");
scanf("%d",&x);
insert(a, 5,x);
printf("the new array a:\n");
for(i=0;i<6;i++)
printf("%d ",a[i]);
}
void insert(int *p, int n, int x)
{ int i,j;
for(i=0;i<n;i++)
if(*(p+i)>x)
break;
for(j=n;j>i;j--)
*(p+j)=*(p+j-1);
*(p+i)=x;
}
实验8 结构体和共用体
(1) 略
(2) 略
(3)*建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
#include "stdio.h"
struct list
{ char xh[4];
char xm[10];
char xb;
int nl;
struct list *next;
};
typedef struct list SLIST;
SLIST *creat_list()
{ SLIST *h,*s,*r;
int i;
h=(SLIST *)malloc(sizeof(SLIST));
r=h;
for(i=0;i<3;i++)
{ s=(SLIST *)malloc(sizeof(SLIST));
scanf("%s%s%d%c",s->xh,s->xm,&s->nl,&s->xb);
r->next=s;
r=s;
}
r->next=NULL;
return h;
}
void dele_list(SLIST *p,int age)
{ SLIST *q=p->next;
while(q)
if(q->nl!=age)
{ p=p->next; q=q->next; }
else
{ p->next=q->next; break; }
}
main()
{ SLIST *head,*p;
int age;
head=creat_list();
printf("Please input the age:\n");
scanf("%d",&age);
dele_list(head,age);
p=head->next;
while(p!=NULL)
{ printf("%s, %s, %c, %d\n",p->xh,p->xm,p->xb,p->nl);
p=p->next; }
}
实验9 文件
(1)略
(2)编写程序实现将一个文本文件复制到另一个文本文件中,源文件内容自己定义。
#include "stdio.h"
main(int argc, char *argv[])
{ FILE *in,*out;
if(argc!=3){ printf("please enter the filename");exit(0);}
if((in=fopen(argv[1],"r"))==NULL)
{ printf("cannot open infile\n");
exit(0); }
if((out=fopen(argv[2],"w"))==NULL)
{ printf("cannot open outfile\n");
exit(0); }
while(!feof(in)) fputc(fgetc(in),out);
fclose(in); fclose(out); }
实验10 综合编程
略
模拟试卷(一)参考答案
一.选择题(1~30每题1分,31~50每题2分,共70分)
1
2
3
4
5
6
7
8
9
10
C
B
D
C
D
D
B
A
C
A
11
12
13
14
15
16
17
18
19
20
B
B
D
C
A
B
C
C
A
C
21
22
23
24
25
26
27
28
29
30
A
B
B
B
B
C
D
D
A
C
31
32
33
34
35
36
37
38
39
40
C
D
D
C
B
B
B
A
B
A
41
42
43
44
45
46
47
48
49
50
C
C
D
C
C
B
C
C
D
C
二.填空题(每空2分,共30分)
空序号
答案
空序号
答案
【1】
main()
【9】
10 20 0
【2】
11 6 4
【10】
1 B
【3】
5
【11】
4 3 3 4
【4】
1 1 0 1
【12】
0 10 1 11 2 12
【5】
i<=9 或 i<10
【13】
yes
【6】
k%3
【14】
-f
【7】
0
【15】
1 3 7 15
【8】
b
模拟试卷(二)参考答案
一.选择题(共35道小题,70分,每题2分)
1
2
3
4
5
6
7
8
9
10
A
A
A
C
B
D
A
B
C
D
11
12
13
14
15
16
17
18
19
20
C
D
A
A
B
B
B
D
A
C
21
22
23
24
25
26
27
28
29
30
A
A
D
B
D
A
A
B
D
A
31
32
33
34
35
D
A
B
B
C
二.填空题(每空2分,共30分)
题空号
答 案
题空号
答 案
【1】
double
【2】
x==0
【3】
0
【4】
–f 或 f*-1 或 –1*f 或 f*(-1) 或 (-1)*f
【5】
fun(10)
【6】
x
【7】
a=1.0;b=1.0;s=1.0;
【8】
-1 或 (-1)
【9】
*sn 或 sn[0]
【10】
&a[i]
【11】
a[i] 或 *(a+i)
【12】
row
【13】
a[row][colum]
【14】
!(s[i]>='0' && s[i]<='9') 或
s[i]<'0' || s[i] > '9'
【15】
'\0' 或 0
展开阅读全文