C++图书馆管理程序(继承,多态)

分析:
    1.在原来的图书馆管理程序中,我只有一个基类User,然后实现了人员继承,没有完成对于书籍的继承。所以在新的程序中,我新增加了Book类作为基类,然后派生出新的类,以及FileManagement类,用于对各种信息的存储,我在此程序中,依然使用文件存储,在对书籍和读者进行增删改查的过程中,程序会相应修改text文档中的信息。
    2. 然后为了区分不同的用户,以便进行不同的操作,用户初始登录,系统根据用户的账号来区分不同角色的用户(管理员账号由字符A开头,普通用户账号由字符U开头),分别进入不同的用户界面,此功能可以使用虚函数实现多态;
    3.管理员可以查看书本信息,增加、删除、修改书本信息;
    4. 普通用户可以查看全部的书本信息、具体某一本的书本信息及借书、还书;
    5. 类的说明如下:
    (1) People保存用户的账号密码属性(private),并提供相应的set、get方法。
    (2) User继承自People,重写display(),并添加以下功能:
        viewBookInfo() 查看图书具体信息
        BorrowBook() 借阅图书
        ReturnBook() 归还图书的功能
    (3)Administrator 继承自People,重写display(),并添加下列功能:
       addBook() 增加图书
       deleteBook() 删除图书
       reSetBook() 修改图书
    (4)Book所有书本类的基类,拥有书本的各种属性,并提供相应的set、get方法以及虚函数toString();
    (5)E_Book、Magazine、Movie、Music继承自Book,并重写toString();
    (6)DVD继承自Movie;
    (7) 三类FileManagement:
    ①map<string, string> getPeopleInfo()负责对用户文件people.txt信息读取
    ②vector<Book *> getBooks()负责对书本信息文件book.txt进行读取
    ③void saveBooks(vector<Book *> vec) ,以及保存对书本信息的修改
    ④Book * getObject(string ID) ,依据书本的ID信息,返回相应类型对象指针;

以上是我的分析,我也写过一个完整的实验报告,里面包含了对类的详细设计,有兴趣的可以下载看看,希望对大家有所帮助,最终还是要靠大家自己领悟,理解其中的原理。如果想下载,请点击Download

代码实现

大家如果不想下载,我在下面也会把全部的代码写出来,给大家一个参考,如果有什么不对的地方,欢迎大家评论,一起加油啊!!!

1.(People.h)

#include<string>
#include"Book.h"
#include <vector>
#include "FileManagement.h"
using namespace std;
class People//基类
{
    
    
private:
	string account;
	string password;
protected:
	FileManagement fileManagement; //维护一个文件管理对象,对文件进行管理
	vector<Book *> Books;  //存储书本信息
	map<string, string> accounts; //存储用户的账号密码信息
public:
	People();//默认构造函数
	People(string account, string password);
	~People();
	string getAccount();
	string getPassword();
	void setAccount(string account);//获得账户名称
	void setPassword(string password);//获得账户密码
	void viewBooks(vector<Book *> Books);  //查看全部的书本信息
	virtual void Login();    //不同用户登录
	virtual void display();  //展示不同的用户界面
};

2.(People.cpp)

