C考试参考答案.docx
- 文档编号:9156994
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:22.38KB
C考试参考答案.docx
《C考试参考答案.docx》由会员分享,可在线阅读,更多相关《C考试参考答案.docx(14页珍藏版)》请在冰豆网上搜索。
C考试参考答案
C101008C语言考试
满分100分,考试时间2个小时,请在答题纸上作答
一、单选题(共10题,每题1分)
1.break关键字在哪一种语法结构中不能使用?
(C)
A.for语句B.switch语句
C.if语句D.while语句
2.现在最快且最通用的排序算法是什么?
(A)
A.快速排序B.冒泡排序
C.选择排序D.外部排序
3.C库函数strstr的功能是?
(A)
A.查找子串B.计算字符串长度
C.字符串比较D.连结字符串
4.选择正确的运行结果:
___d__。
#include"stdio.h"
main()
{
inta=1,b=10;
do{a++;
b-=a;
b--;}
while(b>0);
printf("a=%d,b=%d",a,b);
}
Aa=2,b=-1Ba=2,b=-2Ca=4,b=-1Da=4,b=-2
5.若要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是:
___b__。
A)fopen("A:
\user\abc.txt","r")B)fopen("A:
\\user\\abc.txt","r+")
C)fopen("A:
\user\abc.txt","rb")C)fopen("A:
\\user\\abc.txt","w")
6.C语言规定,数组名做实参时,它和对应形参之间的数据传递方式是:
___d__。
A用户指定传递方式B无传递C单向值传递D地址传递
7.若有以下说明语句:
structSTUDENT
{intnum;
charname[10];
floatcj;
}a1={1001,”liming”,97.5},*p=&a1;
不正确的输出语句是:
__d___。
Aprintf(“%f”,a1.cj);Bprintf(“%f”,p->cj);
Cprintf(“%f”,(*p).cj);Dprintf(“%f”,*p.cj);
8.已知inta;则对指针变量正确的说明和初始化是:
__d___。
Aint*p=a;Bintp=a;Cintp=&a;Dint*p=&a;
9.假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为:
___d__。
A)log2nB)n2C)O(n1.5)D)n(n-1)/2
10..若以下定义:
structlink
{intdata;
strucklink*next;
}a,b,c,*p,*q;
且变量a和b之间已有如下图所示的链表结构:
ab
datanextdatanext
┌──┬──┐┌──┬──┐
│5│┼→│9│\0│
└──┴──┘└──┴──┘
↑p
c
datanext
┌──┬──┐
│7││
└──┴──┘
↑q
指针p指向变量a,q指向变量c。
则能够把c插入到a和b之间并形成新的链表(a->c->b)的语句组是:
___c__。
A)a.next=c;c.next=b;B)p.next=q;q.next=p.next;
C)q->next=p->next;p->next=&c;D)*p.next=q;(*q).next=&b;
二、多选题(共5题,每题1分)
1.在C语言中,每个变量必须在使用前进行类型说明或定义,这样可以( ABCD ).
(A)为变量赋初值(B)规定该变量的取值范围(C)规定该变量所能进行的运算操作
(D)方便在编译时为其分配存储单元(E)规定变量的个数
2.以下是死循环的程序段是_______。
(A)for(i=1;;)
{
if(++i%2==0)continue;
if(++i%3==0)break;
}
(B)i=32767;
do{if(i<0)break;}while(++i);
(C)for(i=1;;)if(++i<10)continue;
(D)i=1;
while(i--);
(E)unsignedk=0;
do{++k;}while(k>=0);
3.设有以下说明和定义语句,则下面表达式中值为3的是___d,e_____。
structs
{
inti1;
structs*i2;
}
staticstructsa[3]={1,&a[1],2,&a[2],3,&a[0]},*ptr;
ptr=&a[1];
(A)ptr->i1++(B)ptr++->i1(C)*ptr->i1(D)++ptr->i1(E)(++ptr)->i1
4.下面程序的功能是将一个整数字符串转换为一个整数,如“-324”转换为-324,请选择填空。
#include
#include
main()
{
chars[6];
intn;
gets(s);
if(*s==‘-’)n=__2__;
elsen=chnum(s);
printf(“%d\n”,n);
}
chnum(char*p)
{
intnum=0,k,len,j;
len=strlen(p);
for(;__3__;p++)
{
k=__4__;
j=(--len);
while(__5__){k=k*10;}
num=num+k;
}
return(num);
}
2(A)chnum(s)(B)-chnum(*s)(C)-chnum(s+1)(D)-chnum(s++)(E)-chnum(++s)
3(A)*p!
=’\0’(B)*(++p)!
=’\0’(C)*(p++)!
=’\0’(D)len!
=0(E)*p==’\0’
4(A)*p(B)*p+’0’(C)*p-‘0’(D)*p-32(E)p[0]-‘0’
5(A)--j>0(B)j-->0(C)--len>0(D)len-->0(E)j—
5.下面程序删除字符串s中的所有空格(包括TAB符、回车符、换行符)。
在对应的一组选项中选择正确的内容填入______处。
#include
#include
main()
{chars[81]=”abcdefg.”;
delspace(s);
puts(s);
}
delspace(char*str)
{inti,t;
charts[81];
for(i=0,t=0;___8___;___9___)
if(!
isspace(str[i]))ts[t++]=str[i];
__10__;
strcpy(str,ts);
}
8(A)str[i](B)!
str[i](C)str[i]!
=’\0’(D)str[i]=NULL(E)str[i]==0
9(A)t++(B)++i(C)i++(D)*(ts+i)(E)++t
10(A)ts[t]=’\0’(B)str[t++]=’\0’(C)ts[t++]=’\0’(D)ts[--t]=’\0’(E)str[t]=’\0’
三、填空题(共10题,每题1分)
1.某32位系统下,C++程序,请计算sizeof的值
charstr[]=“Hello”
char*p=str;
intn=10;
请计算
sizeof(str)=____6_____
sizeof(p)=____4_____
sizeof(n)=_____4_____
voidFoo(charstr[100])
{
请计算
sizeof(str)=____4______
}
void*p=malloc(100);
请计算
sizeof(p)=____4________
2.设intarr[]={129,7,8,9,10};
int*ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
结果_______8,8__________
3.定义double**a[3][4],则变量占有的内存空间为:
__48___
4.写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a的值
inta=4;
(A)a+=(a++);____9____
(B)a+=(++a);____10___
(C)(++a)+=a;____10____
(D)(++a)+=(a++);_____11_____
5.某32位系统下,C++程序,请计算sizeof的值(5分).
charstr[]=“”
char*p=str;
intn=10;
请计算
sizeof(str)=___17____
sizeof(p)=____4______
sizeof(n)=____4_______
voidFoo(charstr[100])
{
请计算
sizeof(str)=____4______
}
void*p=malloc(100);
请计算
sizeof(p)=_____4_______
6、strcat能把strSrc的内容连接到strDest,为什么还要char*类型的返回值?
方便赋值给其他变量
7.以下程序的输出结果是:
___31__。
fun(intx,inty,intz)
{z=x*x+y*y;
}
main()
{inta=31;
fun(5,2,3);
printf(“%d”,a);
}
8.以下程序的输出结果是:
__4,8,12,___。
main()
{inti=1;
while(i<=12)
{if(!
(i%4))printf("%d,",i);
i++;
}
}
9.以下程序的输出结果
main()
{intx=25,y=15;
if(x>y)
swap(&x,&y);
printf("%d",x);
}
swap(int*p1,int*p2)
{int*temp;
temp=p1;
p1=p2;
p2=temp;
}
运行结果:
___25__。
10.以下程序的输出结果:
__30___。
main()
{inta=21,b=11;
printf("%d\n",--a+b,--b+a);
}
四、判断题(共5题,每题1分)
有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0。
(T)
2.int(*ptr)(),则ptr是一维数组的名字。
(F)
答案:
ptr是函数指针
3.指针在任何情况下都可进行>,<,>=,<=,==运算。
(F)
答案:
运算时它们的指针类型要相同,指针级数也要相同才行。
4.switch(c)语句中c可以是int,long,char,float,unsignedint类型。
(F)
答案:
不能是float类型。
5.#defineprint(x) printf("theno,"#x",is") (T)
五、简答题(共5题,每题5分)
1.什么是“引用”?
申明和使用“引用”要注意哪些问题?
答:
引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。
申明一个引用的时候,切记要对其进行初始化。
引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型。
不能建立数组的引用。
2.将“引用”作为函数参数有哪些特点?
答:
(1)传递引用给函数与传递指针的效果是一样的。
这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
而引用更容易使用,更清晰。
3.结构与联合有和区别?
答:
1.结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。
2.对于联合的不同成员赋值,将会对其它成员重写, 原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。
4.分别写出bool,int,float,指针类型的变量a与“零”的比较语句。
答案:
bool:
if(!
a)orif(a)
int:
if(a==0)
float:
if(a==0)
pointer:
if(a!
=NULL)orif(a==NULL)
5.局部变量能否和全局变量重名?
答:
能,局部会屏蔽全局。
要用全局变量,需要使用":
:
";局部变量可以与全局变量同名,函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
六、程序分析题(共4题,每题5分,第4题10分)
1.求下面函数的返回值
intfunc(x)
{
intcountx=0;
while(x)
{
countx++;
x=x&(x-1);
}
returncountx;
}
假定x=9999。
答案:
8
思路:
将x转化为2进制,看含有的1的个数。
2.请问以下程序的输出
#include
union
{
inti;
charx[2];
}a;
void main()
{
a.x[0]=10;
a.x[1]=1;
printf("%d",a.i);
}
答案:
266(低位低地址,高位高地址,内存占用情况是Ox010A)
3.请问以下程序的输出
main()
{
union{ /*定义一个联合*/
inti;
struct{ /*在联合中定义一个结构*/
charfirst;
charsecond;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n",number.half.first,mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n",number.i);
getch();
}
答案:
AB (0x41对应'A',是低位;Ox42对应'B',是高位)
6261(number.i和number.half共用一块地址空间)
4.下来程序想打印“WelcomeMSRAsia”,改正错误
#include
#include
char*GetName(void)
{
//Toreturn“MSRAsia”String
charname[]="MSRAsia";
returnname;
}
voidmain(intargc,char*argv[])
{
charname[32];
//Fillinzerosintoname
for(inti=0;i<=32;i++)
{
name[i]='\0';
}
//copy“Welcome”toname
name="Welcome";
//Appendablankchar
name[8]="";
//Appendstringtoname
strcat(name,GetName());
//printout
printf(name);
}
答:
改正后为
#include
#include
#include
char*GetName(void)
{
//error4不能抛出无效指针,应该用堆空间
char*name=(char*)malloc(strlen("MSRAsia")+1);
strcpy(name,"MSRAsia");
returnname;
}
voidmain(intargc,char*argv[])
{
charname[32];
//error1越界
for(inti=0;i<=31;i++)
{
name[i]='\0';
}
//error2name="Welcome";
strcpy(name,"Welcome");
//error3name[8]="";
name[7]='';
//error5记得释放堆空间,否则造成内存泄漏
char*temp=GetName();
strcat(name,temp);
free(temp);
printf(name);
}
七、编程题(共2题,每题10分)
1..如何判断一个单链表是有环的?
(注意不能用标志位,最多只能用两个额外指针)
structnode{charval;node*next;}
boolcheck(constnode*head){}//return false:
无环;true:
有环
一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
boolcheck(constnode*head)
{
if(head==NULL) returnfalse;
node*low=head,*fast=head->next;
while(fast!
=NULL&&fast->next!
=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast)returntrue;
}
returnfalse;
}
2.Windows下,写一函数voidhtonl(int*i),将一个整型变量的第一个字节和第四个字节交换,第二个字节和第三个字节交换。
#include
voidSwap(char*pch1,char*pch2)
{
charchSwap=*pch1;
*pch1=*pch2;
*pch2=chSwap;
}
//将piParam所指向的整型数据按字节反序
voidHtonl(int*piParam)
{
char*pch=(char*)piParam;
Swap(pch,pch+3);
Swap(pch+1,pch+2);
}
intmain()
{
inti;
scanf("%d",&i);
printf("beforeinvert,iis:
0x%08x\n",i);
Htonl(&i);
printf("afterinvert,iis:
0x%08x\n",i);
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考试 参考答案