练习.docx
《练习.docx》由会员分享,可在线阅读,更多相关《练习.docx(25页珍藏版)》请在冰豆网上搜索。
练习
C语言国家二级考试2001年1月
一、选择题。
(本大题共40个选项,【1】~【40】每个选择项1.5分,共60分)
1、C语言中,用户能使用的合法标识符是【1】。
【1】A)a,bB)-xyzC)fa2D)5i
voiddefinesort_ax.i
a123s(x)stringmalloc
2、若执行printf("%d\n",strlen("a\n\"\x41"))语句其输出结果是【2】。
【2】A)8B)7C)6D)4
3、若inta,b,c;则表达式(a=2,b=5,b++,a+b)的值是【3】。
【3】A)7B)8C)6D)2
4、以下正确的叙述是【4】。
【4】A)在C语言中,main函数必须位于文件的开头
B)C语言每行中只能写一条语句
C)C语言本身没有输入、输出语句
D)对一个C语言进行编译预处理时,可检查宏定义的语法错误
5、若执行以下程序段:
inta=1,b=2,m=2,n=2;
(m=a>b)&&++n;
则n的值是【5】。
【5】A)1B)2C)3D)4
6、已知各变量的类型如下:
inti=8,a,b;
doublex=1.42,y=5.2;
则以下符合C语言语法的表达式是【6】。
【6】A)a+=a-=(b=4)*(a=3)B)a=a*3=2
C)x%(-3)D)y=float(i)
7、以下程序的运行结果是【7】。
#include
main()
{
intm=5;
if(m++>5)printf("%d\n",m);
elseprintf("%d\n",m++);
}
【7】A)7B)6C)5D)4
8、以下程序的运行结果是【8】。
#include
main()
{
charc='y';
if(c>='a'&&c<='u')c+=5;
elseif(c>='v'&&c<='z')c-=21;
putchar(c);
}
(将字母改为其后第五个字母,按循环次序)
【8】A)'y'B)'d'C)yD)d
9、若定义inti;则以下循环语句的循环执行次数是【9】。
for(i=2;i==0;)printf("%d",i--);
【9】A)无限次B)0次C)1次D)2次
10、以下程序的运行结果是【10】。
#include
main()
{
inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int*p[4],j;
for(j=0;j<4;j++)
p[j]=a[j];
printf("%2d,%2d,%2d,%2d\n",*p[1],(*p)[1],p[3][2],*(p[3]+1));
}
【10】A)4,4,9,8B)程序出错C)4,2,12,11D)1,1,7,5
11、以下程序的输出结果是【11】。
#include
main()
{
inti=0;
while
(1)
{
printf("*");
i++;
if(i<3)break;
}
printf("\n");
}
【11】A)*B)***C)**D)****
12、若定义a[][2]={1,2,3,4,5,6,7};则a数组中行的大小是【12】。
【12】A)2B)3C)4D)无确定值
13、要使以下程序中t的输出结果是4,则输入a和b应满足的条件是【13】。
#include
main()
{
ints,t,a,b;
scanf("%d%d",&a,&b);
s=t=1;
if(a>0)s+=1;
if(a>b)t=s+t;
else
if(a==b)t=5;
elset=2*s;
printf("%d\n",t);
}
【13】A)a>0并且a0并且a>bD)a<0并且a>b'
14、以下程序的运行结果是【14】。
#include
voidf(intb[])
{
inti=0;
while(b[i]<=10)
{
b[i]+=2;
i++;
}
}
main()
{
inti,a[]={1,5,10,9,13,7};
f(a+1);
for(i=0;i<6;i++)
printf("%d",a[i]);
}
(从第一个元素起到大于10为止,各加2)
【14】A)271211139B)171211137
C)171211139D)17129137
15、以下各语句或语句组中,正确的操作是【15】。
【15】A)chars[5]="abcde"B)char*s;gets(s);
C)char*s;s="abcde";D)chars[5];scanf("%s",&s);
16、以下C语言中,对函数不正确的描述是【16】。
【16】A)当用数组名作形参时,形参数组改变可使实参数组随之改变
B)允许函数递归调用
C)函数形参的作用范围只是局限于所定义的函数内
D)函数说明必须在主调函数之前
17、在循环语句的循环体中,continue语句的作用是【17】。
【17】A)立即终止整个循环
B)继续执行continue语句之后的循环体各句
C)结束本次循环
D)结束本次循环并跳出循环
18、以下程序的运行结果是【18】。
#include
main()
{
char*s="xcbc3abcd";
inta,b,c,d;
a=b=c=d=0;
for(;*s;s++)
switch(*s)
{
case'c':
c++;
case'b':
b++;
default:
d++;break;
case'a':
a++;
}
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
}
(a='a'的个数、b='b','c'的个数、c='c'的个数、d=非'a'的个数)
【18】A)a=1,b=5,c=3,d=8B)a=1,b=2,c=3,d=3
C)a=9,b=5,c=3,d=8D)a=0,b=2,c=3,d=3
19、若fp为文件指针,且文件已正确打开,i为long型变量,以下程序段的输出结果是【19】。
fseek(fp,0,SEEK_END)
i=ftell(fp);
printf("i=%ld\n",i);
【19】A)-1B)fp所指文件的长度,以字节为单位
C)0D)2
20、以下程序的输出结果是【20】。
#include
inti;
main()
{
inti=1,j=2;
fun(fun(i,&j),&j);
}
fun(inta,int*b)
{
staticintm=2;
i+=m+a;
m=++(*b);
printf("%d,%d\n",i,m);
return(m);
}
【20】A)3,3B)3,3C)3,3D)3,3
9,46,39,36,4
21、定义compare(char*s1,char*s2)函数,以实现比较两个字符串大小的功能。
以下程序运行结果为-32,选择正确答案填空。
#include
main()
{
printf("%d\n",compare("abCd","abc");
}
compare(char*s1,char*s2)
{
while(*s1&&*s2&&【21】)
{
s1++;
s2++;
}
return*s1-*s2;
}
【21】A)*s1!
=*s2B)*s1==*s2C)*s1=*s2D)s1!
=s2
22、若有以下程序:
#include
main(intargc,char*argv[])
{
while(--argc)
printf("%s",argv[argc]);
printf("\n");
}
(逆序参数回送)
该程序经编译和连接后生成可执行文件S.EXE。
现在DOS提示符下键入SAABBCC回车,则输出结果是【22】。
【22】A)AABBCCB)AABBCCSC)CCBBAAD)CCBBAAS
23、若有定义typedefcharSTRING[255];STRINGs;则s是【23】。
【23】A)字符指针数组变量B)字符数组变量
C)字符变量D)字符指针变量
24、以下程序的运行结果是【24】。
#include
voidfun(char*s);
main()
{
staticcharstr[]="123";
fun(str);
}
voidfun(char*s)
{
if(*s)
{
fun(++s);
printf("%s\n",--s);
}
}
【25】A)3B)123C)1D)3
32121223
3211123123
25、判断以下程序段的结果是【25】。
#defineA3
#defineB(a)((A+1)*a)
...
intx;
x=3*(A+B(7));
【25】A)程序错误,不允许嵌套宏定义B)x=93
C)语法错误,宏体中不允许带括号D)x=21
26、以下程序的运行结果是【26】。
#include
structstu
{
intx;
int*y;
}*p;
intdt[]={1,2,3,4};
structstua[4]={5,&dt[0],6,&dt[1],7,&dt[2],8,&dt[3]};
main()
{
p=a;
printf("%d,",(++p)->x);
printf("%d,",++p->x);
printf("%d\n",++(*p->y));
}
【26】A)6,7,3B)6,6,3C)6,6,2D)5,7,2
27、以下程序的运行结果是【27】。
#include
voidsub(int*x,inty,intz)
{
*x=y-z;
}
main()
{
inta,b,c;
sub(&a,10,5);
sub(&b,a,7);
sub(&c,a,b);
printf("%d,%d,%d\n",a,b,c);
}
【27】A)10,-2,5B)10,5,7C)10,-2,7D)5,-2,7
28、以下程序的运行结果是【28】。
#include
voidabc(char*p)
{
inti,j;
for(i=j=0;*(p+i)!
='\0';i++)
if(*(p+i)<'n')
{
*(p+j)=(p+i);
j++;
}
*(p+j)='\0';
}
main()
{
charstr[]="morning";
abc(str);
puts(str);
}
(保留小于字母'n'的字母)
【28】A)morigB)morningC)migD)or
29、若有定义char*language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};则language[2]的值是【29】。
【29】A)一个字符B)一个地址C)一个字符串D)不定值
30、以下程序的运行结果是【30】。
#include
main()
{
inta=3,b=2,c=1;
{
intb=5,c=12;
c-=b*2;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a+=c;
}
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
【30】A)a=3,b=2,c=-3B)a=3,b=5,c=2
a=0,b=2,c=-3a=5,b=5,c=2
C)a=3,b=2,c=1D)a=3,b=5,c=2
a=5,b=5,c=2a=5,b=2,c=1
31、以下程序的运行结果是【31】。
#include
#defineDEBUG0
main()
{
inta=10,b=20,c;
c=a/b;
#ifdefDEBUG
printf("a=%d,b=%d\n",a,b);
#endif
printf("c=%d\n",c);
}
【31】A)a=10,b=20B)编译出错C)a=10,b=20D)c=0
c=0
32、以下程序的输出结果是【32】。
#include
main()
{
union
{
longa;
intb;
charc;
}m;
printf("%d\n",sizeof(m));
}
【32】A)2B)4C)1D)7
33、若执行以下程序段
intx=3,y=6,z;
z=x^y<<2;
则z的二进制值是【33】。
【33】A)00011011B)00010100C)00011000D)00000110
34、若有以下定义和语句,则对a数组元素地址的正确引用是【34】。
inta[2][3],(*p)[3];
p=a;
【34】A)*(p+2)B)p[2]C)p[1]+1D)(p+1)+2
35、若执行以下程序段,其运行结果是【35】。
charc[]={'a','b','\0','c','\0'};
printf("%s\n",c);
【35】A)abcB)'a''b'C)abcD)ab
36、若有intmax(),(*p);为使函数指针变量p指向函数max,正确的赋值语句是【36】。
【36】A)p=max;B)*p=max;C)p=max(a,b);D)*p=max(a,b);
(应为(*p)())
37、若有定义inta[3][5],i,j;(且0≤i<3,0≤j<5),则a[i][j]不正确的地址表示是【37】。
【37】A)&a[i][j]B)a[i]+jC)*(a+i)+jD)*(*(a+i)+j)
38、以下程序的运行结果是【38】。
#include
main()
{
enum
{aa,bb=5,cc,dd}e;
for(e=bb;e>=aa;e--)
printf("%d",e);
printf("\n");
}
【38】A)543000B)5430C)543210D)程序出错
39、C语言规定,函数返回值的类型由【39】所决定。
【39】A)return语句中的表达式类型B)调用该函数时的主调函数类型
C)调用该函数时的形参类型D)在定义该函数时所指定的函数类型
40、若建立以下链表结构,其指针p,q定义如下:
structnode
{
intdata;
structnode*next;
}p,q;
p,q指向图中所示结点,则能将q所指的结点插入到链表末尾组成单向链表的一组语句是【40】。
pq
102030
NULL
(应为*p,*q,除C外都能实现)
【40】A)q->next=NULL;B)p=p->next;
p=p->next;q->next=p->next;
p->next=q;p->next=q;
C)p=p->next;D)p=(*p).next;
q->next=p;(*q).next=(*p).next;
p->next=q;(*p).next=q;
二、请正确填充下面的划线部分,使其完成所要求的功能:
(本大题共20个空,每空2分,共40分。
请将答案写在答题卡对应栏中,答在试卷上不得分)
1、计算sum=1+1/2+1/4+...+1/50的值,并显示出来。
#include
main()
{
inti=2;
floatsum=1.0;
while(i<=【1】)
{
sum+=1/【2】;
i+=2;
}
printf("sum=%f\n",sum);
}
2、以下程序是用来统计从键盘输入的一个正整数中各位数字中零的个数,并求各位数字中最大者。
例如:
1080其零的个数是2,各位数字中最大者是8。
#include
main()
{
unsignedlongnum,max,t;
intcount;
count=max=0;
scanf("%ld",&num);
do{
t=【3】;
if(t==0)++count;
else
if(maxnum/=10;
}while(num);
printf("count=%d,max=%ld\n",count,max);
}
3、以下程序用来检查二维数组是否对称(即:
对所有i,j都有a[i][j]=a[j][i])。
#include
main()
{
inta[4][4]={1,2,3,4,2,2,5,6,3,5,3,7,8,6,7,4};
inti,j,found=0;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
if(【5】)
{
found=【6】;
break;
}
if(found)break;
}
if(found)printf("不对称\n");
elseprintf("对称\n");
}
4、以下程序用来完成数学函数f(x,y)的计算:
#include
#include
main()
{
doublex,y,z,f();
scanf("%lf%lf",&x,&y);
z=x*y/f(【7】);
printf("result=%lf\n",z);
}
doublef(doublea)
{
doublef1;
f1=pow(3,a)+sqrt(1+【8】);
returnf1;
}
5、以下程序用来输出字符串。
#include
main()
{
char*a[]={"for","switch","if","while"};
char**p;
for(p=a;pprintf("%s\n",【9】);
}
6、以下程序是用来输出如下图形:
*
#*#
*#*#*
#*#*#*#
*#*#*#*#*
#include
main()
{
inti,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5-i;j++)printf("");
for(j=1;j<=2*i-1;j++)
ifprintf("*");
elseprintf("#");
printf("\n");
}
}
7、以下程序是用来输入5个整数,并存放在数组中,找出最大数与最小数所在的下标位置,并把两者对调,然后输出调整后的5个数。
#include
main()
{
inta[5],t,i,maxi,mini;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
mini=maxi=【11】;
for(i=1;i<5;i++)
{
if(【12】)mini=i;
if(a[i]>a[maxi])【13】;
}
printf("最小数的位置是:
%3d\n",mini);
printf("最大数的位置是:
%3d\n",maxi);
t=a[maxi];
【14】;
a[mini]=t;
printf("调整后的数为:
");
for(i=0;i<5;i++)
printf("%d",a[i]);
printf("\n");
}
8、以下程序是用来从10到99数字中挑出能被3整除且至少有一位是5的两位数,并打印出所有这样的数及其个数。
#include
main()
{
intk,m=0;
for(k=10;k<=99;k++)
{
m+=sub(k);
}
printf("个数为:
%d\n",m);
}
sub(intk)
{
inta1,a2,n=0;
a2=【15】;
a1=k/10;
if(k%3==0&&(【16】))
{
printf("%d",k);
return1;
}
elsereturn0;
}
9、以下程序是把文件file1.dat中的内容复制到一个名为file2.dat的新文件中。
#include
main()
{
FILE*fpr,*fpw;
if((fpr=fopen("file1.dat","rb"))==NULL)exit(0);