中兴软创C++笔试
姓名 ____________ 学校 ____________ 电话 ___________
一、填空
1.在类中必须声明成员函数可以写在类外。
2.如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应该是 引用 类型或 指针 类型。 3. 4.进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参 个数 或 类型 必须不同。
5.通过一个函数。
6.函数的递归调用是指函数直接或间接地调用 7.拷贝构造函数的形参必须是
二、阅读下列程序,写出其运行时的输出结果
如果程序运行时会出现错误,请简要描述错误原因。 1.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序:
#include #include class Base { private:
char msg[30]; protected: int n; public:
Base(char s[],int m=0):n(m) { strcpy(msg,s); }
void output(void)
{ cout
class Derived1:public Base
{ private: int n; public:
Derived1(int m=1):
Base(
{ n=m; }
void output(void) { cout
class Derived2:public Derived1 { private: int n;
public:
Derived2(int m=2):
Derived1(m-1)
{ n=m; }
void output(void) { cout
void main(void) {
Base B(
(2)程序:
#include class Samp {public:
void Setij(int a,int b){i=a,j=b;} ~Samp() { }
int GetMuti(){return i*j;}
cout
};
int main() {
Samp *p; p=new Samp[5]; int i; int j;
protected:
if(!p) { }
for(int j=0;j
p[j].Setij(j,j);
cout
}
for(int k=0;k
cout
delete[]p; return 0;
2.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序:
#include #include class Vector {
public:
Vector(int s=100); int& Elem(int ndx); void Display(void); void Set(void); ~Vector(void); protected: int size; int *buffer;
};
Vector::Vector(int s) {
buffer=new int[size=s]; }
int& Vector::Elem(int ndx) {
if(ndx=size) {
cout
return buffer[ndx]; }
void Vector::Display(void) {
for(int j=0; j
void Vector::Set(void) {
for(int j=0; j
Elem(j)=j+1;
cout
}
Vector::~Vector(void) {
delete[] buffer; }
void main() {
Vector a(10); Vector b(a); a.Set(); b.Display(); }
(2)程序:
#include
class CAT
{
public:
CAT();
CAT(const &CAT); ~CAT();
int GetAge(){ return *itsAge; } void SetAge( int age ) { *itsAge=age; } protected: };
CAT::CAT() { }
itsAge=new int; *itsAge=5; int * itsAge;
CAT::~CAT() { }
void main() { CAT a;
cout
cout
cout
delete itsAge; itsAge=NULL;
三、阅读下列程序及说明和注释信息,在方框中填写适当的程序段,使程序完成指定的功能
程序功能说明:从键盘读入两个分别按由小到大次序排列的整数序列,每个序列10个整数,整数间以空白符分隔。用这两个序列分别构造两个单链表,每个链表有10个结点,结点的数据分别按由小到大次序排列。然后将两个链表合成为一个新的链表,新链表的结点数据仍然按由小到大次序排列。最后按次序输出合
并后新链表各结点的数据。
程序运行结果如下,带下划线部分表示输入内容,其余是输出内容:
1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include #include
//类定义部分
template class Node {
private:
Node *next; //指向后继节点的指针 public:
T data; //数据域
Node (const T& item, Node* ptrnext = NULL); // 构造函数 void InsertAfter(Node *p); //在本节点之后插入一个同类节点p Node *DeleteAfter(void); //删除本节点的后继节点,返回其地址 Node *NextNode(void) const; // 获取后继节点的地址 };
template class LinkedList {
private:
Node *front, *rear; // 表头和表尾指针
Node *prevPtr, *currPtr; //记录表当前遍历位置的指针,由插入和删除操作更新 int size; // 表中的元素个数
int position; // 当前元素在表中的位置序号。由函数Reset使用 Node *GetNode(const T& item,Node *ptrNext=NULL);
// 生成新节点,数据域为item,指针域为ptrNext void FreeNode(Node *p); //释放节点
void CopyList(const LinkedList& L); // 将链表L 拷贝到当前表
//(假设当前表为空)。被拷贝构造函数、operator=调用
public:
LinkedList(void); // 构造函数
LinkedList(const LinkedList& L); //拷贝构造函数 ~LinkedList(void); // 析构函数
LinkedList& operator= (const LinkedList& L);//重载赋值运算符 int ListSize(void) const; //返回链表中元素个数(size) int ListEmpty(void) const; //size为0时返回TRUE,否则返回FALSE void Reset(int pos = 0); //将指针currPtr移动到序号为pos的节点, //prevPtr相应移动,position记录当前节点的序号 void Next(void); //使prevPtr和currPtr移动到下一个节点
int EndOfList(void) const; // currPtr等于NULL时返回TRUE, 否则返回FALSE int CurrentPosition(void) const; //返回数据成员position
void InsertFront(const T& item); //在表头插入一个数据域为item的节点 void InsertRear(const T& item); //在表尾添加一个数据域为item的节点 void InsertAt(const T& item); //在当前节点之前插入一个数据域为item的节点 void InsertAfter(const T& item); //在当前节点之后插入一个数据域为item的节点 T DeleteFront(void); //删除头节点,释放节点空间,更新prevPtr、currPtr和size void DeleteAt(void); //删除当前节点,释放节点空间,更新prevPtr、currPtr和size T& Data(void); // 返回对当前节点成员data的引用
void ClearList(void); // 清空链表:释放所有节点的内存空间。 };
//类实现部分略......
template
void MergeList(LinkedList* la, LinkedList* lb,LinkedList* lc) {
//合并链表la和lb,构成新链表lc。
}
void main(void) {
LinkedList la, lb, lc; int item, i; la.Reset();
lb.Reset();
MergeList(&la, &lb, &lc);//合并链表 lc.Reset();
cout
中兴软创C++笔试
姓名 ____________ 学校 ____________ 电话 ___________
一、填空
1.在类中必须声明成员函数可以写在类外。
2.如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应该是 引用 类型或 指针 类型。 3. 4.进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参 个数 或 类型 必须不同。
5.通过一个函数。
6.函数的递归调用是指函数直接或间接地调用 7.拷贝构造函数的形参必须是
二、阅读下列程序,写出其运行时的输出结果
如果程序运行时会出现错误,请简要描述错误原因。 1.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序:
#include #include class Base { private:
char msg[30]; protected: int n; public:
Base(char s[],int m=0):n(m) { strcpy(msg,s); }
void output(void)
{ cout
class Derived1:public Base
{ private: int n; public:
Derived1(int m=1):
Base(
{ n=m; }
void output(void) { cout
class Derived2:public Derived1 { private: int n;
public:
Derived2(int m=2):
Derived1(m-1)
{ n=m; }
void output(void) { cout
void main(void) {
Base B(
(2)程序:
#include class Samp {public:
void Setij(int a,int b){i=a,j=b;} ~Samp() { }
int GetMuti(){return i*j;}
cout
};
int main() {
Samp *p; p=new Samp[5]; int i; int j;
protected:
if(!p) { }
for(int j=0;j
p[j].Setij(j,j);
cout
}
for(int k=0;k
cout
delete[]p; return 0;
2.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序:
#include #include class Vector {
public:
Vector(int s=100); int& Elem(int ndx); void Display(void); void Set(void); ~Vector(void); protected: int size; int *buffer;
};
Vector::Vector(int s) {
buffer=new int[size=s]; }
int& Vector::Elem(int ndx) {
if(ndx=size) {
cout
return buffer[ndx]; }
void Vector::Display(void) {
for(int j=0; j
void Vector::Set(void) {
for(int j=0; j
Elem(j)=j+1;
cout
}
Vector::~Vector(void) {
delete[] buffer; }
void main() {
Vector a(10); Vector b(a); a.Set(); b.Display(); }
(2)程序:
#include
class CAT
{
public:
CAT();
CAT(const &CAT); ~CAT();
int GetAge(){ return *itsAge; } void SetAge( int age ) { *itsAge=age; } protected: };
CAT::CAT() { }
itsAge=new int; *itsAge=5; int * itsAge;
CAT::~CAT() { }
void main() { CAT a;
cout
cout
cout
delete itsAge; itsAge=NULL;
三、阅读下列程序及说明和注释信息,在方框中填写适当的程序段,使程序完成指定的功能
程序功能说明:从键盘读入两个分别按由小到大次序排列的整数序列,每个序列10个整数,整数间以空白符分隔。用这两个序列分别构造两个单链表,每个链表有10个结点,结点的数据分别按由小到大次序排列。然后将两个链表合成为一个新的链表,新链表的结点数据仍然按由小到大次序排列。最后按次序输出合
并后新链表各结点的数据。
程序运行结果如下,带下划线部分表示输入内容,其余是输出内容:
1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include #include
//类定义部分
template class Node {
private:
Node *next; //指向后继节点的指针 public:
T data; //数据域
Node (const T& item, Node* ptrnext = NULL); // 构造函数 void InsertAfter(Node *p); //在本节点之后插入一个同类节点p Node *DeleteAfter(void); //删除本节点的后继节点,返回其地址 Node *NextNode(void) const; // 获取后继节点的地址 };
template class LinkedList {
private:
Node *front, *rear; // 表头和表尾指针
Node *prevPtr, *currPtr; //记录表当前遍历位置的指针,由插入和删除操作更新 int size; // 表中的元素个数
int position; // 当前元素在表中的位置序号。由函数Reset使用 Node *GetNode(const T& item,Node *ptrNext=NULL);
// 生成新节点,数据域为item,指针域为ptrNext void FreeNode(Node *p); //释放节点
void CopyList(const LinkedList& L); // 将链表L 拷贝到当前表
//(假设当前表为空)。被拷贝构造函数、operator=调用
public:
LinkedList(void); // 构造函数
LinkedList(const LinkedList& L); //拷贝构造函数 ~LinkedList(void); // 析构函数
LinkedList& operator= (const LinkedList& L);//重载赋值运算符 int ListSize(void) const; //返回链表中元素个数(size) int ListEmpty(void) const; //size为0时返回TRUE,否则返回FALSE void Reset(int pos = 0); //将指针currPtr移动到序号为pos的节点, //prevPtr相应移动,position记录当前节点的序号 void Next(void); //使prevPtr和currPtr移动到下一个节点
int EndOfList(void) const; // currPtr等于NULL时返回TRUE, 否则返回FALSE int CurrentPosition(void) const; //返回数据成员position
void InsertFront(const T& item); //在表头插入一个数据域为item的节点 void InsertRear(const T& item); //在表尾添加一个数据域为item的节点 void InsertAt(const T& item); //在当前节点之前插入一个数据域为item的节点 void InsertAfter(const T& item); //在当前节点之后插入一个数据域为item的节点 T DeleteFront(void); //删除头节点,释放节点空间,更新prevPtr、currPtr和size void DeleteAt(void); //删除当前节点,释放节点空间,更新prevPtr、currPtr和size T& Data(void); // 返回对当前节点成员data的引用
void ClearList(void); // 清空链表:释放所有节点的内存空间。 };
//类实现部分略......
template
void MergeList(LinkedList* la, LinkedList* lb,LinkedList* lc) {
//合并链表la和lb,构成新链表lc。
}
void main(void) {
LinkedList la, lb, lc; int item, i; la.Reset();
lb.Reset();
MergeList(&la, &lb, &lc);//合并链表 lc.Reset();
cout