c语言笔精彩试题问题详解.docx
《c语言笔精彩试题问题详解.docx》由会员分享,可在线阅读,更多相关《c语言笔精彩试题问题详解.docx(15页珍藏版)》请在冰豆网上搜索。
c语言笔精彩试题问题详解
笔试题
一、填空题(每个空4分,共28分)
1)structtagABC
{
charname[10];
charsex;
longsno;
floatscore[4];
}*pAbc;(四字节对齐)
pAbc=NULL;
那么,执行pAbc+=2;之后pAbc的值为(64)
2)如下代码,最终value的值是(8)
int*p1,*p2;
intvalue;
p1=(int*)0×400;
p2=(int*)0×408;
value=p2-p1;
3)如下代码,printf的结果为
(2)
#include〈stdio.h〉
#include〈string.h〉
voidmain(void)
{
characNew[20]=“\\0\0”;
printf(“%d\n”,strlen(acNew));
}
4)有如下程序段,运行该程序的输出结果是(33)
main()
{
inty=3,x=3,z=1;
printf(“%d%d\n”,(++x,y++),z+2);
}
5)设有:
inta=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后,n的值为
(2)
6)structtagAAA
{
UnsignedcharucId:
1;
UnsignedcharucPara0:
2;
UnsignedcharucState:
6;
UnsignedcharucTail:
4;
UnsignedcharucAvail;
UnsignedcharunTail2:
4;
UnsignedlongulData;
}AAA_S
问:
AAA_S在字节对齐分别为1,4情况下,占用的空间大小分别是多少?
(9)(12)
二、选择题(每题2分,共34分)
1)若有说明int(*p)[3];以下叙述正确的是(D)
A:
p是指针数组
B:
(*p)[3]和*p[3]等价
C:
p是指向一维数组中任何一个元素的指针
D:
p是指向含有3个整型元素的一维数组的指针
2)以下关于单元测试的描述,哪些是对的?
(D)
A:
黑盒测试针对软件的功能,不考虑功能的实现细节;
B:
白盒测试针对源代码的测试,从程序功能的具体实现上找错;
C:
路径覆盖是黑盒测试的一种方法,编写测试用例使程序的每条语句都能走到;
D:
条件覆盖是百盒测试的一种方法,编写测试用例使程序的每个判断的各种情况都能到
3)以下可以用于任务间通信的有(ABCD)
A:
共享内存B:
信号量
C:
消息队列和管道D:
socket调用
4)有关结构,以下哪些描述是对的?
(BC)
A:
为了测试方便,尽量把一个结构的功能设计得多一些
B:
不同结构间的关系不要过于复杂
C:
结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中
D:
结构中元素的布局与排列顺序可以随意设计
5)关于强制类型转化,下面说法正确的是(ABCD)
A:
当目的结构的空间大于源结构的空间时,要重点关注内存访问超过源结构范围的情形,可能越界;
B:
当目的结构的空间小于源结构的空间时,要重点关注对目的结构赋值不能完全覆盖源结构范围的情形,可能遗漏;
C:
结构体之间的强制类型转换时,其成员字段的数据类型的差异也是要格外小心的;
D:
与结构体之间的强制类型转换相比,基本数据结构的强制类型转换更容易出现上面描述的情况,使用的时候,一定要慎之又慎;
6)正确的使用assert,软件系统不会对人为原因造成的错误进行处理。
它有利于(ABCD)
A:
缺陷及早暴露,加快定位进程;
B:
明确表示函数接口或算法逻辑的校验关系,增强软件代码的可读性;
C:
去除不必要的容错处理,简化代码处理流程,降低软件处理复杂度;
D:
强化编程接口之间的契约,增强软件的可维护性;
7)对于循环体的执行效率,下述说法正确的是(ABCD)
A:
循环体内工作量最小化
B:
在多重循环中,应将最忙的循环放在最内层
C:
尽量减少循环的嵌套层次
D:
避免在循环体内做无谓的判断语句,将循环语句置于判读语句的代码块之中
8)设数组a[5]={10,20,30,40,50};已知指针p指向a[1];则表达式*++p的值是(A)
A.20
B.21
C.30
D.31
9)有以下程序段,执行后,mul的值为(B)
inta[]={1,3,5,7,9};
intmul,*data,x;
mul=1;
data=&a[1];
for(x=0;x<3;x++)mul*=*(data+x);
A.15
B.105
C.315
D.945
10)有以下程序段,执行后的结果为(D)
intlist[]={6,7,8,9,10};
int*p;p=list;
*(p+2)=10;
printf(”%d,%d\n”,*p,*(p+2));
A.8,10
B.6,8
C.7,9
D.6,10
11)以下语句不能正确赋值的是(A)
A.chars1[10];s1=”China”;
B.chars2[]={’C’,’h’,’i’,’n’,’a’};
C.chars3[20]=”China”;
D.char*s=”China”;
12)C语言中,定义PI为一个符号常量,正确的是(A)
A.#definePI3.14
B.definePI3.14
C.#includePI3.14
D.includePI3.14
13)有以下程序,该程序输出的结果为(B)
#defineN3
#defineMN+2
#defineNUM2*M+1
main()
{
inti;
i=NUM;
printf(”%d\n”,i);
}
A.11、
B.9
C.7
D.5
14)有以下程序,程序运行后的输出结果是(D)
#include
#include
main()
{char*p=“abcde\0fghjik\0”;
printf(“%d\n”,strlen(p));}
A.12
B.15
C.6
D.5
15)为了比较两个字符串s1和s2是否相等,应当使用(C)
A.if(s1=s2)
B.if(s1==s2)
C.if(strcmp(s1,s2)==0)
D.if(strcmp(&s1,&s2)==0)
16)设有如下结构定义:
structstudent
{intnum;
charname[20];
charsex;
intage;
charaddr[30];
}stud;
若用printf(“%s\n”,…)访问该结构中name值的正确方法是(D)
A.stud->name
B.&stud.name
C.stud.&name
D.stud.name
17)想对一个文本文件的尾部追加写入,应当在fopen语句中使用的文件操作方式指示符号为(D)
A.w
B.r
C.wb
D.a
三、指出下列程序的错误(每题4分,共20分)
1).如下程序用于输出"Welcome Home"。
请指出其中的错误:
(4分)
void Test(void)
{
char pcArray[12];
strcpy(pcArray,"Welcome Home");
printf("%s!
", pcArray);
return;
}
答案:
数组越界。
2).如下程序用于把"blue"字符串返回,请指出其中的错误:
(4分)
char *GetBLUE(void)
{
char* pcColor ;
char* pcNewColor;
pcColor = "blue";
pcNewColor = (char*)malloc(strlen(pColor));
if(NULL == pcNewColor)
{
return NULL;
}
strcpy(pcNewColor, pcColor);
return pcNewColor;
}
答案:
申请内存空间不足,字符串结尾还有'\0'。
3).下面程序期望输出str = hello world,请指出其中的错误:
(4分)
char * GetStr(char *p)
{
p = "hello world";
return p;
}
void main()
{
char *str = NULL;
if(NULL !
= GetStr(str))
{
printf("\r\n str = %s",str);
}
return;
}
答案:
无法返回字符串,参数使用错误。
4).请指出下面程序错误的地方:
(4分)
#define BUFFER_SIZE 256
void Test(void)
{
char *str = NULL;
str = (char *)malloc(BUFFER_SIZE);
if(NULL == str)
{
return;
}
strcpy(str, "hello");
free(str);
if(NULL !
= str)
{
strcpy(str, "world");
printf(str);
}
return;
}
答案:
引用了已经释放的内存。
5).请指出下面程序的错误:
(4分)
void GetMemory(char **ppcChar, int iLength)
{
if(NULL == ppcChar)
{
return;
}
*ppcChar = (char *)malloc(iLength);
return;
}
void Test(void)
{
char *szStr = NULL;
GetMemory(&szStr, 100);
if(NULL !
= szStr)
{
strcpy(szStr, "hello");
printf(szStr);
}
return;
}
答案:
没有释放内存。
四、简答题(每题4分,共8分)
1)写宏定义MAX,求出两个数中的较大者。
(4分)
答案:
#definedMAX(A,B)((A)>=(B)?
(A):
(B))
2)画出同下面多叉树等价的二叉树,并作说明。
(4分)
答案如下:
(采用树的孩子兄弟法将树转换成二叉树)
五、编程题(共10分)
1)给一个单链表,删除某一节点(要求:
先找到是否有这个节点,然后再删除,要能保证程序运行正确)(10分)
参考解法如下:
include
#include
#include
#include
typedef struct linkqueue1
{
int data;
struct linkqueue1 *next;
}linkqueue1,linklist;
linklist *creat(void) //建立链表
{
linklist *head;
int n=1,len;
linklist *p1,*p2;
cout<<"input number of records:
"< cin>>len;
head=p1=p2=(linklist *)malloc(sizeof(linklist));
cout<<"input records:
"< cin>>p1->data;
head->next=NULL;
while(n++<=len-1)
{
p1=(linklist *)malloc(sizeof(linklist));
cin>>p1->data;
p2->next=p1;
p2=p1;
p2->next=NULL;
}
return (head);
}
void outlink(linklist *head)
{
linklist *p;
p=head;
while(p)
{
cout<data<<"";
p=p->next;
}
}
int bianli(linklist *head,int Number)//遍历链表,返回1说明有要删除的元素,反之。
{
linklist *p;
p=head;
while(p->next!
=NULL)
{
if(p->data==Number)
return1;
}
return 0;
}
linklist *deletenode(linklist *head,int deleteNumber) {
linklist *Pointer, *Back;
Back= head;
Pointer =Back–>next;
while(Pointer->data!
=deleteNumber)
{
Pointer++;
Back=Back->next;
}
if(Pointer->data == deleteNumber)
{
printf("删除首节点!
\n");
head = Pointer->next;
free( Pointer );
break;
}
else
{
Back->next = Pointer->next;
free(Pointer);
break;
}
return head;
}
void main()
{
linklist *head;
int del,isexit;
head=creat();//创建一个链表
outlink(head);//输出一个链表
cout<";
cin>>del;
isexit=bianli(head,del);//遍历删除的节点是否存在
if(isexit)//如果存在则删除节点
{
head=deletenode(head,del);
outlink(head);
}
else
{
Cout<< “你删除的节点不存在”<}
}