1、c语言笔试题答案 资料仅供参考 笔试题 一、填空题(每个空4分,共28分) 1)struct tagABC { char name[10]; char sex; long sno; float score[4]; }*pAbc;(四字节对齐) pAbc=NULL; 那么,执行pAbc+=2;之后pAbc的值为( 64 ) 2)如下代码,最终value的值是( 8 ) int *p1,*p2; int value; p1=(int*)0×400; p2=(int*)0×408; valu
2、e = p2-p1; 3)如下代码,printf的结果为( 2 ) #include〈stdio.h〉 #include〈string.h〉 void main(void) { char acNew[20]= “\\0\0”; printf(“%d\n”,strlen(acNew)); } 4) 有如下程序段,运行该程序的输出结果是( 33 ) main () { int y=3,x=3,z=1; printf(“%d%d\n”,(++x,y++),z+2); } 5)设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>
3、b)&&(n=c>d)后,n的值为( 2 ) 6)struct tagAAA { Unsigned char ucId:1; Unsigned char ucPara0:2; Unsigned char ucState:6; Unsigned char ucTail:4; Unsigned char ucAvail; Unsigned char unTail2:4; Unsigned long ulData; }AAA_S 问:AAA_S在字节对齐分别为1,4情况下,占用的空间大小分别是多少?( 9 )( 12 ) 二、选择题(每题2分,共34分)
4、 1) 若有说明int(*p)[3];以下叙述正确的是( D ) A:p是指针数组 B:(*p)[3]和*p[3]等价 C:p是指向一维数组中任何一个元素的指针 D:p是指向含有3个整型元素的一维数组的指针 2) 以下关于单元测试的描述,哪些是正确?( D ) A:黑盒测试针对软件的功能,不考虑功能的实现细节; B:白盒测试针对源代码的测试,从程序功能的具体实现上找错; C:路径覆盖是黑盒测试的一种方法,编写测试用例使程序的每条语句都能走到; D:条件覆盖是百盒测试的一种方法, 编写测试用例使程序的每个判断的各种情况都能到 3) 以
5、下能够用于任务间通信的有( ABCD ) A:共享内存 B:信号量 C:消息队列和管道 D:socket调用 4) 有关结构,以下哪些描述是正确?( BC ) A:为了测试方便,尽量把一个结构的功能设计得多一些 B:不同结构间的关系不要过于复杂 C:结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中 D:结构中元素的布局与排列顺序能够随意设计 5) 关于强制类型转化,下面说法正确的是(ABCD) A:当目的结构的空间大于源结构的空间时,要重点关注内存访问超过源
6、结构范围的情形,可能越界; B:当目的结构的空间小于源结构的空间时,要重点关注对目的结构赋值不能完全覆盖源结构范围的情形,可能遗漏; C:结构体之间的强制类型转换时,其成员字段的数据类型的差异也是要格外小心的; D:与结构体之间的强制类型转换相比,基本数据结构的强制类型转换更容易出现上面描述的情况,使用的时候,一定要慎之又慎; 6) 正确的使用assert,软件系统不会对人为原因造成的错误进行处理。它有利于( A BCD ) A:缺陷及早暴露,加快定位进程; B:明确表示函数接口或算法逻辑的校验关系,增强软件代码的可读性; C:去除不必要的容错
7、处理,简化代码处理流程,降低软件处理复杂度; 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) 有以下程序段, 执行后,m
8、ul的值为( B ) int a[ ]={1,3,5,7,9}; int mul, *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) int list[ ]={6,7,8,9,10}; int * p;p=list; *(p+2)=10; printf(”%d, %d\n”,*p
9、p+2)); A.8, 10 B.6, 8 C.7, 9 D.6, 10 11) 以下语句不能正确赋值的是(A) A.char s1[10]; s1=”China”; B.char s2[ ]={ ’C’,’h’,’i’,’n’,’a’}; C.char s3[20]=”China”; D.char *s=”China”; 12) C语言中,定义PI为一个符号常量,正确的是(A) A.#define PI 3.14 B.define PI 3.14 C.#include PI
10、 3.14
D.include PI 3.14
13) 有以下程序,该程序输出的结果为(B)
#define N 3
#define M N+2
#define NUM 2*M+1
main()
{
int i;
i=NUM;
printf(”%d\n”,i);
}
A.11 、
B.9
C.7
D.5
14) 有以下程序,程序运行后的输出结果是( D )
#include
11、de
12、 { int num; char name[20]; char sex; int age; char addr[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
13、 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 ; c
14、har* 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(c
15、har *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) {
16、 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 GetMemo
17、ry(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");
18、printf(szStr); } return; } 答案:没有释放内存。 四、简答题(每题4分,共8分) 1)写宏定义MAX,求出两个数中的较大者。(4分) 答案: #defined MAX(A,B) ((A)>=(B)?(A):(B) ) 2) 画出同下面多叉树等价的二叉树,并作说明。(4分) A B C D E F 答案如下:(采用树的孩子兄弟法将树转换成二叉树) A C B D E F 五、编程题(共10分) 1) 给一个单链表,删除某一节点(要求:先找到是否有这个节点,然后再删除,要能
19、保证程序运行正确)(10分)
参考解法如下:
include
20、
cout<<"input number of records:"<
21、ext=NULL;
}
return (head);
}
void outlink(linklist *head)
{
linklist *p;
p=head;
while(p)
{
cout<
22、>data== Number) return 1; } 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 == deleteNumb
23、er)
{
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<






