`
tempsitegoogle
  • 浏览: 866727 次
文章分类
社区版块
存档分类
最新评论

C++各大软件公司口试,面试宝典,经典,珍藏

 
阅读更多
1.new、、malloc、free关系
青年时代是要做一点什么工作及变成一个什么样人的一种机会。会调用对象的析构函数,和new对应free只会开释内存,new调用机关函数。malloc与free是C++/C说话的标准库函数,new/是C++的运算符。它们都可用于申请动态内存和开释内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的请求。对象在创建的同时要主动履行机关函数,对象在灭亡之前要主动履行析构函数。因为malloc/free是库函数而不是运算符,不在编译器把握权限之内,不克不及够把履行机关函数和析构函数的任务强加于malloc/free。是以C++说话须要一个能完成动态内存分派和初始化工作的运算符new,以及一个能完成清理与开释内存工作的运算符。重视new/不是库函数。

2.与 []差别

聪明只在于一件事,就是熟悉那长于驾驭一切的思惟。只会调用一次析构函数,而[]会调用每一个成员的析构函数。在More Effective C++中有更为具体的申明:“当操纵符用于数组时,它为每个数组元素调用析构函数,然后调用operator来开释内存。”与New配套, []与new []配套

MemTest*mTest1=newMemTest[10];

MemTest*mTest2=newMemTest;

int*pInt1=newint[10];
int*pInt2=newint;
[]pInt1; //-1-

[]pInt2; //-2-

[]mTest1;//-3-

[]mTest2;//-4-

在-4-处报错。

这就申明:对于内建简单数据类型,和[]功能是雷同的。对于自定义的错杂数据类型,和[]不克不及互用。[]删除一个数组,删除一个指针简单来说,用new分派的内存用删除用new[]分派的内存用[]删除[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以题目不大。若是你在用时没用括号,就会认为指向的是单个对象,不然,它就会认为指向的是一个数组。


3.C C++ JAVA共同点,不合之处?


4.持续优毛病。


类持续是在编译时刻静态定义的,且可直接应用,类持续可以较便利地改变父类的实现。然则类持续也有一些不足之处。起首,因为持续在编译时刻就定义了,所以无法在运行时刻改变从父类持续的实现。更糟的是,父类凡是至少定义了子类的项目组行动,父类的任何改变都可能影响子类的行动。若是持续下来的实现不合适解决新的题目,则父类必须重写或被其他更合适的类调换。这种依附关系限制了灵活性并终极限制了复用性。

5.C++有哪些性质(面向对象特点)


封装,持续和多态。


在面向对象法度设计说话中,封装是哄骗可重用成分机关软件体系的特点,它不仅支撑体系的可重用性,并且还有利于进步体系的可扩充性;消息传递可以实现发送一个通用的消息而调用不合的办法;封装是实现信息隐蔽的一种技巧,其目标是使类的定义和实现分别。


6.子类析构时要调用父类的析构函数吗?


析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时辰,派生类的信息已经全部烧毁了定义一个对象时先调用基类的机关函数、然后调用派生类的机关函数;析构的时辰正好相反:先调用派生类的析构函数、然后调用基类的析构函数JAVA无析构函数深拷贝和浅拷贝


7.多态,虚函数,纯虚函数


多态:是对于不合对象接管雷同消息时产生不合的动作。C++的多态性具体表如今两个方面:在法度运行时的多态性经由过程持续和虚函数来表现;


在法度编译时多态性表如今函数和运算符的重载上


虚函数:在基类中冠以关键字 virtual 的成员函数。 它供给了一种接口界面。容许在派生类中对基类的虚函数从头定义。


纯虚函数的感化:在基类中为其派生类保存一个函数的名字,以便派生类按照须要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不克不及直接被调用。


从基类持续来的纯虚函数,在派生类中还是虚函数。若是一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。


抽象类中不仅包含纯虚函数,也可包含虚函数。l抽象类必须用作派生其他类的基类,而不克不及用于直接创建对象实例。但仍可应用指向抽象类的指针支撑运行时多态性。

8.求下面函数的返回值(微软)


int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}


假定x = 9999。 答案:8


思路:将x转化为2进制,看含有的1的个数。


9.什么是“引用”?申明和应用“引用”要重视哪些题目?


答:引用就是某个目标变量的“别号”(alias),对应用的操纵与对变量直接操纵结果完全雷同。申明一个引用的时辰,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不克不及再把该引用名作为其他变量名的别号。声明一个引用,不是新定义了一个变量,它只默示该引用名是目标变量名的一个别号,它本身不是一种数据类型,是以引用本身不占存储单位,体系也不给引用分派存储单位。不克不及建树数组的引用。


10.将“引用”作为函数参数有哪些特点?


(1)传递引用给函数与传递指针的结果是一样的。这时,被调函数的形参就成为本来主调函数中的实参变量或对象的一个别号来应用,所以在被调函数中对形参变量的操纵就是对其响应的目标对象(在主调函数中)的操纵。


(2)应用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操纵;而应用一般变量传递函数的参数,当产生函数调用时,须要给形参分派存储单位,形参变量是实参变量的副本;若是传递的是对象,还将调用拷贝机关函数。是以,当参数传递的数据较大时,用引用比用一般变量传递参数的效力和所占空间都好。


(3)应用指针作为函数的参数固然也能达到与应用引用的结果,然则,在被调函数中同样要给形参分派存储单位,且须要反复应用"*指针变量名"的情势进交运算,这很轻易产生错误且法度的浏览性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更轻易应用,更清楚。


11.在什么时辰须要应用“常引用”? 


若是既要哄骗引用进步法度的效力,又要保护传递给函数的数据不在函数中被改变,就应应用常引用。常引用声明体式格式:const 类型标识符 &引用名=目标变量名;


例1

int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确

例2
string foo( );
void bar(string & s);

那么下面的表达式将是不法的:

bar(foo( ));
bar("hello world");


原因在于foo( )和"hello world"串都邑产生一个姑且对象,而在C++中,这些姑且对象都是const类型的。是以上方的表达式就是试图将一个const类型的对象转换为非const类型,这是不法的。引用型参数应当在能被定义为const的景象下,尽量定义为const 。


12.将“引用”作为函数返回值类型的格式、益处和须要遵守的规矩?


格式:类型标识符 &函数名(形参列表及类型申明){ //函数体 }


益处:在内存中不产生被返回值的副本;(重视:恰是因为这点原因,所以返回一个局部变量的引用是不成取的。因为跟着该局部变量生活生计期的停止,响应的引用也会失效,产生runtime error! 重视事项:


(1)不克不及返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。首要原因是局部变量会在函数返回后被烧毁,是以被返回的引用就成为了"无所指"的引用,法度会进入未知状况。


(2)不克不及返回函数内部new分派的内存的引用。这条可以参照Effective C++[1]的Item 31。固然不存在局部变量的被动烧毁题目,可对于这种景象(返回函数内部new分派内存的引用),又面对其它难堪场合排场。例如,被函数返回的引用只是作为一个姑且变量呈现,而没有被付与一个实际的变量,那么这个引用所指向的空间(由new分派)就无法开释,造成memory leak。


(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。首要原因是当对象的属性是与某种营业规矩(business rule)相接洽关系的时辰,其赋值经常与某些其它属性或者对象的状况有关,是以有须要将赋值操纵封装在一个营业规矩傍边。若是其它对象可以获得该属性的很是量引用(或指针),那么对该属性的纯真赋值就会破损营业规矩的完全性。


(4)流操纵符重载返回值申明为“引用”的感化:


流操纵符<<和>>,这两个操纵符经常被连气儿应用,例如:cout << "hello" << endl; 是以这两个操纵符的返回&#20540;应当是一个仍然支撑这两个操纵符的流引用。可选的其它规划包含:返回一个流对象和返回一个流对象指针。然则对于返回一个流对象,法度必须从头(拷贝)机关一个新的流对象,也就是说,连气儿的两个<<操纵符实际上是针对不合对象的!这无法让人接管。对于返回一个流指针则不克不及连气儿应用<<操纵符。是以,返回一个流对象引用是惟一选择。这个独一选择很关键,它说了然引用的首要性以及无可调换性,也许这就是C&#43;&#43;说话中引入引用这个概念的原因吧。 赋&#20540;操纵符=。这个操纵符象流操纵符一样,是可以连气儿应用的,例如:x = j = 10;或者(x=10)=100;赋&#20540;操纵符的返回&#20540;必须是一个左&#20540;,以便可以被持续赋&#20540;。是以引用成了这个操纵符的惟一返回&#20540;选择。


例3


#i nclude <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数&#20540;作为左&#20540;,等价于vals[0]=10;
put(9)=20; //以put(9)函数&#20540;作为左&#20540;,等价于vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<"subscript error"; return error; }
}


(5)在别的的一些操纵符中,却切切不克不及返回引用:&#43;-*/ 四则运算符。它们不克不及返回引用,Effective C&#43;&#43;[1]的Item23具体的评论辩论了这个题目。首要原因是这四个操纵符没有side effect,是以,它们必须机关一个对象作为返回&#20540;,可选的规划包含:返回一个对象、返回一个局部变量的引用,返回一个new分派的对象的引用、返回一个静态对象引用。按照前面提到的引用作为返回&#20540;的三个规矩,第2、3两个规划都被否决了。静态对象的引用又因为((a&#43;b) == (c&#43;d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。


13.“引用”与多态的关系?


引用是除指针外另一个可以产生多态结果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例4


Class A; Class B : Class A{...}; B b; A& ref = b;


14.“引用”与指针的差别是什么?


指针经由过程某个指针变量指向一个对象后,对它所指向的变量间接操纵。法度中应用指针,法度的可读性差;而引用本身就是目标变量的别号,对引用的操纵就是对目标变量的操纵。此外,就是上方提到的对函数传ref和pointer的差别。


15.什么时辰须要“引用”?


流操纵符<<和>>、赋&#20540;操纵符=的返回&#20540;、拷贝机关函数的参数、赋&#20540;操纵符=的参数、其它景象都推荐应用引用。以上 2-8 参考:http://develop.csai.cn/c/NO0000021.htm


16.布局与结合有和差别?




(1). 布局和结合都是由多个不合的数据类型成员构成, 但在任何同一时刻, 结合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而布局的所有成员都存在(不合成员的存放地址不合)。
(2). 对于结合的不合成员赋&#20540;, 将会对其它成员重写, 本来成员的&#20540;就不存在了, 而对于布局的不合成员赋&#20540;是互不影响的。


17.面关于“结合”的题目标输出?
a)
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;


void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,内存占用景象是Ox010A)
b)
main()
{
union{ /*定义一个结合*/
int i;
struct{ /*在结合中定义一个布局*/
char first;
char second;
}half;
}number;
number.i=0 x4241; /*结合成员赋&#20540;*/
printf("%c%cn", number.half.first, mumber.half.second);
number.half.first=""a""; /*结合中结构成员赋&#20540;*/
number.half.second=""b"";
printf("%xn", number.i);
getch();
}
答案: AB (0 x41对应""A"",是低位;Ox42对应""B"",是高位)
6261 (number.i和number.half共用一块地址空间)
18.接洽关系、聚合(Aggregation)以及组合(Composition)的差别?
涉及到UML中的一些概念:接洽关系是默示两个类的一般性接洽,比如“学生”和“教员”就是一种接洽关系关系;聚合默示has-a的关系,是一种相对疏松的关系,聚合类不须要对被聚合类负责,如下图所示,用空的菱形默示聚合关系:从实现的角度讲,聚合可以默示为:
class A {...} class B { A* a; .....}
而组合默示contains-a的关系,接洽关系性强于聚合:组合类与被组合类有雷同的生命周期,组合类要对被组合类负责,采取实心的菱形默示组合关系:实现的情势是:
class A{...} class B{ A a; ...}
参考文章:http://www.cnitblog.com/Lily/archive/2006/02/23/6860.html
http://www.vckbase.com/document/viewdoc/?id=422
19.面向对象的三个根蒂根基特点,并简单论述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和办法实验protection(private, protected,public)
2. 持续:广义的持续有三种实现情势:实现持续(指应用基类的属性和办法而无需额外编码的才能)、可视持续(子窗体应用父窗体的外观和实现代码)、接口持续(仅应用属性和办法,实现滞后到子类实现)。前两种(类持续)和后一种(对象组合=>接口持续以及纯虚函数)构成了功能复用的两种体式格式。
3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技巧,赋&#20540;之后,父对象就可以按照当前赋&#20540;给它的子对象的特点以不合的体式格式运作。简单的说,就是一句话:容许将子类类型的指针赋&#20540;给父类类型的指针。
20.重载(overload)和重写(overried,有的书也叫做“覆盖”)的差别?
常考的题目。从定义上来说:
重载:是指容许存在多个同名函数,而这些函数的参数表不合(或许参数个数不合,或许参数类型不合,或许两者都不合)。
重写:是指子类从头定寄父类虚函数的办法。
从实现道理上来说:
重载:编译器按照函数不合的参数表,对同名函数的名称做润饰,然后这些同名函数就成了不合的函数(至少对于编译器来说是如许的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过润饰后的函数名称可能是如许的:int_func、str_func。对于这两个函数的调用,在编译器间就已经断定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),是以,重载和多态无关!
重写:和多态真正相干。当子类从头定义了父类的虚函数后,父类指针按照赋给它的不合的子类指针,动态的调用属于子类的该函数,如许的函数调用在编译时代是无法断定的(调用的子类的虚函数的地址无法给出)。是以,如许的函数地址是在运行期绑定的(晚绑定)。
21.多态的感化?
主如果两个:
1. 隐蔽实现细节,使得代码可以或许模块化;扩大代码模块,实现代码重用;
2. 接口重用:为了类在持续和派生的时辰,包管应用家族中任一类的实例的某一属性时的正确调用。
22.Ado与Ado.net的雷同与不合?
除了“可以或许让应用法度处理惩罚存储于DBMS 中的数据“这一基内幕&#20284;点外,两者没有太多共同之处。然则Ado应用OLE DB 接口并基于微软的COM 技巧,而ADO.NET 拥有本身的ADO.NET 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不合于COM 体系,ADO.NET 接口也就完全不合于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据接见体式格式。ADO.net 供给对XML 的支撑。
23.New 与malloc free 的接洽与差别?
答案:都是在堆(heap)长进步履态的内存操纵。用malloc函数须要指定内存分派的字节数并且不克不及初始化对象,new 会主动调用对象的机关函数。 会调用对象的destructor,而free 不会调用对象的destructor.
24.#define DOUBLE(x) x&#43;x ,i = 5*DOUBLE(5); i 是几许?
答案:i 为30。
25.有哪几种景象只能用intialization list 而不克不及用assignment?
答案:当类中含有const、reference 成员变量;基类的机关函数都须要初始化表。
26. C&#43;&#43;是不是类型安然的?
答案:不是。两个不合类型的指针之间可以强迫转换(用reinterpret cast)。C#是类型安然的。
27. main 函数履行以前,还会履行什么代码?
答案:全局对象的机关函数会在main 函数之前履行。
28. 描述内存分派体式格式以及它们的差别?
1) 从静态存储区域分派。内存在法度编译的时辰就已经分派好,这块内存在法度的全部运行时代都存在。例如全局变量,static 变量。
2) 在栈上创建。在履行函数时,函数内局部变量的存储单位都可以在栈上创建,函数履行停止时这些存储单位主动被开释。栈内存分派运算内置于处理惩罚器的指令集。
3) 从堆上分派,亦称动态内存分派。法度在运行的时辰用malloc 或new 申请随便率性几许的内存,法度员本身负责在何时用free 或 开释内存。动态内存的生活生计期由法度员决意,应用很是灵活,但题目也最多。
29.struct 和 class 的差别
答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。从情感上讲,大多半的开辟者感觉类和布局有很大的差别。感触感染上布局仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且靠得住的社会成员,它有智能办事,有稳定的封装樊篱和一个杰出定义的接口。既然大多半人都这么认为,那么只有在你的类有很少的办法并且有公稀有据(这种工作在杰出设计的体系中是存在的!)时,你也许应当应用 struct 关键字,不然,你应当应用 class 关键字。
30.当一个类A 中没有任何成员变量与成员函数,这时sizeof(A)的&#20540;是几许?
答案:若是不是零,请申明一下编译器为什么没有让它为零。(Autodesk)必然不是零。举个反例,若是是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。
31. 在8086 汇编下,逻辑地址和物理地址是如何转换的?(Intel)
答案:通用存放器给出的地址,是段内偏移地址,响应段存放器地址*10H&#43;通用存放器内地址,就获得了真正要接见的地址。
32. 斗劲C&#43;&#43;中的4种类型转换体式格式?
请参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx,重点是static_cast, dynamic_cast和reinterpret_cast的差别和应用。
dynamic_casts在帮助你浏览持续层次上是有限制的。它不克不及被用于缺乏虚函数的类型上,它被用于安然地沿着类的持续关系向下进行类型转换。如你想在没有持续关系的类型中进行转换,你可能想到static_cast
33.分别写出BOOL,int,float,指针类型的变量a 与“零”的斗劲语句。
答案:
BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)



34.请说出const与#define 比拟,有何长处?
答案:
Const感化:定义常量、润饰函数参数、润饰函数返回&#20540;三个感化。被Const润饰的器材都受到强迫保护,可以预防不测的变革,能进步法度的结实性。
1) const 常量稀有据类型,而宏常量没稀有据类型。编译器可以对前者进行类型安然搜检。而对后者只进行字符调换,没有类型安然搜检,并且在字符调换可能会产生料想不到的错误。
2) 有些集成化的调试对象可以对const 常量进行调试,然则不克不及对宏常量进行调试。
35.简述数组与指针的差别?
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向随便率性类型的内存块。
(1)批改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 重视p 指向常量字符串
p[0] = ‘X’; // 编译器不克不及发明该错误,运行时错误
(2) 用运算符sizeof 可以策画出数组的容量(字节数)。sizeof(p),p 为指针获得的是一个指针变量的字节数,而不是p 所指的内存容量。C&#43;&#43;/C 说话没有办法知道指针所指的内存容量,除非在申请内存时记住它。重视当数组作为函数的参数进行传递时,该数组主动退化为同类型的指针。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
策画数组和指针的内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是100 字节
}
36.类成员函数的重载、覆盖和隐蔽差别?
答案:a.成员函数被重载的特点:
(1)雷同的局限(在同一个类中);
(2)函数名字雷同;
(3)参数不合;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特点是:
(1)不合的局限(分别位于派生类与基类);
(2)函数名字雷同;
(3)参数雷同;
(4)基类函数必须有virtual 关键字。
c.“隐蔽”是指派生类的函数樊篱了与其同名的基类函数,规矩如下:
(1)若是派生类的函数与基类的函数同名,然则参数不合。此时,非论有无virtual关键字,基类的函数将被隐蔽(重视别与重载混合)。
(2)若是派生类的函数与基类的函数同名,并且参数也雷同,然则基类函数没有virtual 关键字。此时,基类的函数被隐蔽(重视别与覆盖混合)
37.求出两个数中的较大这
There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
答案:( ( a &#43; b ) &#43; abs( a - b ) ) / 2
38.如何打印出当前源文件的文件名以及源文件的当前行号?
答案:
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是体系预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。 


39. main 主函数履行完毕后,是否可能会再履行一段代码,给出申明?
答案:可以,可以用_onexit 注册一个函数,它会在main 之后履行int fn1(void), fn2(void), fn3(void), fn4 (void);
void main( void )
{
String str("zhanglin");
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.n" );
}
int fn1()
{
printf( "next.n" );
return 0;
}
int fn2()
{
printf( "executed " );
return 0;
}
int fn3()
{
printf( "is " );
return 0;
}
int fn4()
{
printf( "This " );
return 0;
}
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.
40.如何断定一段法度是由C 编译法度还是由C&#43;&#43;编译法度编译的?
答案:
#ifdef __cplusplus
cout<<"c&#43;&#43;";
#else
cout<<"c";
#endif
41.文件中有一组整数,请求排序后输出到另一个文件中


答案:
#i nclude<iostream>
#i nclude<fstream>
using namespace std;


void Order(vector<int>& data) //bubble sort
{
int count = data.size() ;
int tag = false ; // 设置是否须要持续冒泡的标记位
for ( int i = 0 ; i < count ; i&#43;&#43;)
{
for ( int j = 0 ; j < count - i - 1 ; j&#43;&#43;)
{
if ( data[j] > data[j&#43;1])
{
tag = true ;
int temp = data[j] ;
data[j] = data[j&#43;1] ;
data[j&#43;1] = temp ;
}
}
if ( !tag )
break ;
}
}


void main( void )
{
vector<int>data;
ifstream in("c:data.txt");
if ( !in)
{
cout<<"file error!";
exit(1);
}
int temp;
while (!in.eof())
{
in>>temp;
data.push_back(temp);
}
in.close(); //封闭输入文件流
Order(data);
ofstream out("c: esult.txt");
if ( !out)
{
cout<<"file error!";
exit(1);
}
for ( i = 0 ; i < data.size() ; i&#43;&#43;)
out<<data[i]<<" ";
out.close(); //封闭输出文件流
}

42.链表题:一个链表的结点布局
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;


(1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)
Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知两个链表head1 和head2 各自有序,请把它们归并成一个链表依然有序。(保存所有结点,即便大小雷同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知两个链表head1 和head2 各自有序,请把它们归并成一个链表依然有序,此次请求用递归办法进行。 (Autodesk)
答案:
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;

----------
41. 解析一下这段法度的输出 (Autodesk)
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i) //B(int) works as a converter ( int -> instance of B)
{
cout<<"constructed by parameter " << data <<endl;
}
private:
int data;
};


B Play( B b)
{
return b ;
}
(1) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(t1);   destructed t1形参析构
return 0;               destructed t2 重视次序!
} destructed t1
(2) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(10);   constructed by parameter 10
return 0;               destructed B(10)形参析构
} destructed t2 重视次序!
destructed t1
43.写一个函数找出一个整数数组中,第二大的数 (microsoft)
答案:
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i&#43;&#43;)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}
44.写一个在一个字符串(n)中寻找一个子串(m)第一个地位的函数。
KMP算法效力最好,时候错杂度是O(n&#43;m),详见:http://www.zhanglihai.com/blog/c_335_kmp.html
46.多重持续的内存分派题目:
比如有class A : public class B, public class C {} 那么A的内存布局大致是怎么样的?
这个是compiler-dependent的, 不合的实现其细节可能不合。若是不推敲有虚函数、虚持续的话就相当简单;不然的话,相当错杂。可以参考《深切摸索C&#43;&#43;对象模型》,或者:
http://blog.csdn.net/rainlight/archive/2006/03/03/614792.aspx
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnarvc/html/jangrayhood.asp
47.如何断定一个单链表是有环的?(重视不克不及用标记位,最多只能用两个额外指针)
struct node { char val; node* next;}
bool check(const node* head) {} //return false : 无环;true: 有环一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,若是有环的话两者必定重合,反之亦然):
bool check(const node* head)
{
if(head==NULL) return false;
node *low=head, *fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast) return true;
}
return false;
}

48.指针找错题
解析这些口试题,本身包含很强的趣味性;而作为一名研发人员,经由过程对这些口试题的深切解析则可进一步加强自身的内功。
  2.找错题 试题1:
以下是引用片段:
void test1() //数组越界
  {
  char string[10];
  char* str1 = "0123456789";
  strcpy( string, str1 );
  }
  试题2: 
以下是引用片段:
 void test2()
  {
  char string[10], str1[10];
  int i;
  for(i=0; i<10; i&#43;&#43;)
  {
  str1= ""a"";
  }
  strcpy( string, str1 );
  }
  试题3:  
以下是引用片段:
void test3(char* str1)
  {
  char string[10];
  if( strlen( str1 ) <= 10 )
  {
  strcpy( string, str1 );
  }
  }
  解答:
  试题1字符串str1须要11个字节才干存放下(包含末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;对试题2,若是口试者指出字符数组str1不克不及在数组内停止可以给3分;若是口试者指出strcpy(string,str1)调用使得从 str1内存起复制到string内存起所复制的字节数具有不断定性可以给7分,在此根蒂根基上指出库函数strcpy工作体式格式的给10分;
对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) <10),因为strlen的成果未统计’’所占用的1个字节。解析:查核对根蒂根基功的把握
  (1)字符串以’’结尾;
  (2)对数组越界把握的敏感度;
  (3)库函数strcpy的工作体式格式,
49.若是编写一个标准strcpy函数
总分&#20540;为10,下面给出几个不合得分的答案:2分 以下是引用片段:
void strcpy( char *strDest, char *strSrc )
  {
  while( (*strDest&#43;&#43; = * strSrc&#43;&#43;) != ‘’ );
  }
  4分 以下是引用片段:
 void strcpy( char *strDest, const char *strSrc )
  //将源字符串加const,注解其为输入参数,加2分
  {
  while( (*strDest&#43;&#43; = * strSrc&#43;&#43;) != ‘’ );
  }
  7分 以下是引用片段:
void strcpy(char *strDest, const char *strSrc)
  {
  //对源地址和目标地址加非0断言,加3分
  assert( (strDest != NULL) &&(strSrc != NULL) );
  while( (*strDest&#43;&#43; = * strSrc&#43;&#43;) != ‘’ );
  }
  10分 以下是引用片段:
//为了实现链式操纵,将目标地址返回,加3分!
  char * strcpy( char *strDest, const char *strSrc )
  {
  assert( (strDest != NULL) &&(strSrc != NULL) );
  char *address = strDest;
  while( (*strDest&#43;&#43; = * strSrc&#43;&#43;) != ‘’ );
  return address;
  }
  从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然隐蔽着这么多玄机,真不是盖的!须要多么扎实的根蒂根基功才干写一个完美的strcpy啊!
  (4)对strlen的把握,它没有包含字符串末尾的""""。
  读者看了不合分&#20540;的strcpy版本,应当也可以写出一个10分的strlen函数了,完美的版本为: int strlen( const char *str ) //输入参数const 以下是引用片段:
 {
  assert( strt != NULL ); //断言字符串地址非0
  int len=0; //注,必然要初始化。
  while( (*str&#43;&#43;) != """" )
  {
  len&#43;&#43;;
  }
  return len;
  }
  试题4:以下是引用片段:
void GetMemory( char *p )
  {
  p = (char *) malloc( 100 );
  }
  void Test( void )
  {
  char *str = NULL;
  GetMemory( str );
  strcpy( str, "hello world" );
  printf( str );
  }
  试题5: 
以下是引用片段:
char *GetMemory( void )
  {
  char p[] = "hello world";
  return p;
  }
  void Test( void )
  {
  char *str = NULL;
  str = GetMemory();
  printf( str );
  }
  试题6:以下是引用片段:
void GetMemory( char **p, int num )
  {
  *p = (char *) malloc( num );
  }
  void Test( void )
  {
  char *str = NULL;
  GetMemory( &str, 100 );
  strcpy( str, "hello" );
  printf( str );
  }
  试题7:以下是引用片段:
 void Test( void )
  {
  char *str = (char *) malloc( 100 );
  strcpy( str, "hello" );
  free( str );
  ... //省略的其它语句
  }
  解答:试题4传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部批改形参并不克不及真正的改变传入形参的&#20540;,履行完
  char *str = NULL;
  GetMemory( str );
  后的str仍然为NULL;试题5中
  char p[] = "hello world";
  return p;
  的p[]数组为函数内的局部主动变量,在函数返回后,内存已经被开释。这是很多法度员常犯的错误,其根源在于不睬解变量的生活生计期。
  试题6的GetMemory避免了试题4的题目,传入GetMemory的参数为字符串指针的指针,然则在GetMemory中履行申请内存及赋&#20540;语句 tiffanybracelets
  *p = (char *) malloc( num );
  后未断定内存是否申请成功,应加上:
  if ( *p == NULL )
  {
  ...//进行申请内存失败处理惩罚


  }
  试题7存在与试题6同样的题目,在履行
  char *str = (char *) malloc(100);
  后未进行内存是否申请成功的断定;别的,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
  str = NULL;
  试题6的Test函数中也未对malloc的内存进行开释。
  解析:
  试题4~7查核口试者对内存操纵的懂得程度,根蒂根基功扎实的口试者一般都能正确的答复此中50~60的错误。然则要完全解答正确,却也绝非易事。
软件开辟网 www.mscto.com
  对内存操纵的查核首要集中在:
  (1)指针的懂得;
  (2)变量的生活生计期及感化局限;
  (3)杰出的动态内存申请和开释习惯。




再看看下面的一段法度有什么错误:  
以下是引用片段:
swap( int* p1,int* p2 )
  {
  int *p;
  *p = *p1;
  *p1 = *p2;
  *p2 = *p;
  }
  在swap函数中,p是一个“野”指针,有可能指向体系区,导致法度运行的溃散。在VC&#43;&#43;中DEBUG运行时提示错误“Access Violation”。该法度应当改为
以下是引用片段:
swap( int* p1,int* p2 )
  {
  int p;
  p = *p1;
  *p1 = *p2;
  *p2 = p;
  }
50.String 的具体实现

已知String类定义如下:


class String
{
public:
String(const char *str = NULL); // 通用机关函数
String(const String &another); // 拷贝机关函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋&#20540;函数
private:
char *m_data; // 用于保存字符串
};


测验测验写出类的成员函数实现。


答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步断定
{
m_data = new char[1] ;
m_data[0] = """" ;
}
else
{
m_data = new char[strlen(str) &#43; 1];
strcpy(m_data,str);
}


}


String::String(const String &another)
{
m_data = new char[strlen(another.m_data) &#43; 1];
strcpy(m_data,other.m_data);
}


String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
[]m_data; //删除本来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) &#43; 1];
strcpy(m_data,rhs.m_data);
return *this ;
}




String::~String()
{
[]m_data ;
}
51.h头文件中的ifndef/define/endif 的感化?
答:防止该头文件被反复引用。
52.#i nclude<file.h> 与 #i nclude "file.h"的差别?
答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。



53.在C&#43;&#43; 法度中调用被C 编译器编译后的函数,为什么要加extern “C”?
C&#43;&#43;说话支撑函数重载,C说话不支撑函数重载。C&#43;&#43;供给了C连接互换指定符号extern “C”
解决名字匹配题目。


起首,作为extern是C/C&#43;&#43;说话中注解函数和全局变量感化局限(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中应用。


凡是,在模块的头文件中对本模块供给给其它模块引用的函数和全局变量以关键字extern声明。例如,若是模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。如许,模块B中调用模块A中的函数时,在编译阶段,模块B固然找不到该函数,然则并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数


extern "C"是连接申明(linkage declaration),被extern "C"润饰的变量和函数是遵守C说话体式格式编译和连接的,来看看C&#43;&#43;中对类&#20284;C的函数是如何编译的:




作为一种面向对象的说话,C&#43;&#43;支撑函数重载,而过程式说话C则不支撑。函数被C&#43;&#43;编译后在符号库中的名字与C说话的不合。例如,假设某个函数的原型为:


void foo( int x, int y );
  


该函数被C编译器编译后在符号库中的名字为_foo,而C&#43;&#43;编译器则会产生像_foo_int_int之类的名字(不合的编译器可能生成的名字不合,然则都采取了雷同的机制,生成的新名字称为“mangled name”)。


_foo_int_int 如许的名字包含了函数名、函数参数数量及类型信息,C&#43;&#43;就是靠这种机制来实现函数重载的。例如,在C&#43;&#43;中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不雷同的,后者为_foo_int_float。


同样地,C&#43;&#43;中的变量除支撑局部变量外,还支撑类成员变量和全局变量。用户所编写法度的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理惩罚相&#20284;,也为类中的变量取了一个独一无二的名字,这个名字与用户法度中同名的全局变量名字不合。


未加extern "C"声明时的连接体式格式


假设在C&#43;&#43;中,模块A的头文件如下:


// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif  


在模块B中引用该函数:


// 模块B实现文件 moduleB.cpp
#i nclude "moduleA.h"
foo(2,3);
加extern "C"声明后的编译和连接体式格式


加extern "C"声明后,模块A的头文件变为:


// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif  


在模块B的实现文件中仍然调用foo( 2,3 ),其成果是:
(1)模块A编译生成foo的目标代码时,没有对其名字进行特别处理惩罚,采取了C说话的体式格式;


(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经批改的符号名_foo。


若是在模块A中函数声了然foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。


所以,可以用一句话概括extern “C”这个声明的真实目标(任何说话中的任何语法特点的出生都不是随便而为的,起原于真实世界的需求驱动。我们在思虑题目时,不克不及只逗留在这个说话是怎么做的,还要问一问它为什么要这么做,动机是什么,如许我们可以更深切地懂得很多题目):实现C&#43;&#43;与C及其它说话的混淆编程。  


熟悉打听了C&#43;&#43;中extern "C"的设立动机,我们下面来具体解析extern "C"凡是的应用技能:


extern "C"的惯用法


(1)在C&#43;&#43;中引用C说话中的函数和变量,在包含C说话头文件(假设为cExample.h)时,需进行下列处理惩罚:




extern "C"
{
#i nclude "cExample.h"
}


而在C说话的头文件中,对其外部函数只能指定为extern类型,C说话中不支撑extern "C"声明,在.c文件中包含了extern "C"时会呈现编译语法错误。


C&#43;&#43;引用C函数例子中包含的三个文件的源代码如下:


/* c说话头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif




/* c说话实现文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )
{
return x &#43; y;
}




// c&#43;&#43;实现文件,调用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}


若是C&#43;&#43;调用一个C说话编写的.DLL时,当包含.DLL的头文件或声明接口函数时,应加extern "C" { }。


(2)在C中引用C&#43;&#43;说话中的函数和变量时,C&#43;&#43;的头文件需添加extern "C",然则在C说话中不克不及直接引用声了然extern "C"的该头文件,应当仅将C文件中将C&#43;&#43;中定义的extern "C"函数声明为extern类型。


C引用C&#43;&#43;函数例子中包含的三个文件的源代码如下:


//C&#43;&#43;头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif




//C&#43;&#43;实现文件 cppExample.cpp
#i nclude "cppExample.h"
int add( int x, int y )
{
return x &#43; y;
}




/* C实现文件 cFile.c
/* 如许会编译失足:#i nclude "cExample.h" */
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}


15题目标解答请参考《C&#43;&#43;中extern “C”含义深层摸索》注解:
几道c笔试题(含参考答案)


1.
What is displayed when f() is called given the code:
class Number {
public:
string type;


Number(): type(“void”) { }
explicit Number(short) : type(“short”) { }
Number(int) : type(“int”) { }
};
void Show(const Number& n) { cout << n.type; }
void f()
{
short s = 42;
Show(s);
}
a) void
b) short
c) int
d) None of the above


2. Which is the correct output for the following code
double dArray[2] = {4, 8}, *p, *q;
p = &dArray[0];
q = p &#43; 1;
cout << q – p << endl;
cout << (int)q - (int)p << endl;
a) 1 and 8
b) 8 and 4
c) 4 and 8
d) 8 and 1
第一个选C;
固然传入的是short类型,然则short类型的机关函数被生命被explicit,也就是只能显示类型转换,不克不及应用隐式类型转换。
第二个选A;
第一个是指针加减,遵守的是指向地址类型的加减,只跟类型地位有关,q和p指向的数据类型以实际数据类型来算差一个地位,是以是1。而第二个加减是实际指针&#20540;得加减,在内存中一个double类型占领8个字节,是以是8

54.Sony笔试题


  1.完成下列法度
  *
  *.*.
  *..*..*..
  *...*...*...*...
  *....*....*....*....*....
  *.....*.....*.....*.....*.....*.....
  *......*......*......*......*......*......*......
  *.......*.......*.......*.......*.......*.......*.......*.......
  #include
  #define N 8
  int main()
  {
   int i;
   int j;
   int k;
   ---------------------------------------------------------
   | |
   | |
   | |
   ---------------------------------------------------------
   return 0;
  }
  2.完成法度,实现对数组的降序排序
  #include
  void sort( );
  int main()
  {
   int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出
   sort( );
   return 0;
  }
  void sort( )
  {
   ____________________________________
   | |
   | |
   |-----------------------------------------------------|
  }
  3.费波那其数列,1,1,2,3,5……编写法度求第十项。可以用递归,也可以用其
他办法,但要申明你选择的来由。
  #include
  int Pheponatch(int);
  int main()
  {
   printf("The 10th is %d",Pheponatch(10));
   return 0;
  }
  int Pheponatch(int N)
  {
  --------------------------------
  | |
  | |
  --------------------------------
  }
  4.下列法度运行时会溃散,请找失足误并更正,并且申明原因。
  #include
  #include
  typedef struct{
   TNode* left;
   TNode* right;
   int value;
  } TNode;
  TNode* root=NULL;
  void append(int N);
  int main()
  {
   append(63);
   append(45);
   append(32);
   append(77);
   append(96);
   append(21);
   append(17); // Again, 数字随便率性给出
  }
  void append(int N)
  {
   TNode* NewNode=(TNode *)malloc(sizeof(TNode));
   NewNode->value=N;




   if(root==NULL)
   {
   root=NewNode;
   return;
   }
   else
   {
   TNode* temp;
   temp=root;


   while((N>=temp.value && temp.left!=NULL) || (N !=NULL
  ))
   {
   while(N>=temp.value && temp.left!=NULL)
   temp=temp.left;
   while(N    temp=temp.right;
   }
   if(N>=temp.value)
   temp.left=NewNode;
   else
   temp.right=NewNode;
   return;
   }
  }


※ 起原:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM:219.217.233.47]

────────────────────────────────────────
mengfd (Icebreaker) 于 (Sun Oct 23 14:59:59 2005) 说道:
55请你分别画出OSI的七层收集布局图和TCP/IP的五层布局图。
应用层:为应用法度供给办事
默示层:处理惩罚在两个通信体系中互换信息的默示体式格式
会话层:负责保护两个结点间会话连接的建树、经管和终止,以及数据互换
传输层:向用户供给靠得住的端到端办事。UDP TCP和谈。
收集层:经由过程路由选择算法为分组经由过程通信子网选择最恰当的路径,以及实现拥塞把握、收集互联等功能。数据传输单位是分组。IP地址,路由器,IP和谈。
数据链路层:在物理层供给的办事根蒂根基上,数据链路层在通信的实体间建树数据链路连接,传输一帧为单位的数据包(,并采取错误把握与流量把握办法,使有错误的物理线路变成无错误的数据链路。)
物理层:传输比特流。传输单位是比特。调制解调器。



56请你具体地申明一下IP和谈的定义,在哪个层上方?首要有什么感化?TCP与UDP呢 ?
收集层。
57.请问互换机和路由器各自的实现道理是什么?分别在哪个层次上方实现的?
互换机:数据链路层。路由器:收集层。
58.全局变量和局部变量有什么差别?是怎么实现的?操纵体系和编译器是怎么知道的 ?

59.8086是几许位的体系?在数据总线上是怎么实现的?

8086微处理惩罚器共有4个16位的段存放器,在寻址内存单位时,用它们直接或间接地存放段地址。
  代码段存放器CS:存放当前履行的法度的段地址。
  数据段存放器DS:存放当前履行的法度所用操纵数的段地址。
  客栈段存放器SS:存放当前履行的法度所用客栈的段地址。
  附加段存放器ES:存放当前履行法度中一个帮助数据段的段地址。
由cs:ip构成指令地址,ss:sp构成客栈的栈顶地址指针。DS和ES用作数据段和附加段的段地址(段肇端地址或段&#20540;)

8086/8088微处理惩罚器的存储器经管
1.地址线(码)与寻址局限:N条地址线 寻址局限=2N
2.8086有20地址线 寻址局限为1MB 由 00000H~FFFFFH
3. 8086微处理惩罚器是一个16位布局,用户可用的存放器均为16位:寻址64KB
4. 8086/8088采取分段的办法对存储器进行经管。具体做法是:把1MB的存储器空间分成若干段,每段容量为64KB,每段存储器的肇端地址必须是一个能被16整除的地址码,即在20位的二进制地址码中最低4位必须是“0”。每个段首地址的高16位二进制代码就是该段的段号(称段基地址)或简称段地址,段号保存在段存放器中。我们可对段存放器设置不合的&#20540;来使微处理惩罚器的存储器接见指向不合的段。
5.段内的某个存储单位相对于该段段首地址的差&#20540;,称为段内偏移地址(也叫偏移量)用16位二进制代码默示。
6.物理地址是由8086/8088芯片地址引线送出的20位地址码,它用来参加存储器的地址译码,终极读/写所接见的一个特定的存储单位。
7.逻辑地址由某段的段地址和段内偏移地址(也叫偏移量)两项目组所构成。写成:
段地址:偏移地址(例如,1234H:0088H)。
8.在硬件上起感化的是物理地址,物理地址=段基地址×10H十偏移地址

联想笔试题
  1.设计函数 int atoi(char *s)。
  2.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是几许?


60.申明局部变量、全局变量和静态变量的含义。


  4.申明堆和栈的差别。
61.论说含参数的宏与函数的优毛病。


普天C&#43;&#43;笔试题
  1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。
  2.写一个函数,将此中的 都转换成4个空&#26684;。

61.Windows法度的进口是哪里?写出Windows消息机制的流程。


4.如何定义和实现一个类的成员函数为回调函数?

62.C&#43;&#43;里面是不是所有的动作都是main()引起的?若是不是,请举例。
  
6.C&#43;&#43;里面如何声明const void f(void)函数为C法度中的库函数?
  7.下列哪两个是等同的
  int b;
  A const int* a = &b;
  B const* int a = &b;
  C const int* const a = &b;
  D int const* const a = &b;
  8.内联函数在编译时是否做参数类型搜检?
  void g(base & b){
   b.play;
  }
  void main(){
   son s;
   g(s);
   return;
  }


※ 起原:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM:219.217.233.47]
────────────────────────────────────────
mengfd (Icebreaker) 于 (Sun Oct 23 15:00:14 2005) 说道:

大唐电信
  DTT笔试题
  测验时候一小时,第一项目组是填空和选择:
  1.数列6,10,18,32,“?”,问“?”是几?
  2.或人出70买进一个x,80卖出,90买回,100卖出,这桩生意怎么样?
  3.月球绕地球一圈,至少要几许时候?
  4.7小我用7小时挖了7米的沟,以同样的速度在50小时挖50米的沟要几许人?
  5.鱼头长9,鱼尾便是鱼头加半个鱼身,鱼身便是鱼头加鱼尾,问鱼全长几许?
  6.一个蜜斯买了一块手表,回家发明手表比她家的表慢了两分钟,晚上看消息的时辰
又发明她家的表比消息里的时候慢了两分钟,则 。
  A 手表和消息里的时候一样
  B 手表比消息里的时候慢
  C 手表比消息里的时候快
  7.王师长教师看到一则雇用启事,发明两个公司除了以下前提不合外,其他前提都雷同
  A 半年年薪50万,每半年涨5万
  B 一年年薪100万,每一年涨20万
  王师长教师想去一家待遇斗劲优厚的公司,他会去哪家?
  10.问哪个袋子里有金子?
  A袋子上的标签是如许写的:B袋子上的话是对的,金子在A袋子。
  B袋子上的标签是如许写的:A袋子上的话是错的,金子在A袋子里。
  11.3小我住酒店30块钱,经理找回5块钱,办事生从中藏了2块钱,找给每人1块钱,
3×(10&#61485;1)&#43;2=29,问这是怎么回事?
  12.三篇写作,均为手札情势。
  (1)一片中文的祝贺信,祝贺某男当了某公司xx
  (2)两篇英文的,一是说有事不克不及应邀,流派人去;另一篇是索债的,7天不给钱就
走人(首要考business letter&#26684;式)。
  大唐口尝尝题
  1.什么是中断?中断产生时CPU做什么工作?
  2.CPU在上电后,进入操纵体系的main()之前必须做什么工作?
  3.简述ISO OSI的物理层Layer1,链路层Layer2,收集层Layer3的任务。
  4.有线德律风和无线德律风有何差别?无线德律风希罕须要重视的是什么?
  
63.软件开辟五个首要step是什么?
  6.你在开辟软件的时辰,这5个step分别占用的时候百分比是几许?
  7.makefile文件的感化是什么?
  8.UNIX显示文件夹中,文件名的号令是什么?能使文件内容显示在屏幕的号令是什么

  9.(选做)用户在从一个基站漫游到另一个基站的过程中,都邑产生什么?


────────────────────────────────────────

网通笔试题
  选择题(每题5分,只有一个正确答案)
  1.中国1号信令和谈属于 的和谈。
  A ccs B cas C ip D atm
  2.isdnpri和谈全称是 。
  A 综合营业模仿网基速和谈
  B 综合营业模仿网模仿和谈
  C 综合营业数字网基率和谈
  D 综合营业数字网基次和谈
  3.路由和谈中, 和谈是用间隔作为向量的。
  A ospf B bgp C is-is D rip
  4.中国智能网中,ssp与scp间最上层的ss7和谈是 。
  A incs B is41b C is41c D inap
  5.dtmf全称是 。
  A 双音多频 B多音双频 C多音三频 D三音多频
  6.策画机的根蒂根基构成项目组中,不包含下面设备的是 。
  A cpu B输入设备 C存储器 D接口
  7.脉冲编码调制的简称是 。
  A pcm B pam C (delta)M D atm
  8.通俗德律风线接口专业称呼是 。
  A rj11 B rj45 C rs232 D bnc
  9.现有的公共数据网都采取 。
  A电路互换技巧 B报文互换技巧
  C语音插空 D分组互换
  10.ss7和谈中的禁止市忙消息简写为 。
  A stb B slb C sub D spb
  简答题(每题10分)
  1.简述通俗德律风与IP德律风的差别。
  2.简述随路信令与公路信令的底子差别。
  3.申明掩码的首要感化。
  4.ss7和谈中,有三大体素决意其具体定位,哪三大体素?
  5.描述ss7的根蒂根基通话过程。
  6.简述通信网的构成布局。
  7.面向连接与面向非连接各有何利弊?
  8.写出爱尔兰的根蒂根基策画公式。
  9.数据网首要有哪些设备?
  10.中国一号和谈是如安在被叫号码中插入主叫号码的?

东信笔试题目
  笔试:30分钟。
  1.压控振荡器的英文缩写。
  2.动态随机存储器的英文缩写。
  3.选择电阻时要推敲什么?
  4.单片机上电后没有运转,起首要搜检什么?
  5.策画机的根蒂根基构成项目组及其各自的感化。
  6.如何用D触发器、与或非门构成二分频电路?

64.static有什么用处?(请至少申明两种)
答 、1.限制变量的感化域(文件级的)。
2.设置变量的存储域(全局数据区)。


65.引用与指针有什么差别?
答 、1) 引用必须被初始化,指针不必。
2) 引用初始化今后不克不及被改变,指针可以改变所指的对象。
3) 不存在指向空&#20540;的引用,然则存在指向空&#20540;的指针。
66.描述及时体系的根蒂根基特点
答 、在特按时候内完成特定的任务,及时性与靠得住性。

67.全局变量和局部变量在内存中是否有差别?若是有,是什么差别?
答 、全局变量储存在静态数据区,局部变量在客栈中。

68.什么是均衡二叉树?
答 、阁下子树都是均衡二叉树 且阁下子树的深度差&#20540;的绝对&#20540;不大于1。


69.客栈溢出一般是由什么原因导致的?
答 、1.没有收受接管垃圾资料
2.层次太深的递归调用


70.什么函数不克不及声明为虚函数?
答 、constructor
Deconstructor 可以声明为虚函数。
体系为一个空类创建的成员函数有那些。

71.冒泡排序算法的时候错杂度是什么?
答 、O(n^2)


72.写出float x 与“零&#20540;”斗劲的if语句。
答 、if(x>0.000001&&x<-0.000001)


73.Internet采取哪种收集和谈?该和谈的首要层次布局?

答 、tcp/ip 应用层/传输层/收集层/数据链路层/物理层


74.Internet物理地址和IP地址转换采取什么和谈?
答 、ARP (Address Resolution Protocol)(地址解析和谈)


75.IP地址的编码分为哪俩项目组?
答 、IP地址由两项目组构成,收集号和主机号。不过是要和“子网掩码”按位与之后才干区分哪些是收集位哪些是主机位。

76.用户输入M,N&#20540;,从1至N开端次序轮回数数,每数到M输出该数&#20540;,直至全部输出。写出C法度。
答 、轮回链表,用取余操纵做


77.不克不及做switch()的参数类型是:
答 、switch的参数不克不及为实型。
华为
78.局部变量可否和全局变量重名?
答、能,局部会樊篱全局。要用全局变量,须要应用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个轮回体内都定义一个同名的局部变量,而那个局部变量的感化域就在那个轮回体内


79.如何引用一个已经定义过的全局变量?
答 、可以用引用头文件的体式格式,也可以用extern关键字,若是用引用头文件体式格式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译时代会报错,若是你用extern体式格式引用时,假定你犯了同样的错误,那么在编译时代不会报错,而在连接时代报错


80.全局变量可不成以定义在可被多个.C文件包含的头文件中?为什么?
答 、可以,在不合的C文件中以static情势来声明同名全局变量。
可以在不合的C文件中声明同名的全局变量,前提是此中只能有一个C文件中对此变量赋初&#20540;,此时连接不会失足


81.语句for( ;1 ;)有什么题目?它是什么意思?
答 、和while(1)雷同。


82.do……while和while……do有什么差别?
答 、前一个轮回一遍再断定,后一个断定今后再轮回


83.请写出下列代码的输出内容
#i nclude
main()
{
int a,b,c,d;
a=10;
b=a&#43;&#43;;
c=&#43;&#43;a;
d=10*a&#43;&#43;;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答 、10,12,120
84.statac 全局变量、局部变量、函数与通俗全局变量、局部变量、函数
static全局变量与通俗的全局变量有什么差别?static局部变量和通俗局部变量有什么差别?static函数与通俗函数有什么差别?
答 、全局变量(外部变量)的申明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储体式格式, 静态全局变量当然也是静态存储体式格式。 这两者在存储体式格式上并无不合。这两者的差别虽在于非静态全局变量的感化域是全部源法度, 当一个源法度由多个源文件构成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其感化域, 即只在定义该变量的源文件内有效, 在同一源法度的其它源文件中不克不及应用它。因为静态全局变量的感化域局限于一个源文件内,只能为该源文件内的函数公用, 是以可以避免在其它源文件中引起错误。
从以上解析可以看出, 把局部变量改变为静态变量后是改变了它的存储体式格式即改变了它的生活生计期。把全局变量改变为静态变量后是改变了它的感化域, 限制了它的应用局限。
static函数与通俗函数感化域不合。仅在本文件。只在当前源文件中应用的函数应当申明为内部函数(static),内部函数应当在当前源文件中申明和定义。对于可在当前源文件以外应用的函数,应当在一个头文件中申明,要应用这些函数的源文件要包含这个头文件
static全局变量与通俗的全局变量有什么差别:static全局变量只初使化一次,防止在其他文件单位中被引用;
static局部变量和通俗局部变量有什么差别:static局部变量只被初始化一次,下一次根据上一次成果&#20540;;
static函数与通俗函数有什么差别:static函数在内存中只有一份,通俗函数在每个被调用中保持一份拷贝
法度的局部变量存在于(客栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
85.设有以下申明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(struct date)&#43;sizeof(max));的履行成果是?
答 、成果是:___52____。DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20
data是一个struct, 每个变量分隔占用空间. 依次为int4 &#43; DATE20 &#43; double8 = 32.
所以成果是 20 &#43; 32 = 52.
当然...在某些16位编辑器下, int可能是2字节,那么成果是 int2 &#43; DATE10 &#43; double8 = 20
86.-1,2,7,28,,126请问28和126中心那个数是什么?为什么?
答 、应当是4^3-1=63
规律是n^3-1(当n为偶数0,2,4)
n^3&#43;1(当n为奇数1,3,5)

87.用两个栈实现一个队列的功能?请求给出算法和思路!
答 、设2个栈为A,B, 一开端均为空.
入队:
将新元素push入栈A;
出队:
(1)断定栈B是否为空;
(2)若是不为空,则将栈A中所有元素依次pop出并push到栈B;
(3)将栈B的栈顶元素pop出;
如许实现的队列入队和出队的平摊错杂度都还是O(1), 比上方的几种办法要好。

88.在c说话库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?
答 、函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
法度例:
#include
#include
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld ", str, l);
return(0);
}


89.对于一个频繁应用的短小函数,在C说话中应用什么实现,在C&#43;&#43;中应用什么实现?
答 、c用宏定义,c&#43;&#43;用inline

90.用预处理惩罚指令#define 声明一个常数,用以注解1年中有几许秒(忽视闰年题目)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件工作:
1). #define 语法的根蒂根基常识(例如:不克不及以分号停止,括号的应用,等等)
2). 懂得预处理惩罚器将为你策画常数表达式的&#20540;,是以,直接写出你是如何策画一年中有几许秒而不是策画出实际的&#20540;,是更清楚而没有价格的。
3). 意识到这个表达式将使一个16位机的整型数溢出-是以要用到长整型符号L,告诉编译器这个常数是的长整型数。
4). 若是你在你的表达式顶用到UL(默示无符号长整型),那么你有了一个好的出发点。记住,第一印象很首要。

91.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B) (A) : (B))
这个测试是为下面的目标而设的:
1). 标识#define在宏中应用的根蒂根基常识。这是很首要的,因为直到嵌入(inline)操纵符变为标准C的一项目组,宏是便利产生嵌入代码的独一办法,
对于嵌入式体系来说,为了能达到请求的机能,嵌入代码经常是必须的办法。
2). 三重前提操纵符的常识。这个操纵符存在C说话中的原因是它使得编译器能产生比if-then-else更优化的代码,懂得这个用法是很首要的。
3). 懂得在宏中警惕地把参数用括号括起来
4). 我也用这个题目开端评论辩论宏的副感化,例如:当你写下面的代码时会产生什么事?
least = MIN(*p&#43;&#43;, b);

92.预处理惩罚器标识#error的目标是什么?

若是你不知道答案,请看参考文献1。这题目对区分一个正常的伴计和一个书白痴是很有效的。只有书白痴才会读C说话教材的附录去找出象这种
题目的答案。当然若是你不是在找一个书白痴,那么应试者最好本身不要知道答案。

死轮回(Infinite loops)

93.嵌入式体系中经常要用到无穷轮回,你怎么样用C编写死轮回呢?

这个题目用几个解决规划。我首选的规划是:
while(1)
{
}
一些法度员更喜好如下规划:
for(;;)
{
}
这个实现体式格式让我难堪,因为这个语法没有确切表达到底怎么回事。若是一个应试者给出这个作为规划,我将用这个作为一个机会去商量他们如许做的
基起原根蒂根基理。若是他们的根蒂根基答案是:“我被教着如许做,但从没有想到过为什么。”这会给我留下一个坏印象。
第三个规划是用 goto
Loop:
...
goto Loop;
应试者如给出上方的规划,这申明或者他是一个汇编说话法度员(这也许是功德)或者他是一个想进入新范畴的BASIC/FORTRAN法度员。

数据声明(Data declarations)

94.用变量a给出下面的定义
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer
argument and return an integer )

答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

人们经常声称这里有几个题目是那种要翻一下书才干答复的题目,我赞成这种说法。当我写这篇文章时,为了断定语法的正确性,我的确查了一下书。
然则当我被口试的时辰,我期望被问到这个题目(或者附近的题目)。因为在被口试的这段时候里,我断定我知道这个题目的答案。应试者若是不知道
所有的答案(或至少大项目组答案),那么也就没有为此次口试做筹办,若是该口试者没有为此次口试做筹办,那么他又能为什么出筹办呢?

Static

95.关键字static的感化是什么?

这个简单的题目很少有人能答复完全。在C说话中,关键字static有三个明显的感化:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中保持其&#20540;不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数接见,但不克不及被模块外其它函数接见。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地局限内应用。
大多半应试者能正确答复第一项目组,一项目组能正确答复第二项目组,同是很少的人能懂得第三项目组。这是一个应试者的严重的毛病,因为他显然不懂得本地化数
据和代码局限的益处和首要性。

Const

96.关键字const是什么含意?
我只要一听到被口试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。客岁Dan Saks已经在他的文章里完全概括了const的所有效法,是以ESP(译者:Embedded Systems Programming)的每一位读者应当很是熟悉const能做什么和不克不及做什么.若是你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接管它作为一个正确的答案。(若是你想知道更具体的答案,细心读一下Saks的文章吧。)若是应试者能正确答复这个题目,我将问他一个附加的题目:下面的声明都是什么意思?

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前两个的感化是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不成批改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以批改的,但指针是不成批改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不成批改的,同时指针也是不成批改的)。若是应试者能正确答复这些题目,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不消关键字 const,也还是能很轻易写出功能正确的法度,那么我为什么还要如此重视关键字const呢?我也如下的几下来由:
1). 关键字const的感化是为给读你代码的人传达很是有效的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目标。若是你曾花很多时候清理其它人留下的垃圾,你就会很快学会感激这点多余的信息。(当然,懂得用const的法度员很少会留下的垃圾让别人来清理的。)
2). 经由过程给优化器一些附加的信息,应用关键字const也许能产生更紧凑的代码。
3). 公道地应用关键字const可以使编译器很天然地保护那些不被改变的参数,防止其被无意的代码批改。简而言之,如许可以削减bug的呈现。

Volatile

97.关键字volatile有什么含意 并给出三个不合的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,如许,编译器就不会去假设这个变量的&#20540;了。正确地说就是,优化器在用到这个变量时必须每次都警惕地从头读取这个变量的&#20540;,而不是应用保存在存放器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件存放器(如:状况存放器)
2). 一个中断办事子法度中会接见到的非主动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
答复不出这个题目的人是不会被雇佣的。我认为这是区分C法度员和嵌入式体系法度员的最根蒂根基的题目。嵌入式体系法度员经常同硬件、中断、RTOS等等打交道,所用这些都请求volatile变量。不懂得volatile内容将会带来灾害。
假设被口试者正确地答复了这是题目(嗯,思疑这否会是如许),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的首要性。
1). 一个参数既可所以const还可所以volatile吗?申明为什么。
2). 一个指针可所以volatile 吗?申明为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状况存放器。它是volatile因为它可能被意想不到地改变。它是const因为法度不该该试图去批改它。
2). 是的。尽管这并不很常见。一个例子是当一个中办事子法度修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目标是用来返指针*ptr指向&#20540;的,然则,因为*ptr指向一个volatile型参数,编译器将产生类&#20284;下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
因为*ptr的&#20540;可能被意想不到地该变,是以a和b可能是不合的。成果,这段代码可能返不是你所期望的&#20540;!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

位操纵(Bit manipulation)


98.下面的代码输出是什么,为什么?

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a&#43;b > 6) puts("> 6") : puts("<= 6");
}


这个题目测试你是否懂得C说话中的整数主动转换原则,我发明有些开辟者懂得极少这些器材。不管如何,这无符号整型题目的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操纵数都主动转换为无符号类型。是以-20变成了一个很是大的正整数,所以该表达式策画出的成果大于6。这一点对于该当频繁用到无符号数据类型的嵌入式体系来说是丰常首要的。若是你答错了这个题目,你也就到了得不到这份工作的边沿。


99.C说话赞成一些令人震动的布局,下面的布局是合法的吗,若是是它做些什么?
int a = 5, b = 7, c;
c = a&#43;&#43;&#43;b;

这个题目将做为这个测验的一个兴奋的结尾。不管你相不信赖,上方的例子是完全合乎语法的。题目是编译器如何处理惩罚它?程度不高的编译作者实际上会争辩这个题目,按照最处理惩罚原则,编译器该当能处理惩罚尽可能所有合法的用法。是以,上方的代码被处理惩罚成:
c = a&#43;&#43; &#43; b;
是以, 这段代码持行后a = 6, b = 7, c = 12。
若是你知道答案,或猜出正确答案,做得好。若是你不知道答案,我也不把这个算作题目。我发明这个题目的最大益处是:这是一个关于代码编写风&#26684;,代码的可读性,代码的可批改性的好的话题




今天早上的口试题9道,斗劲难,
100.线形表a、b为两个有序升序的线形表,编写一法度,使两个有序线形表归并成一个有序升序线形表h;


答案在 请化大学 严锐敏《数据布局第二版》第二章例题,数据布局傍边,这个叫做:两路归并排序
Linklist *unio(Linklist *p,Linklist *q){
linklist *R,*pa,*qa,*ra;
pa=p;
qa=q;
R=ra=p;
while(pa->next!=NULL&&qa->next!=NULL){
if(pa->data>qa->data){
ra->next=qa;
qa=qa->next;
}
else{
ra->next=pa;
pa=pa->next;
}
}
if(pa->next!=NULL)
ra->next=pa;
if(qa->next!=NULL)
ra->next==qa;
return R;
}
101.用递归算法断定数组a[N]是否为一个递增数组。
递归的办法,记录当前最大的,并且断定当前的是否比这个还大,大则持续,不然返回false停止:
bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n= =2 )
return a[n-1] >= a[n-2];
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
}
102.编写算法,从10亿个浮点数傍边,选出此中最大的10000个。
用外部排序,在《数据布局》书上有《策画办法导论》在找到第n大的数的算法上加工
103.编写一unix法度,防止僵尸过程的呈现.
同窗的4道口试题,应聘的职位是搜刮引擎师,后两道超等难,(大师多给一些算发)
1.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
2.单连表的建树,把""a""--""z""26个字母插入到连表中,并且倒叙,还要打印!
办法1:
typedef struct val
{ int date_1;
struct val *next;
}*p;

void main(void)
{ char c;

for(c=122;c>=97;c--)
{ p.date=c;
p=p->next;
}

p.next=NULL;
}
}
办法2:
node *p = NULL;
node *q = NULL;

node *head = (node*)malloc(sizeof(node));
head->data = "" "";head->next=NULL;

node *first = (node*)malloc(sizeof(node));
first->data = ""a"";first->next=NULL;head->next = first;
p = first;

int longth = ""z"" - ""b"";
int i=0;
while ( i<=longth )
{
node *temp = (node*)malloc(sizeof(node));
temp->data = ""b""&#43;i;temp->next=NULL;q=temp;

head->next = temp; temp->next=p;p=q;
i&#43;&#43;;
}

print(head);

104.可骇的题目终于来了
象搜刮的输入信息是一个字符串,统计300万输入信息中的最热点的前十条,我们每次输入的一个字符串为不跨越255byte,内存应用只有1G,
请描述思惟,写出算发(c说话),空间和时候错杂度,
7.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个体系速度最好,请描述思惟,写出算发(c说话),空间和时候错杂度,


#include string.h
main(void)
{ char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(strlen(src));
int len=strlen(str);
char *d=dest;
char *s=src[len];
while(len--!=0)
d&#43;&#43;=s--;
printf("%s",dest);
}
找失足误!!
#include "string.h"
#include "stdio.h"
#include "malloc.h"
main(void)
{
char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(sizeof(char)*(strlen(src)&#43;1));
int len=strlen(src);
char *d=dest;
char *s=src&#43;len-1;
while(len--!=0)
*d&#43;&#43;=*s--;
*d="""";
printf("%s",dest);
}
105.断定字符串是否为回文
bool IsSymmetry(const char* p)
{
assert(p!=NULL);
const char* q=p;
int len=0;
while(*q&#43;&#43;!="""")
{
len&#43;&#43;;
}
bool bSign=true;
q=p&#43;len-1;
if (0<len)
{
for (int i=0;i<len/2;i&#43;&#43;)
{
if(*p&#43;&#43;!=*q--){ bSign=false;break;};
}
}
if(bSign==true)
{
printf("Yes! ");
}
else
{
printf("No! ");
}
return bSign;
}
107.ASDL应用的是什么和谈?并进行简单描述?

108.Static 感化是什么
起首static的最首要功能是隐蔽,其次因为static变量存放在静态存储区,所以它具备持久性和默认&#20540;0。
109.什么是预编译,何时须要预编译?
预编译又称为预处理惩罚,是做些代码文本的调换工作。处理惩罚#开首的指令,比如拷贝#include包含的文件代码,#define宏定义的调换,前提编译等,就是为编译做的筹办工作的阶段,首要处理惩罚#开端的预编译指令,预编译指令指导了在法度正式编译前就由编译器进行的操纵,可以放在法度中的任何地位。

c编译体系在对法度进行凡是的编译之前,进步前辈行预处理惩罚。c供给的预处理惩罚功能首要有以下三种:1)宏定义 2)文件包含 3)前提编译

1、老是应用不经常批改的大型代码体。
2、法度由多个模块构成,所有模块都应用一组标准的包含文件和雷同的编译选项。在这种景象下,可以将所有包含文件预编译为一个预编译头。

110.过程和线程的差别
什么是过程(Process):通俗的申明就是,过程是法度的一次履行,而什么是线程(Thread),线程可以懂得为过程中的履行的一段法度片段。在一个多任务景象中下面的概念可以帮助我们懂得两者间的差别:


过程间是自力的,这发挥解析在内存空间,高低文景象;线程运行在过程空间内。 一般来讲(不应用特别技巧)过程是无法冲破过程鸿沟存取其他过程内的存储空间;而线程因为处于过程空间内,所以同一过程所产生的线程共享同一内存空间。 同一过程中的两段代码不克不及够同时履行,除非引入线程。线程是属于过程的,当过程退出时该过程所产生的线程都邑被强迫退出并清除。线程占用的资料要少于过程所占用的资料。 过程和线程都可以有优先级。在线程体系中过程也是一个线程。可以将过程懂得为一个法度的第一个线程。

线程是指过程内的一个履行单位,也是过程内的可调剂实体.与过程的差别:
(1)地址空间:过程内的一个履行单位;过程至少有一个线程;它们共享过程的地址空间;而过程有本身自力的地址空间;
(2)过程是资料分派和拥有的单位,同一个过程内的线程共享过程的资料
(3)线程是处理惩罚器调剂的根蒂根基单位,但过程不是.
(4)二者均可并发履行.
111.插入排序和
插入排序根蒂根基思惟:(假定从大到小排序)依次从后面拿一个数和前面已经排好序的数进行斗劲,斗劲的过程是从已经排好序的数中最后一个数开端斗劲,若是比这个数,持续往前面斗劲,直到找到比它大的数,然后就放在它的后面,若是一向没有找到,必然这个数已经斗劲到了第一个数,那就放到第一个数的前面。那么一般景象下,对于采取插入排序法去排序的一组数,可以先选 取第一个数做为已经排好序的一组数。然后把第二个放到正确地位。

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作道理如下。起首在未排序序列中找到最小元素,存放到排序序列的肇端地位,然后,再从残剩未排序元素中持续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
112.运算符优先级题目
能正确默示a和b同时为正或同时为负的逻辑表达式是(D )。
sssA、(a>=0||b>=0)&&(a<0||b<0)
B、(a>=0&&b>=0)&&(a<0&&b<0)
C、(a&#43;b>0)&&(a&#43;b<=0)
D、a*b>0

以下关于运算符优先次序的描述中正确的是(C)。
A、关系运算符<算术运算符<赋&#20540;运算符<逻辑与运算符
B、逻辑与运算符<关系运算符<算术运算符<赋&#20540;运算符
C、赋&#20540;运算符<逻辑与运算符<关系运算符<算术运算符
D、算术运算符<关系运算符<赋&#20540;运算符<逻辑与运算符

113.字符串倒序

写一个函数将"tom is cat" 倒序打印出来,即 "cat is tom"
//a.ch
#define SPACE "" ""
#define ENDL """"


char* str = "Tom is cat"; // 字符串
char* p1 = str&#43;strlen(str)-1;
char* p2 = p1; // 开端时,p1,p2都指向字符串结尾处
char t=0; // 姑且变量,用来保存被姑且调换为ENDL的字符
while(str!=p1--)
{
if(SPACE!=*p1){
for(p2=p1&#43;1;SPACE!=*p1; p1--, t=*p2, *p2=ENDL);


// p1&#43;1指向单词的第一个字母,p2指向单词的结尾,此时输出这个单词
printf("%s ",p1&#43;1);
*p2=t;
p2=p1;
}
}
Output:
cat is Tom
----------------------------------------------------------------------
1)写一个递归函数将内存中的字符串翻转"abc"->"cba"
2)写一个函数将"tom is cat" 将内存中的字符串翻转,即 "cat is tomm"


#include <stdio.h>
#define SPACE "" ""
#define ENDL """"
char* s = "The quick brown fox jumps over the lazy dog";
void str_reverse(char* p1,char* p2){
if(p1==p2)return;
*p1 = (*p1)&#43;(*p2);
*p2 = (*p1)-(*p2);
*p1 = (*p1)-(*p2);
if(p1==p2-1)return;
else str_reverse(&#43;&#43;p1,--p2);
}
void str_word_reverse(char* str){
char *q1=str, *q2=str, *t;
while(*q1==SPACE)q1&#43;&#43;;
if(*q1==ENDL)return; //!
else q2=q1&#43;1;
while( (*q2!=SPACE) && (*q2!=ENDL) )q2&#43;&#43;;

t=q2--;
str_reverse(q1,q2);
if(*t==ENDL)return;
else str_word_reverse(t);
}
int
main(int a ,char** b)
{
printf("%s ",s);
str_reverse(s,s&#43;strlen(s)-1);
printf("%s ",s);
str_word_reverse(s);
printf("%s ",s);
return 0;
}
Output:
The quick brown fox jumps over the lazy dog
god yzal eht revo spmuj xof nworb kciuq ehT
dog lazy the over jumps fox brown quick The
----------------------------------------------------------------------
今天同窗又问一道题,和上方有些类&#20284;,然则请求更严&#26684;了一些:
写一个递归函数将内存中的字符串翻转"abc"->"cba",并且函数原型已断定:void reverse(char* p)


其实,请求越多,思路越断定,我的解如下:


#include <stdio.h>
#include <string.h>
char* s = "0123456789";
#define ENDL """"
void reverse(char* p){
//这是这种办法的关键,应用static为的是能用str_reverse的思路,然则不好
static char* x=0;
if(x==0)x=p;
char* q = x&#43;strlen(p)-1;
if(p==q)return;
*q=(*p)^(*q);
*p=(*p)^(*q);
*q =(*p)^(*q);
if(q==p&#43;1)return;
reverse(&#43;&#43;p);
}


//这种办法就直观多了,然则当字符串很长的时辰就很低效
void reverse2(char* p){
if(*(p&#43;1)==ENDL)return;
for(char* o=p&#43;strlen(p)-1,char t=*o;o!=p;o--)
*o=*(o-1);
*p=t;
reverse2(p&#43;1);
}
int main(int c,char** argv){
reverse2(s);
printf("%s ",s);
return 0;
}

114.互换两个数的宏定义

互换两个参数&#20540;的宏定义为:. #define SWAP(a,b) (a)=(a)&#43;(b);(b)=(a)-(b);(a)=(a)-(b);

115.Itearator各指针的差别

游标和指针
我说过游标是指针,但不仅仅是指针。游标和指针很像,功能很像指针,然则实际上,游标是经由过程重载一元的”*”和”->”来安闲器中心接地返回一个&#20540;。将这些&#20540;存储在容器中并不是一个好主意,因为每当一个新&#20540;添加到容器中或者有一个&#20540;安闲器中删除,这些&#20540;就会失效。在某种程度上,游标可以看作是句柄(handle)。凡是景象下流标(iterator)的类型可以有所变更,如许容器也会有几种不合体式格式的改变:


iterator——对于除了vector以外的其他任何容器,你可以经由过程这种游标在一次操纵中在容器中朝向前的标的目标走一步。这意味着对于这种游标你只能应用“&#43;&#43;”操纵符。而不克不及应用“--”或“&#43;=”操纵符。而对于vector这一种容器,你可以应用“&#43;=”、“—”、“&#43;&#43;”、“-=”中的任何一种操纵符和“<”、“<=”、“>”、“>=”、“==”、“!=”等斗劲运算符。

116. C&#43;&#43;中的class和struct的差别
从语法上,在C&#43;&#43;中(只评论辩论C&#43;&#43;中)。class和struct做类型定义时只有两点差别:
(一)默认持续权限。若是不明白指定,来自class的持续遵守private持续处理惩罚,来自struct的持续遵守public持续处理惩罚;
(二)成员的默认接见权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct根蒂根基就是一个器材。语法上没有任何其它差别。
不克不及因为学过C就总感觉连C&#43;&#43;中struct和class都差别很大,下面列举的申明可能斗劲无聊,因为struct和class底本就是根蒂根基一样的器材,无需多说。但这些申明可能有助于澄清一些常见的关于struct和class的错误熟悉:
(1)都可以有成员函数;包含各类机关函数,析构函数,重载的运算符,友元类,友元布局,友元函数,虚函数,纯虚函数,静态函数;
(2)都可以有一大堆public/private/protected润饰符在里边;
(3)固然这种风&#26684;不再被倡导,但语法上二者都可以应用大括号的体式格式初始化:
A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/布局足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的机关函数。
(4)都可以进行错杂的持续甚至多重持续,一个struct可以持续自一个class,反之亦可;一个struct可以同时持续5个class和5个struct,固然如许做不太好。
(5)若是说class的设计须要重视OO的原则和风&#26684;,那么没任何来由说设计struct就不须要重视。
(6)再次申明,以上所有说法都是指在C&#43;&#43;说话中,至于在C里的景象,C里是底子没有“class”,而C的struct从底子上也只是个包装数据的语法机制。
---------------------------------------------------------------
最后,作为说话的两个关键字,除去定义类型时有上述差别之外,别的还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不消于定义模板参数。

关于应用大括号初始化
  class和struct若是定义了机关函数的话,都不克不及用大括号进行初始化
  若是没有定义机关函数,struct可以用大括号初始化。
  若是没有定义机关函数,且所有成员变量满是public的话,可以用大括号初始化。
  关于默认接见权限
  class中默认的成员接见权限是private的,而struct中则是public的。
  关于持续体式格式
  class持续默认是private持续,而struct持续默认是public持续。
  关于模版

  在模版中,类型参数前面可以应用class或typename,若是应用struct,则含义不合,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。

class中有个默认的this指针,struct没有
不合点:机关函数,析构函数 this 指针

117.有关重载函数

返回&#20540;类型不合构不成重载
参数参数次序不合能构成重载
c&#43;&#43;函数同名不合返回&#20540;不算重载!函数重载是忽视返回&#20540;类型的。


---------------------------------------------
成员函数被重载的特点有:
1) 雷同的局限(在同一个类中);
2) 函数名字雷同;
3) 参数不合;
4) virtual关键字可有可无。
5) 成员函数中 有无const (函数后面) 也可断定是否重载

118.数据库与T-SQL说话

关系数据库是表的凑集,它是由一个或多个关系模式定义。SQL说话中的数据定义功能包含对数据库、根蒂根基表、视图、索引的定义。

119.关系模型的根蒂根基概念


关系数据库以关系模型为根蒂根基,它有以下三项目组构成:
●数据布局——模型所操纵的对象、类型的凑集
●完全性规矩——包管数占领效、正确的束缚前提
●数据操纵——对模型对象所容许履行的操纵体式格式
关系(Relation)是一个由行和列构成的二维表&#26684;,表中的每一行是一笔记录(Record),每一列是记录的一个字段(Field)。表中的每一笔记录必须是互斥的,字段的&#20540;必须具有原子性。


120.SQL说话概述


SQL(布局化查询说话)是关系数据库说话的一种国际标准,它是一种非过程化的说话。经由过程编写SQL,我们可以实现对关系数据库的全部操纵。
●数据定义说话(DDL)——建树和经管数据库对象
●数据把持说话(DML)——用来查询与更新数据
●数据把握说话(DCL)——把握数据的安然性

起来是一个很简单的题目,每一个应用过RDBMS的人都邑有一个概念。
事务处理惩罚体系的典范特点是具备ACID特点。ACID指的是Atomic(原子的)、Consistent(一致的)、Isolated(隔离的)以及Durable(连气儿的),它们代表着事务处理惩罚应当具备的四个特点:
原子性:构成事务处理惩罚的语句形成了一个逻辑单位,不克不及只履行此中的一项目组
一致性:在事务处理惩罚履行之前和之后,数据是一致的。
隔离性:一个事务处理惩罚对另一个事务处理惩罚没有影响。
连气儿性:当事务处理惩罚成功履行到停止的时辰,其结果在数据库中被永远记载下来。

121.C说话中布局化法度设计的三种根蒂根基把握布局

次序布局
选择布局
轮回布局

122.CVS是什么

cvs(Concurrent Version System) 是一个版本把握体系。应用它,可以记录下你的源文件的汗青。


例如,批改软件时可能会不知不觉混进一些 bug,并且可能过了好久你才会察觉到它们的存在。有了 cvs,你可以很轻易地恢复旧版本,并从中看出到底是哪个批改导致了这个 bug。有时这是很有效的。


CVS办事器端对每个文件保护着一个修订号,每次对文件的更新,都邑使得文件的修订号加1。在客户端中也对每个文件保护着一个修订号,CVS经由过程这两个修订号的关系,来进行Update,Commit和发明冲突等操纵操纵

123.三种根蒂根基的数据模型

遵守数据布局类型的不合,将数据模型划分为层次模型、网状模型和关系模型。
124.设计模式:工厂模式 和 单例模式 介绍一下?
模式即将对象创建过程封装即为工厂模式。
单例模式即全部类只有一个对象,并且不容许显示创建。
125.vector 和 list的差别?
vector内部应用数组,接见速度快,然则删除数据斗劲耗机能
list内部应用链表,接见速度慢,然则删除数据斗劲快
126.纯虚函数是如何实现的?在编译道理上讲一下?
在类内部添加一个虚拟函数表指针,该指针指向一个虚拟函数表,该虚拟函数表包含了所有的虚拟函数的进口地址,每个类的虚拟函数表都不
一样,在运行阶段可以循此脉络找到本身的函数进口。
纯虚函数相当于占位符,先在虚函数表中占一个地位由派生类实现后再把真正的函数指针填进去。除此之外和通俗的虚函数没什么差别。
127.抽象类为什么不克不及实例化?
抽象类中的纯虚函数没有具体的实现,所以没办法实例化。曼色尔
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics