发信站:北邮人论坛(TueOct2016:52:132009),站内
1.StuctFoo{Foo(){}Foo(int){}Voidfun(){}};
intmain(){Fooa(10);(1)a.fun();(2)Foob();(3)b.fun();(4)}上面的程序中哪个语句是错误的;
2.struct和class的区别;
4.n进制下。567*456=150216成立,则n的值是多少?
5.C++中不能重载的运算符是?
6.排序方法中元素比较次数与初始化排序无关的是哪种排序方法。
7.intx[4]={0};inty[4]={1};则x,y的值是多少?
8.二分查找的理论
9.采取FIFO页面淘汰算法,如何计算缺页。
10.顺序栈的容量如何计算
11.文件索引结构
12.搜索所用的数据结构的内存,以及速度的问题
13.堆中的数据的存储机制
14.页式存储系统,如何计算分块的大小
15.std::vector::iterator可重载的运算符是哪些:++,>>,*(前置),==
16.判断单向链表是否存在环的最佳方案是什么?
18.在C++中不能重载下面的哪个运算符:(A)*(B):(C)::(D)delete
19.就是指针的一大堆问题啦,什么函数指针啊,数组指针之类的
20.sizeof()计算问题
2.inta[5]={1,2,3,4,5};
printf("%d\n",*((int*)(&a+1)-2);
输出是什么。
答:4.分析:(int*)(&a+1)=a+5=&a[5]
编程题:
2.有1001个球。甲乙两人交替取球,每次可取1、2、4个球,谁拿到最后一个球就算输。如果甲先拿,问他有没有必胜的把握?为什么?
答:有。
第一次甲拿1个球,以后每次:
i.乙拿1个,甲拿2个;
ii.乙拿2个,甲拿1个或4个;
iii.乙拿4个,甲拿2个。
最后肯定剩一个,并轮到乙拿。
3.实现atoi()和itoa()
4.给定一个int型数n,写一个尽可能简单的函数判断n是否为2的幂,不能用循环。
答:boolfoo(intn)
{
inta=n;
if(n<=0)returnfalse;
a=((a&0xAAAAAAAA)>>1)+(a&0x55555555);
a=((a&0xCCCCCCCC)>>2)+(a&0x33333333);
a=((a&0xF0F0F0F0)>>4)+(a&0x0F0F0F0F);
a=((a&0xFF00FF00)>>8)+(a&0x00FF00FF);
a=((a&0xFFFF0000)>>16)+(a&0x0000FFFF);
if(a==1)returntrue;
elsereturnfalse;
}
简答题:
1.哪些方法可以避免或减少锁的使用?
2.release版本的可执行程序为什么非常大?
3.使用C++赋值运算符应注意什么地方?
4.strcpy()为什么会造成缓冲区溢出?可用哪个函数替代?
5.阻塞模式的recv在没受到数据的情况下如何返回?(不能将socket修改为非阻塞)
8.有红、绿、蓝三色球分别3,2,1个。取任意两个不同颜色的球都会使它们变成第三种颜色的两个球。问最少取多少次,可使这些球都变成同一种颜色?
答:无论多少次,都不可以使这些球变成同一种颜色,分析:
一、对于(R,R,R,G,G,B)即(3,2,1),有:
i.(R,G)--->(B,B,B,R,R,G)即(3,2,1)
ii.(R,B)--->(G,G,G,G,R,R)即(4,2)
iii.(G,B)--->(R,R,R,R,R,G)即(5,1)
二、对于(G,G,G,G,R,R)即(4,2),有:
i.(R,G)--->(G,G,G,B,B,R)即(3,2,1)
三、对于(R,R,R,R,R,G)即(5,1)有:
i.(R,G)--->(R,R,R,R,B,B)即(4,2)
因此,只有三种状态(3,2,1),(4,2)和(5,1),不可能出现(6,0)这种情况。
9.哪些方法可让一个进程仅有一个实例运行?
10.exit()和_exit()的区别。
11.红黑树比AVL树的优势在哪?
12.软件开发过程包含哪些阶段?各阶段质量保证措施是什么?
网易2007Hust游戏开发工程师笔试
1.拼七巧板,还是比较有意思的(10分)
2.判断下列图案中哪一个与其他三个不同。(10)
ABCD
3.有一个队列长一百米,有一个人从尾走到头,再从头走到尾,期间他的速度和队列的速度都不变,队列正好行进了100米,问这个人走了多少距离。(10)
4.推理题。关于白帽、黑帽的,可以网上搜搜类似的。(10)
5.其他情况输出E:欢迎您的登陆。
1)画出流程图
2)写出实现代码,不需要定义变量类型
如有其他函数请自己定义并说明用途。
6.计算概率,具体不记得了。(10)
7.英文题目NextNumber。(20)
大意就是要根据输入数字,输出一个新数,要求输出数字各个位的和加起来与原数相等。输出的数字是大于原数的第一个数。
如Input:113,output:122,Input0050,output:0104。
输入的N位数字k(0<=k<=101000,0<=N<2000)。
设计完成函数,用伪码实现。
游戏研发工程师必做题
1.一个游戏,角色属性有:生命、攻击、速度、防御、魔法,试设计一个角色的数据结构,用代码实现。
2.若该游戏发布了资料篇,资料篇中角色属性添加了两个:魔防、敏捷。现改进原设计,怎么区分老版游戏和资料篇玩家,并正确读取。
3.在网络游戏中GM通常有一定特权可以对角色属性进行修改,现有GM1,可以对角色的攻击属性修改,而不能对其他属性修改,试设计系统(所有属性都是可读的)。GM的指令通常为以下模式://movetox,y;移动到x,y;//kick用户,踢出某一用户。
2.最优打怪路线
玩家从东往西进行,打怪只能打南北的怪,消耗的能量与怪物离玩家的距离有关,试找出一个最好的打怪路线。
注:玩家只能水平移动,怪物均是静止的,不移动。
1)证明该路线是最佳路线
2)代码实现
3.用户支付
09.3.27更新
首先你要精通一门高级语言,比如C++或者C#,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为你遇到的大部分资源都将是英文的,不要总等着别人为你翻译。慢慢尝试着阅读英文资料,你会发现其实也并没有那么难:)
当然,作为准备工作之一,你首先要到DirectXDevelopCenter下载最新版的DirectXSDK。
入门书籍非常重要,推荐<
不要一开始就看图形学的书,这个时候你对图形编程还没有一个基本的感性认识,因此八成看的云里雾里。不要以网上的教程和论坛提问作为主要学习途径,找一本好书,系统学习,效率才最高。不要马上看SDK里的例子,很多图形学的基本原理仅仅通过读代码是不会明白的。某些年代太过久远的书就不要看了,比如《windows游戏编程大师技巧》(总看到有人在找这本书)。有人说基本的思想总是不变的,可惜对于现代GPU来说,很多早期的技术和优化技巧早就过时了。图形编程是发展的非常快的技术,看看GPU的发展速度,1~2年就是一代产品的革新。
好了,入门之后,是你巩固和拓展视野的阶段。现在看计算机图形学就比较合适了。吐血推荐<
其实入门之后,就没有固定的学习路线了,最好根据你感兴趣的方向来学习。
Shader方面:《Cg_tutorial》和《TheCompleteEffectandHLSLGuide》都是不错的入门材料,当然还有SDK文档。<
地形:<
模型导入和动画:<
物理:<
LOD:<
Raytracing:<
引擎设计:说实话,这方面还没有特别好的书,大概越是核心的内容,越少有人愿意写吧。<<3DGameEngineArchitectureEngineeringReal-TimeApplicationswithWildMagic>>只有第三章值得一读。<<3DGameEngineProgramming>>可以选部分感兴趣的章节看看,不过总的来说,讲的比较浅。更新:<<3DGameEngineDesign,SecondEdition>>出了影印版本,强烈推荐。最近发现<
AI:<
除了书以外,再推荐一些不错的网络资源:
Nvidia和ATI的开发者中心
creators.xna.comXNA官方网站
当然,不要忘了收集各大论坛里牛人们的blog:)
最后,仅仅靠看书是不够的,多写多练才是王道。
ps:以上书籍,除了特别注明的以外,都是可以通过网络或者书店入手的。pps:不要找我要电子书,我能找到的,相信你也能找到,你找不到的,我肯定也没有:)
1、Java
Java编程语言(第三版)---Java四大名著----JamesGosling(Java之父)
Java编程思想(第2版)----Java四大名著----BruceEckel
Java编程思想(第3版)----Java四大名著----------------BruceEckel
JAVA2核心技术卷I:基础知识(原书第7版)---Java四大名著-----CayHorstmann
JAVA2核心技术卷II:高级特性(原书第7版)----Java四大名著-----CayHorstmann
EffectiveJava中文版------Java四大名著--------JoshuaBloch
精通Struts:基于MVC的JavaWeb设计与开发---孙卫琴
精通Hibernate:Java对象持久化技术详解---孙卫琴
Tomcat与JavaWeb开发技术详解------------孙卫琴
Java与模式------------------------------阎宏
2、c#
.NET程序设计技术内幕-------------JeffProsise---.NET平台四大天王
.NET本质论--第1卷:公共语言运行库(中文版)--------ChrisSells---.NET平台四大天王
3、C++
C++Primer(第3版)中文版----c++八大金刚---StanleyB.Lippman
C++Primer(第4版)中文版----c++八大金刚---StanleyB.Lippman
C++标准程序库—自修教程与参考手册--c++八大金刚--NicolaiM.Josuttis
深度探索C++对象模型---c++八大金刚----StanleyB.Lippman
EssentialC++中文版---c++八大金刚---StanleyB.Lippman
EffectiveC++中文版2ndEdition-----c++八大金刚------ScottMeyers
MoreEffectiveC++中文版----c++八大金刚------ScottMeyers
C++编程思想(第2版)第1卷:标准C++导引--------BruceEckel
C++编程思想(第2版)第2卷:实用编程技术--------BruceEckel
C++程序设计--------------------------谭浩强
C++程序设计教程(第2版)--------------钱能
C++PrimerPlus(第五版)中文版---StephenPrata
广博如四库全书Thec++programminglanguage、c++Primer深奥如山重水复Insidethec++objectmodel程序库大全Thec++standardlibray工程经验之积累Effectivec++、MoreEffectivec++、Exceptionalc++
c++八大金刚:1、Essentitalc++---lippman---C++之父,旁枝暂略,主攻核心,轻薄短小,初学者
2、Thec++programminglanguage----C++之父,技术权威,用词深峻,思想深远,c++百科全书代表
3、c++Primer----lippman---纵横书市十数年,c++最佳教本,c++百科全书代表。4、Insidethec++objectmodel-----lippman----揭示c++底层,非常好,非常难。5、Effectivec++-----通过50个编程实例,展示专家经验,行文有趣,深处浅出。6、MoreEffectivec++----通过35个编程实例,展示专家经验,行文有趣,深处浅出。7、Thec++standardlibray---c++标准库的百科全书。8、设计模式:可复用面向对象软件的基础
4、c
C程序设计(第三版)---------------------------谭浩强
C语言大全(第四版)---------------------------HERBERTSCHILDT
C语言接口与实现:创建可重用软件的技术-------------DAVIDR.HANSON
C语言参考手册(原书第5版)--------------------------SamuelP.Harbison
C程序设计教程---------------------------------H.M.Deitel/P.J.Deitel
C陷阱与缺陷-----------------------------------AndrewKoenig
5、VB
VisualBasic.NET从入门到精通-------------------------Petroutsos,E.
高级VISUALBASIC编程-----------------------------------MATTHEWCURLAND
6、Delphi
InsideVCL(深入核心——VCL架构剖析)----------李维
Delphi7高效数据库程序设计--------------李维
面向对象开发实践之路(Delphi版)----------李维
7、VC
8、vf
VisualFoxpro程序设计参考手册-------------------张洪举
专家门诊——VisualFoxPro开发答疑160问-------------------张洪举
VisualFoxPro6.0/9.0解决方案与范例大全-------------------张洪举
VisualFoxPro软件开发模式与应用案例-------------------张洪举
9、黑客
应用密码学(协议算法与C源程序-----------BruceSchneier
网络信息安全的真相-----------BruceSchneier
黑客大曝光:网络安全机密与解决方案(第5版)--------STUARTMCCLURE
软件加密技术内幕------------看雪学院
加密与解密——软件保护技术与完全解决方案------------看雪学院
加密与解密(第二版)--------段钢
10、汇编
Intel微处理器结构、编程与接口(第六版)---------BarryB.Brey
80*86、奔腾机汇编语言程序设计---------BarryB.Brey
Windows环境下32位汇编语言程序设计(第2版)-----------罗云彬
IBM-PC汇编语言程序设计(第2版)本书是国内优秀教材--------沈美明温冬婵
IBMPC汇编语言程序设计(第五版)这本书籍是国外优秀教材-------PETERABEL著,沈美明温冬蝉译
11、驱动开发
WindowsWDM设备驱动程序开发指南------------------------------------ChrisCant
Windows2000/XPWDM设备驱动程序开发(第2版)--------------------------武安河
WINDOWS2000/XPWDM设备驱动程序开发--------------------------------武安河
12、网络
计算机网络第四版中文版----网络编程三剑客--------------AndrewS.Tanenbaum
TCP/IP详解3卷本--------------------RichardStevens----网络编程三剑客
UNIX网络编程2卷本--------------------RichardStevens----网络编程三剑客
用TCP/IP进行网际互联-----------DouglasE.Comer
高级TCP/IP编程-------------------JonC.Snader
C++网络编程-----------------------DouglasSchmidt
UNIX环境高级编程(第2版)--------------------RichardStevens
13、算法
离散数学及其应用----------KennethH.Rosen
具体数学—计算机科学基础--------Donald.E.Knuth
14、图形编程Windows图形编程----------------FENGYUAN--图形编程界的CharlesPetzold之书
15、数据结构
数据结构C++语言描述》58.00(DataStructuresC++)WilliamFord,WilliamTopp刘卫东沈官林
数据结构算法与应用-C++语言描述》49.00SartejSahni汪诗林孙晓东等机械工业出版社
16、软件工程
设计模式--可复用面向对象软件的基础
重构—改善既有代码的设计
17、操作系统
深入理解计算机系统(修订版)-------RANDALE.BRYANT
18、Unix
19、Linux
Linux内核设计与实现Linux内核完全注释LINUX内核分析及编程GNU/Linux编程指南(第二版)Linux设备驱动程序(第三版)嵌入式设计及Linux驱动开发指南——基于ARM9处理器Linux设备驱动程序第三版(英文影印版)Linux内核设计与实现(第2版)Linux内核设计与实现(英文影印版)(第2版)linux技术手册
20、游戏编程
21、移动开发
WindowsMobile手机应用开发SYMBIANOSC++手机应用开发68-WindowsMobile手机应用开发--傅曦齐宇徐骏48-SYMBIANOSC++手机应用开发(第2卷)------------------RICHARDHARRISON著,周良忠王伯欣译68-SYMBIANOSC++手机应用开发---------------RICHARDHARRISON著,周良忠译WindowsCE.net内核定制及应用程序开发---------周毓林宁杨陆贵强付林林嵌入式系统WindowsCE开发技巧与实例--傅曦PalmOS编程实践---绝版
22、单片机
单片机轻松入门----------------------------------周坚(平凡老师)
单片机典型模块设计实例导航-----------------------求是科技
例说8051----------------------------------------张义和陈敌北
单片机应用程序设计技术(修订版)--------------------周航慈
8051单片机实践与应用-------------------------------吴金戎
MCS-51系列单片机实用接口技术---------------------李华23、串并口通讯
VisualC++/TurboC串口通信编程实践------------------龚建伟
VISUALBASIC与RS-232串行通信控制(最新版)----------范逸之
24、电子
无线电识图与电路故障分析轻松入门(第二版)-------------------胡斌
无线电元器件检测与修理技术轻松入门(第二版)-------------------胡斌
图表细说电子技术识图-------------------胡斌
图表细说电子元器件-------------------胡斌
图表细说元器件及实用电路-------------------胡斌
来自bc-cnC语言论坛
废话了那么多,下面立刻进入主题================》》》》》》》》》》》》》》》》》》》》》
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void*malloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
voidfree(void*FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2、函数的用法:
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:
//Code...
char*Ptr=NULL;
Ptr=(char*)malloc(100*sizeof(char));
if(NULL==Ptr){exit(1);}
gets(Ptr);
//code...
free(Ptr);
Ptr=NULL;
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void*),任何类型的指针都可以转换成(void*),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
二、malloc()到底从哪里得来了内存空间:
1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:
2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.
通过上面对概念的描述,可以知道:
栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)
所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:
voidFunction(void){char*p=(char*)malloc(100*sizeof(char));}
就这个例子,千万不要认为函数返回,函数所在的栈被销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!
3、free()到底释放了什么
这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!
三、malloc()以及free()的机制:
这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是天经地义的事!下面看看这个结构体的原型:
structmem_control_block{
intis_available;//这是一个标记?
intsize;//这是实际空间的大小
};
对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)
好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!
voidfree(void*ptr){
structmem_control_block*free;
free=ptr-sizeof(structmem_control_block);
free->is_available=1;
return;}
那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!
最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友可以自己去下载源代码去看看。