图书管理系统
一、实验题目分析
本次实验要求综合运用面向对象程序设计方法,设计实现一个相对完整的图书管理系统。其中包括系统管理员、图书管理员、学生以及教师的的操作。支持系统用户的图书借阅、图书管理、用户管理等功能。图书借阅管理主要包括图书借阅、图书归还、借阅信息查看等功能。图书管理主要包括图书的增加、删除、修改、查看、统计等功能。用户管理主要包括用户注册、登录、修改密码、修改个人信息、设置用户类型等功能。
考虑到账号为数字类型,且长度大小不固定,故不采用数组,而选择map容器,来进行各类账号的存储,且其中各类用户都可以进行借阅操作,但是部分地方不同,于是采用虚函数来进行此处处理。由于需要从文件中读取数据以及用户输入数据,所以对文件以及用户的输入输出“<<”和“>>”都进行了重载。
二、实验设计
本实验设计了Person类,借阅等相关操作都在Person类中实现,个别部分如老师与学生借书时常、借书数量有差异采取虚函数方式,在派生类中重新定义。且除此之外,对图书管理员类BookManager以及系统管理员类SystemManager类中的方法还进行了扩展,其除了借阅相关操作外,还可以进行增加删除图书,进行图书数量统计、更改用户类型等操作。
本实验采用map容器存储,以避免定义静态数组占用较大空间的情况。且针对不同的用户设计了相应的入口函数。
#include<iostream>
#include<string>
#include<fstream>
#include<map>
using namespace std;
int system_manger_number;
int book_manager_number;
int teacher_number;
int student_number;
int book_number;
int log_number;
int current_user_type = 0;
int have_account;
int user_number;
string user_password;
string user_name;
string user_gender;
string book_title;
string writer_name;
int current_oparatiion = 0;
int log_id;
int book_id;
int year;
int month;
int day;
bool is_borrowed;
int student_user_type = 1;
int teacher_user_type = 2;
int system_manager_user_type = 3;
int book_manager_user_type = 4;
int student_max_borrow_number = 10;
int teacher_max_borrow_number = 20;
int student_max_borrow_day = 20;
int teacher_max_borrow_day = 30;
int manager_max_borrow_number = 15;
int manager_max_borrow_day = 20;
class SystemManager;
class BookManager;
class Student;
class Teacher;
class Book;
class Log;
map<int, SystemManager> map_system_manager;
map<int, SystemManager>::iterator iter_system_manager;
map<int, BookManager> map_book_manager;
map<int, BookManager>::iterator iter_book_manager;
map<int, Student> map_student;
map<int, Student>::iterator iter_student;
map<int, Teacher> map_teacher;
map<int, Teacher>::iterator iter_teacher;
map<int, Book> map_book;
map<int, Book>::iterator iter_book;
map<int, Log> map_log;
map<int, Log>::iterator iter_log;
class Book {
private:
int book_id;
string book_title;
string writer_name;
int is_borrowed;
public:
Book(int book_id = 0, string book_title = "", string writer_name = "", int is_borrowed = 0) :book_id(book_id), book_title(book_title), writer_name(writer_name), is_borrowed(0) {
};
int getBookId() {
return book_id; }
string getBookTitle() {
return book_title; }
string getWriterName() {
return writer_name; }
int getIsBorrowed() {
return is_borrowed; }
void setBookId(int bi) {
book_id = bi;
}
void setBookTitle(string bt) {
book_title = bt;
}
void setWriterName(string wn) {
writer_name = wn;
}
void setBorrowed() {
is_borrowed = 1;
}
void setFree() {
is_borrowed = 0;
}
friend ofstream& operator<<(ofstream& out, Book& a) {
out << a.book_id << " "
<< a.book_title << " "
<< a.writer_name << " "
<< a.is_borrowed << "\n";
return out;
}
friend ifstream& operator>>(ifstream& in, Book& a) {
in >> a.book_id
>> a.book_title
>> a.writer_name
>> a.is_borrowed;
return in;
};
friend istream& operator<<(istream& in, Book& a) {
in >> a.book_id
>> a.book_title
>> a.writer_name
>> a.is_borrowed;
return in;
}
friend ostream& operator<<(ostream& out, Book& a) {
out << a.book_id << "\t"
<< a.book_title << "\t"
<< a.writer_name << "\t";
if(a.is_borrowed){
cout<<"已借出\n";
}else{
cout<<"可借阅\n";
}
return out;
}
};
class Log {
private:
int log_id;
int user_number;
string user_name;
int is_borrowing;
int is_returning;
int book_id;
string book_title;
string writer_name;
int year;
int month;
int day;
public:
int getLogId() {
return log_id; }
int getUserNumber() {
return user_number; }
string getUserName() {
return user_name; }
int getIsBorrowing() {
return is_borrowing; }
int getIsReturning() {
return is_returning; }
int getBookId() {
return book_id; }
string getBookTitle() {
return book_title; }
string getWriterName() {
return writer_name; }
int getYear() {
return year; }
int getMonth() {
return month; }
int getDay() {
return day; }
Log(int log_id = 0,
int user_number = 0,
string user_name = "",
int is_borrowing = 0,
int is_returning = 0,
int book_id = 0,
string book_title = "",
string writer_name = "",
int year = 0,
int month = 0,
int day = 0) :
log_id(log_id),
user_number(user_number),
user_name(user_name),
is_borrowing(is_borrowing),
is_returning(is_returning),
book_id(book_id),
book_title(book_title),
writer_name(writer_name),
year(year),
month(month),
day(day)
{
};
friend ofstream& operator<<(ofstream& out, Log& a) {
out << a.log_id << " "
<< a.user_number << " "
<< a.user_name << " "
<< a.is_borrowing << " "
<< a.is_returning << " "
<< a.book_id << " "
<< a.book_title << " "
<< a.writer_name << " "
<< a.year << " "
<< a.month << " "
<< a.day
<< "\n";
return out;
}
friend ifstream& operator>>(ifstream& in, Log& a) {
in >> a.log_id >>
a.user_number >>
a.user_name >>
a.is_borrowing >>
a.is_returning >>
a.book_id >>
a.book_title >>
a.writer_name >>
a.year >>
a.month >>
a.day;
return in;
};
friend istream& operator<<(istream& in, Log& a) {
in >> a.log_id >>
a.user_number >>
a.user_name >>
a.is_borrowing >>
a.is_returning >>
a.book_id >>
a.book_title >>
a.writer_name >>
a.year >>
a.month >>
a.day;
return in;
}
friend ostream& operator<<(ostream& out, Log& a) {
out << a.log_id << "\t"
<< a.user_number << "\t"
<< a.user_name << "\t"
<< a.is_borrowing << "\t"
<< a.is_returning << "\t"
<< a.book_id << "\t"
<< a.book_title << "\t"
<< a.writer_name << "\t"
<< a.year << "\t"
<< a.month << "\t"
<< a.day << "\t"
<< "\n";
return out;
}
};
class Person {
protected:
int user_number;
string user_password;
string user_name;
string user_gender;
int current_borrow_number;
int user_type;//student 1; teacher 2; system manager 3; book manager 4;
int max_borrow_number;//manager 15 student 10 teacher 20 ;
public:
Person(int user_number = 0,
string user_password = "",
string user_name = "",
string user_gender = "",
int current_borrow_number = 0,
int user_type = 0,
int max_borrow_number = 0) :user_number(user_number), user_password(user_password), user_name(user_name), user_gender(user_gender), current_borrow_number(current_borrow_number), user_type(user_type), max_borrow_number(max_borrow_number) {
};
int getUserNumber() {
return user_number;
}
string getUserPassWord() {
return user_password;
}
string getUserName() {
return user_name;
}
string getUserGender() {
return user_gender;
}
int getCurrentBorrowNumber() {
return current_borrow_number;
}
int getUserType() {
return user_type;
}
int getMaxBorrowNumber() {
return max_borrow_number;
}
void setUserNumber(int a) {
user_number = a;
}
void setUserPassword(string a) {
user_password = a; }
void setUserName(string a) {
user_name = a; }
void setUserGender(string a) {
user_gender = a; }
virtual void showBorrowDay()=0;
virtual bool judgeQuota()=0;
virtual bool judgeOverTime(int)=0;
void userChangePassword() {
cout << "当前为修改密码功能:\n";
cout << "新密码:";
cin >> user_password;
setUserPassword(user_password);
cout << "修改密码成功!";
}
void changeInformations() {
cout << "当前为修改个人信息功能:\n";
cout << "修改姓名为:";
cin >> user_name;
setUserName(user_name);
cout << "修改姓名成功!\n";
cout << "修改性别为:";
cin >> user_gender;
setUserGender(user_gender);
cout << "修改性别成功!\n";
}
void borrowBook() {
try {
showBorrowDay();
if (judgeQuota()) {
int a=0;
throw a;
}
cout << "请输入书号:";
cin >> book_id;
if(map_book[book_id].getIsBorrowed()){
double b=0;
throw b;
}
log_id = ++log_number;
//cout<<"log_number:"<<log_number<<endl;
cout << "请输入当前日期\n";
cout << "年:";
cin >> year;
cout << "月:";
cin >> month;
cout << "日:";
cin >> day;
current_borrow_number++;
map_book[book_id].setBorrowed();
map_log[log_id] = Log(log_id, user_number, user_name, 1, 0, book_id, map_book[book_id].getBookTitle(), map_book[book_id].getWriterName(), year, month, day);
cout << "借阅成功!\n";