C笔试题华为DOCWord文件下载.docx
- 文档编号:19483649
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:18
- 大小:26.39KB
C笔试题华为DOCWord文件下载.docx
《C笔试题华为DOCWord文件下载.docx》由会员分享,可在线阅读,更多相关《C笔试题华为DOCWord文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
*p=(char*)malloc(num);
}
voidTest(void)
char*str=NULL;
GetMemory(&
str,100);
strcpy(str,"
hello"
);
printf(str);
请问运行Test函数会有什么样的结果?
输出“hello”。
(2)voidTest(void)
char*str=(char*)malloc(100);
free(str);
//str仍指向原来的内存空间,但对str来说已不可用
//str=NULL;
if(str!
=NULL)
world"
输出“world”。
(3)char*GetMemory(void)
charp[]="
helloworld"
returnp;
str=GetMemory();
无效的指针,输出不确定。
5.编写strcat函数(6分)
已知strcat函数的原型是char*strcat(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcat
VC源码:
char*__cdeclstrcat(char*dst,constchar*src)//将源字符串加const,表明其为输入参数
assert((dst!
=NULL)&
&
(src!
=NULL));
//对源地址和目的地址加非0断言
char*cp=dst;
while(*cp)
cp++;
while(*cp++=*src++)
{;
}
return(dst);
//为了实现链式操作,将目的地址返回
(2)strcat能把strSrc的内容连接到strDest,为什么还要char*类型的返回值?
方便赋值给其他变量。
6.MFC中CString是类型安全类么?
不是。
其它数据类型转换到CString可以使用CString的成员函数Format来转换。
7.C++中为什么用模板类?
(1)可用来创建动态增长和减小的数据结构;
(2)它是类型无关的,因此具有很高的可复用性;
(3)它在编译时而不是运行时检查数据类型,保证了类型安全;
(4)它是平台无关的,可移植性好;
(5)可用于基本数据类型。
8.CSingleLock是干什么的。
同步多个线程对一个数据类的同时访问。
9.NEWTEXTMETRIC是什么。
物理字体结构,用来设置字体的高宽大小。
10.程序什么时候应该使用线程,什么时候单线程效率高。
(1)耗时的操作使用线程,提高应用程序响应;
(2)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
(3)多CPU系统中,使用线程提高CPU利用率;
(4)改善程序结构。
一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。
11.Windows是内核级线程么。
见下一题
12.Linux有内核级线程么。
线程通常被定义为一个进程中代码的不同执行路线。
从实现方式上划分,线程有两种类型:
“用户级线程”和“内核级线程”。
用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
这种线程甚至在像DOS这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似Windows3.x的协作式多任务。
另外一种则需要内核的参与,由内核完成线程的调度。
其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。
用户线程不需要额外的内核开支,并且用户线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因I/O而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;
而内核线程则没有这个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。
WindowsNT和OS/2支持内核线程。
Linux支持内核级的多线程。
13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
栈:
存放局部变量,函数调用参数,函数返回值,函数返回地址。
由系统管理。
堆:
程序运行时动态申请,new和malloc申请的内存就在堆上。
14.使用线程是如何防止出现大的波峰。
意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。
15.函数模板与类模板有什么区别?
函数模板的实例化是由编译器在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
16.一般数据库若出现日志满了,会出现什么情况,是否还能使用?
只能执行查询等读操作,不能执行更改、备份等写操作,原因是任何写操作都要记录日志。
也就是说基本上处于不能使用的状态。
17.SQLServer是否支持行级锁,有什么好处?
支持。
设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性。
行级锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。
因而行级锁既可保证数据的一致性又能提高数据操作的并发性。
18.如果数据库满了会出现什么情况,是否还能使用?
见16。
19.关于内存对齐的问题以及sizeof()的输出
编译器自动对齐的原因:
为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;
然而,对齐的内存访问仅需要一次访问。
20.inti=10,j=10,k=3;
k*=i+j;
k最后的值是?
60,此题考察优先级,实际写成:
k*=(i+j);
,赋值运算符优先级最低
21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
将操作多个表的操作放入到事务中进行处理。
22.TCP/IP建立连接的过程?
(3-wayshake)
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:
建立连接时,客户端发送SYN包(seq=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到SYN包,必须确认客户端的SYN包(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
23.ICMP是什么协议,处于哪一层?
Internet控制报文协议,处于网络层(IP层)
24.触发器怎么工作的?
触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如INSERT、DELETE、UPDATE这些操作时,数据库就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。
25.Winsock建立连接的主要实现步骤?
服务器端:
socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接,accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。
该新产生的套接字使用send()和recv()读写数据,直至数据交换完毕,closesocket()关闭套接字。
客户端:
socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv()在套接字上读写数据,直至数据交换完毕,closesocket()关闭套接字。
26.动态链接库的两种方式?
调用一个DLL中的函数有两种方法:
(1)载入时动态链接(load-timedynamiclinking),模块非常明确地调用某个导出函数,使得他们就像本地函数一样。
这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
(2)运行时动态链接(run-timedynamiclinking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。
DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数。
如此即可避免导入库文件。
27.IP组播有哪些好处?
Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消耗和网络拥挤问题。
组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。
组播可以大大地节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。
所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。
1.以下三条输出语句分别输出什么?
[C易]
charstr1[]="
abc"
charstr2[]="
constcharstr3[]="
constcharstr4[]="
constchar*str5="
constchar*str6="
cout<
<
boolalpha<
(str1==str2)<
endl;
//输出什么?
false
(str3==str4)<
(str5==str6)<
true
2.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?
[C++中等]
a.classB:
publicA{……}//B公有继承自A
b.classB{operatorA();
}//B实现了隐式转化为A的转化
c.classA{A(constB&
}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)的构造函数
d.A&
operator=(constA&
//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
3.以下代码中的两个sizeof用法有问题吗?
voidUpperCase(charstr[])//将str中的小写字母转换成大写字母
for(size_ti=0;
i<
sizeof(str)/sizeof(str[0]);
++i)
if('
a'
=str[i]&
str[i]<
='
z'
)
str[i]-=('
-'
A'
);
aBcDe"
"
str字符长度为:
<
sizeof(str)/sizeof(str[0])<
UpperCase(str);
str<
4.以下代码有什么问题?
[C难]
voidchar2Hex(charc)//将字符以16进制表示
charch=c/0x10+'
0'
if(ch>
'
9'
)ch+=('
-1);
charcl=c%0x10+'
if(cl>
)cl+=('
cout<
ch<
cl<
Ilove中国"
for(size_ti=0;
strlen(str);
char2Hex(str[i]);
该函数在转换汉字的时候会出现错误。
5.以下代码有什么问题?
[C++易]
structTest
Test(int){}
Test(){}
voidfun(){}
};
voidmain(void)
Testa
(1);
a.fun();
Testb();
//这等于是声明了一个函数,返回值类型是Test,参数是void;
//应该是Testb=Test();
这样就是调用Test的默认构造函数构造b
b.fun();
6.以下代码有什么问题?
(true?
1:
"
1"
)<
类型不一致。
因为三目运算符要求后面2个参数是同样的类型或者是相互可以转换的,而1与"
类型不同且不能相互转换。
7.以下代码能够编译通过吗,为什么?
unsignedintconstsize1=2;
charstr1[size1];
unsignedinttemp=0;
cin>
>
temp;
unsignedintconstsize2=temp;
charstr2[size2];
8.以下代码中的输出语句输出0吗,为什么?
structCLS
intm_i;
CLS(inti):
m_i(i){}
CLS()
{
CLS(0);
//这里产生的是另一个临时的局部变量,不会影响原有的m_i,原有的m_i的值是不定的
CLSobj;
obj.m_i<
不能,因为m_i没有初始化,会赋一个随机数。
9.C++中的空类,默认产生哪些类成员函数?
classEmpty
public:
Empty();
//默认构造函数
Empty(constEmpty&
//拷贝构造函数
~Empty();
//析构函数
Empty&
operator=(constEmpty&
//赋值运算符
Empty*operator&
();
//取址运算符
constEmpty*operator&
()const;
//取址运算符const
10.以下两条输出语句分别输出什么?
[C++难]
floata=1.0f;
(int)a<
(int&
)a<
((int)a==(int&
)a)<
floatb=0.0f;
(int)b<
)b<
((int)b==(int&
)b)<
Theprogramoutputis:
1
1065353216
(int)a:
就是将a表示的数据1.0四舍五入变换成整数。
(int&
)a等价于*(int*)&
a:
意思是将a代表的内存中二进制数当成整型数据来看待,即等价于int(0x3f800000),0x3f800000是floata=1.0中a的内存形式。
11.以下反向遍历array数组的方法有什么错误?
[STL易]
vectorarray;
array.push_back
(1);
array.push_back
(2);
array.push_back(3);
for(vector:
:
size_typei=array.size()-1;
i>
=0;
--i)//反向遍历array数组
array[i]<
vector没有给定具体类型,size_type是无符号整数,当j=0时,做减1操作不会得到-1,而是得到最大的无符号整数,因此永远不会退出循环。
12.以下代码有什么问题?
typedefvectorIntArray;
IntArrayarray;
//删除array数组中所有的2
for(IntArray:
iteratoritor=array.begin();
itor!
=array.end();
++itor)
if(2==*itor)
array.erase(itor);
其实这里面隐藏着一个很严重的错误:
当array.erase(itor)之后,itor就变成了一个野指针,对一个野指针进行itor++是肯定会出错的。
13.写一个函数,完成内存之间的拷贝。
[考虑问题是否全面]
void*mymemcpy(void*dest,constvoid*src,size_tcount)
char*pdest=static_cast<
char*>
(dest);
constchar*psrc=static_cast<
constchar*>
(src);
if(pdest>
psrc&
pdest<
psrc+count)//判断拷贝是否有重叠区
for(size_ti=count-1;
i!
=-1;
--i)
pdest[i]=psrc[i];
else
count;
returndest;
intmain(void)
charstr[]="
0123456789"
mymemcpy(str+1,str+0,9);
system("
Pause"
return0;
14.写一个程序,要求功能:
求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:
100个1是一个组合,5个1加19个5是一个组合。
请用C++语言写。
最容易想到的算法是:
设x是1的个数,y是2的个数,z是5的个数,number是组合数。
注意到0<
=x<
=100,0<
=y<
=50,0<
=z=20,所以可以编程为:
number=0;
for(x=0;
x<
=100;
x++)
for(y=0;
y<
=50;
y++)
for(z=0;
z<
=20;
z++)
if((x+2*y+5*z)==100)
number++;
cout<
number<
endl;
上面这个程序一共要循环100*50*20次,效率实在是太低了。
事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。
我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<
=20,x<
=100,y<
=50
所以(x+2y)<
=100,且(x+5z)是偶数
对z作循环,求x的可能值如下:
z=0,x=100,98,96,...0
z=1,x=95,93,...,1
z=2,x=90,88,...,0
z=3,x=85,83,...,1
z=4,x=80,78,...,0
......
z=19,x=5,3,1
z=20,x=0
因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,即为:
(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1
某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2,某个奇数m以内的奇数个数也可以表示为(m+2)/2。
所以,求总的组合数可以编程为:
for(intm=0;
m<
m+=5)
number+=(m+2)/2;
这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多倍--只是因为做了一些简单的数学分析。
这再一次证明了:
计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。
而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事--这不是一个专业的研发人员的行为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 笔试题华为DOC 笔试 华为 DOC