2009讯飞软件开发笔试题目(答案版)C++_第1页
2009讯飞软件开发笔试题目(答案版)C++_第2页
2009讯飞软件开发笔试题目(答案版)C++_第3页
2009讯飞软件开发笔试题目(答案版)C++_第4页
2009讯飞软件开发笔试题目(答案版)C++_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2009 讯飞软件开发笔试题目( C+) A 卷答案请写在答题纸上+第一部分 综合基础试题 共 50 分1、( 4分)用变量a给出下面的定义a) 一个整型数;b) 个指向整型数的指针;c) 一个指向指针的指针,它指向的指针是指向一个整型数;d) 个有10个整型的数组;e) 个有10个指针的数组,该指针是指向一个整型数;f) 一个指向有10个整型数数组的指针;g) 个指向函数的指针,该函数有一个整型参数并返回一个整型数;h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型 数答案:a) int ab) int *a;c) int *a;d) int a10;e)

2、int *a 10;f) int (*a)10g) int (*a)(int)h) int( *a10)(int)2、( 4 分)请写出以下语句的输出结果:Int i=43;Int j=5;Double f=25.45181;a) printf( “i=%d,j=%d,f=%3.2f ”,i,j,f);b) printf( “i=%x,j=%06d,i/j=%d ”,i,j,i/j);答案:A ) i=43,j=5,f=25.45(说明:本来应该输出最小3位有效数字,25.5,但是由于限定了2位小数,所以强制有2位小数,有效数字的个数就起不到强制作用了。如果是 3.1,则输出为25.5)B)

3、i=2B ,j=000005,i/j=8(%x 显示的是一个无符号的 0x 16 进制的整数 ,%06d 输出的是 6位数,不够 6位数,前面补0, i/j 两个整数相除,只取商的整数值 )3、(2 分)请完成以下宏定义:a) 用预处理指令#define声明一个常数,用以表明1年中有多少个秒(忽略闰年问题)b) 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个答案:a)#define SECONDS (365*24*60*60)ULb) #define MIN(a,b) (A)(B)?(A):(B)ABS 宏 #define ABS (X)0)?(X):(-(X)4、( 6分)以下为

4、32为windows下的C+程序,请计算: a)Char str= ” hello ”;Char *p=str;请计算:sizeof(str)=6 sizeof(p)=4 strlen(p)=5答案: 6,字符串数组以 0(空格为结尾,所以 str 数组空间大小为 5+1)4,计算的是指针的长度。5, strlen 函数区的字符指针 str 的长度,不包括空字符。b)void funC(Char str100)Void *p=malloC(100);请计算:sizeof(str)=100, :表示在内存中预分配的内存大小。 sizeof (p)=4C)int a3=1,2,3;int b=si

5、zeof(a)/sizeof(a0); sizeof(a)求的是数组的大小。请计算:b=3,对的。5、( 2 分) 设有定义: int n=0,*p=&n,*q=&p; 则以下选项中,正确的赋值语句是( d)a) p=1;b)*q=2; C)q=p; d)*p=5;(c)改成q=&p; 才对。6、( 2 分) Const 关键字的用途?(至少说明两种)答案:( 1)可以定义 const 常量(2) const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东 西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。(3) const 可以用来修饰指针变量,控制指针变量的

6、存取规则。7、 (2分)typedef的c语言中频繁用以声明一个已经存在的数据类型的同义词。也可以用以 预处理器做类似的事情。例如:#defi ne dps struct s*Typedef struct s * tps;以上两种情况的意图都是要定义dps和tps作为一个指向结构s指针。哪种方法更好一些呢?(如果有的话)为什么?考虑安全性还是用typedef好,宏定义在编译时是不检查的,只是简单替换,而typedef编译时要检查的typedef,而且 typedef,define 并非等价,如 #define stringl char *typedef char *string2;第二种才能达

7、到预想效果,stringl a,b;得到的b是chardefine是做替换的,typedef则是重新定义一种数据类型的。可以向int型一样使用的。#define FIND(struct,e) (size_t) &( struct*) 0)-e)typedef是语句(以;结尾)Typedef。它在自己的作用域内给一个已经存在的类型一个别名8、 ( 8分)以下是一组有关内存知识的问题,请仔细看题,回答:Void GetMemory(char *p)P=(char *)malloc(100);Void Test(void)Char *str=Null;GetMemory(str);Strcpy(st

