中青宝网C++笔试题及答案

匿名网友 匿名网友 发布于: 2015-08-30 00:00:00
阅读 172 收藏 0 点赞 0 评论 0

中青宝网面试题:

以下给出的是我之前参加一家网络游戏公司招聘C++程序员的笔试题,这套题目整个测试的时间长达三个小时

前言:

请写代码打印100之内的素数,讲求效率(请做你的解法的效率分析)

考察数据结构的知识点,这里可使用筛选法,该方法是大部分数据结构书籍都有讲解的算法,当然还有时间复杂度更低的算法(空间复杂度),但是因为求值范围为1100,故综合来看,筛选法的效率是最高的。

int main()

{

int *sieve;

int n;

int iCounter=2, iMax, i;

 

printf(“Please input max number:”);

scanf(“%d”, &n);

sieve=(int*)malloc((n-1)*sizeof(int));

for(i=0;i<n-1;i++) 

sieve[i]=i+2; 

iMax = (int)sqrt(n);

while (iCounter<=iMax) {

for (i=2*iCounter-2; i<n-1; i+=iCounter)

sieve[i] = 0;

iCounter++; }

for(i=0; i<n-1; i++)

if (sieve[i]!=0) printf(“%d “,sieve[i]);

 

return 0;

}

 

m,n的最大公约数

考察数据结构的知识点,求公约数的算法很多,可考虑效率较高的欧几里德递归算法,

int gcd(int m,int n){

int temp = 0;

 

if(m < n){

temp = m;

m = n;

n = temp;

}

 

if(n == 0)

return m;

else

return gcd1(n, m%n);

 

}

输入10个字符串,打印出其中重复的字符串以及重复的次数

考察C++容器的知识,这里考察的MAP

int main()

{

string str;

map<string, int> content;

 

for( int cnt = 0; cnt < 10; cnt++ )

{

cin >> str;

(content.insert(make_pair(str, 0)).first)->second++;

}

 

map<string, int>::iterator it = content.begin();

for( ; it != content.end(); ++it )

cout << it->first << “: ” << it->second << endl;

 

return 0;

}

请画图例(UML最好),给出windows下的文件目录的设计模式

考察数据结构,文件目录是一个树

OO表示狼吃羊羊吃草

考察OO思想,定义4个或5个类,有继承体系、虚函数即可。以4个类的模型为例,定义动物基类、狼类、羊类,草类。羊、狼类从动物基类派生,基类有虚eat方法。在狼类里实现成员函数eat(参数),参数为羊类,同样羊类的eat函数的参数为草类。

 

问答题:

什么是subversion?它与vss,cvs的区别在哪?或者有什么优势?

Subversion是版本管理工具,它与vss的区别在SVN采用的是“拷贝修改合并”模型,而VSS使用的是“锁定修改解锁”模型,SVN的优势在于版本可恢复:每次更新都会产生一个新的版本,如果需要回复到之前的版本,只需要简单地执行版本回复即可。  

什么是wiki,关于程序项目的wiki你使用过哪些?wiki对你有什么帮助吗?wiki与程序文挡的差别在哪?

Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。有人认为,Wiki系统属于一种人类知识网格系统,我们可以在Web的基础上对Wiki文本进行浏览、创建、更改,而且创建、更改、发布的代价远比HTML文本小;同时Wiki系统还支持面向社群的协作式写作,为协作式写作提供必要帮助;最后,Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供简单的交流工具。与其它超文本系统相比,Wiki有使用方便及开放的特点,所以Wiki系统可以帮助我们在一个社群内共享某领域的知识。

什么是tdd?你使用过吗?tdd的关键在哪?跟传统的单元测试相比,有什么优越性?

TDD,测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。代码整洁可用是测试驱动开发的目标。

什么是单元测试?你用过哪些单元测试工具?他们的区别和好处各有哪些?你主要倾向于哪一种?

