# 面向对象程序设计作业参考代码 **Repository Path**: jiaoxubin/oop-works-cpp-code ## Basic Information - **Project Name**: 面向对象程序设计作业参考代码 - **Description**: 面向对象程序设计C++课后作业参考代码 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-06-06 - **Last Updated**: 2022-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 面向对象程序设计C++课后作业参考代码 #### 第1次作业 1. 编写程序,显示如下表格: a   a^2   a^3 1   1   1 2   4   8 3   9   27 4   16   64 2. 编写程序,计算并显示半径为6.5的圆的面积和周长。 3. 编写程序,随机产生一个1~12的整数,根据数值显示相应的英文月份名。例如生成的数为3时显示March。 注:生成随机数的库函数为rand(),返回一个0~RAND_MAX之间的int值,要包含标准库<cstdlib>。RAND_MAX是库中定义的常量,值最小为32767。例如,生成10以内的随机数代码为rand()%10。 4. 编写程序,计算e = 1+1/1!+1/2!+1/3!+…+1/n!+…的近似值,要求误差小于0.00001。 5. 编写程序,读入一个整数,然后以升序显示它的所有最小因子。例如,输入整数120,则输出应该是: 2, 2, 2, 3, 5。 #### 第2次作业 1. 编写程序,判断两个数组是否相等,然后利用vector编写一段类似的程序。 2. 编写程序比较两个string类型的字符串,然后编写另一个程序比较两个C风格字符串。 3. 编写程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串。 4. 提取字符串中的数值。如果字符串中的内容为“ab7c d234bk jalf 34 78k3j4 a 59jfd45”,那么提取的数值依次是7, 234, 34, 78, 3, 4, 59, 45。 #### 第3次作业 1. 编写函数,将两个有序整型序列合并成一个新的有序序列。例如,merge([1, 3, 15], [2, 4, 8, 17]),合并结果为[1, 2, 3, 4, 8, 15, 17]。函数原型为void merge(int *list1, int size1, int *list2, int size2, int *&result, int &size3)。 2. 编写函数,将整数转换成字符串。例如,itoa(-123),转换结果为“-123”。函数原型为:string itoa(int)。 #### 第4次作业 1. 设计表示时间的CTime类,要求: (1) 有表示时、分、秒的数据成员; (2) 正确的初始化操作,检验数据的合法性; (3) 有时、分、秒的get和set函数; (4) 以24小时格式或12 小时加上午下午的格式输出当前时间。 编写测试程序。 2. 设计一个名为CFan的类表示风扇,要求包括: (1) 3个名为SLOW 、MEDIUM 和FAST 的常量,值分别为1、2、3,表示风速; (2) int类型的私有数据成员speed,表示风扇的速度,默认值为SLOW; (3) bool类型的私有数据成员on,表示风扇是否打开,默认值为false; (4) double类型的私有数据成员radius,表示风扇的半径,创建后不可修改,默认值; (5) unsigned long类型的私有数据成员color,表示风扇的颜色,默认值为0xFFFFFF,表示白色; (6) 4个数据成员的访问器,非const成员的修改器; (7) 创建默认风扇的构造函数; (8) 根据参数值创建风扇的构造函数; (9) 成员函数status(),返回风扇的状态字符串:如果风扇是打开的,字符串中包括风扇的速度、颜色和半径;否则,返回的字符串中包括风扇关闭、颜色和半径。 编写测试程序,创建三个不同颜色和大小的风扇,进行改变速度、开、关等操作,输出这些风扇的状态。 3. 设计并实现一个有理数类CRational,要求: (1) 用两个整数的比描述有理数; (2) 能够进行加、减、乘、除等算术运算; (3) 以分数形式输出有理数; (4) 提供double类型到有理数的类型转换; (5) 合理的初始化,注意检测分母和除数为0的错误,默认分子为0,分母为1。 编写测试程序。 #### 第5次作业 1. 设计一个名为IntQueue的队列类,用于存储整数。队列以“先进先出”的方式存取元素。这个类包含: (1) 名为element的数据成员,保存队列中的int值; element的类型可以使用vector或在堆上分配的动态数组。 (2) 名为size的数据成员,保存队列中元素的个数。 (3) 默认构造函数,用默认的队列容量值初始化IntQueue对象。 (4) 进队列操作void enqueue(int value),将value加入队列尾,一旦元素个数超过了队列容量,将队列容量翻倍。 (5) 出队列操作出int dequeue(),删除队列首元素并将其返回;原来的第二个元素变成新的队列首元素,依次类推。 (6) 判断队列是否为空的操作bool empty(),如果队列为空,返回true。 (7) 成员函数size_t getSize(),返回队列中元素的个数。 (8) 根据(1)中选择的数据结构,设计需要的拷贝控制成员。 编写测试程序,利用IntQueue将输入的整数加入队列,然后逐一移出队列井输出。例如:队列中假设有元素3、2、8、6;执行enqueue(5)后队列变为3、2、8、6、5;执行dequeue()后返回3,队列变为2、8、6、5。 #### 第6次作业 1. 设计一个包含点类(CPoint2D)、矩形类(CRectangle)、等腰三角形类(CTriangle)、椭圆类(CEllipse)和CDonut(圆环类)在内的形状类集合,要求能实现形状的绘制、颜色的修改以及缩放、上下左右移动等操作。基于Graph2D图形库编写测试程序,从键盘输入下列测试数据(数据格式为形状类型,形状位置、尺寸与颜色,Exit为结束符),创建多个不同颜色、位置和大小的形状对象,进行缩放、平移等操作。 输入数据: Rectangle 400 400 800 400 0xC0E8F2 Rectangle 400 100 800 200 0xB8BD95 Rectangle 407 354 30 100 0x8C1926 Ellipse 403 425 15 15 0xFFEEEE Ellipse 360 480 20 20 0xFFEEEE Ellipse 300 550 30 30 0xFFEEEE Rectangle 474 181 236 200 0xDECA8F Triangle 474 340 340 180 0x9E6120 Rectangle 412 227 30 30 0xB5C9EE Rectangle 550 227 30 30 0xB5C9EE Rectangle 412 130 30 30 0xB5C9EE Rectangle 550 130 30 30 0xB5C9EE Rectangle 474 167 80 20 0xF9B06B Rectangle 462 128 25 55 0x8C1926 Rectangle 486 128 25 55 0x8C1926 Rectangle 474 94 80 12 0x9F9E99 Rectangle 474 82 100 12 0x9F9E99 Ellipse 444 45 50 15 0x9F9E99 Ellipse 322 31 55 18 0x9F9E99 Ellipse 181 22 65 15 0x9F9E99 Rectangle 154 78 10 15 0x814000 Triangle 154 103 95 50 0x002800 Triangle 154 131 85 45 0x002800 Triangle 154 156 70 40 0x002800 Triangle 154 184 50 50 0x002800 Rectangle 254 78 10 15 0x814000 Triangle 254 103 95 50 0x002800 Triangle 254 131 85 45 0x002800 Triangle 254 156 70 40 0x002800 Triangle 254 184 50 50 0x002800 Donut 474 490 80 60 0.5 0x814000 Exit #### 第7次作业 1. 己知矩形类CRectangle的定义如下: ```cpp class CRectangle { protected: double width, height; public: CRectangle(int wid=1, int hei=1):width(wid),height(hei){} int getWidth(){return width;} void setWidth(int newWid){width = newWid;} int getHeight(){return height;} void setHeight(int newHei){height = newHei;} int area(){return width*height;}//面积 int perimeter(){return (width+height)*2;}//周长 void scale(double fw, double fh) {width*=fw; height*=fh;}//缩放 }; ``` 在CRectangle 类的基础上,设计并实现一个正方形类CSquare。 2. 己知整型链表类的部分声明如下: ```cpp #include class CIntList { private: list lst; public: CIntList() { lst.clear();} void insert_front(int x); //在表头插入元素x void insert_back(int x); //在表尾插入元素x int del_front(); //删除并返回第一个元素 int del_back(); //删除并返回最后一个元素 int front(); //返回第一个元素 int back(); //返回最后一个元素 bool empty(); //判断链表是否为空 }; ``` 在CIntList类的基础上,设计并实现一个整型堆栈类CIntStack。 提示:list链表类模板的使用可参考:http://www.cplusplus.com/reference/list/list/ 3. 学生选修课程可用学生类和课程类之间的关联关系来建模。设计并实现这两个类以及它们的关联关系,要求如下: (1)学生的属性有姓名和学号; (2)课程的属性有课程名、编号和学分; (3)通过课程类能知道选修了该课程的所有学生; (4)通过学生类能知道自己选修了哪些课程。 编写测试程序,模拟学生选课的操作,选课完成后,打印某门课程的学生名单,对某位学生,统计选修课程的总学分数。 提示:使用前向引用声明,因为涉及到类的交叉引用。 ```cpp class CCourse; //学生类 class CStudent{ string name; unsigned id; vector cs; public: CStudent(string nm, unsigned sid); ~CStudent(); unsigned getId() const; const string& getName() const; void takeCourse(CCourse* c); void quitCourse(CCourse* c); string printCourses() const; int getTotalCredits() const; }; //课程类 class CCourse{ string name; unsigned id; int credit; vector stu; public: CCourse(string nm, unsigned cid, int crdt); ~CCourse(); int getCredit(); unsigned getId(); const string& getName(); string printStudents() const; void take(CStudent* s); void quit(CStudent* s); }; ``` #### 第8次作业 1. 修改第四次作业的有理数类CRational,要求实现下列运算符的重载: (1) 用两个整数的比描述有理数; (2) 重载"+"、"-"、" * "、"/"等双目运算符; (3) 重载输出流运算符"<<"以分数形式输出有理数; (4) 重载输入流运算符“>>”读入有理数; (5) 重载"++"前缀、"++"后缀、"+(正号)"、"-(负号)"等单目运算符; (6) 重载">"、"<"等运算符用于判断两个数的大小; (7) 合理的初始化,注意检测分母和除数为0的错误,默认分子为0,分母为1。 实现有理数类并测试,测试代码如下: ```cpp int main() { CRational r1; CRational r2(2, 1); CRational r3(-3, -4); CRational r4(3, -9); CRational r5; r1 = 3.6; r5 = -r4; r4++; ++r4; cout<<"r1: "<r2) cout << "r4>r2" << endl; else cout <<"r4 items; }; class Goods { public: Goods(string t, double pr); virtual ~Goods() {} virtual double getPrice(); virtual string getTitle(); virtual string getDetails()=0; private: string title; double price; }; class Book : public Goods { public: Book(string t, double pr); ~Book() {} void setDetails(string au, string pr, string isbn); string getDetails(); private: string author; string press; string ISBN; }; class Magazine : public Goods { public: Magazine(string t, double pr); ~Magazine() {} void setDetails(string isn, string p,string is); string getDetails(); private: string issue; string issNo; string period; }; class MusicCD : public Goods { public: MusicCD(string t, double p); ~MusicCD() {} void setDetails(string p, string st,int tr, int t); string getDetails(); private: string player; string style; int tracks; int lasttime; }; class VCD : public Goods { public: VCD(string t, double p); ~VCD() {} void setDetails(int t, string des); string getDetails(); private: string description; int lasttime; }; int main() { Cart ct; const int n = 4; Goods* gs[n] = { new MusicCD("Eagles", 12), new VCD("African Animals", 23), new Book("The DaVinci Code", 22), new Magazine("Reader", 5) }; for(int i=0; i class CElem { public: T data; CElem* next; }; template class CSingleList { public: CSingleList() : h(NULL) {} ~CSingleList(); void prepend(Type value); void del(); CElem* first() const; void print(ostream& os = cout) const; bool contains(Type value) const; void release(); private: CElem* h; }; ``` 2. 使用迭代器编写程序,从标准输入设备读入若干string对象,并将它们存储在一个vector容器中,然后逆序输出vector中所有的元素。提示:使用逆向迭代器实现。 3. 利用适当的容器类实现电话簿类CPhoneBook,要求如下: (1)联系人信息包括:姓名,电话号码; (2)支持添加新联系人、删除联系人; (3)支持双向查找:给定姓名查找电话号码,给定电话号码查找姓名。 提示:使用map实现。