C理论自测题及参考答案第3次.docx
《C理论自测题及参考答案第3次.docx》由会员分享,可在线阅读,更多相关《C理论自测题及参考答案第3次.docx(25页珍藏版)》请在冰点文库上搜索。
![C理论自测题及参考答案第3次.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/0bf3b960-a2ed-4871-bd59-9959b55b1576/0bf3b960-a2ed-4871-bd59-9959b55b15761.gif)
C理论自测题及参考答案第3次
一、单选题
1.以下关于函数的叙述中,正确的是。
A.在函数体中可以直接引用另一个函数中声明为static类别的局部变量的值
B.在函数体中至少必须有一个return语句
C.在函数体中可以定义另一个函数
D.在函数体中可以调用函数自身
2.以下关于变量的叙述中,不正确的是。
A.一个变量的作用域完全取决于该变量声明的位置
B.全局变量可以在函数以外的任何位置声明
C.动态局部变量的生存期仅限于本次函数调用,无法将局部变量的值保存到函数下一次调用
D.&
E.用static声明一个变量是为了限制其他编译单位引用该变量
3.以下选项是一个自定义函数的头部,其中正确的是。
A.intfun(inta,b)B.intfun(inta,inta)
C.intfun(inta[],intb)D.intfun(staticinta,intb)
4.关于函数返回值,以下叙述中正确的是。
A.函数返回值的类型由函数体内return语句包含的表达式类型决定
B.函数返回值的类型由函数头部定义的函数类型决定
C.若函数体中有多个return语句,则函数返回值是排列在最后的return语句中表达式的值
D.若函数体内没有return语句,则函数没有返回值
5.以下程序中main函数需要调用fun函数,所给选项中正确的调用语句是。
A.fun(1,2);B.fun((1,2));C.f();D.fun(fun
(1));
—
voidfun(intc)
{printf(“%d”,c);}
6.已知函数f定义如下:
voidf(void)
{printf(“That’sgreat!
”);}
则调用f函数的正确形式是。
A.f;B.f();C.f(void);D.f
(1);
7.已知有函数f的定义如下:
intf(inta,intb)
{if(a
]
在main函数中若调用函数f(2,3),得到的返回值是。
A.2B.3C.2和3D.3和2
8.在以下程序中,需要在fun函数中声明一个int型的变量,所给选项中不能用作该变量名的是。
A.xB.yD.fun
#include<>
inty;
main()
{inta=1;
fun(a);
}
~
intfun(intx)
{/*int型变量声明位置*/
}
9.若有程序:
intx;
intf(inty)
{return标识符;}
#include<>
intw;
main()
&
{intz=2;f(z);}
则在函数f中,return语句后允许出现的标识符是。
A.x或wB.x或yC.z或wD.NULL
10.在main函数体内部和外部均允许出现的实体是。
A.预处理命令B.操作语句C.另一函数的定义D.函数形式参数声明
11.设有下列程序段:
staticcharb=2;
voidY()
{staticfloatd=4;.......}
inta=1;
】
voidX()
{intc=3;......}
关于程序段中各变量的属性,以下叙述中错误的是。
A.a是全局变量,函数X可以访问,函数Y不能访问
B.b是全局变量,函数X和函数Y都可以访问
C.c是动态局部变量,函数X可访问,函数Y不可访问
D.d是静态局部变量,函数X和函数Y都可以访问
12.对应main函数中的fun函数调用,以下给出的四个fun函数定义的首部中,错误的是。
main()
{inta,n;
fun(n,&a);
[
}
A.voidfun(intm,intx[])B.voidfun(ints,inth[41])
C.voidfun(intp,int*s)D.voidfun(intn,inta)
13.下列全局变量声明中,正确的是。
A.autointi=1;B.floata=1,b=,c=a+b;
C.charfor=1;D.staticcharch;
14.若有数组A和B的声明“staticcharA[]="ABCDEF",B[]={'A','B','C','D','E','F'};”,则数组A和数组B的长度分别是。
A.7,6B.6,7C.6,6D.7,7
15.以下程序运行后的输出结果是。
22C.752
"
#include<>
main()
{chara[7]="a0\0a0\0";inti,j;
i=sizeof(a);j=strlen(a);
printf("%d%d",i,j);
}
16.假定已有声明“chara[30],*p=a;”,则下列语句中能将字符串"ThisisaCprogram."正确地保存到数组a中的语句是。
A.a[30]="ThisisaCprogram.";B.a="ThisisaCprogram.";
C.p="ThisisaCprogram.";D.strcpy(p,"ThisisaCprogram.");
17.以下数组声明中正确的是。
*
A.intn=10,a[n];B.inta[];
C.inta[2][3]={{1},{2},{3}};D.inta[][3]={{1},{2},{3}};
18.若有声明inta[10],b[3][3];则以下对数组元素赋值的操作中,不会出现越界访问的是。
A.a[-1]=0B.a[10]=0C.b[3][0]=0D.b[0][3]=0
19.已有声明“intS[2][3]”,以下选项中正确地引用了数组S中的元素。
A.S[1>2][!
1])B.S[2][0]C.S[1]D.S
20.已知函数fun的定义如下:
voidfun(intx[],inty)
{intk;
for(k=0;k]
x[k]+=y;
}
若main函数中有声明inta[10]={10};及调用fun函数的语句,则正确的fun函数调用形式是。
A.fun(a[],a[0]);(a[0],a[0]);(&a[0],a[0]);D.fun(a[0],&a[0]);
21.以下单目运算符均只需要一个操作数,其中要求操作数类型必须是指针型的选项是。
A.&B.++C.!
D.*
22.已有声明“inta[5];”,以下表达式中不能正确取得数组元素a[1]地址的选项是。
A.&a[1]B.++aC.&a[0]+1D.a+1
23.已知有声明:
“intgood=1;”,若要使得表达式p="good"+good在编译时不出现语法错和警告,p应当声明为。
p;B.char*p;C.intp;D.int*p;
{
24.下列程序段的输出结果是。
inti,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(i=0;i<4;i+=2)
printf("%d",*(p+i));
A.52B.51C.53D.97
25.若有以下声明和定义,如果在main函数中需要调用fun函数,以下调用语句中错误是。
A.fun
(1);B.(*a)
(1);C.b=fun;(*b)
(1);D.c=a;(*c)
(1);
voidfun(intc){printf(“%d”,c);}
main()
{void(*a)(int)=fun,*b(int),(*c)(int);
/*调用fun函数语句位置*/
}
'
void*b(intc){}
26.若有声明“inta[][4]={1,2,3,4,5,6,7,8,9,10},*p=*(a+1);”,则值为9的表达式是.
+=3,*p++B.p+=4,*(p++)C.p+=4,*++pD.p+=4,++*p
27.已知某程序中有声明inta[4],j;及语句for(j=0;j<4;j++)p[j]=a+j;,则标识符p正确的声明形式应为。
A.intp[4];B.int*p[4];C.int**p[4];D.int(*p)[4];
参考答案:
1~5:
DDCBB6~10:
BBABA11~15:
DDDAB16~20:
DDDAC
21~25:
DBBCC26~27:
BB
]
二、多选题
1.在定义一个函数时,下列选项中(21)可以缺省。
A.函数名之前的数据类型B.函数名之后一对圆括号
C.函数名D.形式参数声明
E.函数体中的语句
2.以下程序中需要在main函数之后定义一个函数,在所给的选项中不能用作该函数名的标识符是。
C.p
#definep1
inty;
、
main()
{inta=1;
函数名(a);
}
int函数名(intx)
{returnx*x;
}
3.若已定义一个无返回值的函数,则以下关于调用该函数的叙述中错误的是。
A.函数调用可以作为独立的语句存在
B.函数调用可以出现在表达式中
{
C.函数调用可以作为一个函数实参
D.函数调用可以作为一个函数形参
参考答案:
2.BCD
三、填空题
1.以下程序运行后输出结果是。
#include<>
fun(intk)
{
{staticinti;
intj=0;
return(++k*(++i+(++j)));
}
main()
{inti,n;
for(i=0;i<3;i++)
printf("%3d\t",fun(i));
}
2.以下程序运行后输出结果是。
.
voidfun1(int);
voidfun2(void);
main()
{externintx;
printf("%d",x+=2);
fun1
(2);
}
intx=1;
voidfun1(intx)
{printf("%d",x++);
"
fun2();
}
voidfun2(void)
{printf("%d",x);
while
(1)
{intx=5;
printf("%d",x);break;
}
}
3.以下程序运行后输出结果是。
"
intx=1;
main()
{inty,k;
y=f(3);printf("%d,%d",x,y);
}
intf(intx)
{if(x==3)
{intx=2;
returnx;
}
~
elsebreturnx;
}
4.下列程序运行后输出结果是。
#include<>
trans(intm,intn)
{intq;
if(mq=m;
else
{q=m%n;trans(m/n,n);}
…
if(q<10)
printf("%d",q);
else
printf("%c",'a'+q-10);
}
main()
{trans(30,4);
}
5.下列程序运行后输出结果是。
#include<>
~
intfun(intn);
main()
{printf("%d",fun(5));
}
intfun(intn)
{if(n==1)return1;
returnn-fun(n-1);
}
6.以下程序运行后的输出结果是。
voidfun(intx,inty,int*z)
—
{y=x*x;
*z=x*x*x;
}
voidmain()
{inta=2,b=0,c=0;
fun(a,b,&c);
printf("%d%d%d",a,b,c);
}
7.以下程序运行后输出结果中第一行为
(1),第二行为
(2)。
#include<>
$
intfun(inta[],intn,intb[])
{inti=0,j,m=0,c,x;
for(i=0;i{x=a[i];c=1;
for(j=i+1;jif(a[j]==x)c++;
else{i=j-1;break;}
if(j>=n)i=j;
if(c==1)b[m++]=x;
else{b[m++]=-c;b[m++]=x;}
}
returnm;
}
voidmain()
{intx[]={4,4,4,4,4,4,4,4,1,2},y[10],i,j,n=10;
n=fun(x,n,y);
for(i=0;i{if(i%2==0)printf("\n");
printf("%5d",y[i]);
}
"
}
8.以下程序运行后输出结果第一行是
(1),第二行是
(2)。
#include<>
intconvert(chars1[],chars2[])
{inti=0,j,s;
chartab[8][4]={"000","001","010","011","100","101","110","111"};
for(i=0,j=0;s1[i]!
='\0';i++,j=j+3)
strcpy(&s2[j],tab[s1[i]-'0']);
for(i=0,s=0;is=s*2+s2[i]-'0';
*
returns;
}
main()
{charss1[]="15",ss2[80];
inty;
y=convert(ss1,ss2);
printf("%d\n%s",y,ss2);
}
9.以下程序运行后输出结果第一行是
(1),第二行是
(2)。
,
main()
{inta[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.以下程序运行后输出结果第一行是
(1),第三行是
(2)。
#include<>
voidmat_change(intb[4][4])
{inti,j,m,n,k,c[6][6];
for(i=0;i<6;i++)
for(j=0;j<6;j++)c[i][j]=1;
for(i=1;i<5;i++)
for(j=1;j<5;j++)c[i][j]=b[i-1][j-1];
for(i=1;i<5;i++)
`
for(j=1;j<5;j++)
{if(c[i][j]==0)
{k=0;
for(m=-1;m<=1;m++)
for(n=-1;n<=1;n++)
if(!
(m==0&&n==0))k=k+c[i+m][j+n];
if(k==8)c[i][j]=1;
}
}
for(i=1;i<5;i++)
}
for(j=1;j<5;j++)
b[i-1][j-1]=c[i][j];
}
main()
{inti,j,a[4][4]={{0,1},{1,1,1,1},{0,1,0,1},{0,1,1,1}};
mat_change(a);
for(i=0;i<4;i++)
{for(j=0;j<4;j++)printf("%d",a[i][j]);
printf("\n");
}
$
}
11.已知某程序中有如下片段:
inti;floatf;
/*p的声明*/
p=&i;p=&f;
若要保证该段程序没有任何语法错误,p应当声明为。
12.以下程序运行时输出结果是。
main()
{inti,a[6]={1,2,3,4,5,6};
fun(a,a+5);
(
for(i=0;i<6;i++)printf("%2d",a[i]);
}
fun(int*p1,int*p2)
{intt;
if(p1{t=*p1;*p1=*p2;*p2=t;
fun(p1+=2,p2-=2);
}
}
13.以下程序运行时输出结果第一行是
(1),第二行是
(2)。
<
voidswap(int*a,int*b)
{intc;
c=*a;*a=*b;*b=c;
}
main()
{inti,j,a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
for(j=0;j<2-i;j++)
if(i==j)
swap(&a[i][j],&a[i+2][j+2]);
-
else
swap(&a[i][j],&a[i+1][j+1]);
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
14.以下程序运行时输出结果第一行是
(1),第二行是
(2),第三行是(3)。
#include<>
《
#include<>
longfun(char*s)
{longn,sign,base=10,t;
for(;isspace(*s);s++);
sign=(*s=='-')-1:
1;
if(*s=='+'||*s=='-')s++;
if(*s=='0'&&s++)
{if(*s=='x'||*s=='X')
{base=16;s++;}
else
/
base=8;
}
for(n=0,t=1;t&&(isdigit(*s)||isalpha(*s));s++)
switch(base)
{case10:
n=n*base+*s-'0';break;
case8:
if(*s>='0'&&*s<='7')
n=n*base+*s-'0';
elset=0;
break;
default:
if(isdigit(*s))
~
n=n*base+*s-'0';
else
if(toupper(*s)>='A'&&toupper(*s)<='F')
n=n*base+toupper(*s)-'A'+10;
elset=0;
}
returnsign*n;
}
main()
{charc1[]="0x1f",c2[]="0409",c3[]="-33";
<
printf("%ld\n%ld\n%ld",fun(c1),fun(c2),fun(c3));
}
15.以下程序运行时,输出结果的第一行是
(1),第二行是
(2)。
voidq(char*s,intleft,intright)
{inti,j;
charx,y;
i=left;j=right;
x=s[(left+right)/2];
do
{while(s[i]>x&&i。
while(s[j]left)j--;
if(i<=j)
{y=s[i];
s[i]=s[j];
s[j]=y;
i++;j--;
}
}while(i<=j);
}
main()
&
{charstr1[6]="abcde",str2[7]="25134";
q(str1,0,4);puts(str1);
q(str2,1,4);puts(str2);
}
参考答案:
1.26122.32353.1,24.1325.36.2087.
(1)-84
(2)12
8.
(1)13
(2)0011019.
(1)143
(2)25810.
(1)1100
(2)011111.void*p;
12.6,2,4,3,5,113.
(1)963
(2)85214.
(1)31
(2)32(3)-33
15.
(1)edcba
(2)25431
【
四、完善程序
1、以下程序中函数sort的功能是把a、b数组中的数据从大到小有序归并到c数组中,m保存a数组中数据的个数,n保存b数组中数据的个数,函数返回归并到c数组的数据个数。
算法提示:
首先将b数组中数据倒序,再将a、b数组有序合并到c数组中。
#include<>
voidswap(int*a,int*b)
{intc;c=*a,*a=*b,*b=c;}
intsort(int*a,intm,int*b,intn,int*c)
{inti,j,k,x;
for(i=0;iswap(&b[i],
(1));
i=0;j=0;k=0;
(
while(i{if(
(2))
{x=a[i];i++;}
else
{x=b[j];j++;}
c[k]=x;k++;
}
while(k{if(j{c[k]=b[j];k++;j++;}
—
elseif(i{(3);k++;i++;}
}
returnm+n;
}
voidmain()