运用C++语言实现一个图书管理系统,需要代码注释,要描述书籍类、图书类型类、图书类。设计基类和派生类,并运用多态性和虚函数的知识。要求设计具有继承与派生以及多态性的类。 要实现的主要功能如下: 1)建立书籍类、图书类型类、图书类 2)书籍、图书类型、图书信息的初始化 3)书籍、图书类型、图书信息的添加、修改、删除、查找 4)图书信息的输出 5)对图书信息按编号、书名排序 6)将图书信息保存为文件 6)读入文件

时间: 2023-11-13 12:04:19 浏览: 59
很高兴能为您解答这个问题。以下是一个简单的图书管理系统的C++代码,注释描述了书籍类、图书类型类、图书类的设计,以及多态性和虚函数的使用。请注意,这只是一个简单的实现,可以根据需要进行修改和扩展。 ```c++ #include<iostream> #include<fstream> #include<vector> #include<algorithm> using namespace std; // 图书类型类 class BookType { public: BookType(string name = "", string description = "") { this->name = name; this->description = description; } string getName() const { return name; } void setName(string name) { this->name = name; } string getDescription() const { return description; } void setDescription(string description) { this->description = description; } private: string name; // 图书类型名称 string description; // 图书类型描述 }; // 书籍类 class Book { public: Book(string id = "", string name = "", string author = "", double price = 0, BookType type = BookType()) { this->id = id; this->name = name; this->author = author; this->price = price; this->type = type; } string getId() const { return id; } void setId(string id) { this->id = id; } string getName() const { return name; } void setName(string name) { this->name = name; } string getAuthor() const { return author; } void setAuthor(string author) { this->author = author; } double getPrice() const { return price; } void setPrice(double price) { this->price = price; } BookType getType() const { return type; } void setType(BookType type) { this->type = type; } virtual void printInfo() const { // 虚函数,用于输出图书信息 cout << "编号:" << id << endl; cout << "名称:" << name << endl; cout << "作者:" << author << endl; cout << "价格:" << price << endl; cout << "类型:" << type.getName() << endl; } private: string id; // 书籍编号 string name; // 书籍名称 string author; // 书籍作者 double price; // 书籍价格 BookType type; // 书籍类型 }; // 普通图书类,继承自书籍类 class NormalBook : public Book { public: NormalBook(string id = "", string name = "", string author = "", double price = 0, BookType type = BookType()) : Book(id, name, author, price, type) {} }; // 电子图书类,继承自书籍类 class EBook : public Book { public: EBook(string id = "", string name = "", string author = "", double price = 0, BookType type = BookType(), string format = "") : Book(id, name, author, price, type) { this->format = format; } string getFormat() const { return format; } void setFormat(string format) { this->format = format; } virtual void printInfo() const { // 重载虚函数,用于输出电子图书信息 Book::printInfo(); cout << "格式:" << format << endl; } private: string format; // 电子图书格式 }; // 图书管理类 class BookManager { public: void init() { // 初始化图书信息 BookType type1("计算机科学", "关于计算机科学的图书"); BookType type2("文学", "关于文学的图书"); books.push_back(new NormalBook("001", "C++ Primer", "Lippman", 65.0, type1)); books.push_back(new NormalBook("002", "Java核心技术", "Horstmann", 59.0, type1)); books.push_back(new EBook("003", "红楼梦", "曹雪芹", 29.0, type2, "PDF")); books.push_back(new EBook("004", "西游记", "吴承恩", 39.0, type2, "EPUB")); } void addBook(Book* book) { // 添加图书 books.push_back(book); } void modifyBook(string id, Book* book) { // 修改图书 for (int i = 0; i < books.size(); i++) { if (books[i]->getId() == id) { books[i] = book; break; } } } void deleteBook(string id) { // 删除图书 for (int i = 0; i < books.size(); i++) { if (books[i]->getId() == id) { books.erase(books.begin() + i); break; } } } Book* findBookById(string id) const { // 按编号查找图书 for (int i = 0; i < books.size(); i++) { if (books[i]->getId() == id) { return books[i]; } } return NULL; } vector<Book*> findBookByName(string name) const { // 按名称查找图书 vector<Book*> result; for (int i = 0; i < books.size(); i++) { if (books[i]->getName() == name) { result.push_back(books[i]); } } return result; } void printAllBooks() const { // 输出所有图书信息 for (int i = 0; i < books.size(); i++) { books[i]->printInfo(); } } void sortById() { // 按编号排序 sort(books.begin(), books.end(), [](Book* a, Book* b) { return a->getId() < b->getId(); }); } void sortByName() { // 按名称排序 sort(books.begin(), books.end(), [](Book* a, Book* b) { return a->getName() < b->getName(); }); } void saveToFile(string filename) const { // 保存到文件 ofstream ofs(filename); if (ofs) { for (int i = 0; i < books.size(); i++) { ofs << books[i]->getId() << ","; ofs << books[i]->getName() << ","; ofs << books[i]->getAuthor() << ","; ofs << books[i]->getPrice() << ","; ofs << books[i]->getType().getName() << ","; if (dynamic_cast<EBook*>(books[i])) { // 判断是否为电子图书 ofs << dynamic_cast<EBook*>(books[i])->getFormat() << endl; } else { ofs << endl; } } } ofs.close(); } void loadFromFile(string filename) { // 从文件读取 ifstream ifs(filename); if (ifs) { string line; while (getline(ifs, line)) { vector<string> fields; string field; for (int i = 0; i < line.length(); i++) { if (line[i] == ',') { fields.push_back(field); field = ""; } else { field += line[i]; } } BookType type(fields[4], ""); if (fields.size() == 6) { // 电子图书 books.push_back(new EBook(fields[0], fields[1], fields[2], stod(fields[3]), type, fields[5])); } else { // 普通图书 books.push_back(new NormalBook(fields[0], fields[1], fields[2], stod(fields[3]), type)); } } } ifs.close(); } private: vector<Book*> books; // 存储图书信息 }; int main() { BookManager manager; manager.init(); // 初始化图书信息 manager.printAllBooks(); // 输出所有图书信息 cout << endl; // 添加图书 BookType type1("历史", "关于历史的图书"); Book* book1 = new NormalBook("005", "中国古代史", "王国维", 45.0, type1); manager.addBook(book1); // 修改图书 BookType type2("哲学", "关于哲学的图书"); Book* book2 = new NormalBook("002", "Java从入门到精通", "Horstmann", 69.0, type2); manager.modifyBook("002", book2); // 删除图书 manager.deleteBook("004"); // 按编号查找图书 Book* book3 = manager.findBookById("001"); if (book3 != NULL) { book3->printInfo(); } cout << endl; // 按名称查找图书 vector<Book*> books = manager.findBookByName("Java从入门到精通"); for (int i = 0; i < books.size(); i++) { books[i]->printInfo(); } cout << endl; // 按编号排序 manager.sortById(); manager.printAllBooks(); cout << endl; // 按名称排序 manager.sortByName(); manager.printAllBooks(); cout << endl; // 保存到文件 manager.saveToFile("books.txt"); // 从文件读取 BookManager manager2; manager2.loadFromFile("books.txt"); manager2.printAllBooks(); return 0; } ``` 以上代码实现了一个简单的图书管理系统,包括了书籍类、图书类型类、图书类的设计,以及多态性和虚函数的使用。主要功能包括图书信息的初始化、添加、修改、删除、查找、排序、输出,以及将图书信息保存到文件和从文件读取。

