D.for(p=a,i=0;i<4;i+=2) printf("%d",p[i]);
14.在下列C语言源程序的错误中,通常不能在编译时发现的是(14)C。
A. 括号不匹配
B. 非法标识符
C. 数组元素下标值越界
D. 程序结构不完整
15.若有声明“long a,b;”且变量a和b都需要通过键盘输入获得初值,则下列语句中正
确的是(15)D。
A. scanf("%ld%ld,&a,&b");
B. scanf("%d%d",a,b);
C. scanf("%d%d",&a,&b);
D. scanf("%ld%ld",&a,&b);
16.若有程序段“char c=256; int a=c;”,则执行该程序段后a的值是(16)C 。
A. 256
B. 65536
C. 0
D. -1
17.若在一个C语言源程序中“e1”和“e3”是表达式,“s;”是语句,则下列选项中与语
句“for(e1; ;e3)s;”功能等同的语句是(17)B。
A. e1;while(10)s;e3;
B. e1;while(10){s;e3;}
C. e1;while(10){e3;s;}
D. while(10){e1;s;e3;}
18.若有声明“int a[3][4], *p=a[0] ,(*q)[4]=a;”,则下列叙述中错误的是 (18) B 。
A. a[2][3]与q[2][3]等价B. a[2][3]与p[2][3]等价
C. a[2][3]与*(p+11)等价D. a[2][3]与p=p+11,*p等价
19. 若有声明“long fun(int *x,int n,long *s);int a[4]={1,2,3,4}; long b,c;”,
则以下函数调用形式中正确的是(19)D。
A. c=fun(a,4,b);
B. c=fun(a[],4,&b);
C. c=fun(a[4],4,b);
D. c=fun(a,4,&b);
20.已知在函数f中声明了局部变量x,如果希望f函数第一次被调用返回后变量x中存储的数据保持到下次f函数被调用时仍可以使用,则在声明x时必须指定其存储类型为(20)C。
A. auto
B. register
C. static
D. extern
21. 若有如下的类型定义和变量声明,则在给出的选项中值不为7的表达式是(21)
A 。
A.ptr->a
B.(++ptr)->a
C.x[1].a
D.x[0].b->a
struct ss
{ int a; struct ss *b; }x[3]={{5,&x[1]},{7,&x[2]},{9,0}}, *ptr=&x[0];
22. 若需要对一个数据文件abc.txt中的数据做加密处理并且限定只能做一次打开文件操
作,则在“fp=fopen("abc.txt", 模式字符串 ); ”中,模式字符串应当是(22)
B 。
A. "w+"
B. "r+"
C. "a+"
D. "r"
23.若有如下声明和语句:
int t[3][3],*pt[3],k;
for(k=0;k<3;k++) pt[k]=&t[k][0];
则表达式*(*(pt+1)+2)所引用的是 (23) C。
A. t[2][0] B. &t[2][0] C. t[1][2] D. &t[1][2] 24. 若有结构类型定义“typedef struct test{ int x,y[2]; }TEST;”,则以下声明中
正确的是(24)A。
A.struct test x; B.struct x;
C.test x ; D.struct TEST x;
25. 设有声明int value=‘5’;则执行下列选项的赋值语句后,value的值不等于5的是
(25)C。
A. value=value-‘0’;
B. value=value-0x30;
C. value=value-49;
D. value=value-‘\060’;
26.若有枚举类型定义“enum list1{x1,x2,x3,x4=6,x5,x6};”,则枚举常量x2和x6代
表的值分别是(26)B。
A. 1,6
B. 1,8
C. 2,6
D. 2,8 27.设有声明float a=1.23456; int i;,欲将a中的数值保留小数点后两位,第三位进行四舍五入运算,能实现该功能的表达式是(27)A 。
A. i=a*100+0.5,a=i/100.0
B. a=(a*100+0.5)/100.0
C. a=((int)a*100+0.5)/100.0
D. a=(a/100+0.5)/100.0
28.若有声明“int x[10]={0,1,2,3,4,5,6,7,8,9},*p;”,则值不为4的表达式是(28)C 。
A.p=x,*(p+4) B.p=x+4,*p++
C.p=x+3,*(p++) D.p=x+3,*++p
29.若有声明“int i,k=1; unsigned j;”,则下列语句执行时会出现无限循环的语句是 (29) A。
A.for(j=15;j>0;j-=2) k++; B.for(j=0;j<15;j+=2) k++;
C.for(i=0;i<15;i+=2) k++; D.for(i=15;i>0;i-=2) k++;
30.已知A盘根目录下有文本文件“data.txt”且程序中已有声明“FILE *fp;”,若程序需要先从“data.txt”文件中读出数据,修改后再写入“data.txt”文件中,则调用fopen函数的正确形式是 (30) C。
A.fp=fopen("a:\\data.txt","rw");
B.B. fp=fopen("a:\\data.txt","w+");
C. fp=fopen("a:\\data.txt","r+");
D. fp=fopen("a:\\data.txt","r");
31.以下选项均为fun函数定义的头部,其中错误的是 (31) B。
A. int fun(int x,int y[])
B. int fun(int x,int y[x])
C. int fun(int x,int y[3])
D. int fun(int x,int *y)
32.以下结构变量stu1的声明形式中,错误的是 (32) D。
A.typedef struct stu{char name[10];float score;}STU ; STU stu1;
B.#define STU struct stu
STU {char name[10];float score; }stu1;
C.struct stu{char name[10];float score;}stu1;
D.struct stu{char name[10];float score;}STU; STU stu1;
33.若有声明“double x=3,c,*a=&x,*b=&c;”,则下列语句中错误的是(33)C。
A.a=b=0; B.a=&c,b=a; C.&a=&b; D.*b=*a; 34.若已有声明“int x=4,y=3;”,则表达式xA.2 B.3 C.4 D.5
35.程序段“int x=3; do { printf(“% d”,x - - );} while( !x );”的执行结果是(35)C。
A.3 2 1 B.死循环 C.3 D.2
36.以下关于C语言语句的叙述中,正确的是(36)D 。
A.所有语句都包含关键字
B.所有语句都包含表达式
C.所有语句都可以出现在源程序中的任何位置
D.所有语句都以分号结束
37.设有变量声明“char c;”,执行“for( ;c=(getchar() != ‘\n’);) printf(“% c”,c);”时,从键盘上输入“ABCDEFG”回车后,输出结果是(37)C。
A.ABCDEFG B.AABBCCDDEEFFGG
C.非字母数字字符 D.语句不能执行
38.假定已有声明“char a[30],*p=a;”,则下列语句中能将字符串“This is a C program.”正确地保存到数组a中的语句是(38)D。
A.a[30]=“This is a C program.” B.a =“This is a C program.”
C. p =“This is a C program.” D.strcpy(p,“This is a C program.”);
39.以下关于函数定义的叙述中,正确的是(39)A。
A.构成C语言源程序的基本单位之一是函数定义
B.所有被调用的函数必须在调用之前定义
C.main函数定义必须放在其他函数定义之前
D.main函数定义的函数体中必须至少有一条语句或声明
40.已知函数fun的定义如下:
Void fun(int x[],int y)
{ int k;
For (k=0;k若main函数中有声明int a[10]={10};及调用fun函数的语句,则正确的fun函数调用形式是(40)C 。
A.fun(a[],a[0]); B.fun(a[0],a[0]);
C. fun(&a[0],a[0]);
D. fun(a[0],&a[0]);
二、填空题(每空2分,共50分)
1.已知有函数定义“int fun(){return (3,4);}”,则调用fun后的函数返回值是(1)4 。
2. 设有声明“int a=3, b=4; float x=4.5, y=
3.5;”,则表达式
“(float)(a+b)/2+(int)x%(int)y”的值是 (2) 4.5。
3.若有声明“char s[10]="remind";”,执行“puts(s+2);”后的输出结果是 (3) mind 。
4.若有声明“double x=10,y=5;”,则计算x y的库函数调用形式是 (4) pow(x,y) 。
5. 以下程序运行时输出结果的最后一行是 (5) 3/5,5/8 。
#include
void main()
{ int a=1,b=1,i;
for(i=1;i<=2;i++)
{ a=a+b;
printf("%d / %d , ",b,a); b=a+b;
printf("%d / %d \n",a,b); }
printf("\n"); }
6. 以下程序运行时输出结果为 (6) 1 。
#include
void main() { int i,sum=0; for (i=0;i<5;i++) { switch(i) { case 0: case 1: sum++; case 3: sum++; case 4: sum--; break; } }
printf("%d\n",sum); }
7. 以下程序运行后输出结果为 (7) 15 。 #include "stdio.h"
int mystery(int a,int b) { if(b==1)return a;
else return a+mystery(a,b-1); }
void main()
{ int x=5,y=3;
printf("%d\n",mystery(x,y));
}
8. 以下程序运行时输出结果的第一行是 (8) 3 ,第二行是 (9) 2 。
#include
int f1( )
{ static int i=0,f=1; return f*=++i; }
int f2( )
{ int i=0,f=1; return f*=++i; }
void main( )
{ printf("%d\n",f1( )+f1( ));
printf("%d\n",f2( )+f2( ));
}
9. 以下程序运行时输出结果是 (10) ABCxyz。
#include
#include
void sf(char *s1,char *s2)
{ if(*s1=*s2)
sf(s1+1,s2+1);
}
void main( )
{ char a[20]= "ABC",b[20]="xyz";
sf(a+strlen(a),b);
puts(a);
}
10. 以下程序运行时输出结果的第一行是(11) 1 1 1 ,第三行是(12) 3 2 1。
#include
void main( )
{ int i,j,a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(ia[i][j]=1;
else
a[i][j]=i-j+1;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
11. 以下程序运行时输出结果是(13)8 3 4 1 。
#include
void sort(int a[],int n)
{ int i,j,p; int t;
for(i=1;i{ p=i;
for(j=i+2;jif(a[j]>a[p])
p=j;
if(p!=i)
{ t=a[i]; a[i]=a[p]; a[p]=t; }
}
}
void main( )
{ int s[ ]={8,1,4,3},n=4,k;
sort(s,n);
for(k=0;kprintf("%4d",s[k]);
printf("\n");
}
12. 以下程序运行时输出结果的第一行是(14) 100,第二行是(15)101 。
#include
struct s
{ int x,*y;
}*p;
int d[5]={10,20,30,40,50};
struct s a[5]={100,&d[0],200,&d[1],300,&d[2],400,&d[3],500,&d[4]};
void main( )
{ p=a;
printf("%5d",p->x++);
printf("%5d\n",p->x);
printf("%5d",*p->y);
printf("%5d\n",*++p->y);
}
13. 以下程序运行后输出结果中第一行为(16)32659,第二行为(17)23569,第三行为(18)256 。
#include "stdio.h"
#include "stdlib.h"
struct node
{ char data; struct node *next;};
struct node *insert(struct node *h,char c)
{ struct node *p,*p1,*p2;
p=(struct node*)malloc(sizeof(struct node));
p->data=c;p->next=NULL;
if(h==NULL) h=p;
else
{ p1=p2=h;
while(c>p1->data&&p1->next!=NULL)
{ p2=p1;p1=p1->next;}
if(c<=p1->data)
if(p1==h) { p->next=h;h=p;}
else { p2->next=p;p->next=p1;}
else
{ p1->next=p;}
}
return h;
}
struct node *del(struct node *h)
{ struct node *p=h;
while(p!=NULL)
{ if(p->data%2==0) p->next=p->next->next;
p=p->next;
}
return h;
}
void print(struct node *h)
{ struct node *p=h;
while(p!=NULL)
{ printf("%c",p->data); p=p->next; }
printf("\n");
}
void main()
{ struct node *head=NULL;
char *item="32659",*p=item;
puts(item);
while(*p) head=insert(head,*p++);
print(head); del(head); print(head);
}
14. 以下程序的功能是:求a数组中前4个元素之和及后6个元素之和。试完善程序以达
到要求的功能。
int fsum(int *array,int n)
{ int i,s;
s=0;
for(i=0; (19)is+=array[i];
return(s);
}
void main(void)
{ int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int sumh,sumt;
sumh=fsum(a,4);
sumt= (20)fsum(&a[9],6) ;
printf(“%d %d\n”,sumh,sumt);
}
15.以下程序对二维数组a中存储的N N矩阵做如下操作:先将每一行中值最大的元素与该行位于主对角线处的元素交换值,然后对主对角线上的所有元素排序使其自左上角到右下角升序排列,最后输出排序后主对角线上各元素的值。试完善程序以达到要求的功能。
#include
#define N 5
void fun(int x[][N],int n)
{ int i,j,t,arr,col;
for(i=0;i{ arr=x[i][0]; col=0;
for(j=0;jif(x[i][j]>=arr)
{ arr=x[i][j];
(21) col=j ;
}
t=x[i][i];
(22) x[i][i]=x[i][col] ;
x[i][col]=t;
}
for(i=0;ifor(j=i+1;jif( (23) x[i][i]>x[j][j] )
{ t=x[i][i]; x[i][i]=x[j][j]; x[j][j]=t ; }
}
void main()
{ int a[N][N]={{10,25,24,13,23},{11,22,12,21,14},{20,15,19,16,18},
{17,9,4,5,3},{2,1,6,7,8}},i;
fun(a,N);
for(i=0;iprintf("%3d",a[i][i]);
printf("\n");
}
16. 以下程序中函数replace的功能是:将字符串s中所有属于字符串s1中的字符都用
s2中的对应位置的字符替换。假如s为“ABCBA”,s1为“AC”,s2为“ac”,则调用replace函数后,字符串s的内容将变换为“aBcBa”。试完善程序以达到要求的功能。
#include
#define MAX 20
void replace(char *s, char *s1, char *s2)
{ char *p;
for(; *s; s++)
{ p=s1;
while(*p&& (24)*p!=*s ) p++;
if(*p) *s=*(s2+p-s1);
}
}
void main( )
{ char s[MAX]="ABCBA",s1[MAX]="AC", s2[MAX]= "ac";
(25)replace(s, s1, s2) ;
printf("The string of s is:");
printf("%s\n", s);
}