#include "People.h"
People::People()
{
    
    
}
People::~People()
{
    
    
}
People::People(string account, string password) {
    
    
	this->account = account;
	this->password = password;
}
string People::getAccount() {
    
    
	return this->account;
}
string People::getPassword() {
    
    
	return this->password;
}
void People::setAccount(string account) {
    
    
	this->account = account;
}
void People::setPassword(string password) {
    
    
	this->password = password;
}
void People::viewBooks(vector<Book *> Books) {
    
    
	cout << "Number" << "  " << "ID" << "           " << "Name" << "      " << "Author" << "      " << "Publisher"
		<< "  " << "Price" << "  " << "IsBorrowed\n";
	for (unsigned int i = 0; i < Books.size(); i++)
	{
    
    
		cout << "  ";
		cout.width(4);//设置字符宽度
		cout.setf(ios::left);//左对齐
		cout << i << "  ";
		cout.width(10);
		cout.setf(ios::left);
		cout << Books[i]->getID() << "   ";
		cout.width(8);
		cout.setf(ios::left); 
		cout << Books[i]->getName() << "  ";
		cout.width(10);
		cout.setf(ios::left); 
		cout << Books[i]->getAuthor() << "  ";
		cout.width(9);
		cout.setf(ios::left);
		cout << Books[i]->getPublisher() << "   ";
		cout.width(5);
		cout.setf(ios::left); 
		cout << Books[i]->getPrice() << "   ";
		if (!Books[i]->getBorrowed())
		{
    
    
			cout.setf(ios::left);
			cout << "No\n";
		}
		else
		{
    
    
			cout.setf(ios::left);
			cout << "Yes\n";
		}
	}
}
void People::Login() {
    
    
	//获取用户账号密码及书本信息
	accounts = fileManagement.getPeopleInfo();
	Books = fileManagement.getBooks();

	//验证登录
	if (accounts[getAccount()] == getPassword())
	{
    
    
		//展示用户的操作页面
		system("cls");
		this->display();
	}
	else
	{
    
    
		system("cls");
		cout << "Account And Password Is Error! Please Again!\n";
		string password, account;
		cout << "Account:";
		cin >> account;
		cout << "Password:";
		cin >> password;
		//重新设置用户信息,用户重新输入账号密码登录
		setAccount(account);
		setPassword(password);
		this->Login();
	}
}
void People::display() {
    
    
}

3.(User.h)

class User :public People//User继承于基类People
{
    
    
public:
	User();//默认构造函数
	User(string account,string password);
	~User();//析构函数
	void display();//显示人员信息
	void viewBookInfo();//查看图书信息
	void borrowBook();//借书
	void ReturnBook();//还书
};

4.(User.cpp)

#include "User.h"
User::User()
{
    
    
}
User::~User()
{
    
    
}
User::User(string account, string password):People(account, password)//使用初始化列表,调用基类的构造函数
{
    
    
}
//查看具体一本书的信息
void User::viewBookInfo() {
    
    
	cout << "Input Book's Number:";
	int num;
	cin >> num;
	cout << endl;
	cout << Books[num]->toString();
	cout << endl;
	display();
}
//借书
void User::borrowBook() {
    
    
	cout << "Input Book's Number:";
	int num;
	cin >> num;
	Books[num]->setBorrowed(true);
	system("cls");//执行清屏操作
	cout << "Success Borrow Book!\n\n";
	viewBooks(Books);
	display();
}
//归还书本
void User::ReturnBook() {
    
    
	cout << "Input Book's Number:";
	int num;
	cin >> num;
	Books[num]->setBorrowed(false);
	system("cls");
	cout << "Success Return Book!\n\n";
	viewBooks(Books);
	display();
}

//显示用户界面
void User::display() {
    
    
	cout << "Operations:\n";
	cout << "1、View Books!\n";
	cout << "2、View Book's Information!\n";
	cout << "3、Borrow Book!\n";
	cout << "4、Return Book!\n";
	cout << "5、Exit Library!\n";
	cout << endl;
	cout << "Input Your Operation:";
	int chose;
	cin >> chose;
	switch (chose)
	{
    
    
	case 1:
		system("cls");
		viewBooks(Books);
		display();
		break;
	case 2:
		viewBookInfo();
		break;
	case 3:
		borrowBook();
		break;
	case 4:
		ReturnBook();
		break;
	case 5:
		exit(1);
	}
}

5.(Administrator.h)

#include "People.h"
#include "Book.h"
#include "FileManagement.h"

