中兴笔试.docx
《中兴笔试.docx》由会员分享,可在线阅读,更多相关《中兴笔试.docx(24页珍藏版)》请在冰豆网上搜索。
中兴笔试
第一部分是单选:
系统测试是对什么的测试(系统测试(SystemTest,ST)是将经过测试的子系统装配成一个完整系统来测试。
);软件具体设计是对什么的设计;等等很多
第二部分多选:
中断:
CPU正常运行程序时,由于微处理器内部事件或外设请求,引起CPU中断正在运行的程序,转去执行请求中断的外设或内部事件的中断服务子程序,中断服务子程序执行完毕,再返回被中止的程序,这一过程称为中断。
利用中断可以避免不断检测外部设备状态,提高CPU效率。
中断源:
内部中断(INTn)和外部中断.发现中断就转去执行,但要先保护中断点(当前CS,IP和PSW入栈),然后到中断服务子程序,完毕后返回断点处继续执行。
中断向量表:
中断服务子程序的入口地址放在中断向量表中。
中断优先级,允许中断嵌套。
中断屏蔽:
CPU有软件设置对中断源的中断请求不于响应。
中断响应时间:
发出中断开始到执行中断服务子程序之前。
千兆以太网和快速以太网的区别,快速以太网包括10M,100M,1000M;千兆以太网是快速以太网里的一种.
点对点协议都有哪几个(ppp,hdlc,,atm)
城域网建设:
虚继承和接口的区别:
虚函数继承是为了实现多态。
多态性是为了实现将接口和实现进行分离。
纯虚函数是的类是抽象类,抽象类不会定义默认的拷贝构造函数。
虚拟继承是为了实现多重继承。
解决子类继承中调用父类模糊的概念。
图像的格式等等很多(.bmp.jpeg.dif.gif.pcx.pcon,)
第三部分简答:
(1)线程是什么,还进程的区别?
1线程,和进程的区别
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.当进程退出后该进程所产生的所有线程都会被强制退出并清除。
线程是比进程更小的处理模块。
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。
每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。
但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
这就是进程和线程的重要区别。
2进程间的通信如何实现?
现在常用的进程间的通信方式有:
信号,信号量,消息队列,共享内存。
信号和信号量是不同的,他们都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。
消息队列是比较高级的一种进程间通信方法,因为它真的可以在进程间传送message,一个消息队列可以被多个进程共享(如linux下的IPC),如果一个进程的消息太多,一个消息队列放不下,也可以用多于一个消息队列。
共享消息队列的进程所发送的消息除了message本身还有一个标志,这个标志可以指明该消息是哪个进程或者哪类进程接受。
每一个共享消息队列的进程针对这个队列也有自己的标志,可以用来声明自己的身份。
3在网络编程中设计并发服务器,使用多进程与多线程有什么区别?
用多进程时每个进程有自己的地址空间,线程则共享地址空间。
所有其他区别都是由此而来:
1速度:
线程产生速度快,线程间通信快,切换快,因为它们在同一个地址空间内。
2:
资源利用率:
线程的资源利用率比较好。
(2)实时录制音频出现差错的原因,如何改进。
(3)static的作用:
首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
详细:
隐藏,当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
static的第二个作用是保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:
全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
static的第三个作用是默认初始化为0。
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
(4)死锁防止和死锁预防的区别。
是计算机系统中多道程序并发执行时,两个或两个以上的进程由于竞争资源而造成的一种互相等待的现象(僵局),如无外力作用,这些进程将永远不能再向前推进。
产生死锁的四个必要条件:
⑴互斥条件:
进程访问的是临界资源,那个资源一次只能被一个进程所使用。
⑵不剥夺条件:
一个资源仅能被占有它的进程所释放,而不能被其他进程剥夺。
⑶部分分配:
(请求和保持条件)一个进程在请求新的资源的同时,保持对某些资源的占有。
⑷环路等待条件:
存在一个进程的环路链,链中每一个进程占用有着某个或某些资源,又在等待链中的另一个进程占有的资源。
根据生产死锁的四个必要条件,只要使用其中之一不能成立,死锁就不会出现。
但必要条件1是由设备的固有特性所决定的,不仅不能改变,相反还应加以保证,因此实际上只有三种方法。
避免死锁与预防死锁的区别在于,预防死锁是设法至少破坏产生死锁的必要条件之一,严格地防止死锁的出现。
避免死锁,它是在进程请求分配资源时,采用银行家算法等防止系统进入不安全状态。
第四部分编两个小程序:
(1)用指针实现输入偶数输出1+1/2+1/4+1/6+....+1/n;输入奇数,输出1+1/3+1/5+1/7+....+1/n;
(2)用汇编实现冒泡排序
一直到快一点才做完啊,真的很伤脑筋啊
中兴笔试题目2007
公共题:
1、数据库中XXX和XXX操作可恢复数据库。
undoredo吧?
更新日志前undo更新日志后redo可以回复数据库。
2、数据库的核心是XX。
数据库管理系统/书上是数据库
3、头文件中<>和“”的区别?
<>是编译器从标准库路径开始寻找“”是从用户路径开始寻找
4、定义一个宏,输入两个参数,输出积。
#defineMutil(a,b)((a)*(b))
1、18分的题:
char*GetMemory(void)
{charp[]="helloworld";
returnp; }
voidTest(void)
{ char*str=NULL;
str=GetMemory();
printf(str); }请问运行Test函数会有什么样的结果?
答:
可能是乱码。
因为GetMemory返回的是指向“栈内存” 的指针,该指针的地址不是NULL,但其原先的内容已经被清除,新内容不可知。
2、析构函数什么时候运行,实现什么功能?
析构函数是在类生命周期结束的时候由系统自动调用。
如一个对象的作用域结束的时,或者是一个对象使用new动态构造时,在使用delete释放它时,delete会调用它。
功能是释放一个对象的存储空间。
析构函数没有返回值,没有参数,不能重载。
7、全局变量和局部变量的区别。
全局变量:
全局变量是在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用。
全局变量不受作用域的影响,问题可以使用的(也就是说,全局变量的生命期一直到程序的结束)。
如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据。
局部变量:
局部变量出现在一个作用域内,它们是局限于一个函数的。
局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。
关键字auto可以显式地说明这个问题,但是局部变量默认为auto,所以没有必要声明为auto。
1:
作业调度程序从处于(D)状态的队列中选择适当的作业的作业投入运行。
(3分)
A运行B提交C完成D后备
2:
SQL语言中,删除一个表的命令是(B)(3分)
ACLEARTABLEBDROPTABLE CDELETETABLE 3:
ATM采用的线路复用方式为(C)(3分) A频分多路复用B同步时分多路复用C异步时分多路复用D独占信道ATM:
AsynchronousTransferMode异步传输方式。
4:
数据库中只存放视图的(C)(3分)
A操作 B对应的数据 C定义 D限制
5:
什么是虚拟设备?
为什么在操作系统中引入虚拟设备?
(10分)
答:
虚拟设备技术是指把每次仅允许一个进程使用的物理设备,改造为能同时供多个进程共享的虚拟设备的技术,或者说将一个物理设备变换为多个对应的逻辑设备。
6:
TCP为何采用三次握手来建立连接,若采用二次握手可以吗,请说明原因?
(16分)
答:
TCP对话通过三次握手来初始化。
三次握手的目的是使数据段的发送和接收同步;告诉其它主机其一次可接收的数据量,并建立虚连接。
TCP要提供可靠的服务。
三次握手的简单过程:
第一次握手:
建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
采用二次握手可以不?
不可以。
二次握手不可行,因为:
如果由于网络不稳定,虽然客户端以前发送的连接请求以到达服务方,但服务方的同意连接的应答未能到达客户端。
则客户方要重新发送连接请求,若采用二次握手,服务方收到重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费。
7:
什么是分布式数据库?
(12分)
答:
分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都有DBMS的一份完整拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的大型数据库。
这种组织数据库的方法克服了物理中心数据库组织的弱点。
首先,降低了数据传送代价,因为大多数的对数据库的访问操作都是针对局部数据库的,而不是对其他位置的数据库访问;其次,系统的可靠性提高了很多,因为当网络出现故障时,仍然允许对局部数据库的操作,而且一个位置的故障不影响其他位置的处理工作,只有当访问出现故障位置的数据时,在某种程度上才受影响;第三,便于系统的扩充,增加一个新的局部数据库,或在某个位置扩充一台适当的小型计算机,都很容易实现。
然而有些功能要付出更高的代价。
例如,为了调配在几个位置上的活动,事务管理的性能比在中心数据库时花费更高,而且甚至抵消许多其他的优点。
分布式数据库系统主要特点:
·多数处理就地完成;
·各地的计算机由数据通信网络相联系。
·克服了中心数据库的弱点:
降低了数据传输代价;
·提高了系统的可靠性,局部系统发生故障,其他部分还可继续工作;
·各个数据库的位置是透明的,方便系统的扩充;
·为了协调整个系统的事务活动,事务管理的性能花费高;
数据分片
类型:
(1)水平分片:
按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子集为关系的一个片段。
(2)垂直分片:
把一个全局关系的属性集分成若干子集,并在这些子集上作投影运算,每个投影称为垂直分片。
(3)导出分片:
又称为导出水平分片,即水平分片的条件不是本关系属性的条件,而是其他关系属性的条件。
(4)混合分片:
以上三种方法的混合。
可以先水平分片再垂直分片,或先垂直分片再水平分片,或其他形式,但他们的结果是不相同的。
条件:
(1)完备性条件:
必须把全局关系的所有数据映射到片段中,决不允许有属于全局关系的数据却不属于它的任何一个片段。
(2)可重构条件:
必须保证能够由同一个全局关系的各个片段来重建该全局关系。
对于水平分片可用并操作重构全局关系;对于垂直分片可用联接操作重构全局关系。
(3)不相交条件:
要求一个全局关系被分割后所得的各个数据片段互不重叠(对垂直分片的主键除外)。
数据分配方式
(1)集中式:
所有数据片段都安排在同一个场地上。
(2)分割式:
所有数据只有一份,它被分割成若干逻辑片段,每个逻辑片段被指派在一个特定的场地上。
(4)全复制式:
数据在每个场地重复存储。
也就是每个场地上都有一个完整的数据副本。
(5)混合式:
这是一种介乎于分割式和全复制式之间的分配方式。
C++部分(50分)
1:
设有“intw[3][4];”,p是与数组名w等价的数组指针,则pw的初始化语句为int**p=w;
或者int (*p)[4]=w;
2:
要使引用pr代表变量“char*p”,则pr的初始化语句为char*&pr=p(3分)
3:
“零值”可以是0,,FALSE或者“空指针”。
例如int变量n与“零值”比较的if语句为:
if(n==0),则BOLLflag与“零值”比较的if语句为if(!
a);floatx与“零值”比较的if语句为:
constfloatm=;if((x>=m&&x<=m)。
(6分)
4:
社有如下语句:
(3分)
Intx;
()
*px=0;
则选择以下哪条语句可将x值置为0。
Aint*px;Bintconst*px=&x;
Cintconstpx=&x;Dconstint*px=&x;
答:
正确答案:
int*constpx=&x;(B)
5:
设viodf1(int*m,long&n);inta;longb;则以下调用合法的是(B)(3分)
Af1(a,b)Bf1(&a,b)
Cf1(a,&b)Df1(&a,&b)
6:
请写出如下代码的运行结果(6分)
Intmain(){inta,b,c,d;a=0; b=1;c=2;d=3;printf(“%d”,a+++b+c+++d++);}
答:
6运算后a=1b=1c=3d=4;
7:
写出下面函数的功能(12分)
TemplateU3 VoidWE(Typea[],Typeb[],intn){Y
for(inti=0;i定义一个模板,交换两个数组的内容,且是逆序交换。
8写一段代码判断一个单向链表中是否有环。
(14分)
给出如下结构
Structnode
{steuct*next;
};
TypedefstuctnodeNode;
答:
设置两个游标p1,p2。
P1#include<>
structlisttype
{
intdata;
structlisttype*next;
};
typedefstructlisttype*list;
/*Checkthatwhetherthereisloopinthesinglylinkedlistsllornot.*/
intfind_circle(listsll)
{
listfast=sll;
listslow=sll;
if(NULL==fast)
{
return-1;
}
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
return1;
}
}
return0;
}
3、简述电路交换和分组交换的区别及优缺点。
见宝典里面的网络和通信文件夹
从csdn论坛我近半年的收集中选出10道有代表性的题目,难度基本上是逐渐加大.对数组,指针,数据结构,算法,字符串,文件操作等问题都有覆盖.主要以c语言的实现为主,也有c++的题.大家可以先做做这10道题,测试一下自己的水平.
1.下面这段代码的输出是多少(在32位机上).
char*p;char*q[20];char*m[20][20];int(*n)[10];
structMyStruct
{
chardda;
doubledda1;
inttype;
};
MyStructk;printf("%d%d%d%d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:
4,80,1600,4,24我觉得最后一题应该是16
(1)chara[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}}};
for(inti=0;i<12;i++)
printf("%d",a[0][0][i]);
在空格处填上合适的语句,顺序打印出a中的数字
(2)char**p,a[16][8];
问:
p=a是否会导致程序在以后出现问题?
为什么?
答:
没有问题,只是使用时要小心,p是指向指针的指针。
A是数组的首地址也是指针。
3.用递归方式,非递归方式写函数将一个字符串反转.
函数原型如下:
char*reverse(char*str);
答:
非递归方式:
char*reverse(char*str)
{
if(str!
=NULL)
{
intlength=strlen(str);
for(inti=0;i{
chartemp=str[i];
str[i]=str[length-1-i];
str[length-1-i]=temp;
}}
printf("%s\n",str);
}
递归方式:
搞不定
char*reverse(char*str)
{
if(str==NULL||strlen(str)==1)
returnstr;
inti;
if(i==1)
str[i]='\0';
returnstr[i];
。
。
。
。
}
函数和memcpy函数有什么区别?
它们各自使用时应该注意什么问题?
答:
strcpy函数:
拷贝字符串,遇到‘\0’结束,删去’\0’并结束拷贝。
memcpy函数:
拷贝任何数据。
并不是所有的数据都以NULL结束,所以要给其指定拷贝数据的长度。
5.写一个函数将一个链表逆序.
答:
typedefstructnode{
intdata;
structnode*next;
}node;
node*reverse(node*head)
{node*p1,*p2,*p2;
if(head!
=NULL||head->next!
=NULL)
{p1=head;
P2=p1->next;
While(p2){
P3=p2->next;
P2->next=p1;
P1=p2;
P2=p3;}
head->next=NULL;
head=p1;
returnhead;
}
6一个单链表,不知道长度,写一个函数快速找到中间节点的位置.
你设两个指针一个移动速度是令一个两倍就可以了吧,第一个NULL了第2个就是中间节点了
答:
typedefstructlinknode
{
inta;
structlinknode*next;
}linknode;
linknode*findmiddle(linknode*head)
{
linknode*fast,*low,*p;
if(head==NULL)
{
returnNULL;
}
P=head;
low=p->next;
fast=p->next->next;
while(!
(p=fast->next)&&!
p->next)
{
low=low->next;
fast=fast->next;
}
returnlow;
}
7写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
答:
两个指针,第一个先于第二个n个位置。
LinkNodeIsLoopList(LinkNode*head,intn)
{
LinkNode*p1,*p2,*p3;
P1=head;
While(n-->=0)
{我想到的办法是,从头开始一次取出把链表中的结点组成另一个链表,判断这个链表是不是循环的,第一个满足条件的头结点就是了.
比如以上面的测试数据为例:
第一次取出:
0->1->2->3->4->5->6->7->8->(3)
第二次取出:
1->2->3->4->5->6->7->8->(3)
第三次取出:
2->3->4->5->6->7->8->(3)
以此类推.
10.判断链表是否循环;
答:
boolIsLoopList(LinkNode*head)
{
LinkNode*p1=head,*p2=head;
if(head->next==NULL)递归算法判断数组a[N]是否为一个递增数组。
答:
递归算法:
#include<>
#include<>
#defineN5
intJudgment(inta[]);
intmain(){
inta[N],i,flag=1;
printf("Enterarraydata:
");
for(i=0;i{
scanf("%d",&a[i]);n");
}
elseif(flag==0)
{
printf("noincrementarray.\n");
}
getch();
return0;
}
intJudgment(inta[])
{
statici=0;简述一个Linux驱动程序的主要流程与功能。
MyAnswer:
设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如