2012秋C语言笔试卷
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二部分C语言程序设计
一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)
21. 以下声明中有语法错误的是21 。
A. char *x="thank";
B. char x[] ;
C. char *x(void) ;
D. char (*x)[2];
22. 假定a为一个一维字符数组名,则引用数组元素a[k]的正确形式为22 。
A. a+k
B. &a+k
C. *(a+k)
D. *a+k
23. 已有声明“int x;”,实现“若x的值是奇数,则输出x”这一功能的语句是23 。
A. if(x/2) printf("%d",x);
B. if(x%2) printf("%d",x);
C. if(x/2==1) printf("%d",x);
D. if(x%2==0) printf("%d",x);
24. 假定一个函数的头部为“char *func(int n)”,则该函数返回值的类型是24 。
A. int
B. int *
C. char
D. char *
25. 已知fun函数的头部为“void fun(int x[],int n)”,main函数中有声明“int a[10]={1},b=10;”,欲
在main函数中调用fun函数,则以下调用语句中正确的是25 。
A. fun(a,fun(a,b));
B. fun(a[10],b);
C. fun(a,a[0]);
D. fun(b,a);
26. 已有声明“int a[3][4]={{3,4},{2,8,6}};”,则数组元素a[1][0]的值为26 。
A. 2
B. 4
C. 6
D. 8
27. 已有声明“int x=0, *p;”,则以下赋值表达式中正确的是27 。
A. p=x
B. *p=*x
C. &p=&x
D. p=&x
28. 已有声明“char c='\72';”,则变量c包含28 个字符。
A. 1
B. 2
C. 3
D. 4
29. 已有声明“int *p; ”,若用语句“p=(int *)malloc(20*sizeof(int));”动态申请一个int型数组存储区,
则p所指向的数组中可存储29 个int型数据。
A. 10
B. 20
C. 40
D. 80
30. 判断char型变量c1的值是否为小写字母的正确表达式为30 。
A. 'a'<=c1<='z'
B. c1>=a&&c1<=z
C. 'a'>=c1||'z'<=c1
D. c1>='a'&&c1<='z'
二、填空题(将答案填写在答题纸的相应答题号内,每个答案只占一行,共30分)
●基本概念(5分)
1. 已有声明“int a = -3;”,则表达式“a>=0?a:-a”的值是(1)。
2. &&、+、>= 是C语言中的三个运算符,其中优先级最高的是(2)。
3. 假定指针变量p指向对象的值为16,p+1指向对象的值为35,则*p++的值为(3)。
4. 在系统头文件中定义的符号常量NULL代表的数值(整数)是(4)。
5. 若需要打开一个已存在的非空文件F.txt并修改其中的部分数据,则打开文件 F.txt的语句应是
“fp=fopen("F.txt", (5));”。
●阅读程序(13分)
第4页 C语言
6. 以下程序运行时,输出到屏幕的结果是(6)。
#include <stdio.h>
int main( )
{ int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0;
for(i=0;i<3;i++)
for(j=2;j>=i;j--)
t+=b[i][j];
printf("%d\n",t);
return 0;
}
7. 以下程序运行时,输出到屏幕的结果是(7)。
#include<stdio.h>
int main( )
{ char *str[]={"one","two","three","four"};
puts(str[3]+1);
return 0;
}
8. 以下程序运行时,输出到屏幕的结果是(8)。
#include <stdio.h>
int fun(int x,int y,int z)
{ return x*y*z; }
int main( )
{ printf("%d",fun(1.5,2.5,3.5));
return 0;
}
9. 以下程序运行时,输出到屏幕的结果是(9)。
#include<stdio.h>
int fun(char *s)
{ if(*s=='\0')
return 0;
else
return 1+fun(s+1);
}
int main( )
{ char str[]="China";
printf("%d\n",fun(str));
return 0;
}
10. 以下程序运行时,输出到屏幕的结果中第一行是(10),第二行是(11)。
#include <stdio.h>
int main( )
第5页 C语言
{ int x;
char a;
a=x=266;
printf("%d \n %d ",x,a);
return 0;
}
11. 以下程序运行时,输出到屏幕的结果中第一行是(12),第二行是(13)。
#include <stdio.h>
int f(int n)
{ int s=1;
return s*=n;
}
int g(int n)
{ static int s=1;
return s*=n;
}
int main( )
{ int a=0,b=0,i;
for(i=1;i<4;i++)
{ a=a+f(i); b=b+g(i); }
printf("%d\n%d",a,b);
return 0;
}
12. 以下程序运行时,输出到屏幕的结果中第一行是(14),第二行是(15)。
#include<stdio.h>
void fun(int a[],int b[],int n)
{ int k,i,j;
for(i=0;i<n;i++)
{ k=n;
for(j=0;j<n;j++)
if(a[i]<=a[j]) k--;
b[k]=a[i];
}
}
int main( )
{ int i,b[6],a[6]={1,3,4,2,5,0};
fun(a,b,6);
for(i=0;i<6;i++)
printf((i+1)%3==0?"%4d\n":"%4d",b[i]);
return 0;
}
第6页 C语言
13. 以下程序运行时,若输入1到变量k1、输入85到变量k2,则输出到屏幕的结果中第一行是
(16),第二行是(17),最后一行是(18)。
#include<stdio.h>
int sieve(int x[][4],int n,int y[][4],int key1,int key2,int *p1,int *p2)
{ int i=0,k,m=0;
while(i<n)
{ if(x[i][1]==key1 && x[i][2]>=key2 && x[i][3]>=key2)
{ for(k=0;k<4;k++) y[m][k]=x[i][k];
m++;
}
i++;
}
*p1=*p2=0;
for(i=0;i<m;i++)
{ *p1+=y[i][2]; *p2+=y[i][3]; }
*p1/=m; *p2/=m;
return m;
}
int main( )
{ int a[6][4]={{101,1,97,90},{102,0,92,89},{103,0,88,78},{104,1,90,90},
{105,1,60,70},{106,1,93,87}},b[6][4]={0};
int count=6,k1,k2,av1,av2,i,j;
printf("key1="); scanf("%d",&k1);
printf("key2="); scanf("%d",&k2);
count=sieve(a,count,b,k1,k2,&av1,&av2);
for(i=0;i<count; i++)
{ for(j=0;j<4;j++)
printf("%4d",b[i][j]);
printf("\n");
}
printf("ave1=%d,ave2=%d\n",av1,av2);
return 0;
}
完善程序(12分)
14. 以下程序在20000~21000范围内验证数学命题:如果一个整数的奇数位上各位数字之和与该整数的
偶数位上各位数字之和的差是11的倍数(若奇数位的各位数字之和小于或等于偶数位的各位数字之和,则对奇数位各位数字之和不断加11,直到其值大于偶数位各位数字之和为止),则这个数能被11整除。
#include<stdio.h>
int fun(long m)
{ int odd,even;
第7页 C语言
odd=even= (19);
while(m>0)
{ odd=odd+m%10;
even=even+ (20);
m= m/100;
}
while( (21))
{ odd=odd+11; }
if((odd-even)%11==0) return 1;
else return 0;
}
int main( )
{ long k,n=20000,m=21000,j=0;
for(k=n;k<=m;k++)
{ if( (22))
if(k%11==0)
{ if(j++%10==0)putchar('\n');
printf("%ld ",k);
}
else printf("error");
}
return 0;
}
15. 以下程序的功能是反转一个字符串中单词的顺序。
例如,将字符串“there is no try”中单词顺序反
转后变为“try no is there ”。
假定以空格作为单词分隔符。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverseWords(char str1[],char str2[])
{ int tokenPos,wReadPos,wEnd,writePos;
writePos=0;
/* tokenPos记录向前扫描(从串尾到串首扫描)str1字符串时当前被判断字符的下标*/ tokenPos= (23);
while(tokenPos>=0)
{ if(str1[tokenPos]==' ')
{ str2[writePos++]=str1[tokenPos--]; /* 复制单词之间的空格* / }
else
{ wEnd=tokenPos; /* wEnd记录str1字符串中被处理单词的尾字符下标*/ while(tokenPos>=0 && str1[tokenPos]!=' ') /* 向前扫描到空格为止*/
tokenPos--;
wReadPos= (24); /*wReadPos记录str1字符串中被处理单词的首字符下标*/
while(wReadPos<=wEnd)
第8页 C语言
str2[writePos++]=str1[wReadPos++];
}
}
str2[writePos]= (25); /* 在str2数组中置字符串的终止符*/ }
int main( )
{ char *sentence="there is no try", *reverse;
reverse=(char *)malloc(strlen( (26))+1 );
printf("%s\n",sentence);
reverseWords(sentence,reverse);
printf("%s\n",reverse);
free(reverse);
return 0;
}
16. 已知一个单向链表结点的数据结构定义如下:
typedef struct point
{ int x;
struct point *next;
}POT;
函数creat的功能是:找出p指向的单向链表中数据值只出现一次的结点,将这些结点依次复制链接到q链表,函数返回q链表首结点的地址。
POT *creat(POT *p)
{ POT *q=NULL,*qr,*p0,*p1,*p2; int c;
p0= (27); /* p0指向p链表首结点*/
while(p0!=NULL)
{ c=0;
p1=p; /* p1指向p链表首结点*/
while(p1!=NULL) /*依次将p1指向的每个结点中的数据与p0指向的结点中的数据做比较*/
{ if(p1->x==p0->x ) c++;
p1= (28);
}
if(c==1)
{ /* 将p0指向的结点中数据复制到p2指向的结点,将p2指向的结点链入q链表*/ p2=(POT *)malloc(sizeof(POT));
p2->x=p0->x;
if(q==NULL) q=qr= (29);
else { qr->next=p2; qr=p2; }
}
p0=p0->next;
}
qr->next= (30);
第9页 C语言
return q;
}
第10页 C语言。