class Administrator :public People
{
    
    

private:
	string arr[10] = {
    
     "E_Book", "Magazine", "Music", "DVD", "Movie" };

public:
	Administrator();
	Administrator(string account, string password);
	~Administrator();
	void display();
	void deleteBook();
	void addBook();
	void ResetBook();
};

6.(Administrator.cpp)

#include "Administrator.h"
Administrator::Administrator()
{
    
    
}
Administrator::Administrator(string account, string password):People(account, password)
{
    
    
}
Administrator::~Administrator()
{
    
    
}
//删除书本
void Administrator::deleteBook() {
    
    
	cout << "Input Book's Number:";
	int num;
	cin >> num;
	Books.erase(Books.begin() + num);
	system("cls");
	viewBooks(Books);
	cout << endl;
	display();
}
//添加书本
void Administrator::addBook() {
    
    
	cout << "Chose Book's Type: 1、E_Book 2、Managezine 3、Music 4、DVD 5、Movie\n";
	int type;
	cin >> type;
	cout << "Input Book's ID:";
	string ID;
	cin >> ID;
	Book * book;
	book = fileManagement.getObject(arr[type - 1]);
	book->setBorrowed(false);
	book->setID(arr[type - 1] + ID);
	cout << "Input Book's Name:";
	string name;
	cin >> name;
	book->setName(name);

	cout << "Input Book's Author:";
	string author;
	cin >> author;
	book->setAuthor(author);
	cout << "Input Book's Publisher:";
	string Publisher;
	cin >> Publisher;
	book->setPublisher(Publisher);
	cout << "Input Book's Price:";
	int price;
	cin >> price;
	book->setPrice(price);
	cout << "Input Book's Content:";
	string Content;
	cin >> Content;
	book->setContent(Content);
	Books.push_back(book);
	//保存文件
	FileManagement fileMan;
	fileMan.saveBooks(Books);
	system("cls");
	viewBooks(Books);
	cout << endl;
	display();
}
//修改书本信息
void Administrator::ResetBook() {
    
    
	cout << "Input Chosed Book's Number:";
	int num;
	cin >> num;
	cout << "Input Book's Name:";
	string name;
	cin >> name;
	Books[num]->setName(name);
	cout << "Input Book's Author:";
	string author;
	cin >> author;
	Books[num]->setAuthor(author);
	cout << "Input Book's Publisher:";
	string Publisher;
	cin >> Publisher;
	Books[num]->setPublisher(Publisher);
	cout << "Input Book's Price:";
	int price;
	cin >> price;
	Books[num]->setPrice(price);
	cout << "Input Book's Content:";
	string Content;
	cin >> Content;
	Books[num]->setContent(Content);
	//保存修改
	FileManagement fileMan;
	fileMan.saveBooks(Books);
	system("cls");
	viewBooks(Books);
	cout << endl;
	display();
}
//展示管理员的操作页面
void Administrator::display() {
    
    
	cout << "Operations:\n";
	cout << "1、View Book Information!\n";
	cout << "2、Add Book!\n";
	cout << "3、Delete Book!\n";
	cout << "4、Reset Book!\n";
	cout << "5、Exit Library!\n";
	cout << "Input your chosen operation:";
	int chosen;
	cin >> chosen;
	switch (chosen)
	{
    
    
	case 1: 
		system("cls");
		viewBooks(Books);
		cout << endl;
		    display();
		break;
	case 2: addBook();
		break;

	case 3: deleteBook();
		break;

	case 4: ResetBook();
		break;
	case 5: exit(1);
	}
}

7.(Book.h)

#include<string>
#include<iostream>
using namespace std;
class Book
{
    
    
private:
	string ID;//书本编号
	string Name;//书本名称
	string Author;//书本作者
	string Publisher;//书本出版社
	int price;//书本价格
	bool   isBorrowed;//是否借出
	string content;//简单的内容
public:
	Book();
	~Book();
	void setID(string ID);
	string getID();
	void setName(string Name);
	string getName();
	void setAuthor(string Author);
	string getAuthor();
	void setPublisher(string publisher);
	string getPublisher();
	void setPrice(int price);
	int getPrice();
	void setBorrowed(bool flag);
	bool getBorrowed();
	void setContent(string content);
	string getContent();
	virtual string toString();
};

