一、选择题(单选,每题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)。
要求 :所有运算均应在原数组上进行,不得引进第二个数