问答题
请使用VC6或使用[答题]菜单打开考生文件夹proj2下的工程proj2,此工程中含有一个源程序文件proj2.cpp,其中定义了Sort类和InsertSort类。Sort是一个表示排序算法的抽象类,成员函数mySort为各种排序算法定义了统一的接口,成员函数swap实现了两个整数的交换操作。InsertSort是Sort的派生类,它重新定义了基类中的成员函数mySort,具体实现了简单插入排序法。本程序的正确输出结果应为:
Before sorting a[]=
5,1,7,3,1,6,9,4,2,8,6,
After sorting a[]=
1,1,2,3,4,5,6,6,7,8,9,
请首先阅读程序,分析输出结果,然后根据以下要求在横线处填写适当的代码并删除横线,以实现上述功能。
(1)将Sort类的成员函数swap补充完整,实现两个整数的交换操作;
(2)将InsertSort类的构造函数补充完整;
(3)将InsertSort类的成员函数mySort补充完整,实现简单插入排序法(在交换数据时,请使用基类的成员函数swap)。
注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found ****”。
//proj2.cpp
#include <iostream>
using namespace std;
class Sort {
public:
Sort (int* a0, int n0): a (a0), n(n0) {}
virtual void mySort() = 0;
static swap(int& x, int& y)
{
int trap = x;
//********** found**********
______;
y = tmp;
}
protected:
int* a;
int n;
};
class InsertSort : public Sort {
public:
InsertSort(int* a0, int n0)
//********** found**********
:______
{
}
virtual void mySort()
{
for(int i =1; i<n; ++i)
for(int j = i; j>0; --j)
if(a[j] <a[j-i])
//********** found**********
______;
else
//********** found**********
______;
}
};
void fun (Sort& s) { s.mySort();}
void print (int * a, int n)
{
for(int i = 0; i<n; ++i)
cout << a[i] << ",";
cout << endl;
}
int main(int argc, char * argv[])
{
int a[] ={5, 1, 7, 3, 1, 6, 9, 4, 2, 8, 6};
cout << "Before sorting a[] = /n";
print(a, 11);
InsertSort bs(a, 11);
fun(bs);
cout << "After sorting a[] = /n";
print(a, ii);
return 0;
}
【正确答案】(1)x=y
(2)Sort(a0, n0)
(3)swap(a[j], a[j-1])
(4)break
【答案解析】[考点] 本题考查Sort类及其派生类InsertSort,其中涉及动态数组、构造函数和纯虚函数。
[解析] (1)主要考查考生对成员函数的掌握,题目要求将Sort类的成员函数swap补充完整,实现两个整数的交换操作,因此这里是—个交换操作,程序利用中问变量tmp交换x和y的值。
(2)主要考查考生对构造函数的掌握,派生类的构造函数使用成员列表初始化基类。
(3)主要考查考生对成员函数调用的掌握,题目提示:在交换数据时,请使用基类的成员函数swap。因此这里可以直接调用swap函数交换a[j]和a[j-1]的值。
(4)主要考查考生对成员函数的掌握,当条件a[j]<a[j-1]不满足时,说明顺序没问题不需要交换,使用break语句跳出本次循环。