C语言考试综合题.docx
《C语言考试综合题.docx》由会员分享,可在线阅读,更多相关《C语言考试综合题.docx(100页珍藏版)》请在冰点文库上搜索。
![C语言考试综合题.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/f62627ef-ce94-4dfa-ad7c-e3f9ee99bece/f62627ef-ce94-4dfa-ad7c-e3f9ee99bece1.gif)
C语言考试综合题
一、单选题
1、有以下程序
#defineN20
fun(inta[],intn,intm)
{inti,j;
for(i=m;i>=n;i--)a[i+1]=a[i];
}
main()
{
inti,a[N]={1,2,3,4,5,6,7,8,9,10};
fun(a,2,9);
for(i=0;i<5;i++)printf("%d",a[i]);
}
程序运行后的输出结果是______。
A:
10234
B:
12344
C:
12334
D:
12234
答案:
C
评析:
本题考查的是循环的嵌套。
本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。
由函数调用"fun(a,2,9);"可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。
故本题答案为C。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
2、有以下程序
#defineP3
voidF(intx){return(P*x*x);}
main()
{printf("%d\n",F(3+5));}
程序运行后的输出结果是______。
A:
192
B:
29
C:
25
D:
编译出错
答案:
D
评析:
本题考查的是宏定义。
return语句用于从被调函数带回一个函数值。
void关键字表示"无类型",即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数的类型和返回值、宏定义
3、有以下程序
intfun1(doublea){returna*=a;}
intfun2(doublex,doubley)
{doublea=0,b=0;
a=fun1(x);b=fun1(y);return(int)(a+b);
}
main()
{doublew;w=fun2(1.1,2.0);……}
程序执行后变量w中的值是______。
A:
5.21
B:
5
C:
5.0
D:
0.0
答案:
C
评析:
本题考查的是数值类型的定义与强制转换。
本题在进行调用函数fun2()时,又对函数fun1()进行了调用,由于函数fun1()定义为整型,所以第一次调用fun1()时返回的值为1,然后再将1赋值给a,此时由于a为double型,则系统自动类型转换,将1转换成了1.000000赋值给了变量a,以此类推,得b的值为4.000000,然后通过"return(int)(a+b);"将a+b的值强制转换为int型5返回给主函数,此时又由w的类型为double,所以返回的整型值5又被转换为double型。
故输出结果为5.0。
故本题答案为C。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数、不同类型数据间的转换与运算
4、若有以下函数首部
intfun(doublex[10],int*n)
则下面针对此函数的函数声明语句中正确的是______。
A:
intfun(doublex,int*n);
B:
intfun(double,int);
C:
intfun(double*x,intn);
D:
intfun(double*,int*);
答案:
D
评析:
本题考查的是函数的声明。
函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。
字符数组可用指针来表示,所以选项D正确。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数的定义方法、指针
5、有以下程序
voidf(intn,int*r)
{intr1=0;
if(n%3==0)r1=n/3;
elseif(n%5==0)r1=n/5;
elsef(--n,&r1);
*r=r1;
}
main()
{intm=7,r;
f(m,&r);printf("%d\n",r);
}
程序运行后的输出结果是______。
A:
2
B:
1
C:
3
D:
0
答案:
A
评析:
本题考查的是指针作为函数的参数和函数的调用。
题目中定义了一个指针变量r作为形参的f()函数。
在主函数main()中定义了两个变量m和r,同时给m赋初值7,执行"f(m,&r);"语句,调用f()函数并将m的初值7传递给形参n,将r的地址传给形参指针变量r。
f()函数中通过指针r将最后的值返回。
首先执行if语句中的条件:
n%3==0,7%3=1条件为假,执行第一个else下的语句,同样不满足条件,再执行第二个else下的语句,n自行减一,n=6,再执行if语句,满足条件,r1=2,把r1的值2赋给指针变量r所指向的存储单元,即为主函数r的值,输出结果为2。
故本题答案选A。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/用指针作函数参数
6、有以下程序
#include
#include
voidfun(chars[][10],intn)
{chart;inti,j;
for(i=0;ifor(j=i+1;jif(s[i][0]>s[j][0]){t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}
}
main()
{charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};
fun(ss,5);printf("%s,%s\n",ss[0],ss[4]);
}
程序的运行结果是______。
A:
xy,aaaacc
B:
aaaacc,xy
C:
xcc,aabcc
D:
acc,xabcc
答案:
D
评析:
本题的考查点是循环嵌套。
函数fun的功能是对数组中的每个字符串的第一个字符按由小到大的顺序排序,最终输出数组的第一个和第五个的字符串。
比较各字符串的首字符可知,字符'a'最小,字符'x'最大,所以输出的ss[0]的值为acc,ss[4]的值为xabcc。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/循环的嵌套
7、有以下程序
voidf(int*x,int*y)
{
intt;
t=*x;*x=*y;*y=t;
}
main()
{
inta[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
while(p{f(p,q);p++;q--;}
for(i=0;i<8;i++)printf("%d,",a[i]);
}
程序运行后的输出结果是______。
A:
8,2,3,4,5,6,7,1,
B:
5,6,7,8,1,2,3,4,
C:
1,2,3,4,5,6,7,8,
D:
8,7,6,5,4,3,2,1,
答案:
D
评析:
本题考查的是函数的调用。
本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。
在主函数中,能过"p=a;q=&a[7];"将指针变量p指向了数组的第一个元素,指针变量q指向了数组的最后一个元素。
通过"f(p,q)"调用函数f进行对称的数组元素的交换。
当while循环4次(即p=q)后,a数组中各元素的值分别为87654321,所以程序输出的结果为8,7,6,5,4,3,2,1,。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数的正确调用,嵌套调用,递归调用
8、已定义以下函数
fun(char*p2,char*p1)
{while((*p2=*p1)!
='\0'){p1++;p2++;}}
函数的功能是______。
A:
将p1所指字符串复制到p2所指内存空间
B:
将p1所指字符串的地址赋给指针p2
C:
对p1和p2两个指针所指字符串进行比较
D:
检查p1和p2两个指针所指字符串中是否有'\0'
答案:
A
评析:
本题的考查点是函数。
while((*p2=*p1)!
='\0'表示将p1所指向的值赋给*p2,即将p1所指字符串复制到p2所指内存空间。
在这里"*P2=*p1"是赋值操作,而不是比较是否相等,比较应当为双等号"=="。
所以B,C,D都不对。
故本题答案为A。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
9、以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。
#include
voidf(charp[][10],intn)
{chart[20];inti,j;
for(i=0;ifor(j=i+1;jif(strcmp(p[i],p[j])<0)
{strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
}
main()
{charp[][10]={"abc","aabdfg","abbd","dcdbe","cd"};inti;
f(p,5);printf("%d\n",strlen(p[0]));
}
程序运行后的输出结果是______。
A:
6
B:
4
C:
5
D:
3
答案:
C
评析:
本题的考查点是比较字符串的大小。
比较字符串的大小是从字符串的第一个字母开始比较,如果第一个字母相同则比较第二个字母,以此类推,直至字符串结束,结合本题可知,比较后的字符串数组为:
p[0]="dcdbe"
p[1]="cd"
p[2]="abc"
p[3]="abbd"
p[4]="aabdfg"
所以,strlen(p[0])=5。
故本题答案为C。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/FOR循环结构
10、以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。
voidreverse(inta[],intn)
{inti,t;
for(i=0;i{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}
}
main()
{intb[10]={1,2,3,4,5,6,7,8,9,10};inti,s=0;
reverse(b,8);
for(i=6;i<10;i++)s+=b[i];
printf("%d\n",s);
}
程序运行后的输出结果是______。
A:
22
B:
10
C:
34
D:
30
答案:
A
评析:
本题的考查点是对数组的操作。
本题并不是将整个数组中的内容逆置,而是逆置前8个元素。
逆置后的数组为:
8,7,6,5,4,3,2,1,9,10。
通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。
故本题答案为A。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/数组、函数、FOR循环结构
11、有以下程序
voidss(char*s,chart)
{while(*s)
{if(*s==t)*s=t-'a'+'A';
s++;
}
}
main()
{charstr1[100]="abcddfefdbd",c='d';
ss(str1,c);printf("%s\n",str1);
}
程序运行后的输出结果是______。
A:
ABCDDEFEDBD
B:
abcDDfefDbD
C:
abcAAfefAbA
D:
Abcddfefdbd
答案:
B
评析:
本题的考查点是将字符串中指定的小写字母转换为大写字母。
在主函数中,因为c被赋值为字符'd',所以函数的功能是将字符串中d字母转换为大写。
故本题答案为B。
等级:
3难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数、WHILE和DOWHILE循环结构
12、以下程序的输出结果是______。
charcchar(charch)
{if(ch>='A'&&ch<='Z')ch=ch-'A'+'a';
returnch;
}
main()
{chars[]="ABC+abc=defDEF",*p=s;
while(*p)
{*p=cchar(*p);
p++;
}
printf("%s\n",s);
}
A:
abc+ABC=DEFdef
B:
abc+abc=defdef
C:
abcABCDEFdef
D:
abcabcdefdef
答案:
B
评析:
本题中cchar函数的作用是:
如果参数ch是大写字母,则将它转换成小写的,而对大写字母以外的字符不起作用。
所以答案应该是B。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/函数的正确调用,循环、指针
13、设有以下函数;
f(inta)
{intb=0;
staticintc=3;
b++;c++;
return(a+b+c);
}
如果在下面的程序中调用该函数,则输出结果是______。
main()
{inta=2,i;
for(i=0;i<3;i++)printf("%d\n",f(a));
}
A)B)C)D)
7777
89107
911137
A:
A)
B:
B)
C:
C)
D:
D)
答案:
A
评析:
本题考查的是C语言的静态数据类型。
静态数据类型的变量的值在退出了函数时依然存放在内存中,且只初始化一次。
本题答案为A。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
14、下列程序的运行结果是______。
voidfun(int*a,int*b)
{int*k;
k=a;a=b;b=k;
}
main()
{inta=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf("%d%d",a,b);
}
A:
63
B:
36
C:
编译出错
D:
00
答案:
B
评析:
本题中主函数里的x、y,fun函数里的a,b,k,这些都是指针,fun函数中只是将a,b这两个指针交换了位置,而并没有改变主函数中变量a,b的值。
本题答案为B。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
15、有以下程序
main()
{inta[][3]={{1,2,3},{4,5,0}},(*pa)[3],i;
pa=a;
for(i=0;i<3;i++)
if(i<2)pa[1][i]=pa[1][i]-1;
elsepa[1][i]=1;
printf("%d\n",a[0][1]+a[1][1]+a[1][2]);
}
执行后输出结果是______。
A:
7
B:
6
C:
8
D:
无确定值
答案:
A
评析:
本题的考查点是二维数组和指针数组的应用。
在所给的程序中,pa指向二维数组首地址a,接着执行下面的for循环,当i=0或i=1时,数组元素pa[1][i]的值减1,当i=2时,数组元素pa[1][i]的值为1,此时得到新的二维数组a[][3]={{1,2,3},{3,4,1}},最终打印结果就是2+4+1=7。
故本题答案为A。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/FOR循环结构、2级指针
16、有以下程序
main()
{charstr[][10]={"China","Beijing"},*p=str;
printf("%s\n",p+10);
}
程序运行后的输出结果是______。
A:
China
B:
Bejing
C:
ng
D:
ing
答案:
B
评析:
此题考的是指向数组元素的指针变量。
本题首先要知道,C语言中二维数组元素排列的顺序是按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
此题二维数组str[0]前5个元素为''C','h','i','n','a','\0',第6个元素为'\0',后4个元素为空字符。
紧接着内存单元存放的内容即从str[1][0]到str[1][9]为'B','e','i','j','i','n','g','\0',第八个元素为'\0',后两个元素为空字符,执行*p=str后,指针p就指向了二维数组str的首地址,所以p+10就指向了从首地址依次向后的第11个存储单元即字符B的地址,所以输出Beijing,故答案为B。
如果此题将*p=str改为(*p)[10]=str;则p+10指的就是str的第10行,如果此时要想输出Beijing,则必需将p+10改为p+1,因为(*p)[10]中的p是行指针,它是指向包含10个元素的一维数组,那么p+1就是加的一行了;而本题的p+1只是移动一个位置,因为此题的p只是一个指针变量。
故本题答案为B。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/指向数组元素的指针变量
17、有以下程序段
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
b=p[5];
b中的值是______。
A:
5
B:
6
C:
8
D:
9
答案:
D
评析:
int*p中p为指向整型数据的指针变量,*p为指针变量p所指向的变量。
指针变量中只能存放地址(指针),本题中p存放的是a[3]的地址,即p指向数组{4,5,6,7,8,9,10},b=p[5]=9。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
18、若有以下说明和语句
intc[4][5],(*p)[5];
p=c;
能够正确引用c数组元素的是______。
A:
p+1
B:
*(p+3)
C:
*(p+1)+3
D:
*(p[0]+2)
答案:
D
评析:
本题考查的是数组元素的引用。
如果定义一个指针指向二维数组的一行,则可以移动到下一行,这就是行指针。
行指针的定义格式为:
[存储类型]数据类型(*指针)[n]这里的n是一个整数,表示所指向的二维数组的列数。
(*p)[5]中p是指向一个包含5个元素的一维数组,p的值就是该一维数组的首地址。
所以当用行指针访问二维数组时,行指针每增加1,就移动一行,即指向二维数组的下一行,例如此题中的p+i将指向数组的第i行。
即选项A所指的意思是指向数组c的第1行,并不是引用c数组的元素;B答案中p+3是指向数组元素的第3行,*(p+3)是指第三行第零个元素的地址;选项C由对选项A,选项B的解释可知,它指的是第一行第3列元素的地址;选项D中p[0]+2是指第0行第2列元素的地址,再加个*就表示第0行第2列的元素,即c[0][2]。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
没有定义
19、若要用下面的程序片段使指针变量p指向一个存储整型变量的动态存储单元
int*p;
p=______malloc(sizeof(int));
则应填入______。
A:
int
B:
int*
C:
(*int)
D:
(int*)
答案:
D
评析:
本题的考查点是强制类型转换。
不论p是指向什么类型的指针变量,都可以通过强制类型转换的方法使之类型一致,强制类型转换的格式为(数据类型*)。
故本题答案为D。
等级:
1难度:
1区分度:
1
出题人:
文本导入修改人:
审核人:
创建时间:
2008-06-25最后修改时间:
知识点:
C综合题目部分/知识点/综合/不同类型数据间的转换与运算、指针
20、若有以下说明和语句,请选出哪个是对c数组元素的正确引用______。
intc[4][5],(*cp)[5];
cp=c;
A:
cp+1
B:
*(cp+3)
C:
*(cp+1)+3
D:
*(*c