C语言考试试卷
二级 C语言考试试卷
(考试说明及第一部分计算机基础知识略)
第二部分 C语言程序设计
一、选择题(用答题卡答题,答案依次填在21~30答题号内)
21. 若有声明语句char s1[10]={0},s2[10]= "books";则能将字符串"books"赋给数组s1保存的表达式是21 。
A. s1=”books”;
B. strcpy(s2,s1);
C. s1=s2;
D. strcat(s1,s2);
22. 表达式(a=4*5,b=a*2),b-a,a+=2的值是22 。
A.2 B. 20 C. 22 D. 42
23. 以下是一个自定义函数的头部,其中正确的是23 。
A. int fun(int a[ ],b)
B. int fun(int a[ ],int a)
C. int fun(int * a,int b)
D. int fun(char a[ ][ ],int b)
24. 以下数组声明语句中正确的是24 。
A.int n,a[n]; B. int a[ ];
C. int a[2][3]={{1},{2},{3}};
D. int a[ ][3]={{1},{2},{3}};
25.已知在某C语言编译系统中表达式sizeof(int)的值是2,如果希望将常量-70000正确地保存在一个变量a中,该变量声明语句应当是25 。
A.int a; B. long int a;
C. unsigned int a;
D. unsigned long int a;
26. 以下声明语句中,用于声明一个行指针变量的是26 。
A. int *p(int);
B. int *p;
C.int (*p)[3]; D. int (*p)(int);
27. 已知A盘根目录下的一个文本数据文件data.dat中存储了100个int型数据,若需要修改该文件中已经存在的若干个数据的值,只能调用依次fopen函数,已有声明语句FILE*fp;则fopen
函数的正确调用形式是27 。
A. fp=fopen(”A:\\dAtA.dAt”,”r+”);
B. fp=fopen(”A:\\data.d At”,”w+”);
C. fp=fopen(”A:\\dAtA.dAt”,”A+”); d. fp=fopen(”A:\\dAtA.dAt”,”w”);
28. 在以下程序中,需要在fun函数中声明一个int型的变量,以下选项中28 不能用作该变量的名字。
A.x B. y C. fabs D. fun
#include
int y;
main( )
{int a=1;
fun(a);
}
int fun(int x)
{ ;/* int型变量声明语句位置*/
…/*若干执行语句*/
}
29.如有语句:int x,y=0,z,* p[3];p[0]=&x;p[1]=&y;p[2]=&z;以下表达式中有语法错误的是29 。
A.y++ B. p++ C. *++p[0] D. (*p[0])++
30. 设有声明语句:int a[3][3]={1,2,3,4,5,6,7,8,9};以下语句中除30 外均能输出a[1][2]的值。
A.printf(“%d”,*(*(A+1)+2)); b. printf(“%d”,*(&A[2][0]-1));
C. printf(“%d”,*(A[1]+2)); d. printf(“%d”,*(A+1)[2]);
二、填空题(将答案填写在答题纸的响应答题号内,每个答案只占一行)
基本概念题(共5分)
1.只能在循环体中出现的语句是(1)语句。
2.& 既可以用作单目运算符也可以用作双目运算符,其中用作单目运算符时表示的功能是(2)。
3.包含二目运算符的表达式可一般的表示为(x)op(y),其中op代表运算符x、y代表操作数。若op 是“+”运算符,且x和y均为常量时,不能同时为(3)常量。
4.当(4)语句被执行时,程序的执行流程无条件地从一个函数跳转到另一个函数。
5.在函数内部声明局部变量时缺省了存储类型,该变量存储类型为(5)。
阅读程序写出运行结果题(共10分)
6.以下程序段运行后,x、y、z的值分别是(6)。
int x=0,y=3,z=2;
if(x++&&y++)z--;
else if(x+1==6||y--)z++;
7. 设有以下宏定义:
#define N3
#define Y(n) ((N+1)* n)
则执行语句z=2 * (N+Y(5+1));后,z的值为(7)。
8.[程序]
int x=1;
main( )
{ int y,k;
y=f(3);printf(“%d\n%d”,x,y);
}
int f(int x)
{ if(x==3)
{ int x=2;
return x;
}
else return x;
该程序运行后,输出x 的值是(8),y的值是(9)。
9.[程序]
main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9},m,k,t;
for(m=0;m<3;m++)
for(k=0;k<=m;k++)
if((m+k)%2) t=a[m][k],a[m][k]=a[k][m],a[k][m]=t; for(m=0;m<3;m++)
{ for(k=0;k<3;k++)
printf(“%d”,A[m][k]);
printf(“\n”);
}
}
该程序执行时输出第一行是(10),第二行是(11)。10.[程序]
#include
int convert(char s1[ ],char s2[ ],int *n1)
{ int i=0,j=0,k,s=0,len;
int value=0;
ChAr tAb[16]=”0123456789AbCdef”;
len = strlen(s1);
if(len%4)
{ for(i=0;i s=s*2+s1[i]-‘0’; s2[j++]=tab[s];value=value*16+s; while(i { s=0; for=(k=0;k<4;k++) s=s*2+s1[i+k]-‘0’; s2[j++]=tab[s]; value=value*16+s; i=r+4; s2[j]=’\0’;* n1=strlen(s2); return value; } main( ) { ChAr ss1[ ]=”1001010”,ss2[10]; int x,y; y=convert(ss1,ss2,&x); printf(“%d\n%d\n%s”,x,y,ss2); } 该程序执行时输出第一行是(12),第二行是(13),第三行是(14)。11.[程序] main( ) { int a[3][3],i,j; numlist(&a[0][0],9); for(I=0;I<3;I++) { for(j=0;j<3;j++)printf(“%d”,A[i][j]); printf(“\n”); } } numlist(int *p,int n) { int i; for(i=0;i } num(int n) { if(n==0)return 1; return num(n-1)*2+1; } 程序执行时输出的第一行是(15)。 完善程序题(共15分) 12.程序功能:合并两个已经按照升序排列的一维数组。Insert函数功能:将m插入x指向的含有n个元素的数组中,数组中n个元素已按升序排列,插入m后的n+1个元素仍保持有序。 void insert(int x[ ],int n,int m); main( ) { int a[10]={1,3,5,7,9},b[5]={2,4,8,16,32},k; for(k=0;k<5;k++) { insert(a, (16) ,b[k]); } for(k=0;k<10;k++) printf("%d",a[k]); } void insert(int x[],int n,int m) { int i,j; if(m>x[n-1]) (17) =m; else {for (i=; (18) ;i++); for(j=n;j>=i;j--) x[j]= (19) ; x[i]=m; } } 13 程序功能:查找满足下列条件的m,n值。给定正整数k,0 # include main( ) { long m,n,k,s,flag=0; printf("input k:"); scanf("%ld",&k); n=k; do { m=_(20)_; do { s=n*(n-m)-m*m; if(s*s==1) (21); else m--; } while(m>0&&! flag); if(m==0) (22); }while(n>0&&! flag); printf("m=%ld,n=%ld",m,n); } 14 已知链表中结点的数据结构定义如下: # include struct node { int x; struce node *next; }; 函数loop功能:根据dir的值循环移位head指向的链表中的所有结点,当dir为正整数时实现循环右移一次,否则循环左移一次。函数返回链表首结点的指针。 例如,移位前的链表数据:head->1->3->5->4。 右移一次后的链表数据:head->4->1->3->5。 算法提示:循环右移时,将链表最后一个结点删除,再将其插入到链表首部;循环左移时,将链表的第一个结点删除,再将其连接到链表尾部。 struct node *loop(struce node *head,int dir) { struct *p1,*p2; p1=head; if(p1==null||p1->next==null) return head; if(dir>=0) { while(p1->next) { p2=p1;p1=p1->next;} (23)= null; p1->next= (24); head=p1; } else { head= (25); p2=head; while(p2->next)p2=p2->next; (26); p1->next=null; } return head; } 15 程序功能:在一行文本中查找给定的单词。一行文本由字母和分隔符组成,分隔符包括若干空格,逗号,句号和换行符。一个单词由若干个连续字母组成。 程序说明:main函数中的word数组存放欲查找的单词。find_word函数完成在t字符串中查找s指向的字母字符串的功能,如未找到返回0,找到则返回s串在t串中出现的次数并将所有出现位置的起始下标保存在x指向的数组中。 #inclued #include #include int find_word(char*, char*, int* ); main( ) { char text[80]="I will pass the examination in the summer holiday.",word[20]; int j,t,pos[10]; puts(〞enter a word to be found: 〞); gets(word); t=find___word (text,word, (27) ); if( (28) ) { printf(〞Find word ˊ%sˊin text. It locate in〞,word); for (j=0;j printf(〞text[%d]〞,pos[j]); } else printf(〞not find〞); } int find___word(char * t, char* s, int*x) { char w[20]; int i,j,k=0; for(i=0;t[i]!= ˊ\0ˊ;i++) { if( isalpha(t[i])) { for (j=0; isalpha(t[i+j]); j++) w[j]= (29) ; w[j]= ˊ\0ˊ; if(strcmp(s,w)==0) x [k++]=i; i= (30) ; } } return k; } 参考答案 一、选择题 21.D 22. C 23. C 24. D 25. B 26. C 27. A 28. A 29. B 30. D 二、填空题 (1)continue (2)取操作数地址(3)字符串 (4)return (5)auto (6)1,2,3 (7)48 (8)1 (9)2 (10)1 4 3 (11)2 5 8 (12)2 (13)74 (14)4A (15)1,3,7 (16)k+5 (17)x[n] (18)x[i] (19)x[j-1] (20)n (21)flag=1(22)n-- (23)p2->next (24)head (25)p1->next (26)p2->next = p1 (27)pos (28)t (29)t[i+j] (30)i+j-1 二级C语言上机试卷 (本试卷完成时间70分钟) 一、改错题(20分) 【题目】 以下程序中函数fixed的功能是:将实型数f转换为十进制字符串形式存放到数组c中,当f<0时,首字符存放“—”,否则存放“+”,小数点后存放有效位数7位,不足的部分用“0”补足,多余部分截尾。例如,程序正确时将输入实型数 1.23456789 转换为字符串“+ 1.2345678”输出。 # include # include # define MAX 100 void fixed(int f, char c[]) { int i,j; double x; char *p= c,*q= c + MAX –1; if(f<0) *p++ =ˊ-ˊ,f= -f; else *p++=ˊ+ˊ; i = int(f); x=f-i ; *q--= ˊ\0ˊ; while(i!=0) { *q= i%10 + ˊ0ˊ; i=i/0; } strcpy(p, q + 1); p=p + strlen(q + 1); (*p)++ =ˊ.ˊ; i=1; while(i<=7) { j=(x =x * 10); *p++=j +ˊ0ˊ;i+ +; x=x-j; } *p=ˊ0ˊ; } main() { double y; char s[MAX]; scanf(″%lf″, &y) fixed(y,s); puts(s); } 【要求】 1.将上述程序录入到文件myfl.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。 2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。 3.改正后的源程序(文件名myfl.c)必须放在考盘的根目录上,供阅卷用,否则不予评分。 二、编程题(20分) 【题目】 按以下要求编写程序: 1.编写函数int countvalue(int aa[ ] ),其功能是:求出500到800区间内的素数及素数的 个数cnt,将这些素数按从小到大的顺序依次存入aa指向的数组中,函数返回cnt的值。 2.编写主函数,调用countvalue函数,将所找到的所有素数保存到文件myf2.out中。 【要求】 1.源程序文件名必须取为myf2.c,输入结果文件名为myf2.out。 2.数据文件的打开、使用、关闭等操作均用C标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均需保存在考试盘根目录中共阅卷使用。 4.不要复制扩展名为obj和exe的文件到考试盘中。 参考答案 一、改错题(20分) #include #include #define MAX 100 void fixed (int f,char c[ ] ) /* 正确double f { int i , j ; double x ; char * p=c , *q=c+MXA-1 ; if ( f<0 ) * p ++=’-‘ , f= - f ; else * p++=’+’ ; i = int ( f ) ; /* 正确i= (int)f;或i=f;*/ x = f – i ; *q -- =’\0’ ; while ( i ! = 0 ) { *q=i%10+’0’; /* 正确*q--=i%10+’0’;*/ i=i/10; } strcpy(p,q+1); p=p+strlen(q+1); (*p)++=’.’; /*正确*p++=’.’*/ i=1; while (i<=7) { j=(x=x*10);*p++=j+’0’;i++; x=x-j; } *p=’\0’; } main( ) { double y ; char s[MAX]; sCAnf(“%if”,&y); fixed(y,s); put(s); } 二、编程题(20分) #include #include int countvalue(int aa,int*p) { int i,j,k=-1,cnt,f=-1; for(i=501;i<800;i+=2) { for (j=2;j<=sqrt(i);j++) if (i%j==0)break; if (j>sqrt(i)){f=-f;aa[++k]=i;*p=*p+f*aa*[k];} } cnt= k+1; return cnt; } main( ) { int i,sum=0,coumt,a[100]; FILE*fp; if((fp=fopen(“myf2.out”,”w”))==null) { printf(“CAn’t open file!”);exi t(1);} count=countvalue(a,&sum); for(i=0;i fprintf(fp,(i+1)%5?”%5d”:”%5d\n”,A[i]); fprintf(fp,”\n”); fprintf(fp,”Count=%d,sum=%d\n”,Count,sum); fclose(fp); } 运行结果: 503 509 521 523 541