C考试参考答案Word文档格式.docx
《C考试参考答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《C考试参考答案Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
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;
则对指针变量正确的说明和初始化是:
Aint*p=a;
Bintp=a;
Cintp=&
a;
Dint*p=&
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<
stdio.h>
string.h>
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符、回车符、换行符)。
在对应的一组选项中选择正确的内容填入______处。
ctype.h>
{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;
%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[]=“”
sizeof(str)=___17____
sizeof(p)=____4______
sizeof(n)=____4_______
sizeof(str)=____4______
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,___。
{inti=1;
while(i<
=12)
{if(!
(i%4))printf("
%d,"
i);
i++;
9.以下程序的输出结果
main()
{intx=25,y=15;
if(x>
y)
swap(&
x,&
y);
%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.指针在任何情况下都可进行>
<
>
=,<
=,==运算。
运算时它们的指针类型要相同,指针级数也要相同才行。
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
a.x[0]=10;
a.x[1]=1;
a.i);
266(低位低地址,高位高地址,内存占用情况是Ox010A)
3.请问以下程序的输出
main()
union{
/*定义一个联合*/
inti;
struct{
/*在联合中定义一个结构*/
charfirst;
charsecond;
}half;
}number;
number.i=0x4241;
/*联合成员赋值*/
%c%c\n"
number.half.first,mumber.half.second);
number.half.first='
a'
;
/*联合中结构成员赋值*/
number.half.second='
b'
%x\n"
number.i);
getch();
AB
(0x41对应'
A'
是低位;
Ox42对应'
B'
是高位)
6261(number.i和number.half共用一块地址空间)
4.下来程序想打印“WelcomeMSRAsia”,改正错误
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);
改正后为
malloc.h>
//error4不能抛出无效指针,应该用堆空间
char*name=(char*)malloc(strlen("
)+1);
strcpy(name,"
);
returnname;
charname[32];
//error1越界
for(inti=0;
=31;
name[i]='
//error2name="
//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->
while(fast!
=NULL&
&
fast->
next!
=NULL)
low=low->
fast=fast->
next->
if(low==fast)returntrue;
2.Windows下,写一函数voidhtonl(int*i),将一个整型变量的第一个字节和第四个字节交换,第二个字节和第三个字节交换。
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()
scanf("
&
i);
beforeinvert,iis:
0x%08x\n"
i);
Htonl(&
afterinvert,iis:
return0;