C++貌似也有一套,华为前几天在某学校举办C++大赛的题目:
注意:如对考试题目有任何疑问,请举手与现场监考人员联系,监考人员会协助跟出题人员
澄清疑问)
所有答案写答题纸上,写试卷纸上无效。[详见考试说明]
第一部分:客观题
客观题部分,共30分,建议这部分答题用40分钟。
一、 单选题 (每题1分,共10题)
1、 下列那种不是任务间通讯的方式____
A)信号量
B)消息队列
C)共享内存
D)中断
2、 以下叙述中不正确的是____
A)在不同的函数中可以使用相同名字的变量
B)函数中的形式参数是局部变量
C)在一个函数内定义的变量只在本函数范围内有效
D)在一个函数内的复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括
号构成的代码)
3、 若整型变量a的值为50,则c语言表达式a>>2的值为____
A)50
B) 25
C) 12.5
D) 12
4、 下面方法中,哪一个不能很好解决死锁问题?____
A) 给每一个进程不同的优先级,并按照优先级的大小决定在资源队列中的顺序。
B) 让进程开始运行时获得全部的资源,在不能获得全部资源时重新启动。
C) 给资源编号,并要求进程按照编号的顺序申请资源。
D) 提供超时机制,在进程进入资源等待后一段随机时间内重起进程。
5、 下面的程序是对二叉树的前序遍历,请写出下面空格中的语句____
其中,Visit函数表示访问节点数据。
void PreOrder(BinaryTreeNode *t)
{
// 对* t进行前序遍历
if (t)
{
(_1_);
(_2_);
(_3_);
}
}
A) PreOrder(t->LeftChild) Visit(t) PreOrder(t->RightChild)
B) PreOrder(t->LeftChild) PreOrder(t->RightChild) Visit(t)
C) Visit(t) PreOrder(t->RightChild) PreOrder(t->LeftChild)
D) Visit(t) PreOrder(t->LeftChild) PreOrder(t->RightChild)
6、 已知int a[]={10,9,8,7,6}; int *p = a;则(*(p+1))*(p+2)[2]的值是____
A)72
B)80
C)54
D)有语法错误
7、 下面关于new 和delete操作符的说法,哪个是不正确的____
A)使用new操作符,可以动态分配全局堆中的内存资源
B)若p的类型已由A*强制转换为void *,那么执行语句delete p;时,类A的析构函数不会
被调用
C)new和delete通常成对地使用
D)执行语句A * p=new A[100];时,类A的构造函数只会被调用1次
8、 如下代码,正确的是____
class CExample
{
public:
static void Func( void* pobj );
private:
char m_cTest;
};
A) void CExamle::Func( void* pobj )
{
m_cTest = ( char )0;
}
B) 在Func内部不能访问类的私有成员m_cTest;
C) void CExample::Func( void* pobj )
{
CExample *pThis;
pThis = dynamic_cast< CExample* >( pobj );
ASSERT( NULL != pThis );
pThis->m_cTest = ( char )0;
}
D) void CExample::Func( void* pobj )
{
CExample::m_cTest = ( char )0;
}
9、 对于下面的类CA,在32位计算机、4字节对齐的情况下,sizeof(CA) = ____
class CA
{
public:
CA();
virtual ~CA();
private:
int m_iTime;
public:
int GetTime();
int SetTime(int iTime);
};
A)16
B)12
C)8
D)4
10、 对于下面的代码,描述正确的是____
class A
{
public:
virtual void test();
};
class B: public A
{
public:
void test();
...
};
class C: public B
{
public:
void test();
...
};
A) B类的test函数是虚函数,而C类的也是
B) B类的test函数不是虚函数,C类的是
C) B类的test函数是虚函数,而C类的不是
D) C类的test函数不是虚函数
二、 多选题 (每题2分,共10题,少选可得1分)
11、 关于变量定义,下列说[屏蔽]确的有____
A)公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦
合度
B)命名中若使用特殊约定或缩写,则要有注释说明
C)变量名的命名要清晰、明了,有明确含义
D)除非必要,不要用数字或较奇怪的字符来定义标识符
12、 请找出以下程序中的错误,不考虑命名规范和排版的问题____
long strlen(char *p )
{
ASSERT(p);
long i = 0;
while (*p)
{
i++;
p++;
}
return i;
}
ShowErrMsg(char *msg)
{
int nCount = 1; -------A
if (msg == NULL) return;
char *pBuf = (char *)malloc(256); -------B
if (pBuf == NULL) return;
if ( strlen(msg) > 256 )
{
strncpy(pBuf, msg, 256);
pBuf[256] = ‘\0’;
}
else
{
strcpy( pBuf, msg); -------C
}
printf( "No. %d: This message is: %s\n", nCount, pBuf );
nCount++;
pBuf = NULL; -------D
}
13、 下列代码中对const关键字的使用是正确并有意义的____
class SomeClass
{
private:
int m_nValue;
char* m_pszName;
public:
SomeClass(int id);
int GetValue() const; //---------------- A
void SetValue(const int value); //------ B
const char* GetName(); //---------------- C
void SetName(const char* pszName); //--- D
void DoSomething(char* const p); //------ E
}
14、 多任务系统中,任务所具有的基本状态有____
A)就绪
B)执行
C)阻塞
D)挂起
15、 下列说明哪些是正确的____
A)一个类必须至少提供一个构造函数
B)缺省构造函数是指不用指定任何实参就能被调用的构造函数,这并不意味着它不能接受
实参
C)父类的构造函数肯定在子类的构造函数之前被调用
D)如果一个类不显式地提供缺省构造函数则编译器会自动生成一个以初始化其数据成员
E)子类的析构函数中要调用父类的析构函数以确保父类的成员被释放
F)构造和析构函数中不应该调用虚函数
16、 在一个老版本代码中已经声明了myfunc函数:int myfunc(int a,double b),小李在
开发新版本时增加了如下几个函数声明,请问哪些不是对老版本函数的重载声明____
A)int myfunc(int c, double d)
B)int myfunc(int a,double b=0.5)
C)double myfunc(int , double )
D)int myfunc(double b,int a)
17、 类B的析构函数不为virtual,类D是类B的子类,并且是public继承的,B和D都定义了
缺省的构造函数,下面正确代码段有____
A)B* pb = new B;delete pb;
B)D* pd = new D;delete pd;
C)B* pb = new D;delete pb;
D)D d;B* pb = &d;
18、 假定类CA的声明如下, 下面哪些语句声明了a是CA的对象____
class CA
{
public:
CA ();
CA (int iValue);
... ...
};
A)CA a;
B)CA a();
C)CA a(100);
D)CA a = 100;
19、 下面关于指针和引用的说[屏蔽]确的是____
A)指针变量存放的是内存地址,并且可以置为0
B)定义引用变量时,必须同时指明具体被引用的对象或变量
C)使用取地址操作符,可以取得指针变量自身的地址,但取不到引用变量自身的地址
D)类中的数据成员可以是指针变量,但不能是引用变量
20、 下列代码中正确的有____
A)char* p = malloc(100); free(p);
B)char* p = malloc(100); delete p;
C)char* p = new char[100]; delete p;
D)char* p = new char[100]; delete[] p;
E)char p[100]; delete[] p;
F)char p[100]; delete p[100];
三、 编程题(共2题,第1题40分,第2题30分。请上机编写程序,按题目要求提交文件。本
试题采用自动测试用例进行评分,测试用例不对考生公开?,凡不满足提交要求导致不能编
译或用例不通过,不予评分)。
1. 报数游戏
问题描述:
设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M
个人时,此人出圈,再从他的下一个人重新开始1到M的报数,如此进行下去直到所有的人都
出圈为止。现要打印出出圈次序。
要求实现函数:
void circle_sort (int n, int s, int m, int *p)
输入:n 游戏总人数 s 报数的起始编号 m 报数的数值
输出:p 指向长度为n的数组,出圈次序保存在p指向的数组中
示例
n=7 s=2 m=3 出圈次序为:4 7 3 1 6 2 5
n=3 s=1 m=2 出圈次序为:2 1 3
2. 实现子串查找程序
问题描述:
判断一个字符串(dst)是否是另一个字符串(src)的子串;
输出子串在母串中的第一次出现的起始位置;
匹配的时候不区分大小写;
不能使用库函数(使用库函数按0分计算);
要求实现函数:
unsigned int str_str(char * src, char *dst);
返回:如果dst是src的子串 则返回起始位置
如果不是 则返回0
输入:src 指向母串的指针; dst 指向子串的指针
示例
src->akrsd5859 dst->rsd
则返回3
src->Rstsawerst36ds dst->rst
则返回8
src->dfsge dst-> dfsgesa
则返回0