8.(Book.cpp)

#include "Book.h"
Book::Book()
{
    
    
}
Book::~Book()
{
    
    
}
void Book::setID(string ID) {
    
    
	this->ID = ID;
}
string Book::getID() {
    
    
	return this->ID;
}
void Book::setName(string Name) {
    
    
	this->Name = Name;
}
string Book::getName() {
    
    
	return this->Name;
}
void Book::setAuthor(string Author) {
    
    
	this->Author = Author;
}
string Book::getAuthor() {
    
    
	return this->Author;
}
void Book::setPublisher(string publisher) {
    
    
	this->Publisher = publisher;
}
string Book::getPublisher() {
    
    
	return this->Publisher;
}
void Book::setPrice(int price) {
    
    
	this->price = price;
}
int Book::getPrice() {
    
    
	return this->price;
}
void Book::setBorrowed(bool flag) {
    
    
	this->isBorrowed = flag;
}
bool Book::getBorrowed() {
    
    
	return this->isBorrowed;
}
void Book::setContent(string content) {
    
    
	this->content = content;
}
string Book::getContent() {
    
    
	return this->content;
}
string Book::toString() {
    
    
	return "This is A Book! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n" ;
}

9.(E_Book.h)

#include "Book.h"
class E_Book :public Book
{
    
    
public:
	E_Book();
	~E_Book();
	string toString();
};

10.(E_Book.cpp)

#include "E_Book.h"
E_Book::E_Book()
{
    
    
}
E_Book::~E_Book()
{
    
    
}
string E_Book::toString() {
    
    
	return "This is An E_Book! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n";
}

11.(Magazine.h)

#include "Book.h"
class Magazine :public Book
{
    
    
public:
	Magazine();
	~Magazine();
	string toString();
};

#include "Magazine.h"

Magazine::Magazine()
{
    
    
}

12.(Magazine.cpp)

Magazine::~Magazine()
{
    
    
}
string Magazine::toString() {
    
    
	return "This is An Magazine! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n";
}

13.(Music.h)

#include "Book.h"
class Music :public Book
{
    
    
public:
	Music();
	~Music();
	string toString();
};

14(Music.cpp)

#include "Music.h"
Music::Music()
{
    
    
}
Music::~Music()
{
    
    
}
string Music::toString() {
    
    
	return "This is A Music! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n";
}

15.(Movie.h)

#include "Book.h"
class Movie :public Book
{
    
    
public:
	Movie();
	~Movie();
	string toString();
};

16.(Movie.cpp)

#include "Movie.h"
Movie::Movie()
{
    
    
}
Movie::~Movie()
{
    
    
}
string Movie::toString() {
    
    
	return "This is A Movie! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n";
}

17.(DVD.h)

#include "Movie.h"
class DVD :public Movie
{
    
    
public:
	DVD();
	~DVD();
	string toString();
};

18.(DVD.cpp)

#include "DVD.h"
DVD::DVD()
{
    
    
}
DVD::~DVD()
{
    
    
}
string DVD::toString() {
    
    
	return "This is A DVD! Its Name's " + getName() + "! And Its Content's " + getContent() + "!\n";
}

19.(FileManagement.h)

#include<vector>
#include<map>
#include "Book.h"
using namespace std;

class FileManagement
{
    
    
public:
	FileManagement();
	~FileManagement();

	map<string, string> getPeopleInfo();//读取用户文件people.txt的信息
	vector<Book *> getBooks();  //读取书本信息book.txt的信息
	void saveBooks(vector<Book *> vec);//保存对书本信息的修改
	Book * getObject(string ID);
};

