C语言试题及答案Word下载.docx
- 文档编号:8394816
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:41
- 大小:37.63KB
C语言试题及答案Word下载.docx
《C语言试题及答案Word下载.docx》由会员分享,可在线阅读,更多相关《C语言试题及答案Word下载.docx(41页珍藏版)》请在冰点文库上搜索。
charstr[]=“Hello”;
char*p=str;
intn=10;
请计算
sizeof(str)=sizeof(p)=sizeof(n)=
2)
voidFunc(charstr[100])
sizeof(str)=
3)
void*p=malloc(100);
请计算sizeof(p)=
10.请仔细分析以下程序并回答问题。
………………………………………………………16’
voidGetMemory(char*p)
p=(char*)malloc(100);
voidTest(void)
char*str=NULL;
GetMemory(str);
strcpy(str,"
helloworld"
printf(str);
}
请问运行Test函数会有什么样的结果?
2)
char*GetMemory(void)
{
charp[]="
;
returnp;
voidTest(void)
str=GetMemory();
VoidGetMemory2(char**p,intnum)
*p=(char*)malloc(num);
GetMemory(&
str,100);
hello"
4)
voidTest(void)
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=NULL)
{
strcpy(str,“world”);
二、编程题
第一组:
请在以下三到题中任意选一道做………………………………………………10’
1.请编写程序,把文件a.txt和文件b.txt的内容都拷贝到文件c.txt中。
2.请编写一个程序,在一个升序的整形数组中是否有一个需要找的数,用折半查找法?
3.请编写一个程序,输出一个short类型数的镜像。
(既:
假如一个unsignedshort类型的数的二进制码是1111111100000000那输出应为0000000011111111)。
第二组:
请在以下三到题中任意选一道做(如果选题3做,加5分)………………10’
1.请编写程序,将一个有数字组成的字符串转化为整数。
(不允许使用库函数atoi())
2.已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
不调用C++/C的字符串库函数,请编写函数strcpy。
3.请编写一个程序,用递归的算法,来实现10!
?
第三组:
请在以下三到题中任意选一道做(如果选题3做,加5分)………………15’
1.请编写一个程序,输出显示如下图形。
11111
12221
12321
2.设编号为1,2,…n的17个人围坐一圈,从1开始报数,数到3的那个人出列,它的下一位又从1开始报数,数到3的那个人又出列,依次类推,请编写一个程序,来得到最后留下来的那个人的编号。
3.请编写一个程序,实现一个二叉树中序的遍历。
第四组该组是必须做题…………………………………………………………………15’
1.请编写一个程序,实现以下功能。
1)创建一棵链表,该链表的每个节点有来存放一个整形的数。
(提示:
在创建链表时可以用输入0来结束创建)
2)查找一个数是否是该链表的一个节点。
3)如果这个数是在这个链表中,那么就删除该节点。
请自己定义相关数据结构。
试题一参考答案
1.答:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是这个函数被限制在声明它的模块的本地范围内使用。
(考生可以自己的话总结,只要符合要求,就给分)
2.答:
不会在两个操作之间把volatile变量缓存在寄存器中。
在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。
不做常量合并、常量传播等优化。
对volatile变量的读写不会被优化掉。
如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对MemoryMappedIO的处理是不能这样优化的。
(考生可以自己的话总结,只要符合要求,就给分)
3.答:
防止该头文件被重复引用。
4.答:
对于#include<
,编译器从标准库路径开始搜索filename.h,对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h。
5.答:
#defineSECONDS_PER_YEAR(365*24*60*60)UL
6.答:
#defineMIN(A,B)((A)<
=(B)?
(A):
(B))
7.答:
输出是"
6"
。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
8.答:
输出是1,2。
不能满足真实的要求。
程序应该为
swap(int*p1,int*p2)
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
swap(&
a,&
b);
9.答:
64444
10.
1)答:
程序崩溃。
因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。
将使程序崩溃。
2)答:
可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。
3)答:
能够输出hello。
会有内存泄漏的情况。
4)答:
篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);
之后,str成为野指针,if(str!
=NULL)语句不起作用。
二、编程题(注:
编程题主要考察考生的思路,考生的回答不一定会和参考答案一样)
第一组:
#include<
stdio.h>
voidmian(void)
FILE*fp1,*fp2,*fp3;
charch;
fp1=fopen("
a.txt"
"
r"
fp2=fopen("
b.txt"
fp3=fopen("
c.txt"
w"
ch=fgetc(fp1);
while(ch!
=EOF)
fwrite(&
ch,1,1,fp3);
ch=fgetc(fp1);
}
ch=fgetc(fp2);
ch=fgetc(fp2);
fclose(fp1);
fclose(fp2);
fclose(fp3);
#include<
intfind_number(intnum[],intneed_num,intsize)
intlow,high,middle;
low=0;
high=size-1;
while(high>
=low)
middle=(low+high)/2;
if(need_num>
num[middle])
low=middle+1;
elseif(need_num<
high=middle-1;
elseif(need_num==num[middle])
return1;
return0;
/**************用来测试的*****************/
voidmain(void)
inta[]={1,2,3,4,5,6,7,8,9,10};
intflag=0;
flag=find_number(a,3,10);
if(flag)
printf("
exist\n"
else
noexist\n"
/****************************************/
voidimage(unsignedshortsrc)
inti;
unsignedshortdest=0;
printf("
%x\n"
src);
for(i=0;
i<
16;
i++)
dest=((((src>
i)&
1)<
(15-i))|dest);
printf("
dest);
第二组:
intmy_atoi(char*pnum)
char*ptemp=pnum;
inti=0;
intdata=0;
while(*ptemp++!
='
\0'
)
i++;
ptemp=pnum;
while(i)
data=data*10+*ptemp++-'
0'
i--;
returndata;
char*strcpy(char*strDest,constchar*strSrc);
assert((strDest!
=NULL)&
&
(strSrc!
=NULL));
char*address=strDest;
while((*strDest++=*strSrc++)!
=‘\0’)
returnaddress;
intmul(longn)
intresult;
if(n==1||n==0)
result=1;
result=n*mul(n-1);
returnresult;
math.h>
intx,y,result;
for(y=-2;
y<
3;
y++)
for(x=-2;
x<
x++)
{
if(fabs(x)>
fabs(y))
{
result=3-fabs(x);
printf("
%d"
result);
}
else
result=3-fabs(y);
}
\n"
stdlib.h>
#definenull0
structnode
intdata;
structnode*next;
};
structnode*p,*tmp,*head;
p=head=(structnode*)malloc(sizeof(structnode));
head->
data=1;
next=null;
for(i=2;
=17;
tmp=(structnode*)malloc(sizeof(structnode));
tmp->
data=i;
head->
next=tmp;
head=head->
next;
next=p;
while(p!
=p->
next)
p->
next->
next=p->
p=p->
%d\n"
p->
data);
typedefstructtree/*定义树结点结构*/
structtree*child;
structtree*rchild;
}treenode,*bintree;
bintreecreate_tree(intdata[],intlen)/*利用插入算法创建二叉树*/
bintreeroot;
root=NULL;
for(i=0;
len;
root=insert_node(root,data[i]);
returnroot;
voidinorder(bintreeroot)/*中序遍历二叉树的递归算法*/
if(root!
=NULL)
inorder(root->
lchild);
root->
rchild);
第四组:
1.答:
#defineNULL0
#defineLENsizeof(structdata)
structdata
intnum;
structdata*next;
intn=0;
structdata*creat(void)
structdata*head;
structdata*p1,*p2;
n=0;
p1=p2=(structdata*)malloc(LEN);
scanf("
&
p1->
num);
head=NULL;
if(p1->
num==0)
free(p1);
while(p1->
num!
=0)
n=n+1;
if(n==1)
head=p1;
else
p2->
next=p1;
p2=p1;
p1=(structdata*)malloc(LEN);
scanf("
p2->
next=NULL;
returnhead;
intfind(structdata*head,intfindnum)
structdata*p1;
p1=head;
while(p1!
if(p1->
=findnum)
p1=p1->
returnfindnum;
if(p1==NULL)
return0;
structdata*del(structdata*head,intneednum)
if(head==NULL)
returnhead;
while(neednum!
=p1->
num&
next!
p1=p1->
if(neednum==p1->
num)
if(p1==head)
head=p1->
next=p1->
free(p1);
voidprint(structdata*head)
p1->
intfindnum=5;
intflag;
head=creat();
print(head);
flag=find(head,findnum);
head=del(head,flag);
试题二
问答题
1、局部变量能否和全局变量重名?
2、如何引用一个已经定义过的全局变量?
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?
为什么?
4、动态连接库的两种方式?
5、inti=10,j=10,k=3;
k*=i+j;
k最后的值是?
6、C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
7、什么是“引用”?
申明和使用“引用”要注意哪些问题?
8、将“引用”作为函数参数有哪些特点?
9、在什么时候需要使用“常引用”?
10、static全局变量与普通的全局变量有什么区别?
static局部变量和普通局部变量有什么区别?
static函数与普通函数有什么区别?
11、结构与联合有和区别?
12、程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中?
13、队列和栈有什么区别?
14、为什么标准头文件都有类似以下的结构?
15、#include<
file.h>
与#include"
file.h"
的区别?
16、面向对象的三个基本特征,并简单叙述之?
17、多态:
是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说,就是一句话:
允许将子类类型的指针赋值给父类类型的指针。
18、请说出static和const关键字尽可能多的作用
19、
Newdelete与mallocfree的联系与区别?
20、
#defineDOUBLE(x)x+x,i=5*DOUBLE(5);
i是多少?
21、有哪几种情况只能用intializationlist而不能用assignment?
22、
C++是不是类型安全的?
23、
main函数执行以前,还会执行什么代码?
24、描述内存分配方式以及它们的区别?
25、Heap与stack的差别?
26、在8086汇编下,逻辑地址和物理地址是怎样转换的?
27、C和C++有什么不同?
28、“&
”“|”和“&
”“||”的区别?
29、假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比。
最少要称多少次才能找出这个较重的球?
30、进程和线程的差别?
试题二参考答案
问答题1:
能,局部会屏蔽全局。
要用全局变量,需要使用"
:
"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
问答题2:
Extern,可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个函数名写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
问答题3:
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
问答题4:
调用一个DLL中的函数有两种方法:
1.载入时动态链接(load-timedynamiclinking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。
这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
2.运行时动态链接(run-timedynamiclinking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。
DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。
如此即可避免导入库文件了。
问答题5:
60,此题考察优先级,实际写成:
k*=(i+j)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 试题 答案