问答题 请使用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语句跳出本次循环。