20.(FileManagement.cpp)

#include "FileManagement.h"
#include <fstream>
#include "E_Book.h"
#include "Magazine.h"
#include "DVD.h"
#include "Movie.h"
#include "Music.h"


FileManagement::FileManagement()
{
    
    
}
FileManagement::~FileManagement()
{
    
    
}
Book * FileManagement::getObject(string ID) {
    
    
//如果是电子书,则返回电子书指针
	if (ID.find("E_Book") != string::npos)
	{
    
    
		return new E_Book();
	}
	//如果是杂志,则返回杂志指针
	if (ID.find("Magazine") != string::npos)
	{
    
    
	    return new Magazine();
	}
	//如果是音乐,则返回音乐指针
	if (ID.find("Music") != string::npos)
	{
    
    
		return new Music();
	}
	//如果是DVD,则返回DVD指针
	if (ID.find("DVD") != string::npos)
	{
    
    
		return new DVD();
	}
	//如果是Movie,则返回Movie指针
	if (ID.find("Movie") != string::npos)
	{
    
    
		return new Movie();
	}
	return NULL;
}
map<string, string> FileManagement::getPeopleInfo() {
    
    
	ifstream ifile("people.txt", ios::in);
	if (!ifile)
	{
    
    
		cerr << "open people error!" << endl;
	}
	map<string, string> mp;
	//读取用户账号信息
	while (!ifile.eof())
	{
    
    
		string account, password;
		ifile >> account >> password;
		mp[account] = password;
	}
	ifile.close();
	return mp;
}
vector<Book *> FileManagement::getBooks() {
    
    
	ifstream ifile("book.txt", ios::in);

	if (!ifile)
	{
    
    
		cerr << "open Book error" << endl;
	}
	vector<Book *> Books;
	Book * book;
	string ID, Name, Author, Pubilsher, Content;
	int price, flag;
	while (!ifile.eof())
	{
    
    
		ifile >> ID >> Name >> Author >> Pubilsher >> price >> flag >> Content;
		book = getObject(ID);
		book->setID(ID);
		book->setAuthor(Author);
		book->setName(Name);
		book->setPublisher(Pubilsher);
		book->setPrice(price);
		book->setContent(Content);
		if (flag == 0)
			book->setBorrowed(false);
		else
			book->setBorrowed(true);
		Books.push_back(book);
	}
	ifile.close();
	return Books;
}
void FileManagement::saveBooks(vector<Book *> vec) {
    
    
	ofstream ofile("book.txt", ios::out);
	if (!ofile)
	{
    
    
		cout << "open error";
	}
	for (unsigned int i = 0; i < vec.size(); i++)
	{
    
    
		ofile << vec[i]->getID() << " "
			<< vec[i]->getName() << " "
			<< vec[i]->getAuthor() << " "
			<< vec[i]->getPublisher() << " "
			<< vec[i]->getPrice() << " ";
		if (!vec[i]->getBorrowed())
		{
    
    
			ofile << 0;
		}
		else
		{
    
    
			ofile << 1;
		}
		ofile << " " << vec[i]->getContent();
		if (i != vec.size() - 1)
		{
    
    
			ofile << "\n";
		}
	}
	ofile.close();
}

21.(mainfunction)

#include<iostream>
#include "Book.h"
#include "FileManagement.h"
#include "User.h"
#include "Administrator.h"
using namespace std;
int main() {
    
    
	string account, password;
	cout << "Welcom to Library!\n";
	cout << "Account:";
	cin >> account;
	cout << "Password:";
	cin >> password;
	if (account.find("A") != string::npos)//管理员登录
	{
    
    
		Administrator * admin = new Administrator(account, password);
		admin->Login();
	}
	if (account.find("U") != string::npos)//普通用户登录
	{
    
    
		User * user = new User(account, password);
		user->Login();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Light20000309/article/details/104699734