2008春C语言笔试卷
第二部分 C语言程序设计
一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)
21.下列叙述中正确的是 (21) 。
A. main函数必须出现在其他函数之前
B. main函数中至少必须有一条语句
C. C程序总是从main函数的第一条语句开始执行
D. C程序总是在执行完main函数的最后一条语句后结束
22.以下常量表示中正确的是 (22) 。
A. \xff
B.5L
C. aEb
D. 3.14U
23.若程序中已有相应的声明,下列语句中错误的是 (23) 。
A.printf(i==4 ? "%6d\n" : "%6d" , i );
B.i==4 ? printf("%6d\n",i ) : printf("%6d" , i ) ;
C.for (i=10 ; ; i--) if(i==1) break;
D.for (i=10 ; ; ) if(i--); break;
24.若有声明“float f=123.45678;”,则执行语句“printf( "%.3f",f );”后,输出结果是 (24) 。
A. 1.23e+02 B. 123.457 C. 123.456780 D. 1.234e+02
25.若有声明“int x=2,y=1,z=0;”,则下列关系表达式中有语法错误的是 (25) 。
A. x>y=2 B.z>y>x
C. x>y==1 D.x==(x=0,y=1,z=2)
26.若有声明“int x[10]={0,1,2,3,4,5,6,7,8,9},*p;”,则值不为4的表达式是(26)。
A.p=x,*(p+4) B.p=x+4,*p++
C.p=x+3,*(p++) D.p=x+3,*++p
27.若有声明“int i,k=1; unsigned j;”,则下列语句执行时会出现无限循环的语句是 (27) 。
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++;
28.已知A盘根目录下有文本文件“data.txt”且程序中已有声明“FILE *fp;”,若程序需要先从“data.txt”文件中读出数据,修改后再写入“data.txt”文件中,则调用fopen函数的正确形式是 (28) 。
A.f p=fopen("a:\\data.txt","rw"); B. fp=fopen("a:\\data.txt","w+");
C. fp=fopen("a:\\data.txt","r+");
D. fp=fopen("a:\\data.txt","r"); 29.以下选项均为fun函数定义的头部,其中错误的是 (29) 。
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)
30.以下结构变量stu1的声明形式中,错误的是 (30) 。
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;
第4页C语言2008年春
二、填空题(将答案填写在答题纸的相应答题号内,每个答案只占一行,共30分)
●基本概念
1.在C语言源程序中,不带任何修饰符的浮点数直接量(例如:3.14)都是按 (1) 类型数据存储的。
2.若有声明“char s1[10]=″ABCDE″,s2[10]=″A\\0″;”,则语句
“printf(″%d″,strlen(strcpy(s1,s2)));”的输出结果是 (2) 。
3.可以改变局部变量的生存期、但不能改变它的作用域的存储类别是 (3) 。
4.C语言有效的预处理命令总是以 (4) 开头。
5.若有声明“int a=15,b=20,c=25,e;”,则执行语句“e=a>b? --c :++c;”后变量e的值是 (5) 。
●阅读程序
6.以下程序运行后的输出结果是 (6) 。
#include
#define Count(n) ++n
main ( )
{ int x=-3 ,n=8;
while(Count(x)) n--;
printf("%d\n",n);
}
7.以下程序运行后的输出结果是 (7) 。
#include
int fun(int w1 , int w2)
{ return w2-w1;
}
main( )
{ int w=1,k ;
k=fun(fun(w+1,w),w) ;
printf("%d\n",k) ;
}
8.下列程序运行后的输出结果第一行是 (8) ;第二行是 (9) 。
#include
main( )
{ int i,a=0,c=2;
for(i=0;i<2;i++)
switch(++a,a*c)
{ case 1: printf("1");
case 2: printf("2");
case 3: printf("3\n");break;
default: printf("other\n");
}
}
第5页C语言2008年春
9.以下程序运行后的输出结果是 (10) 。
#include
main ( )
{ char a[ ]="369",*p=a;
int s=0,t=1;
while(*++p) t*=10;
p--;
while (t)
{ s+=(*p-'0')*t;
p--;
t/=10;
}
printf ("%d\n",s);
}
10.以下程序运行后的输出结果第一行是 (11) ;第二行是 (12) 。
#include
struct num
{ int x,y ;
} st[]={{1,10},{2,20},{3,30},{4,40},{-1,-1}},s1[2],s2[2];
main()
{ int i=0,j=0,k;
for(k=0;st[k].x!=-1;k++)
{ if(st[k].x%2)
s1[i++]=st[k];
else
s2[j++]=st[k];
}
printf (" %d \n %d \n",s1[0].y ,s2[0].y );
}
11.以下程序运行后的输出结果第一行是 (13) 。
#include
void print(int n);
void print_n(int n);
main()
{ print(4); }
void print(int n)
{ if (n==0) return;
print_n(n);
if (n>0) print(n-1);
}
第6页C语言2008年春
void print_n(int n)
{ if(n==0)return;
printf("%d",n);
if(n>1)
print_n(n-1);
else
printf("\n");
}
12.以下程序运行后的输出结果第一行是 (14) ;第二行是 (15) ;第三行是 (16) 。
#include
void sot( int a[3][3])
{ int i,j,i0,j1,min,max,temp;
min=max=a[0][0];
for(i=0;i<3;i++)
{ for( j=0;j<3;j++)
{ if(a[i][j]<=min) { min=a[i][j];i0=i;}
if(a[i][j]>=max) { max=a[i][j];j1=j;}
}
}
for(j=0;j<3;j++)
{ temp=a[i0][j];
a[i0][j]=a[2][j];
a[2][j]=temp; }
for(i=0;i<3;i++)
{ temp=a[i][j1];
a[i][j1]=a[i][2];
a[i][2]=temp;
}
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
main()
{ int b[3][3]={{3,2,1},{6,5,4},{9,8,7}};
sot(b);
}
13.以下程序运行时,若在键盘上输入 2
第7页C语言2008年春
第8页 C 语言 2008年春
#include
#include
int strch( char *s,char ch)
{ int i;
for(i=strlen(s);i>=0;i--)
if(s[i-1]==ch) return i;
if(i<0)return 0;
}
main()
{ char ch,s1[]="as123d2nfghjkm";
int k;
printf("input ch:");
ch=getchar();
k=strch(s1,ch);
if(k!=0)
printf("k=%d \n",k);
else
printf("not found\n");
}
完善程序
14.某餐厅用苹果、桔子、香蕉、菠萝、梨五种水果制作水果拼盘,要求每个拼盘中恰有三种
不同水果。以下程序的功能就是计算可以制作出多少种这样的水果拼盘并列出组合方式。 #include
typedef enum { apple,orange,banana,pineapple,pear } Fruit;
main() { (19) fruits[ ]={"apple","orange","banana","pineapple","pear"}; Fruit x,y,z,p;
int k=0,i; for (x= (20) ;x<=pear;x++)
for (y=x+1;y<=pear;y++)
for (z=y+1;z<=pear;z++)
printf ("\n%d %s %s %s ",++k, fruits[x],fruits[y],fruits[z]); }
15.以下程序通过给出的公式计算π的近似值,计算过程在所加项的值小于10-10时终止。
#include
+??? ????? ????+??? ????? ???+??? ????? ??+=7
53217165432121514321213121216π
{ double sum=0.5,t,t1,t2,t3;
int odd=1, even=2 ;
t=t1=t2=1.0; t3=0.5;
while (t>1e-10)
{ t1= (21) ;
odd+=2;
even+=2;
t2=1.0/odd ;
t3= (22) ;
t=t1*t2*t3;
sum+=t;
}
printf ("\nPI=%.8lf", (23) );
}
16.以下程序中函数long fun(char *str)的功能是:自左至右取出非空字符串str中的所有数字字符,将这些数字字符组成一个不超过8位的十进制整数并输出。
例如,字符串str为“efg32gh76.jbejing08t5y4u2”,程序输出:32760854。
#include
long fun(char *str)
{ int i=0; long k=0;
char *p=str;
while(*p!='\0'&& (24) )
{ if(*p>='0'&&*p<='9')
{ k= (25) +*p-'0'; ++i; }
(26) ;
}
return k;
}
void main( )
{ char x[]="efg32gh76.jbejing08t5y4u2";
printf("%ld\n", fun(x));
}
17.设某单向链表结点的数据结构定义为:
typedef struct node
{ char ch;
struct node *next ;
} linklist ;
以下程序首先建立一个单向链表head(如图1所示),该链表每个结点中保存x数组的一个元素值;输出head链表中每个结点的值;再将head链表变换为倒序链表(如图2所示),输出倒序后head链表中每个结点的值。
第9页C语言2008年春
head链表倒序算法提示:(1)使hp指向head链表,置head为0(head链表为空链表)。
(2)从hp指向的链表第一个结点开始,依次从hp链表中删除每个结点,将所删除的结点再依次插入到head链表第一个结点之前,直到hp链表为空时结束。
#include
typedef struct node
{ char ch;
struct node *next;
}linklist ;
linklist *create( char x[])
{ int i; linklist *pt,*pr,*p=NULL;
for(i=0;x[i]!='\0';i++)
{ pt=(linklist*)malloc(sizeof(linklist));
pt->ch=x[i];pt->next=NULL;
if(p==NULL)
{ (27) ; pr=pt;}
else
{ pr->next=pt; (28) ;}
}
return p;
}
linklist *revlist( linklist *head)
{ linklist *hp,*p=NULL;
hp=head;
head= (29) ;
while(hp)
{ p=hp;
hp=hp->next;
p->next=head;
(30) ;
}
return head;
}
第10页C语言2008年春
void print( linklist *phead)
{ while(phead)
{ printf("%c ",phead->ch);
phead=phead->next;
}
printf("\n");
}
main()
{ linklist *head; char x[]="ABCD";
head=create(x); print(head);
head=revlist(head); print(head);
}
第11页C语言2008年春