资源描述
(全)近几年科大讯飞软件笔试题目
精品文档
2009讯飞软件开发笔试题目(C++)A卷
1、(4分)用变量a给出下面的定义
a) 一个整型数;
b)一个指向整型数的指针;
c)一个指向指针的指针,它指向的指针是指向一个整型数;
d)一个有10个整型的数组;
e)一个有10个指针的数组,该指针是指向一个整型数;
f)一个指向有10个整型数数组的指针;
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案:a)int a b)int *a; c)int **a; d)int a[10]; e)int *a [10];
f) int a[10], *p=a; g)int (*a)(int) h) int( *a[10])(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 B)i=2b ,j=00005,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
b) #define MIN(a,b) ((a)<(b)?(a):(b))
扩展:MAX宏 #define MAX ((a)>(b)(a):(b))
ABS宏 #define ABS (((x)>0)?(x):(-(x)))
4、(6分)以下为32为windows下的c++程序,请计算:
a)char str[]=”hello”;
char *p=str;
请计算:
sizeof(str)= sizeof(p)= strlen(p)=
答案:6, 4,5
b)void func(char str[100])
{
Void *p=malloc(100);
}
请计算:
sizeof(str)=101
sizeof (p)=4
c) int a[3]={1,2,3};
int b=sizeof(a)/sizeof(a[0]);
请计算:
b=3
5、(2分) 设有定义:int n=0,*p=&n,**q=&p; 则以下选项中,正确的赋值语句是(d)
a)p=1; b)*q=2; c)q=p; d)*p=5;
6、(2分)const关键字的用途?(至少说明两种)
答案:(1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
7、(2分)typedef的c语言中频繁用以声明一个已经存在的数据类型的同义词。也可以用以预处理器做类似的事情。例如:
#define dps struct s*
Typedef struct s *tps;
以上两种情况的意图都是要定义dps和tps作为一个指向结构s指针。哪种方法更好一些呢?(如果有的话)为什么?
Typedef更好一些,因为define只是简单的替换,比如声明dps a,b等价于struct *a,b;所以这样声明是错误的,而Typedef却不会这样。
8、(8分) 以下是一组有关内存知识的问题,请仔细看题,回答:
Void GetMemory(char *p)
{
P=(char *)malloc(100);
}
Void Test(void)
{
Char *str=Null;
GetMemory(str);
Strcpy(str,”hello world”);
Printf(str);
}
请问运行Test函数会有什么样的结果?
a)_会出错,不能传递动态分配的内存,str一直为空
char *GetMemory(void)
{
Char p[]=”hello world”);
Return p;
}
Void Test(void)
{
Char *str=NULL;
Str=GetMemory();
Printf(str);
}
请问运行Test函数会有什么结果?
b)_会产生错误,不能返回子函数的局部变量值,因为在函数退出时,局部变量的值也清空。
void GetMemory2(char **p,int num)
{
*p=(char *)malloc(num);
}
Void Test(void)
{
Char *str=NULL;
GetMemory(&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函数会有什么样的结果?
虽然能拷贝成功,但是这样使用很不安全,free(str)后,str成为悬浮指针。
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 A
{
Public:
B()
{printf(“B constructed.\n”);}
Virtual ~B()
{printf(“B deconstructed.\n”);}
Virtual void Fn()
{printf(“B fn called.\n”);}
};
Class C:public B
{
Public:
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<B*>(pA);
If(pB!=NULL)
pB->fn();
C * pC=static_cast<C*>(pA);
If(pC!=NULL)
pC->fn();
delete pA;
}
A constructed.
B constructed
B fn called.
B fn called.
B fn called.
B deconstructed.
A deconstructed.
10.(2分)以下说法错误的是:(b)
A)指针和引用作为函数参数都可以改变实参
B)指针和引用都可以在定义后任意的改变指向
C)引用必须在创建的时候初始化,而指针则不需要
D)不能空引用,但是可以有空指针
11、(2分) 下列关于多态的描述,错误的是(c)
A)C++语言的多态性分为编译时的多态和运行时的多态性
B)编译时的多态性可以通过函数重载来实现
C)运行时的多态性可以通过模板和虚函数来实现
D)实现运行时多态性的机制称动态绑定
12、(2分) 运算符的重载形式有两种,重载为_类的成员函数_和_类的友元函数_
13、(2分) main主函数执行完毕后,是否可能会再执行一段代码?请说明理由?
答:可以,可以用_onexit()注册一个函数,在main结束之后调用f1,f2,f3,f4。
14、(2分)C++中的空类,默认产生那些类成员函数?
答:默认构造函数、析构函数、默认拷贝函数和赋值操作符
15、(4分)简述STL库的功能,并给出遍历一个包含一组整型数的vector的代码。
答:标准模板库是一个基于模板的容器类库,包括链表、列表、队列和堆栈。标准模板库还包含许多常用的算法,包括排序和查找。标准模板库的目的是提供对常用需求重新开发的一种替代方法。标准模板库已经经过测试和调试,具有很高的性能并且是免费的。最重要的是,标准模板库是可重用的,当你知道如何使用一个标准模板库的容器后,就可以在所有的程序中使用它而不需要重新开发了。
容器是包容其他对象的对象。标准C++库提供了一系列的容器类,它们都是强有力的工具,可以帮助C++开发人员处理一些常见的编程任务。标准模板库容器类有两种类型,分别为顺序和关联。顺序容器可以提供对其成员的顺序访问和随机访问,关联容器则经过优化类的键值访问它们的元素。标准模板库在不同操作系统是可移植的。
#include<iostream>
#include<vector>
using namespace std;
int sum(vector<int > vec)
{
int result=0;
vector<int>::iterator p=vec.begin();
while(p!=vec.end())
{
cout<<*p<<" ";
result+=*p++;
}
return result;
}
int main()
{
vector<int> v1(100);
cout<<v1.size()<<endl;//100
cout<<sum(v1)<<endl;//0
v1.push_back(23);
cout<<v1.size()<<endl;//101
cout<<sum(v1)<<endl;//23
v1.reserve(1000);
v1[900]=900;
cout<<v1[900]<<endl;
cout<<v1.front()<<endl;
cout<<v1.back()<<endl;
v1.pop_back();
cout<<v1.back()<<endl;
return 0;
}
16、(5分)请写出贝叶斯公式
若A1,A2,…,An构成完备事件组,且P(Ai)>0,(i=1,2,…,n) ,则对任一事件B(P(B)>0)有:
17、(5分)进程和线程的区别和联系?
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4) 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些
18、(10分) 请不用任何c runtime函数实现以下函数:
Inter trim_str(char *pstr)
函数功能如下:
1) 滤掉字符串头尾的空格、回车、tab
2) 输出字符串通过输入字符串指针返回
3) 如果成功则返回0否则返回非0
#include<iostream>
using namespace std;
#define ERR -1;
int trim_str(char *pstr)
{
char *p=pstr;
char *m;
if(p==NULL)
{
return ERR;
}
while(*p!='\0')
{
if((*p==' ')|(*p=='\n')|(*p=='\t'))
{
m=p;
while(*m!='\0')
{
*m=*(m+1);
m++;
}
}
else
{
p++;
}
}
return 0;
}
int main()
{
char s[]="ab de edeasd ";
int i=trim_str(s);
if(i==0)
{
cout<<"成功"<<endl;
}
else
{
cout<<"失败"<<endl;
}
cout<<s<<endl;
return 0;
}
19、(10分)有N个大小不等的自然数(1,2,3,…..N)请将它们从小到大排列。算法要求:时间复杂度为O(n),空间复杂度为O(1)。请简要说明你采用的排序算法并写出c的伪代码。
#include<iostream>
using namespace std;
const int MAX=1000;
int data[MAX];
void paixu(int *p,int m)
{
int k=0;
for(int i=0;i<MAX;i++)
{
data[i]=0;
}
for(int j=0;j<m;j++)
{
data[*(p+j)]++;
}
for(i=0;i<MAX;i++)
{
if(data[i]!=0)
{
for(j=0;j<data[i];j++)
{
*(p+k)=i;
k++;
}
}
}
}
int main()
{
int a[]={1,3,1,27,13,2,4,80,43,23,18,46};
int len;
len=sizeof(a)/sizeof(int);
paixu(a,len);
for(int i=0;i<len;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
20、(10分) 用文字和图示(类图)描述你所知道的除单件模式和简单工厂之外的一种设计模式,并用c++实现
单例模式:
类图:
Singleton
<<static>>singleton:Singleton *
<<static>>GetInstance()
Singleton()
class Singleton
{
public:
static Singleton* GetInstance();
private:
Singleton(){}
~Singleton(){}
static Singleton *singleton;
}
Singleton* Singleton::singleton=NULL;
Singleton* Singleton::GetInstance()
{
if(singleton==NULL)
singleton=new Singleton();
return singleton;
}
21、(10分)请在下列三题中任选一题作答
A)什么是内存的垃圾回收集算法,其作用是什么?据你所知,有那些开发语言中提供了垃圾收集机制?
答:一种自动内存管理的策略,就是自动垃圾回收机制。既然是自动垃圾回收,那么平台肯定得采取一种方式发现垃圾,然后清除。这就是垃圾收集算法所关注的问题。
垃圾收集算法的任务就是将活动的对象和已经死掉的对象分别出来,然后将死掉的对象的内存回收,而且为了更好的利用内存,有的算法还会对内存碎片进行压缩。
JAVA,C#
B)现在非常多的用户都在谈SOA,根据Gartner的预测,2008年,企业80%应用都将通过使用SOA来实现,你理解SOA是什么?SOA的关键特点有哪些?SOA带来什么?
答:面向服务的体系结构 面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。
C)随着互联网的普及,很多新兴的、传统的软件厂商都在探讨SAAS的前景,甚至很多行业观点认为SAAS是软件行业的未来趋势。你是怎么理解SAAS的,你怎么看待这种趋势?SAAs和更早之前的ASP感念有什么异同?
答:SaaS(Software-as-a-service)的意思是软件即服务,
SaaS的中文名称为软营或软件运营。SaaS是基于互联网提供软件服务的软件应用模式。作为一种在21世纪开始兴起的创新的软件应用模式,SaaS是软件科技发展的最新趋势 SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统。就像打开自来水龙头就能用水一样,企业根据实际需要,从SaaS提供商租赁软件服务。
13、指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查
14 、多线程问题
为什么多线程会比单线程更耗时呢?其原因就在于,线程启停以及线程上下文切换都会引起额外的开销,所以消耗的时间比单线程多。
为什么加锁后的三线程比两线程还慢呢?其原因也很简单,那把读写锁就是罪魁祸首。实际情况并不是并行执行,反而成了串行执行,
在采用多线程方法设计程序时,如果产生的额外开销大于线程的工作任务,就没有并行的必要。线程并不是越多越好,软件线程的数量尽量能与硬件线程的数量相匹配。最好根据实际的需要,通过不断的调优,来确定线程数量的最佳值。
15、什么是虚拟存储器?虚拟存储器的特点是什么?
虚拟存储器:在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。
虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。
特点:多次性、对换性、虚拟性。
多次性是指一个作业被分成多次调入内存运行,亦即在作业运行时没有必要将其全部装入,只需将当前要运行的那部分程序和数据装入内存即可;以后每当要运行到尚未调入的那部分程序时,再将它调入。
对换性是指允许在作业的运行过程中进行换进、换出,亦即,在进程运行期间,允许将那些暂不使用的程序和数据,从内存调至外村的对换区(换出),待以后需要时再将它们从外存调至内存(换进)。
虚拟性是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。
16、什么是this指针?其主要功能是什么?
this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。
全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用
return *this;
另外一种情况是当参数与成员变量名相同时使用this指针,如this->n = n (不能写成n= n)
17、C++常见的内存错误:
1. 内存泄露:指应用程序未释放动态申请的且不再使用的内存,原因可能是程序员疏忽或者错误造成程序异常。在C/C++中,动态申请的内存是在堆上的。如果发送此类的内存泄露,函数每执行一次就丢失一块内存。长时间运行改程序可能引起系统"内存耗尽"。
2. 野指针:未初始化的指针称为野指针。通常的避免方法就是在指针定义的时候就初始化,初始为NULL或者一个有意义的内存地址。对于动态申请的内存地址,在该内存释放之后,对应指针最好立即赋值为NULL。并在具体使用指针的时候判断指针的值是否为NULL。
3. 内存越界访问:内存越界访问通常发生在数组、字符串或者连续内存的访问。有两种情况:读越界,即读了非有效的数据。如果所读的内存地址是无效的,程序会立即崩溃。如果所读内存地址是有效的,读入的时候不会有错误,但是读入的数据是随机的,可能会产生不可控制的后果。举个简单的例子,字符串输出,如果没有结束符,会输出一堆乱码也可能输出正常,也就是说结果是不可控的。写越界,亦称为缓冲区溢出,通常写越界会发生错误。内存写越界造成的后果是非常严重的。例如访问数组越界可能会修改访问数组的循环变量,造成死循环。
4. 返回指向临时变量的指针char * getString(){char b[] = "Hello, Tocy!"; return b;}
5. 试图修改常量
6. 内存未分配成功,但已经使用
7. 内存分配成功,但没有初始化
附加:goto语句有没有必要存在程序设计语言中
答案:结构程序设计是避免使用GOTO语句的一种程序设计; 结构程序设计是自顶向下的程序设计; 结构程序设计是一种组织和编制程序的方法,利用它编制的程序易于理解、易于修改; 程序结构化的一个主要功能是使程序正确性的证明容易实现; 结构程序设计对设计过程中的每一步去验证其正确性,这样便自动导致自我说明和自我捍卫的程序设计风格;
2012年科大讯飞软件笔试题
一、单选题
1、64变形的外角和是多少(A)是360度
A、1*360 B、1*180
C、64*360 D、64*180
2、有一盆衣服(已经洗过了,需要漂洗),请问在漂洗次数固定的情况下如何分配水才能把衣服洗得最干净(C)
A、从少到多 B、从多到少
C、平均分配,是求函数极值问题 D、随便洗
3、用力拉一根橡皮筋,橡皮筋上有没有点还处在原来的位置没有被拉走(B)
A、有 B、没有
C、有是有、有时没有 D、一般人拉没有,刘谦拉就有
4、假设一个应用程序需要使用多个提供不同功能但在皆接口上有差异的类,适合使用的设计模式是(D(确定))
A、装饰模式 B、迭代器模式
C、工厂模式 D、适配器模式
5、结构化程序设计主要强调的是(C)
A、程序的规模 B、程序的效率
C、程序的易读性 D、程序设计语言的先进性
6、SQL Server中,删除一个表的命令是(C)
A、DELETE B、CLEAR C、DROP D、REMOVVE
7、以下关于互斥量说法错误的是:(B)
A、单线程程序不需要使用互斥量
B、互斥量可以被两个以上的线程锁定
C、互斥量的激活是原子操作
D、互斥量的创建和销毁可以在不同的线程进行
8、在Windows任务管理器中发现某个进程CPU占用率长时间处于100%,以下可能导致该现象的原因是(D)
A、程序处于大量I/O过程中 B、多线程导致进程死锁
C、等带另一个程序响应 D、程序进入死循环
9、假设进程中一个生产者线程,10个消费者线程,为保证进程间不出现死锁,信号量的初值可以设置为(C)
A、-1 B、0
C、1 D、10
10、使用两个栈共享一片空间时,当(D)时,才产生溢出
A、其中一个栈的栈底到达这片内存空间的中心点
B、其中一个栈的栈顶到达这片内存空间的中心点
C、两个栈均不空,且一个栈的栈顶到达另一个栈的栈底(不可能发生这种情况)
D、两个栈的栈顶在这片内存空间的某一位置相遇
11、在一个单链表HL中,若要在指针所指节点的后面插入一个有指针second所指向的节点,则执行(A)
A、second->next=first->next ; first->next=second;
B、first->next=second->next;second=first;
C、second->next=first->next ; second->next=first;
D、first->next=second->next;second->next=first;
12、以下C语言编译过程的真确步骤是(B)
A、预处理 编译 汇编 连接 B、预处理 编译 优化(不能少了优化) 汇编 连接
C、编译 优化 汇编 运行 D、编辑 预处理 编译 汇编 优化 运行
13、在C语言程序编译时出现如下错误:
“error LNK2019:unresoved external symbol"int__cdecl test(int)"(?test@@YAHH@Z) referenced”可能的原因是(D)
A、函数未定义 B、变量未声明 C、变量未定义 D、函数未声明
14、下列关于C语言中的函数叙述错误的是(B)
A、一个函数中可以有多条return语句
B、调用函数必须要在一条独立的语句中完成
C、函数可以通过return语句传递函数值
D、主函数main可以带有参数
15、在C语言中,打开可读写的二进制文件myfile并向该文件追加写入内容,如果myfile不存在则创建新文件,正确的调用方式为()
A、fopen("myfile","w") B、fopen("myfile","wb")
C、fopen("myfile","r+b") D、fopen("myfile","a+b")
a 表示追加文件内容。
16、在C语言中,一个short int型数据在内存中占2字节,则short int型数据的取值范围(B)
A、-256~255 B、-32768~32767
C、-65536~65535 D、-2147483647-2147683648
17、下面是对数组s的初始化,其中不正确的是(D)
A、char s[6]={"abcd"}; B、char s[6]={'a','b','c','d'}
C、char s[6]="" ; D、char s[6]="abcdef"
18、有以下一段程序代码:
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
请问运行Test函数会有什么样的结果(A)
A、hello B、无效指针,输出不确定
C、NUll D、程序崩溃
19、在32位系统中,有一类:
class A
{
public:
virtual int test();
virtual double test2();
int test3();
protected:
double test4();
private:
int a,b,c;定义了三个变量,加上一个虚函数表指针。大小为16
};
请问sizeof(A)=(B)
A、12 B、16 C、28 D、32
20、有以下一段程序代码:
class A
{
public:
virtual void func1(){printf("A'sfuncl");}
void func2(){("A'sfunc2")};
}
class B:public A
{
public:
virtual void func1(){printf("B'sfuncl");}
void func2(){("B'sfunc2")};
}
void main()
{
B inst_b;
B *ptr_a=&b;
ptr_a->func1();
ptr_a->func2();
}
程序的输出结果为:(C)
A、A'sfuncl B'sfunc2 B、B'sfuncl A'sfunc2
C、B'sfuncl B'sfunc2 D、A'sfuncl A'sfunc2
二、填空题
1、操作系统中的存储管理常用__虚拟存储器__的方式来摆脱主存容量的限制。
2、满二叉树第i层上的叶子节点数有_2^(i-1)___个。
3、二分查找算法平均时间复杂程度是___o(log(n))_____。
4、设x=3,y=2,x<<y=___12___。
5、非成员函数声明为类的__友元函数_____才能访问这个类的private成员。
6、带有____纯虚函数____的类称为抽象类,它只能作为基类来使用。
三、简答题(每题6分,共18分)
1、列举你所知道的排序算法和它们的平均复杂程度。
答:1、冒泡排序(bubble sort) — O(n^2)
2、鸡尾酒排序(Cocktail sort, 双向的冒泡排序) — O(n^2)
3、插入排序(insertion sort)— O(n^2)
4、选择排序(selection sort)— O(n^2)
5、堆排序(heapsort)— O(nlog n)
6、快速排序(quicksort)— O(nlog n)
2、列举析构函数与普通类成员函数的不同点。
答:1、析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud( )
2、它不能带任何参数,也没有返回值(包括void类型)。
3、只能有一个析构函数,不能重载
4、析构函数在对象生存期即将结束的时刻被自动调用
3、在C++语言中使用宏定义经常会引起一些错误(如少打括号引起表达式值与预期不符等),列举一些可以代替宏定义的方法。
Method 1:内联函数,
Method 2:const方法
Method 3:typedef 方法。
四、编程题(共三题20分)
1、 斐波那契数列的形式如下:1,1,2,3,5,8,13……,n,编写一个函数计算数列中第n个元素的值。(5分)
2、不调用任何系统函数,实现一个字符串查找子串的函数,如果包含字串,则返回该字符串的位置值,如果不包含,则返回-1。(7分)
分两步,
第一步:找到字符串中与子串首字符相等的字符在字符串中的位置。
第二步:比较以后的字符是否相等。如果不等,记录上次找到的第一次相等的位置,从这以后再寻找找到字符串中与子串首字符相等的字符在字符串中的位置。
然后再比较以后的字符是否相等。
2、 用算法实现将一个输入的数字颠倒(输入12345->54321),要求不调用任何系统函数,也不能将输入的数字转换为字符串作为中间过渡。(8分)
2013年科大讯飞软件类笔试题
1、相同表面积的正三棱锥、四面体、六面体、正十二面体以及正二十面体,其中体积最大的是?
正二十面体,物体越接近于球,体积越大
2、上山和下山的路程都是1km,上山时速度15km/h,下山速度为多少才能到达时速30km/h(D)
A 45km/h B 大于45km/h C 接近光速 D 永远不可能
设下坡速度x,则:1/x+1/15=2/30 ==> 1/x=0
3、三个骰子,出现两个点数一样的概率(5/12)
4、凡是包含纯虚函数的类都是抽象类吗? 对的
5、数据库oder by 和having知识点的。
6、对应“一个接口不同行为”的设计模式是。
填空题
1、对于无序整型数字的排序用什么算法最佳。快速排序
2、一串数字16个,用折半查找查找一个存在的数字最多查多少次。
3、构造函数、重载运算符函数、-------不能定义为虚函数。静态成员函数
4、STL由xx、迭代器、算法组成。我答容器
5、生产模式和消费者模式都要用到的数据结构是什么?
简答题:
1、线程和进程用到的技术
2、析构函数和普通成员函数的区别
3、冒泡和快排的优缺点
4、指针和引用的区别
答:
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
三个编程题:
1、统计一个字节中被置1的位数,算法效率要求尽可能的高。
2、不能被继承且只能示例化三次。
#include<iostream>
using namespace std;
class Singleton
{
public:
static int count;
static Singleton* GetInstance()
{
if(count>0)
{
count--;
return new Singleton();
}
else
{
return NULL;
}
}
static void DeleteInstance(Singleton *PInstance)
{
if(PInstance!=NULL)
{
delete PInstance;
PInstance=NULL;
}
else
{
cout<<"is NULL"<<endl;
}
}
static void G
展开阅读全文