相关推荐

最新推荐

recommend-type

按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体)

按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体) 1. Rectangle 私有成员:  double x1, y1; //左下角的坐标  double x2, y2; //右上角的坐标 公有成员:  带缺省值的构造...
recommend-type

C#中派生类调用基类构造函数用法分析

主要介绍了C#中派生类调用基类构造函数用法,实例分析了派生类调用基类构造函数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

node-v4.1.0-linux-x64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

基于AT89S52的数字温度计设计说明.docx

基于AT89S52的数字温度计设计说明.docx
recommend-type

HTML+CSS+JS精品网页模板H108.rar

HTML5+CSS+JS精品网页模板,设置导航条、轮翻效果,鼠标滑动效果,自动弹窗,点击事件、链接等功能;适用于大学生期末大作业或公司网页制作。响应式网页,可以根据不同的设备屏幕大小自动调整页面布局; 支持如Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件进行编辑修改; 支持包括IE、Firefox、Chrome、Safari主流浏览器浏览; 下载文件解压缩,用Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件打开,只需更改源代码中的文字和图片可直接使用。图片的命名和格式需要与原图片的名字和格式一致,其他的无需更改。如碰到HTML5+CSS+JS等专业技术问题,以及需要对应行业的模板等相关源码、模板、资料、教程等,随时联系博主咨询。 网页设计和制作、大学生网页课程设计、期末大作业、毕业设计、网页模板,网页成品源代码等,5000+套Web案例源码,主题涵盖各行各业,关注作者联系获取更多源码; 更多优质网页博文、网页模板移步查阅我的CSDN主页:angella.blog.csdn.net。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。