2009秋江苏C语言二级考试笔试
2009秋 第二部分 C语言程序设计
一、 选择题(用答题卡答题,答案依次填在21,30答题号内,共10分)
21. 以下叙述中正确的是 (21) 。
A. C语言系统以函数为单位编译源程序
B. main函数必须放在程序开始
C. 用户定义的函数可以被一个或多个函数调用任意多次
D. 在一个函数体内可以定义另外一个函数
22(以下选项中,不能用作C语言标识符的是 (22) 。
D. _00 A. print B. FOR C. &a
23. 已知int类型数据在内存中存储长度为2个字节,以下语句中能正确输出整数32768的是
(23) 。
A. printf("%d",32768); B. printf("%ld",32768);
C. printf("%f",32768); D. printf("%c",32768); 24. 已知有声明“int a=3,b=4,c=5; ”,以下表达式中值为0的是 (24) 。
A. a&&b B. a<=b C. a||b&&c D. !(!c||1)
25. 已知有声明“long x,y;”且x中整数的十进制表示有n位数字(4,n,10),若要求去掉整数x十进制
表示中的最高位,用剩下的数字组成一个新的整数并保存到y中,以下表达式中能正确实现这一功
能的是 (25) 。
A. y=x/(10*(n-1)) B. y=x%(10*(n-1))
C. y=x%(long)pow(10,n-1) D. y=x%(10,(n-1))
26. 已知有声明“int x,y;”,若要求编写一段程序实现“当x大于等于0时y取值1,否则y取值-1”,则
以下程序段中错误的是 (26) 。
A. if(x>=0)y=1;else y=-1; B. y=x>=0?1:-1;
C. switch() D. switch(x-abs(x))
{ case x>=0: y=1; break; { case 0: y=1; break;
default: y=-1; default: y=-1;
} } 27(已知有声明“int m[]={5,4,3,2,1},i=0;”,下列对m数组元素的引用中,错误的是 (27) 。
A. m[++i] B. m[5] C. m[2*2] D. m[m[4]] 28(已知有声明“char s[80];”,若需要将键盘输入的一个不含空格的字符串保存到s数组中,则下列语
句中正确的是 (28) 。
A. scanf("%s",s); B. scanf("%s",s[0]); C. s=gets(); D. s=getchar();
29(若函数调用时的实参为变量,则以下关于函数形参和实参的叙述中正确的是 (29) 。
A. 实参和其对应的形参占用同一存储单元
B. 形参不占用存储单元
C. 同名的实参和形参占用同一存储单元
D. 形参和实参占用不同的存储单元
30. 已知有声明“int i,a[10],*p=a;”,现需要将1,10保存到a[0],a[9]中,以下程序段中不能实现这一功
能的是 (30) 。
第4页 C语言
A. for(i=0;i<10;i++)a[i]=i+1; B. for(i=0;i<10;i++)p[i]=i+1;
C. i=1;while(p
void main()
{ FILE *fp;
int k,n,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w");
fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);
fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);
fclose(fp);
fp=fopen("d2.dat","r");
fscanf(fp,"%d%d",&k,&n);
printf("%d,%d\n",k,n);
}
7. 以下程序运行时输出到屏幕的结果是 (7) 。
#include
void main()
{ int i=1,m=0;
switch(i)
{ case 1:
case 2: m++;
case 3: m++;
}
printf("%d",m);
}
第5页 C语言
8. 以下程序运行时输出到屏幕的结果中第一行是 (8) ,第二行是 (9) 。
#include
void fun(int a[],int b[],int *x) { int i,j=0;
for(i=0;a[i];i++)
{ if(i%2==0)continue ;
if(a[i]>10)
b[j++]=a[i];
}
*x=j;
}
void main()
{ int a[10]={3,15,32,23,11,4,5,9},b[10];
int i=0,x=0;
fun(a,b,&x) ;
for(i=0;i
int fun(int *x,int n)
{ if(n==0) return x[0];
else return x[0]+fun(x+1,n-1);
}
void main()
{ int a[]={1,2,3,4,5,6,7};
printf("%d\n",fun(a,2)); }
10(以下程序运行时输出到屏幕的结果是 (11) 。 #include
long f(int n)
{ static long s;
if(n==1)return s=2;
else return ++s; }
void main()
{ long i,sum=0;
for(i=1;i<4;i++) sum+=f(i);
printf("%ld",sum);
}
第6页 C语言
11(以下程序运行时输出到屏幕的结果中第一行是 (12) ,第二行是 (13) 。
#include
#define f(x,y) y=x*x
void g(int x,int y)
{ y=x*x; }
void main()
{ int a=2,b=0,c=2,d=0;
f(a,b);
g(c,d);
printf("%d\n%d",b,d); }
(14) ,第三行是 (15) 。 12. 以下程序运行时输出到屏幕的结果中第一行是
#include
void main()
{ int a[3][3]={{3,8,12},{4,7,10},{2,5,11}}, i,j,k,t;
for(j=0;j<3;j++)
for(k=0;k<2;k++)
for(i=0;i<2-k;i++)
if(a[i][j]>a[i+1][j])
t=a[i][j],a[i][j]=a[i+1][j],a[i+1][j]=t;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
13(以下程序运行时输出到屏幕的结果是 (16) 。
#include
#include
void main()
{ int i=0,n=0;char s[80],*p;
strcpy(s,"It is a book.");
for(p=s;*p!='\0';p++)
if(*p==' ')
i=0;
else
if(i==0)
{ n++; i=1; }
printf("%d\n",n); }
第7页 C语言
14(以下程序运行时输出到屏幕的结果第一行是 (17) ,第二行是 (18) 。 #include
typedef struct fact
{ int m,z;
}FACT;
FACT fun1(FACT t1,FACT t2) { FACT t3;
t3.m=t1.m*t2.m;
t3.z=t1.z*t2.m+t2.z*t1.m;
return t3;
}
FACT fun2(FACT t)
{ int m,n,k;
m=t.m;
n=t.z;
while(k=m%n)
{ m=n; n=k; }
t.m=t.m/n;
t.z=t.z/n ;
return t;
}
void main()
{ FACT s,s1={8,4},s2={6,5} ;
s=fun1(s1,s2);
printf("%d,%d\n",s.z,s.m);
s=fun2(s);
printf("%d,%d",s.z,s.m); }
, 完善程序
15. 以下程序求方程的一个近似根。root函数采用二分法计算并返回方程f(x)=0在[a,b]内的一个近似根,
main函数调用root函数求方程cos(x)=0在[0,3.14]内的一个近似根。试完善程序以达到要求的功能。
#include
#include
double root(double a,double b,double (*f)(double))
{ double x,y;
if( (19) )
{ printf(" There is no root between %f and %f",a,b);
return 0;
}
第8页 C语言
do
{ x= (20) ;
y=f(x);
if(fabs(y)<1e-6||fabs(b-a)<1e-6)break;
if( (21) <0 ) b=x;
else a=x;
}while(1);
return x;
}
void main()
{ printf("\n x=%f",root(0,3.14, (22) )); }
16(以下程序在3,50范围内验证:大于等于3的两个相邻素数的平方之间至少有4个素数。例如,3
22和5是相邻素数,3,5之间有素数11、13、17、19、23。试完善程序以达到要求的功能。
#include
#include
#include
int prime(int n)
{ int i;
for(i=2;i<=sqrt(n);i++)
if( (23) )return 0;
return 1;
}
void main()
{ int i,j,k=0,m,n,c,a[30]={0};
for(i=3;i<50;i++)
if(prime(i)) (24) ;
for(i=0;i=4)
printf("\n %d*%d-%d*%d: %d",a[i],a[i],a[i+1],a[i+1],c);
else { printf("Error"); exit(0);}
}
}
第9页 C语言
17. fun函数的功能是删除s指向的链表中满足以下条件的结点:该结点的编号值是奇数且存放的字母
ASCII编码值也为奇数(提示:a的ASCII编码是97);将删除的结点添加到t所指向的链表尾部。
试完善fun函数以达到要求的功能。
例如,若删除前的s链表为:
s 1 a 2 b 4 c 0 3 b
则删除后的s链表为:
s 2 b 4 c 0 3 b
#include
struct node
{ int i; /* 存放结点的编号 */
char c; /* 存放一个字母的ASCII编码 */
struct node *next;
};
struct node *t=NULL;
struct node *fun(struct node *s) { struct node *p,*q; struct node *r;
p=q=s;
while(p!=NULL)
{ if(((p->i)%2)&&((p->c)%2))
{ if(s==p)
s=q= (27) ;
else
{ (28) ;
q=p->next;
}
if(t==NULL)
t=r=p;
else
{ r->next=p; r=r->next; }
}
p= (29) ;
}
if(t!=NULL)
(30) ;
return s;
}
第10页 C语言