8、r, hello world ”;Prin tf(str);请问运行Test函数会有什么样的结果?a)程序崩溃,运行时错误char *GetMemory(void)Char p= hello world ”;Retur n p;Void Test(void)Char *str=NULL;Str=GetMemory();Prin tf(str);请问运行 Test 函数会有什么结果?b) hello world void GetMemory2(char *p,int num)*p=(char *)malloc(num);Void Test(void)Char *str=NULL;GetMemor

9、y(&str,100);Strcpy(str,”hello”);Printf(str);请问运行 Test 函数会有什么结果?c) hello void Test(void)Char *str=(char *)malloc(100);Strcpy(str,”hello”);Free(str);If(str!=NULL)Strcpy(str,”world ”);Printf(str);、请问运行 test 函数会有什么样的结果?d) 程序崩溃:因为释放 str 指针后,没有将指针置为 null ,所以指针变为野指针了。再执行 cpy 时会因为找不到指针的指向而导致程序崩溃,请编程时,注意这一点。

10、9、( 6 分)请写出以下程序的输出结果:Class A Public:A() Printf( “A constructed.n ”);Virtual A()printf( “A deconstructed.n ”);Virtual void Fn()printf( “A fn called.n ”); ;Class B:public APublic:B()printf( “B constructed.n ”);Virtual B()printf( “B deconstructed.n ”);Virtual void Fn()printf( “B fn called.n ”); ;Class

11、C:public BPublic:C()printf( “C constructed.n”);Virtual C()printf( “C deconstructed.n”);Virtual void Fn()printf( “C fn called.n ”); ;Void main(int argc,char* grgv)A *pA=new B;If(pA!=NULL)pA-fn();B *pB=static_cast(pA);If(pB!=NULL)pB-fn();C * pC=static_cast(pA);If(pC!=NULL)pC-fn();delete pA;Answer :A c

12、onstructedB constructedB fn calledB fn calledB fn calledB dec on structedA dec on structed10. (2分)以下说法错误的是:()A)指针和引用作为函数参数都可以改变实参B)指针和引用都可以在定义后任意的改变指向,弓I用是不可以改变的。C)引用必须在创建的时候初始化,而指针则不需要D)不能空引用,但是可以有空指针11、 (2分)下列关于多态的描述,错误的是()A)C+语言的多态性分为编译时的多态和运行时的多态性B)编译时的多态性可以通过函数重载来实现C) 运行时的多态性可以通过模板(不是模板是引用)和虚函数

13、来实现D)实现运行时多态性的机制称动态绑定编译时的 多态T生:就是在程序编译的时候,也就是生成解决方案的时候就决定要实现什么操作。而运行时的多态性:就是指直到系统运行时,才根据实际情况决定实现何种操作。静态链接库是ib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码加入你的程序中因此会增加代码大小,你的程序一运行lib代码强制被装入你程序的运行空间,不能手动移除lib代码。动态链接库是程序运行时动态装入内存的模块,格式*.dll,在程序运行时可以随意加载和移除,节省内存空间。也就是说静态链接库不适合程序的运行,它是要么不做,要么全做的库。在大型的软件项目中一般要实现很

14、多功能,如果把所有单独的功能写成一个个lib文件的话,程序运行的时候要占用很大的内存空间,导致运行缓慢;但是如果将功能写成dll文件,就可以在用到该功能的时候调用 功能对应的dll文件,不用这个功能时将 dll文件移除内存,这样可以节省内存空间这种情况称为运行时链接!如果我们再把动态库的名字加上去呢?cpp view pla in copypri nt?1.gcc main.c -ldl ./libA.so ./libB.socrazybaby2./a.outcrazybaby3.libA common!4.libA common!cppview pla in copypri nt?1gcc

15、main.c -ldl ./libB.so ./libA.socrazybaby2./a.outcrazybaby3.libB common!4. libB common!同样可以得岀结论,动态链接库如果不加库连选项,函数调用是正确的加库路径,会以库的路径顺序为主左边覆盖右边.而且当只链接其中一个时也生效 如如果是两个静态库中有相同的函数,会造成同名冲突。但是动态库不会造成同名冲突。 也就是说动态库不会造成同名冲突。只有静态链接库才会造成同名冲突。12、 (2分)运算符的重载形式有两种,重载为重载为类的内部成员函数 和重载为类的友元函数 13、( 2分)main主函数执行完毕后,是否可能会再执

