分析:
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;
}