文件名:西山居笔试试题
模板号:
XSJ-HR-DOC-2012-03
金山软件有限公司西山居工作室
程序类笔试试卷
(考试时间:120分钟)
个人信息(必填)
基本信息
姓
名:______________ 性 别:______________ 年 龄:______________
学校名称:______________ 学院名称:______________ 专 业:______________
学 历:______________ 毕业日期:201___年
联系方式
手 机:________ Q Q:________ 电子邮箱:______________
紧急联系人:____________ 手 机:______________
获知此次招聘会的渠道:
海报宣传
校园网站
官网网站
老师同学
其他:_________
应聘岗位: 后台开发
客户端开发 3D开发 逻辑开发 移动开发
数据开发
测试开发
我还不是很清楚我在哪一方面擅长,服从公司安排
答题说明
A
)您开始答题时间:
结束时间:
B
)交卷时简历和试卷一起交,
试卷在上,简历在下
C)
本试卷为非计分制,并非以答题数量作为评判标准
D)
考试中如对题目内容有任何疑问,请不要询问监考人员
正式答题
一 填空题
1、 32位x86平台下,char memory[] = { 1,2,3,4,5,6,7,8,9, };int* p = (int*) memory;则*p的值用16进制表示为_____,*(p+1)的值用16进制表示为______。
2、 32位MSC编译环境下,struct K1{ char a; short b; int c;}; struct K2{ char a; int b; char c; }; sizeof(K1) = _____, sizeof(K2) = _____.
3、 32位编译环境下定义int a[5][10],则a[2][4]相对于a[0][0]的内存地址偏移是___________。
4、
数据的插入,查找,删除操作都比较频繁时,采用________ 数据结构可以得到较好的效率平衡,stl的_________容器采用了这种数据结构。
5、 下面一段程序:
#include
class A
{
void fun() { printf(“A”); }
} ;
class B : public A
{
virtual void fun() { printf(“B”); }
};
class C : public B
{
void fun() { printf(“C”); }
};
class D : public C
{
virtual void fun() { printf(“D”); }
virtual void funD() { printf(“D_Test”); }
};
class E : public D
{
virtual void fun() { printf(“E”); }
virtual void funE() { printf(“E_Test”); }
};
class E1 : public D
{
virtual void fun() { printf(“E1”); }
virtual void funE1() { printf(“E1_Test”); }
};
int main()
{
A* p1 = (A*)new B; p1->fun();printf(“,”);
B* p2 = (B*)new C; p2->fun();printf(“,”);
B* p3 = (B*)new D; p3->fun();printf(“,”);
B* p4 = (E*)new D; p4->fun();printf(“,”);
D* p5 = (D*)new E; p5->funD();printf(“,”);
E1* p6 = (E1*) new E; p6->funE1();printf(“,”);
p6->funD();printf(“,”);
printf(“ %d, %d”, sizeof(B) – sizeof(A), sizeof(D) – sizeof(A));
}
以上程序在32
位环境下执行结果是
(
按输出结果的逗号分隔填空
)
:
_______
,
_______
,
_______
,
_______
,
_______
,
_______
,
_______
,
_______
,
________
。
6、
防止头文件被重复包含的方法是_______。
7、 8086
体系中指向栈顶的寄存器为
_______
,指向代码段偏移地址的寄存器为
______
,整型函数返回值一般放在
______
寄存器。
8、 完成以下二分查找 算法函数的代码:
template
int BinarySearch(Type a[], const Type& x, int n)
{
int left=0;
int right=n-1;
while(__________)
{
int middle=(left + right) / 2;
if (x == a[middle])
return middle;
if (x > a[middle])
___________;
else
___________;
}
return -1;
}
二 诊断题:
(以下说法如果正确直接回答“正确”即可,如果错误请指出并说明原因。)
1、
如果源字符串长度已知,用memcpy
拷贝字符串比
strcpy
效率要高。
2、
可以使用memcpy拷贝一个对象。
3、
在调用有overload, override或者
overwrite的函数时均要进行运行期绑定。
4、 stl的sort排序算法可以应用于vector,list,map,set等容器。
5、
指针p
指向一个对象,则
sizeof(p)
的值是
4
,
sizeof(*p)
的值是
p
指向对象的实际大小。
6、 每个运行中的程序至少包含一个主线程,也称为进程。
7、 内存泄漏是指程序申请的内存在程序退出前也没有得到释放,直到 操作系统重启。
8、 SQL
是一种跨平台的数据库。
三 简答题
1、
分别阐述析构函数被定义为private的作用及被定义为virtual的作用
2、 类增加成员函数是否会增加使用该类定义的对象占用内存的大小,增加虚函数呢?
3、
void fun(T a, T b); void fun(const T& a, const T& b); 以上两种函数定义有何区别?实际编程时该如何选择?
4、 按照你的猜测,一个含客户端程序的网络游戏,从玩家开启客户端主程序到进入游戏世界,客户端与服务端需要进行哪些必须的网络协议交互?
5、
驱动Windows
窗口的消息系统的运行机制是怎样的,有哪些关键
API
6、
程序运行时出现间程序无响应,CPU
占用
100%
。此时可能是出现了什么问题?该如何确认问题所在?
四 指出以下几个代码片段分别都存在什么问题
1、 char* ToStr(int a)
{
char buf[16];
itoa(buf, a, 10);
return buf;
}
2、 int Player::CalcExp(int nRadix, int nNpcId)
{
Npc* pNpc = ::GetNpc(nNpcId);
int nExpBase = this->GetCurExpBase();
return nExpBase + nRadix / (pNpc->GetLevel() - this->GetLevel());
}
3、 bool Player::ChangePsw(const char* pswOld, const char* pswNew)
{
if (strcmp(m_szPsw, pswOld) != 0)
return flase;
strcpy(m_szPsw, pswNew);
retrun true ;
}
4、 void OuputTxtFile(const char* szFileName)
{
if (!szFileName) return;
fstream fs;
fs.open(szFileName, ios_base::in);
while(fs.good() && !fs.eof())
{
char readbuf[1024];
fs.getline(readbuf, sizeof(readbuf));
printf(readbuf);
printf(“\n”);
}
}
5、 template
class ObjectMgr
{
std::vector m_vecObject;
public:
size_t Add(T obj)
{
m_vecObject.push_back(obj);
return m_vecObject.size();
}
T* GetByIndex(size_t index)
{
if (index < m_vecObject.size())
return &m_vecObject[index];
return NULL;
}
};
6、 typedef LPCSTR const char*;
class KString
{
public:
char *m_Str;
KString()
{
m_Str = "";
}
KString(KString& str)
{
m_Str = new char[str.len()];
memcpy(m_Str, (LPCSTR)str, str.len());
}
~KString()
{
delete m_Str;
}
unsigned int len()
{
return sizeof(m_Str);
}
operator LPCSTR()
{
return m_Str;
}
operator = (char szSrc[])
{
m_Str = new char[sizeof(szSrc)];
memcpy(m_Str, szSrc, sizeof(szSrc));
}
}
五. 编程题
1
、实现一个内存缓冲区类(用
char
数组做缓冲即可),至少实现:创建定长缓冲区、类拷贝、扩大缓冲区长度(保留数据)三个主要功能。
2
、实现一个快速排序函数
void qsort(int* numbers, int count)
,对输入的指定数量的整数进行排序,排序后的整数仍保存在原数组中。
六.附加题(可选)
1
、数据表
Item
的字段信息如下:
字段名
|
类型
|
Item_ID
|
number
|
Item_Name
|
varchar2(32)
|
Item_Type
|
number
|
1)
请用SQL
实现一个函数或存储过程,要求:
a)
输入参数为Item_Name
,
Item_Type
,输出参数为
Item_ID
。
b)
如果Item_Name
和
Item_Type
的组合在表中已存在,则返回原有的
Item_ID
。
c)
如果不存在,则向表中插入新的记录,并返回新插入记录的Item_ID
。
d) Item_ID
是唯一的序列编号
e)
对Item_Name
的判断不区分大小写。
f) 需要考虑函数或存储过程被多个Session同时调用的问题。
2)
请设计合适的索引,并写出创建索引的SQL
语句。
2
、某个对战类游戏,每局游戏由两个队伍参战,同时会有很多支队伍同时进行游戏。该游戏设计有匹配系统,该匹配系统要求尽量把两个水平接近的队伍匹配在一起进行对战。现由你来负责实现这个游戏的匹配系统,写出需求分析,程序实现方案、要点。