16、行一段代码?请说明理由?可以使用注册函数让程序在推岀main之后,程序终止之前执行自定义的一些代码!全局对象的构造函数会在 main函数之前执行利用atexit()函数可以在程序终止前完成一些 清理”工作如果将指向一组函 数的指针传递给atexit()函数,那么在程序退出 main()函数后(此时程序还未终 止)就能自动调用这组函数。在使用 atexit()函数时你要注意这样两点:main之前:预编译全局变量的初始化等main之后:全局变量的释放main函数执行之前,主要就是初始化系统相关资源mainCRTStartup 中被调用的在main之前会调用一系列初始化函数来初始化这个进程而在mai

17、n之后会调用exit(int)来进行进程的清理工作。可以用_onexit注册一个函数,可以用 _onexit 注册一个函数,它会在 main 之后执行 int fn1(void), fn2(void), fn3(void), fn4 (void);可能会执行一些注册过的Hook注意,atexit()以栈的方式注册函数,后注册的函数会先执行。_onexit和atexit()一样是以占的方式注册函数的,后注册的函数会被先执行。void main( void )14、(2分)C+中的空类,默认产生那些类成员函数?默认构造函数,析构函数,拷贝构造函数,赋值函数,取址函数(一对,一个const的,一个非

18、const的),第二部分概念简答(共10分)15、(4分)简述STL库的功能,并给出遍历一个包含一组整型数的vector的代码。1. 标准模板库(STL )使得C+编程语言在有了同Java 一样强大的类库的同时,保有了更大的可扩展性。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。2. 为广大C+程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。3. 从逻辑层次来看,在 STL中体现了泛型化程序设计的思想( generic programming )#in elude #in elude #in elude using namespaee std ;int main

19、()veetor data;data. push_back(1);data. push_baek(2);data. push_baek(3);data. push_baek(4);data. push_baek(5);data. push_baek(6);data. push_baek(7);veetor : iterator it ;for ( it =data . beg in (); it != data . en d(); it +)eout *it ;eout endl;system( pause);return 0;16、( 5分)请写出贝叶斯公式贝叶斯定理公式:P(A|B)=P(

20、B|A)*P(A)/P(B)17、( 5分)进程和线程的区别和联系?进程是程序的一次执行,线程可以理解为进程中执行的一段程序片段,在一个多任务的环境中下面的概念可以帮助我们理解两者之间的差别。1. 进程间是独立的,这表现在内存空间,上下文环境上;线程运行在进程空间内,线程之间并不是独立的,是并发执行的。一般来讲(不适用特殊技术),进程无法突破边界来存取其他进程的资源;而线程由于处于进程空间内,所以同一进程产生的线程共享同一 内存空间。2. 同一进程中的两段代码不能同时进行,除非引入线程。3. 线程是属于进程的,当进程退出时,该进程所产生的线程都会被强制退出并清除。线程 是CPU调度的基本单位,

21、进程是系统资源调度的基本单位。第三部分 算法设计与设计思考共 30 分18、( 10 分) 请不用任何 c runtime 函数实现以下函数:Inter trim_str(char *pstr) 函数功能如下:1) 滤掉字符串头尾的空格、回车、 tab2) 输出字符串通过输入字符串指针返回3) 如果成功则返回 0 否则返回非 0int trim ( char * str1 )if ( str1 =NULL)return 1;/*char str115= 12334 ;*/char * begin ,* end;begin =str1 ;end=str1 ;while (* end!= 0 )e

22、nd+;if (* end = | * end = t | * end = n )break ;* end=0 ;while (* begin != 0 )if (* begin = | * begin = t | * begin = n ) begin +;cout begin endl ; return 0;19、(10分)有 N 个大小不等的自然数( 求:时间复杂度为 o (n),空间复杂度为1, 2, 3,.N)请将它们从小到大排列。算法要O (1)。请简要说明你采用的排序算法并写出c的伪代码。n的大小而改变时,可表示为0(1);如当一个算法的空间复杂度为一个常量,即不随被处理数据量1

23、.#include 3.intsort( int data,int n);4.intmain()5.6.int data = 8,7,9,4,6,5,3,2,1;7.for (int i = 0 ;i sizeof(data)/ sizeof (int );i+)8.coutdatai;9.coutendl;10.sort(data,sizeof (data)/ sizeof (int );11.system(pause);12.return 1;13.14.intsort( int data,int n)15.16./保证空间复杂度为O(1)17.int tmp = 0;18.for (in

