c语言考研真题及答案pdf,04年c语言真题及答案

一、选择题(单选,每题2分,共20分)

1.已知 int x=1,y=2,z=3;则z+=x>y?++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 选择,I/O, 递归;

C 重复,选择,顺序;

D 重复,递归,子程序。

9.程序段:

scanf(“%d%d”,&a,&b);

c=5*a+b;

if(c= =0) a=1;

else a=1/c+1/b;

保证该程序段运行不出错的必要条件是(C)

A b>0

B a>0&&b>0

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;a<10;a++)

{sub(a++);

printf(“%d”,a);}

}

sub(int a)

{a=a*a;

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;i<4;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;i

{if(i%2) continue;

s+=p+=i;}

return s;

}

main()

{printf(“%d\n”,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=%f\n”,y,z);

}

double t(double a,double (*f)())

{return (*f)(a+a);}

double f(double x)

{return 3.0*x;}

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(“%s\n”,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;i<6;i++)

{*(f+2)=‘6’- i ;

printf(f,a);

if(i= =0) printf (“*\n”);

else if (i= =5) printf(“***********”);

else {for(j=0;j<2*i-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(i

{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 node*h,*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

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.{char*s[]={“boy”, “girl”, “mother”, “father”};

5.char st;                                 改为 char **st;

6.int i;

7.st=s;

8.for(i=1;i<4;i++)

9.if(*st

10.st=s[i];                                改为 strcpy(*st,s[i]);

11.printf(“%s\n”,*st);}.

2.10个学生5门课,下面的程序从文件f1.dat读入所有学生的各课成绩,计算出每个学生的总分,并按总分降序的次序将每个学生名次、各课得分及总分输出到文件f2.dat。

提示: 为了避免排序时可能要交换s[i][k]和s[j][k],程序另引进数组ord[],改上述交换为ord[i]和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;i<10;i++)

21.{fread(fp,2,6,s[i]); 改为fread(s[i],2,6,fp]);

22.sum=0;

23.for(j=1;j<=5;j++)

24.sum=sum+s[i][j];

25.s[i][6]=sum;

26.ord[i]=i;

27.}     改为 fclose(fp);}

28.for(i=0;i<9;i++)

29.for(j=i+1;j<10;j++)

30.if(s[i][6]

31.{t=ord[i]; ord[i]=ord[j];ord[j]=t;}

32.fp=fopen(“rb”, “f2.dat”); 改为.fp=fopen(“f2.dat”, “wb”);

33.for(i=0;i<10;i++)

34.{s[i][0]=i+1;   改为s[i][0]=ord[i];

35.fwrite(fp,2,7,s[i]);}改为fwrite(s[i],2,7,fp);}

36.fclose(fp);

37.}

五、编程题(每题15分,共30分)

说明:按各题要求编程,否则不给分。

1.编程序实现单链表的起泡排序。

要求:(1)结点的数据域只有一个整数域;

(2)N个结点的整数链表的建立过程,写一函数(create)实现,数据从键盘输入。

2.如果一个数列中的任意一段(至少是两个元素)的各个元素均相同,我们称之为等

值数列段。等值数列段中元素的个数叫等值数列段长度。现有100个元素组成的整数数列A ,求A中长度最大的所有等值数列段的首末位置,并输出该等值数列段的首末位置。如果没有等值数列段,则输出结束标志(not have)。

要求 :所有运算均应在原数组上进行,不得引进第二个数

你可能感兴趣的:(c语言考研真题及答案pdf)