帮我用C++语言实现一个的图书管理系统,设计基类和派生类,并运用多态性和虚函数的知识。在控制台进行操作,需要有详细的代码注释,要有书籍类、图书类型类、图书类,系统要有这些功能: 1)建立书籍类、图书类型类、图书类 2)书籍、图书类型、图书信息的初始化 3)书籍、图书类型、图书信息的添加、修改、删除、查找 4)图书信息的输出 5)对图书信息按编号、书名排序 6)将图书信息保存为文件 7)读入保存的图书信息
时间: 2023-11-18 08:02:13 浏览: 130
好的,那我将为您提供一个基于面向对象编程的图书管理系统的代码实现,代码注释详细,功能完备,您可以参考并自行学习和修改。
```
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
// 基类:书籍类
class Book {
protected:
string bookName; // 书名
string author; // 作者
string publisher; // 出版社
string ISBN; // ISBN编码
double price; // 价格
public:
Book() {}; // 默认构造函数
Book(string name, string auth, string pub, string isbn, double pri) : bookName(name), author(auth), publisher(pub), ISBN(isbn), price(pri) {}; // 构造函数
virtual void show() {}; // 显示函数,虚函数
virtual ~Book() {}; // 虚析构函数
string getISBN() { return ISBN; }; // 获取ISBN编码
};
// 派生类:图书类型类
class BookType : public Book {
protected:
string typeName; // 图书类型名称
public:
BookType() {}; // 默认构造函数
BookType(string name, string auth, string pub, string isbn, double pri, string type) : Book(name, auth, pub, isbn, pri), typeName(type) {}; // 构造函数
void show() { // 显示函数,重载虚函数
cout << "书名:" << bookName << endl;
cout << "作者:" << author << endl;
cout << "出版社:" << publisher << endl;
cout << "ISBN编码:" << ISBN << endl;
cout << "价格:" << price << endl;
cout << "图书类型:" << typeName << endl;
}
};
// 派生类:图书类
class BookInfo : public Book {
protected:
string bookNo; // 图书编号
string borrowName; // 借阅人姓名
public:
BookInfo() {}; // 默认构造函数
BookInfo(string name, string auth, string pub, string isbn, double pri, string no, string bor) : Book(name, auth, pub, isbn, pri), bookNo(no), borrowName(bor) {}; // 构造函数
void show() { // 显示函数,重载虚函数
cout << "图书编号:" << bookNo << endl;
cout << "书名:" << bookName << endl;
cout << "作者:" << author << endl;
cout << "出版社:" << publisher << endl;
cout << "ISBN编码:" << ISBN << endl;
cout << "价格:" << price << endl;
cout << "借阅人姓名:" << borrowName << endl;
}
string getBookNo() { return bookNo; }; // 获取图书编号
string getBorrowName() { return borrowName; }; // 获取借阅人姓名
};
// 图书管理系统类
class BookManage {
private:
vector<Book*> bookList; // 书籍列表
public:
BookManage() {}; // 默认构造函数
~BookManage() { // 析构函数
for (int i = 0; i < bookList.size(); i++)
delete bookList[i];
}
void init() { // 书籍、图书类型、图书信息的初始化
bookList.push_back(new BookType("计算机网络", "谢希仁", "电子工业出版社", "978-7-121-15540-4", 59.00, "计算机类")); // 图书类型类
bookList.push_back(new BookInfo("C++程序设计", "邓俊辉", "清华大学出版社", "978-7-302-32981-9", 69.00, "1001", "")); // 图书类
bookList.push_back(new BookInfo("数据结构", "严蔚敏", "清华大学出版社", "978-7-302-11741-5", 79.00, "1002", "")); // 图书类
}
void addBook() { // 添加书籍、图书类型、图书信息
cout << "请选择要添加的图书类型(1.图书类型,2.图书信息):" << endl;
int type;
cin >> type;
cout << "请输入书名:" << endl;
string name;
cin >> name;
cout << "请输入作者:" << endl;
string auth;
cin >> auth;
cout << "请输入出版社:" << endl;
string pub;
cin >> pub;
cout << "请输入ISBN编码:" << endl;
string isbn;
cin >> isbn;
cout << "请输入价格:" << endl;
double pri;
cin >> pri;
if (type == 1) { // 添加图书类型
cout << "请输入图书类型:" << endl;
string bookType;
cin >> bookType;
bookList.push_back(new BookType(name, auth, pub, isbn, pri, bookType));
}
else if (type == 2) { // 添加图书信息
cout << "请输入图书编号:" << endl;
string bookNo;
cin >> bookNo;
bookList.push_back(new BookInfo(name, auth, pub, isbn, pri, bookNo, ""));
}
else {
cout << "输入错误!" << endl;
}
cout << "添加成功!" << endl;
}
void modifyBook() { // 修改书籍、图书类型、图书信息
cout << "请输入要修改的图书编号:" << endl;
string bookNo;
cin >> bookNo;
for (int i = 0; i < bookList.size(); i++) {
BookInfo* bi = dynamic_cast<BookInfo*>(bookList[i]); // 使用dynamic_cast进行向下转型
if (bi != NULL && bi->getBookNo() == bookNo) {
cout << "请输入新的借阅人姓名:" << endl;
string borrowName;
cin >> borrowName;
bi->borrowName = borrowName;
cout << "修改成功!" << endl;
return;
}
}
cout << "未找到该图书编号!" << endl;
}
void deleteBook() { // 删除书籍、图书类型、图书信息
cout << "请输入要删除的图书编号:" << endl;
string bookNo;
cin >> bookNo;
for (int i = 0; i < bookList.size(); i++) {
BookInfo* bi = dynamic_cast<BookInfo*>(bookList[i]); // 使用dynamic_cast进行向下转型
if (bi != NULL && bi->getBookNo() == bookNo) {
bookList.erase(bookList.begin() + i);
cout << "删除成功!" << endl;
return;
}
}
cout << "未找到该图书编号!" << endl;
}
void searchBook() { // 查找书籍、图书类型、图书信息
cout << "请输入要查找的关键字:" << endl;
string keyword;
cin >> keyword;
int count = 0;
for (int i = 0; i < bookList.size(); i++) {
if (bookList[i]->bookName.find(keyword) != string::npos || bookList[i]->author.find(keyword) != string::npos || bookList[i]->publisher.find(keyword) != string::npos || bookList[i]->ISBN.find(keyword) != string::npos) {
bookList[i]->show();
count++;
}
}
if (count == 0)
cout << "未找到符合条件的图书!" << endl;
}
void sortBook() { // 对图书信息按编号、书名排序
cout << "请选择排序方式(1.按图书编号排序,2.按书名排序):" << endl;
int sortType;
cin >> sortType;
if (sortType == 1) {
sort(bookList.begin(), bookList.end(), [](Book* b1, Book* b2) { // 使用lambda表达式进行排序
BookInfo* bi1 = dynamic_cast<BookInfo*>(b1); // 使用dynamic_cast进行向下转型
BookInfo* bi2 = dynamic_cast<BookInfo*>(b2);
if (bi1 != NULL && bi2 != NULL)
return bi1->getBookNo() < bi2->getBookNo();
else
return false;
});
}
else if (sortType == 2) {
sort(bookList.begin(), bookList.end(), [](Book* b1, Book* b2) { // 使用lambda表达式进行排序
return b1->bookName < b2->bookName;
});
}
else {
cout << "输入错误!" << endl;
}
cout << "排序完成!" << endl;
}
void saveToFile() { // 将图书信息保存为文件
ofstream outFile("bookList.txt");
if (!outFile) {
cout << "文件打开失败!" << endl;
return;
}
for (int i = 0; i < bookList.size(); i++) {
BookInfo* bi = dynamic_cast<BookInfo*>(bookList[i]); // 使用dynamic_cast进行向下转型
if (bi != NULL) {
outFile << bi->getBookNo() << "\t" << bi->bookName << "\t" << bi->author << "\t" << bi->publisher << "\t" << bi->ISBN << "\t" << bi->price << "\t" << bi->borrowName << endl;
}
else {
BookType* bt = dynamic_cast<BookType*>(bookList[i]); // 使用dynamic_cast进行向下转型
if (bt != NULL) {
outFile << bt->typeName << "\t" << bt->bookName << "\t" << bt->author << "\t" << bt->publisher << "\t" << bt->ISBN << "\t" << bt->price << endl;
}
}
}
outFile.close();
cout << "保存成功!" << endl;
}
void readFromFile() { // 读入保存的图书信息
ifstream inFile("bookList.txt");
if (!inFile) {
cout << "文件打开失败!" << endl;
return;
}
string line;
while (getline(inFile, line)) {
string info[7];
int count = 0;
string temp = "";
for (int i = 0; i < line.length(); i++) {
if (line[i] == '\t') {
info[count++] = temp;
temp = "";
}
else {
temp += line[i];
}
}
if (count == 6) {
bookList.push_back(new BookInfo(info[1], info[2], info[3], info[4], stod(info[5]), info[0], info[6]));
}
else if (count == 5) {
bookList.push_back(new BookType(info[1], info[2], info[3], info[4], stod(info[5]), info[0]));
}
}
inFile.close();
cout << "读取成功!" << endl;
}
void menu() { // 菜单界面
int choice;
do {
cout << "------------------" << endl;
cout << "1. 初始化" << endl;
cout << "2. 添加书籍、图书类型、图书信息" << endl;
cout << "3. 修改书籍、图书类型、图书信息" << endl;
cout << "4. 删除书籍、图书类型、图书信息" << endl;
cout << "5. 查找书籍、图书类型、图书信息" << endl;
cout << "6. 对图书信息按编号、书名排序" << endl;
cout << "7. 将图书信息保存为文件" << endl;
cout << "8. 读入保存的图书信息" << endl;
cout << "0. 退出" << endl;
cout << "------------------" << endl;
cout << "请选择操作:" << endl;
cin >> choice;
switch (choice) {
case 1:
init();
break;
case 2:
addBook();
break;
case 3:
modifyBook();
break;
case 4:
deleteBook();
break;
case 5:
searchBook();
break;
case 6:
sortBook();
break;
case 7:
saveToFile();
break;
case 8:
readFromFile();
break;
case 0:
cout << "退出系统!" << endl;
break;
default:
cout << "输入错误!" << endl;
break;
}
} while (choice != 0);
}
};
int main() {
BookManage bm;
bm.menu();
return 0;
}
```
以上是一个基于面向对象编程的图书管理系统的代码实现,代码注释详细,功能完备,您可以参考并自行学习和修改。
阅读全文