24、t i = 0;i n;i+)19.20./移动,直到第datai为i+1的时,while结束循环。向后继续判断21.while (datai != i+1)22.23./每次循环保证了 datai-1的正确。总共有n个所以时间复杂度为0(N)24.tmp = datadatai-1;25.datadatai-1 = datai;26.datai = tmp;27.2.using namespace std;由于while中移动的次序很少。所以近似为O(n)28. 29. for(inti = 0;i n;i+)30. coutdataivv;31. coutendl;32. return1;

25、33. 20、( 10分)用文字和图示(类图)描述你所知道的除单件模式和简单工厂之外的一种设 计模式,并用c+实现Adapter模式,就是适配器模式代码如下:class targetpublic :virtual void requst ()cout general interface. endl ;class adapteepublic :void specialrequst ()cout specialin terface specialrequst();target: requst ();private :adaptee* ade;int main()adapter *p= new ad

26、apter ();p-requst ();return 0;第四部分知识面考察共10分21、(10分)请在下列三题中任选一题作答A )什么是内存的垃圾回收集算法,其作用是什么?据你所知,有那些开发语言中提供了垃 圾收集机制?因此我们需要一种自动内存管理的策略,这就是自动垃圾回收机制。既然是自动垃圾回收,那么平台肯定得采取一种方式发现垃圾,然后清除。这就是垃圾收集算法所关注的问题。垃圾收集算法的任务就是将活动的对象和已经死掉的对象分别出来,然后将死掉的对象的内存回收,而且为了更好的利用内存,有的算 法还会对内存碎片进行压缩。下面会对常用的垃圾收集算法进行介绍:引用计数(Referenee Cou

27、nting )引用计数,顾名思义,就是每个对象上有个计数器,当添加了一个对它的引用时它的计数器就会加1,当不再使用这个引用时它的计数器就会递减1。当计数器为o的时候则认为该对象是垃圾,可以被回收了,如果该对象被回收则该对象所引用的所有对象的计数器会跟着递减。这样有可能会有很多对象的引用都减为0跟踪(trace )跟踪有以下几种方式。标记清扫(Mark-Sweep )使用跟1.标记(Mark Phase) 2.清扫(Sweep Phase)首先垃圾收集器会确定一些根(root ):比如线程 当前正在执行的方法的局部变量,方法参数,以及所在类的实例变量及所有静态变量。然后垃圾收集器会 从这些根对象

28、出发查找他们所有的引用,然后在被引用的对象上作标记(mark ),当垃圾收集器遇上一个已经被标记的对象后就不再往前走了(避免循环标记,造成死循环)。当标记阶段结束后,所有被标记的 对象就称为可达对象(Reachable Object )或活对象(Live Object ),而所有没有被标记的对象则被认为 是垃圾,可以被回收。踪对象的关系图,然后进行收集。使用跟踪方式的垃圾收集算法主要有以下几种标记压缩(Mark-Compact )标记压缩算法的标记阶段和标记清扫算法的标记阶段是一致的,就不再重复。使用标记压缩算法时,标记 完可达对象之后,我们不再遍历所有对象清扫垃圾了,我们只需要将所有存活对象

29、向左”靠齐,让不连续的空间变成连续的,这样就没有内存碎片了。不仅如此,因为不再连续的空间变成连续的,内存分配也更 快速了。标记拷贝(Mark-Copy,也有叫节点复制 )这种算法的一大特点就是将堆空间分为两部分:From , To。开始的时候我们只在 From里分配,当From分配满的时候岀发垃圾收集,这个时候会找岀From空间里所有的存活对象,然后将这些存活的对象拷贝到To空间里。这样From空间里剩下的就都全是垃圾JAVA,C#c#提供了 GC (grabage collection)专门用于自动回收垃圾,的垃圾机制,垃圾回收一般被放在Finalize、Dispose、close方法中B)现在非常多的用户都在谈SOA,根据Gartner的预测,2008年,企业80%应用都将通过使用SOA来实现,你理解 SOA是什么? SOA的关键特点有哪些? SOA带来什么? 面向服务的体系结构面向服务的体系结构(Service-Oriented Architecture ,SOA )是一个组件模型,它将应用程序的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论