2004年计算机博士入学试题
一、选择题(单选,每题2分,共20分)
1.已知 int x=1,y=2,z=3;则z+=xy++x++y的值是(D)
A,2 B,4 C,3 D,6
2.已知int a[]={10,9,8,7,6},p=a;则(p+1)(p+2)[2]的值是(C)
A,72 B,80 C,54 D,有语法错误
3.已知int i,j;表达式(j=i=5,i=j=5+i=3=5)的值是(A)
A,1 B,5 C,3 D,0
4.从计算机所用资源(时间和空间)角度分析,宏与函数的主要区别是(B)
A,宏的使用节省了存储空间,函数消耗了时间;
B,宏的使用耗费了存储空间,函数消耗了时间;
C,宏的使用耗费了存储空间,函数节省了时间;
D,宏的使用节省了存储空间,函数节省了时间;
5.一维指针数组名作为实参,若有以下说明
int p[5];
....
sub(p);
则sub函数中对应的形参可以是(D)
A. sub(int p[5]);
B. sub(int p[]);
C. sub(int p);
D. 以上答案都正确。
6.C语言函数中的形参和在函数中定义的变量,都是在调用该函数时系统会给他们分配存储空间,在函数调用结束时就释放他们所占的空间,该说法(A)
A错误 B正确
7.若有以下说明
union
{int n[3];
char ch ;
float f;} a;
如果a.n[0]的地址为158,则a.ch和a.f的地址分别为(A)
A 158,158
B 164,165
C 159,160
D 170,171
8.程序的3种基本控制结构是(C)
A 顺序,转移,选择;
B 选择,IO, 递归;
C 重复,选择,顺序;
D 重复,递归,子程序。
9.程序段
scanf(“%d%d”,&a,&b);
c=5a+b;
if(c= =0) a=1;
else a=1c+1b;
保证该程序段运行不出错的必要条件是(C)
A b0
B a0&&b0
C b!=0
D c!=0&&b!=0
10.在进行文件操作时,写文件的一般含义是(B)
A 将磁盘中的信息存入计算机CPU;
B 将计算机内存中的信息存入磁盘;
C 将计算机CPU中的信息存入磁盘;
D 将磁盘中的信息存入计算机内存。
二、按要求完成下列各题(共50分)
1.写出下列程序的输出结果(5分)
int a=1;
main()
{int a;
for(a=1;a10;a++)
{sub(a++);
printf(“%d”,a);}
}
sub(int a)
{a=aa;
return;
}
答案2 4 6 8 10
2.写出下列程序的输出结果(5分)
f(int x ,int y)
{int r;
if(y= =1) r=x;
else r=f(x,y-1)+x;
return r;
}
main()
{int a=6,b=5;
printf(“%d”,f(a,b));
}
答案36
3.写出下列程序的输出结果(5分)
func(int s,int y)
{static int t=3;
y=s[t];
t--;
}
main()
{int a[]={10,20,30,40},i,x=0;
for(i=0;i4;i++)
{func(a,&x);
printf(“%d”,x);
}
printf(“n”);
}
答案40 30 20 10
4.写出下列程序的输出结果(5分)
int sum1(int n)
{int p=0,s=0,i;
for(i=1;in;i++)
{if(i%2) continue;
s+=p+=i;}
return s;
}
main()
{printf(“%dn”,sum1(10));}
答案40
5.写出下列程序的输出结果(6分)
double x,y,z;
double f(),g(),t();
main()
{x=5.0;
y=t(x,f);
z=t(x,g);
printf(“y=%f z=%fn”,y,z);
}
double t(double a,double (f)())
{return (f)(a+a);}
double f(double x)
{return 3.0x;}
double g(double x)
{return 3.0+x;}
答案y=30.00000 z=13.00000
6.写出下列程序的输出结果(8分)
void f(int i,char cp)
{for (;i;i--)
printf(“%c”,cp++);}
main()
{char a[][3]={“ABC”,“DEF”,“GH”};
char p;
p=a[0];f(1,p++);f(1,p++);f(1,p++);
printf(“n”);
p=a[1];f(3,p++);f(2,p++);f(1,p);printf(“n”);
printf(“%sn”,a[0]);}
答案ABC
DEFEFF
7.写出下列程序的输出结果(8分)
#include “stdio.h”
main()
{char f,a;
int i,j;
f= “%11.2s”;
a= “”;
printf(“n”);
for(i=0;i6;i++)
{(f+2)=‘6’- i ;
printf(f,a);
if(i= =0) printf (“n”);
else if (i= =5) printf(“”);
else {for(j=0;j2i-1;j++) printf(“ ”);
printf(“n”);}
}
}
答案
8.写出下列程序的输出结果(8分)
sub(int s,int m,int n,char st[])
{int p,q,t;
t=st[s];p=s;
while(1)
{q=(p+m)%n;
if(q= =s) break;
st[p]=st[q];
p=q;
}
st[p]=t;
}
char b[]= “0123456789”;
main()
{sub(1,2,10,b);
puts(b);}
答案0 3 2 5 4 7 6 9 8 1
三、程序填空题(每空2分,共20分)
1.本程序的功能是判断指定的正整数是否为素数,若是则输出该素数。
int f(int a)
{int y,i;
i=2;y=1;
while(ia2&&[(1)])
{if([(2)]) y=0;
i++;
}
return y;
}
main()
{int m;
scanf(“%d”,&m);
if(f(m))
printf(“%d”,m);
}
答案(1)y
(2) !(a%i) 或 a%2= =0
2.本程序的功能为将给定的一组整数由小到大的顺序排序,排序后输出。具体实现为函数create()根据已知整数数组构造一个线性链表。函数sort()采用选择排序方法对已知链表进行排序。为方便排序,函数scort() 排序前在链表首结点之前生成一个辅助结点,排序完成后,将该辅助结点删除。
#include “stdio.h”
#include “stdlib.h”
struct node {
int val;
struct node next;};
struct node create(int a[],int n)
{struct nodeh,q;
for(h=NULL;n;n--)
{q=(struct node)malloc(sizeof(struct node));
q-val=[(3)];
[(4)];
h=[(5)];
}
return h;
}
void sort(struct node h)
{ struct node p,q,r,s,h1;
h1=p=( struct node )malloc(sizeof(struct node ));
p-next=h;
while(p-next)
{q=p-next;
r=p;
while(q-next)
{if(q-next-val[(6)])
r=q;
q=q-nexr;
}
if(r!=p)
{s=r-nexr;
[(7)]=s-next;
s-next=[(8)];
[(9)]=s;
}
p=p-next;
}
h=h1-next;
free(h1);
}
main()
{ struct node p,head1,head2;
int a[]={1,5,2,7,4},m=5;
head1=create(a,m);
head2=[(10)];
sort(head2);
p=head1;
while(p)
{printf(“%d”,p-val);
p=p-next;}
}
答案(3)a[n-1]
(4) q-next=h
(5) h=q
(6) q-val
(7) r-next
(8) p-next
(9) p-next=s
(10) &head1
四、下列程序已标上行号,请指出并改正程序中的错误。(共30分)
注不得增加或删除程序行,也不能更改程序结构。
1.程序功能为在4个字符串中求最大字符串并输出结果。
1.#include “string.h”
2.#include “stdio.h”
3.main()
4.{chars[]={“boy”, “girl”, “mother”, “father”};
5.char st; 改为 char st;
6.int i;
7.st=s;
8.for(i=1;i4;i++)
9.if(sts) 改为 if(strcmp(st,s)0)
10.st=s; 改为 strcpy(st,s);
11.printf(“%sn”,st);}.
2.10个学生5门课,下面的程序从文件f1.dat读入所有学生的各课成绩,计算出每个学生的总分,并按总分降序的次序将每个学生名次、各课得分及总分输出到文件f2.dat。
提示 为了避免排序时可能要交换s[k]和s[j][k],程序另引进数组ord[],改上述交换为ord和ord[j]的交换。
12.# include “stdio.h”
13.int s[10][7];
14.main()
15.{int i,j,sum,ord[10],t;
16.FILE fp;
17.if((fp=fopen(“wb”, “f1.dat”))= =NULL) 改为if((fp=fopen(“f1.dat”, “rb”))= =NULL)
18.{printf(“can’t open file %s n”, “f1.dat”);
19.exit(1);}
20.for(i=0;i10;i++)
21.{fread(fp,2,6,s); 改为fread(s,2,6,fp]);
22.sum=0;
23.for(j=1;j=5;j++)
24.sum=sum+s[j];
25.s[6]=sum;
26.ord=i;
27.} 改为 fclose(fp);}
28.for(i=0;i9;i++)
29.for(j=i+1;j10;j++)
30.if(s[6]s[j][6])
31.{t=ord; ord=ord[j];ord[j]=t;}
32.fp=fopen(“rb”, “f2.dat”); 改为.fp=fopen(“f2.dat”, “wb”);
33.for(i=0;i10;i++)
34.{s[0]=i+1; 改为s[0]=ord;
35.fwrite(fp,2,7,s);}改为fwrite(s,2,7,fp);}
36.fclose(fp);
37.}
五、编程题(每题15分,共30分)
说明按各题要求编程,否则不给分。
1.编程序实现单链表的起泡排序。
要求(1)结点的数据域只有一个整数域;
(2)N个结点的整数链表的建立过程,写一函数(create)实现,数据从键盘输入。
2.如果一个数列中的任意一段(至少是两个元素)的各个元素均相同,我们称之为等
值数列段。等值数列段中元素的个数叫等值数列段长度。现有100个元素组成的整数数列A ,求A中长度最大的所有等值数列段的首末位置,并输出该等值数列段的首末位置。如果没有等值数列段,则输出结束标志(not have)。
要求 所有运算均应在原数组上进行,不得引进第二个数