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

时间: 2023-08-09 08:09:38 浏览: 46
好的,下面是一个简单的C++代码示例,实现了书籍类(Book)、图书类型类(BookType)、图书类(Library)以及对图书信息的添加、修改、删除、查找、排序和输出等功能。同时,使用了多态性和虚函数的知识。 ```cpp #include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <string> using namespace std; // 基类:书籍类 class Book { protected: string title; string author; string publisher; int year; int pages; public: Book(string t = "", string a = "", string p = "", int y = 0, int pg = 0) : title(t), author(a), publisher(p), year(y), pages(pg) {} virtual ~Book() {} virtual void display() const = 0; // 纯虚函数 virtual void input() { cout << "Title: "; getline(cin, title); cout << "Author: "; getline(cin, author); cout << "Publisher: "; getline(cin, publisher); cout << "Publication Year: "; cin >> year; cout << "Number of Pages: "; cin >> pages; cin.ignore(); // 忽略换行符 } string getTitle() const { return title; } string getAuthor() const { return author; } string getPublisher() const { return publisher; } int getYear() const { return year; } int getPages() const { return pages; } }; // 派生类:图书类型类 class BookType : public Book { private: string type; public: BookType(string t = "", string a = "", string p = "", int y = 0, int pg = 0, string tp = "") : Book(t, a, p, y, pg), type(tp) {} void display() const { cout << "Title: " << title << endl; cout << "Author: " << author << endl; cout << "Publisher: " << publisher << endl; cout << "Publication Year: " << year << endl; cout << "Number of Pages: " << pages << endl; cout << "Type: " << type << endl << endl; } void input() { Book::input(); cout << "Type: "; getline(cin, type); } string getType() const { return type; } }; // 派生类:图书类 class Library : public Book { private: int id; // 图书编号 static int count; // 统计图书数目 public: Library(string t = "", string a = "", string p = "", int y = 0, int pg = 0) : Book(t, a, p, y, pg), id(++count) {} void display() const { cout << "ID: " << id << endl; cout << "Title: " << title << endl; cout << "Author: " << author << endl; cout << "Publisher: " << publisher << endl; cout << "Publication Year: " << year << endl; cout << "Number of Pages: " << pages << endl << endl; } void input() { Book::input(); } int getID() const { return id; } // 按编号排序 static bool cmpID(const Library& l1, const Library& l2) { return l1.id < l2.id; } // 按书名排序 static bool cmpTitle(const Library& l1, const Library& l2) { return l1.title < l2.title; } }; int Library::count = 0; // 初始化静态成员变量 // 图书管理类 class BookManager { private: vector<Book*> books; // 所有图书的指针数组 public: ~BookManager() { for (int i = 0; i < books.size(); i++) { delete books[i]; } } // 添加书籍 void addBook(Book* book) { books.push_back(book); } // 修改书籍 void modifyBook(int id) { for (int i = 0; i < books.size(); i++) { Library* lib = dynamic_cast<Library*>(books[i]); // 动态类型转换 if (lib != nullptr && lib->getID() == id) { lib->input(); cout << "Book modified successfully!" << endl << endl; return; } } cout << "Book not found!" << endl << endl; } // 删除书籍 void removeBook(int id) { for (int i = 0; i < books.size(); i++) { Library* lib = dynamic_cast<Library*>(books[i]); if (lib != nullptr && lib->getID() == id) { books.erase(books.begin() + i); cout << "Book removed successfully!" << endl << endl; return; } } cout << "Book not found!" << endl << endl; } // 查找书籍 void searchBook(string keyword) { for (int i = 0; i < books.size(); i++) { Library* lib = dynamic_cast<Library*>(books[i]); if (lib != nullptr && (lib->getTitle().find(keyword) != string::npos || lib->getAuthor().find(keyword) != string::npos)) { books[i]->display(); } } } // 按编号排序 void sortByID() { sort(books.begin(), books.end(), Library::cmpID); } // 按书名排序 void sortByTitle() { sort(books.begin(), books.end(), Library::cmpTitle); } // 输出所有图书信息 void displayAll() { for (int i = 0; i < books.size(); i++) { books[i]->display(); } } // 保存图书信息到文件 void saveToFile(string filename) { ofstream fout(filename); if (!fout) { cout << "Failed to open file: " << filename << endl; return; } for (int i = 0; i < books.size(); i++) { fout << books[i]->getTitle() << '\t' << books[i]->getAuthor() << '\t' << books[i]->getPublisher() << '\t' << books[i]->getYear() << '\t' << books[i]->getPages() << '\t'; Library* lib = dynamic_cast<Library*>(books[i]); if (lib != nullptr) { fout << lib->getID(); } fout << endl; } fout.close(); cout << "Books saved to file: " << filename << endl << endl; } }; int main() { BookManager manager; while (true) { cout << "1. Add Book" << endl; cout << "2. Modify Book" << endl; cout << "3. Remove Book" << endl; cout << "4. Search Book" << endl; cout << "5. Sort by ID" << endl; cout << "6. Sort by Title" << endl; cout << "7. Display All Books" << endl; cout << "8. Save to File" << endl; cout << "0. Exit" << endl; int choice; cin >> choice; cin.ignore(); // 忽略换行符 cout << endl; switch (choice) { case 1: { cout << "1. Book Type" << endl; cout << "2. Library" << endl; int type; cin >> type; cin.ignore(); if (type == 1) { BookType* book = new BookType(); book->input(); manager.addBook(book); } else if (type == 2) { Library* book = new Library(); book->input(); manager.addBook(book); } else { cout << "Invalid choice!" << endl << endl; } break; } case 2: { int id; cout << "Enter Book ID: "; cin >> id; manager.modifyBook(id); break; } case 3: { int id; cout << "Enter Book ID: "; cin >> id; manager.removeBook(id); break; } case 4: { string keyword; cout << "Enter Keyword: "; getline(cin, keyword); manager.searchBook(keyword); break; } case 5: { manager.sortByID(); cout << "Books sorted by ID." << endl << endl; break; } case 6: { manager.sortByTitle(); cout << "Books sorted by Title." << endl << endl; break; } case 7: { manager.displayAll(); break; } case 8: { string filename; cout << "Enter Filename: "; getline(cin, filename); manager.saveToFile(filename); break; } case 0: { return 0; } default: { cout << "Invalid choice!" << endl << endl; break; } } } } ``` 该程序通过使用基类和派生类,实现了对书籍信息的建立,图书类型类和图书类继承自书籍类,同时使用了多态性和虚函数的知识,其中图书类(Library)还添加了一个静态成员变量count,统计图书数目。程序实现了对图书信息的初始化、添加、修改、删除、查找、排序和输出等功能,并可以将图书信息保存到文件中。

相关推荐

最新推荐

recommend-type

Java swing + socket + mysql 五子棋网络对战游戏FiveChess.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

纯C语言实现的控制台有禁手五子棋(带AI)Five-to-five-Renju.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

setuptools-57.1.0.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

setuptools-59.1.1.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

空载损耗计算软件.zip

空载损耗计算软件
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

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

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