单元测试,是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。工具包括CUNITCPPUNITVS2005自带工具等。

 

什么是编程规范?你倾向于什么样的规范?他的好处在哪?

编程规范就是为了便于自己和他人阅读理解源程序,而制定的一个规范。如在Visual C++中源程序中变量的取名一般采用匈牙利表示法则,该法则要求每个变量名都有一个前缀,用于表示变量的类型,后面是代表变量含义的一串字符串。例如,前缀n表示整形变量,前缀sz表示以0结束的字符串变量,前缀lp表示指针变量。编程规范只是一个规范,也可以不遵守,但是要做一个有良好编程风格的程序员,就一定要遵守编程规范,不仅方便自己以后的阅读,也方便与其他程序员的交流。

什么是mfc?你经常使用那些mfc类?那么为什么很多人不主张使用mfc

MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C++ 开发工具发布。目前最新版本为9.0(截止200811月)。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。为什么很多人不主张使用mfc,首先MFC不具备跨平台的能力,其次MFC的高度封装(比如网络相关的类),导致一些细节的处理反而不方便。

什么是头文件依赖?你注意过这些问题吗?你注意过编译的时间吗?你怎么改进编译时间?

源文件所需要(#include)的头文件称为头文件依赖。改进编译时间可以采取“预编译头文件”的方法。

什么是面向对象?你在哪些方面用过面向对象?带来了什么好处?又有什么弊端?

“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOAObject Oriented Analysis),面向对象的设计(OODObject Oriented Design)、以及我们经常说的面向对象的编程实现(OOPObject Oriented Programming)。

好处:

第一,类具有独立性

由于这种独立的存在,使得和其他的过程也好,对象也罢能够不彼此牵引.避免牵一发而动全身的局面,这有利于维护和调试。

第二,类具有通用性” 

这种通用性,是通过抽象得来的.所谓抽象,就是抽取出事物的共同特征并且加以概括。正是因为这种通用性的实现,才造就了“re-use”的可能。

第三,类具有灵活性

由于第二个特征的存在,加上客观事物的特殊性,有可能通用的类中一部分成员方法变得不通用,这个时候通过继承和Overload的机制,使得它能够应付某些特殊情况,从而实现了灵活性

弊端:有可能会降低程序的执行速度

什么是接口编程.com,他带来了什么好处?适用于什么地方?

COMComponet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。

COM的好处:

首先:用户一般希望能够定制所用的应用程序,而组件技术从本质上讲就是可被定制的,因而用户可以用更能满足他们需要的某个组件来替换原来的那个。 

其次,由于组件是相对应用程序独立的部件,我们可以在不同的程序中使用同一个组件而不会产生任何问题,软件的可重用性将大大的得到增强。 

第三,随着网络带宽及其重要性的提高,分布式网络应用程序毫无疑问的成为软件市场上越来越重要的买点。组件价构可以使得开发这类应用程序的过程得以简化。

10 什么是设计模式?使用设计模式有什么好处?列举你使用过的设计模式

设计模式使人们可以更加简单方便地复用成功的设计和体系结构。

一些基本的设计模式:

Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 

Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 

Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 

Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。 

Composite:将对象组合成树形结构以表示“部分整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 

Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。 

Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 

Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

Flyweight:运用共享技术有效地支持大量细粒度的对象。 

Interpreter:给定一个语言定义它的文法的一种表示,并定义一个解释器该解释器使用该表示来解释语言中的句子。 

Iterator:提供一种方法顺序访问一个聚合对象中各个元素而又不需暴露该对象的内部表示。

Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。 

Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 

Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

Proxy:为其他对象提供一个代理以控制对这个对象的访问。 

Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 

State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 

Strategy:定义一系列的算法,把它们一个个封装起来并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。 

Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 

Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 

 

后面还有一道文学诗歌,一道历史常识题以及三道逻辑推理题。

评论列表
文章目录