F面的程序是关于 CBook类的一个定义,试改正程序中的错误。(共10
分)
#include
#include
char *p_book; public:
p_book=new char[strlen(p_val)+1] CBook(const char *p_val) { p_book = new char[strlen(p_val)]; strcpy(p_book, p_val);
}
void print() const { cout < } }; void main(){ char book_title[60]; CBook *p_book_obj; cout << cin >>p; CBook abook(p); p_book_obj = &abook; p_book_obj->print(); } “Enter book title: ” ; 三、根据如下所示程序,回答下列问题(共 10分) #include CJournal () { cout <<“ Journal default constructor ” < void read () { cout << “ Read paper ” < ~CJournal () { cout << “ Journal default destructor ” < class CComputerDesign : public CJournal{ public: CComputerDesign () {cout <<“《 Computer Design 》 default constructor virtual < < void subscribe () { cout <<“ Subscribing 《 Computer Design 》 void read () {cout <<“ Reading 《 Computer Design 》” < void main(){ CComputerDesign journal1; CJournal *p_journal; journal1.subscribe(); journal1.read(); “《 Computer Design 》 default destructor // ① p_journal = &journal1; p_journal->subscribe(); p_journal->read(); } 1. 当程序运行到①处时,写出程序运行的输出结果 (3分) 2. 当程序结束时,程序会在第 1 问的基础上增加哪些输出。 (4 分) 3. 若在主函数中定义一个对象 CJournal journal; 程序编译时会否出错?为什么? (3 分) 四、编程题 ( 共 40 分 ) 1. 定义一个商品类 CGoods其中包含商品号(Iong no)、商品名(char *p_name)、商 品价格 (double price) 三个数据成员,以及相应的构造函数、拷贝构造函数、析构函数、 打印数据成员的成员函数。 (10 分) #incIude Iong no; char *p_name; fIoat credit; pubIic: CCourse(Iong no_vaI,char p_vaI,fIoat credit_vaI); CCourse(const CCourse &r_course); ~CCourse(){deIete p_name;} void print() const; }; CCourse:CCourse(Iong no_vaI,char p_vaI,fIoat credit_vaI){ no=no_vaI; p_name=new char[strIen(p_vaI)+1]; strcpy(p_name,p_vaI); credit=credit_vaI; } CCourse:CCourse(const CCourse &r_course){ no=r_course.no; p_name=new char[strIen(r_course.p_name)+1]; strcpy(p_name,r_course.p_name); credit=r_course.credit; } void CCourse:print() const{ cout<<\ name\ } 2. 为CGoods类增加一个商品总数 (int count) 数据成员,并增加一个成员函数 getCount()获取count的值,编写一个友元函数getName()获取商品名称p_name做如上 修改后,重新实现CGoods类(与第1问相同的不用再重复)。(10分) 3. 为CGoods类定义小于运算符(‘ <')和不小于运算符(‘ >=')两个运算符重载函 数。CGoods类对象大小的比较是根据其商品价格(price)的值的大小来实现的。(与第2 问相同的不用再重复 )(10 分) 4. 以CGoods类为基类,派生出服装类 CClothes和食品类CFood两个派生类,并在这 两个类中分别增加一个表示品牌的指针数据成员 (char *p_brand) 和表示用途的成员函数 (void usedFor() ——可分别输出一条表示服装和食品用途的信息 ) 。写出 CClothes 类和 CFood类的完整定义(包括构造、析构和usedFor()成员函数的实现)。(10分) 五、附加题 (共 30分。注意:确保基本题成绩能达到 75分以上,再尝试做附 加题!) 1. 在基本题第四题的基础上,在CGoods类增加总商品数(long total_goods)和商品总价 格(double total_price) 两个数据成员,以及相应的获取这两个数据成员值的成员函数 getTotalGoods() 和 getTotalPrice() 。(注意说明数据成员和成员函数的存储类型,以便 能够用类名来调用 getTotalGoods() 和 getTotalPrice() 这两个函数)。为了能够采用动态 联编的方式调用派生类的usedFor()成员函数,应该在CGoods类及其派生类CClothes和 CFood类中作何改动? (15分) 2. 编写一个实现两个数交换的函数模板 swap,然后使用该函数模板再编写一个对具有 n 个数组元素(通用类型)的数组采用冒泡排序算法进行排序的函数模板。 (15 分) 答案 二、 #include p_book = new char[strlen(p_val)] 改为 p_book = new char[strlen(p_val)+1] CBook abook; 改为 CBook abook(p); p_book_obj = abook 改为 p_book_obj = &abook; p_book_obj.print() 改为 p_book_obj->print(); (该对得 2分,未改或改错得 0分,正确之处该成错误倒扣 1 分) 三、 1. Journal default constructor < ( 全部答对得 3 分,答错或漏答一条输出扣 1 分 ) 2. Subscribing < < ( 全部答对得 4 分,答错或漏答一条输出扣 1 分 ) 3. 会出错,因为 CJournal 中包含有纯虚函数,故 CJournal 是抽象类,不能定义抽象类对象。 ( 答对编译会出错得 1 分,答对原因得 2 分。 ) 四、 1. #include CCourse(long no_val, char *p_val, float credit_val); CCourse(const CCourse &r_course); ~CCourse() { delete p_name; } void print() const; }; CCourse::CCourse(long no_val, char *p_val, float credit_val){ no = no_val; p_name = new char[strlen(p_val)+1]; strcpy(p_name, p_val); credit = credit_val; } CCourse::CCourse(const CCourse &r_course){ no = r_course.no; p_name = new char[strlen(r_course.p_name)+1]; strcpy(p_name, r_course.p_name); credit = r_course.credit; } void CCourse::print() const{ cout <<\\} ( 数据成员定义正确得 2 分,部分正确得 1 分,不正确得 0 分 每个成员函数定义正确得 2 分,每个成 员函数有小错误扣 1 分,完全不正确不得分 ) 2. 在 class CCourse 定义中增加一条: private: static int total_course; ( 答对得 1 分,未加 static 得 0 分) 在类外部增加一条: int CCourse::total_course = 0; ( 答对得 1 分,答错或漏答得 0 分 ) 在 CCourse 类的构造函数中增加一条: total_course++; ( 答对 得 1 分) 在 CCourse 类的拷贝构造函数中增加一条: total_course++; ( 答对得 1 分) 在 CCourse 类的析构函数中增加一条: total_course--; ( 答对得 1 分) 在 class CCourse 定义中增加一条: public: static getTotalCourse() { return total_course; } ( 答对得 2 分,未加 static 得 1 分) 在 class CCourse 定义中增加一条: friend char *getCourseName(const CCourse &r_course); ( 答对得 1 分,未加 friend 得 0 分) 在类外部定义: char *getCourseName(const CCourse &r_course){ return r_course.p_name; ( 答对得 2 分) 3. 在 class CCourse 定义中增加一条: public: bool operator <(const CCourse &r_course); ( 答对得 2 分) 在类外部定义: bool CCourse::operator <(const CCourse &r_course){ if (credit return false; ( 答对得 3 分) 在 class CCourse 定义中增加一条: public: bool operator >=(const CCourse &r_course); ( 答对得 2 分) 在类外部定义: bool CCourse::operator >=(const CCourse &r_course){ if (credit >= r_course.credit) return true; else return false; } ( 答对得 3 分) 4. class CHLP : public CCourse{ private: char *p_openby; public: CHLP(long no_val, char *p_val, float credit_val, char *p_open) : CCourse(no_val, p_val, credit_val){ p_openby = new char[strlen(p_open)+1]; strcpy(p_openby, p_open); } ~CHLP() { delete p_openby; } void studyFor() { cout <<\}; ( 答对得 5 分,其中构造函数 3 分,析构函数 1 分, studyFor() 函数 1 分) class COOP : public CCourse{ private: char *p_openby; public: COOP(long no_val, char *p_val, float credit_val, char *p_open) : CCourse(no_val, p_val, credit_val){ p_openby = new char[strlen(p_open)+1]; strcpy(p_openby, p_open); } ~COOP() { delete p_openby; } void studyFor() { cout <<\}; ( 答对得 5 分,其中构造函数 3 分,析构函数 1 分, studyFor() 函数 1 分) 五、 1. 在 class CCourse 定义中增加一条: public: virtual void studyFor() { cout <<\
大学C++期末考试试卷(含答案)



