图书馆管理系统
要求
模拟图书馆管理系统。每名读者只能借一本书,读者可借书或还书。管理员可对图书和读者信息进行录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
大作业。恶臭代码。有时间了加注释,加用txt当数据库的功能之类的。
代码
#include <cstdio>
#include <iostream>
#include <set>
#include <string>
using namespace std;
class baseBook {
public:
string id;
string name;
int num;
baseBook() { id = "0", name = "", num = 0; }
baseBook(const string &a, const string &b, int c) {
id = a, name = b, num = c;
}
bool operator<(const baseBook &rho) const { return name < rho.name; }
bool operator==(const baseBook &rho) const {
return id == rho.id || name == rho.name;
}
};
class baseReader {
public:
string id;
string name;
baseReader() { id = "0", name = ""; }
baseReader(string a, const string &b) { id = a, name = b; }
bool operator<(const baseReader &rho) const { return name < rho.name; }
bool operator==(const baseReader &rho) const {
return id == rho.id || name == rho.name;
}
};
class Book : public baseBook {
public:
Book() : baseBook() { borrowed.clear(); }
Book(const string &a, const string &b, int c) : baseBook(a, b, c) {
borrowed.clear();
}
using baseBook::operator<;
using baseBook::operator==;
bool borrow_return(int _num, baseReader reader) {
// 1 for return, -1 for borrow
if (num + _num < 0) {
printf("Not enough book.\n");
return 1;
} else {
borrowed.insert(reader);
num += _num;
return 0;
}
}
void print() {
cout << id << '\t' << name << '\t' << num << endl;
printf("Borrowed by:\n");
if (borrowed.empty())
printf("No one.\n");
else
for (auto reader : borrowed) {
cout << reader.id << '\t' << reader.name << endl;
}
}
private:
set<baseReader> borrowed;
};
class Reader : public baseReader {
public:
Reader() : baseReader() { borrows.clear(); }
Reader(const string &a, const string &b) : baseReader(a, b) {
borrows.clear();
}
using baseReader::operator<;
using baseReader::operator==;
bool borrow_return(int num, baseBook book) { // 1 for return, -1 for borrow
if (num == 1 && borrows.find(book) == borrows.end()) {
printf("Haven't borrowed this book.\n");
return 1;
} else {
borrows.insert(book);
return 0;
}
}
void print() {
cout << id << '\t' << name << endl;
printf("Borrowed:\n");
if (borrows.empty())
printf("Nothing.\n");
else
for (auto book : borrows) {
cout << book.id << '\t' << book.name << endl;
}
}
private:
set<baseBook> borrows;
};
// Books
set<Book> Books;
typedef set<Book>::iterator bookIt;
bookIt find_book_id(string id) {
bookIt it = Books.begin();
for (; it != Books.end(); it++) {
if (it->id == id) {
return it;
}
}
cout << "Book ID " << id << " not found." << endl;
return it;
}
bookIt find_book_name(string name) {
bookIt it = Books.upper_bound(Book(name, "", 0));
if (it == Books.end())
cout << "Book name " << name << " not found." << endl;
return it;
}
void add_book(string id, string name, int num) {
Book ne = Book(id, name, num);
if (Books.upper_bound(ne) != Books.end())
printf("Book already exist.");
else {
Books.insert(ne);
cout << "Add successfully." << endl;
}
}
void del_book(bookIt it) {
if (it != Books.end()) {
Books.erase(it);
cout << "Delete successfully." << endl;
}
}
// Readers
set<Reader> Readers;
typedef set<Reader>::iterator readerIt;
readerIt find_reader_id(string id) {
readerIt it = Readers.begin();
for (; it != Readers.end(); it++) {
if (it->id == id) {
return it;
}
}
cout << "Reader ID " << id << " not found." << endl;
return it;
}
readerIt find_reader_name(string name) {
readerIt it = Readers.upper_bound(Reader(name, ""));
if (it == Readers.end())
cout << "Reader name " << name << " not found." << endl;
return it;
}
void add_reader(string id, string name) {
Reader ne = Reader(id, name);
if (Readers.upper_bound(ne) != Readers.end())
printf("Reader already exist.");
else {
Readers.insert(ne);
cout << "Add successfully." << endl;
}
}
void del_reader(readerIt it) {
if (it != Readers.end()) {
Readers.erase(it);
cout << "Delete successfully." << endl;
}
}
// 3 main functions
void edit_book() {
printf("Tape 1 to add book.\n");
printf("Tape 2 to delete book.\n");
printf("Tape 3 to look for book.\n");
printf("Tape R to return to start menu.\n");
char op, op2;
string id, name;
int numbers = 0;
cin >> op;
switch (op) {
case '1':
printf("List the ID ,Name and Numbers of the book:\n");
cin >> id >> name >> numbers;
add_book(id, name, numbers);
break;
case '2':
printf("Tape 1 for delete book in ID, 2 for delete in Name.\n");
printf("Then type in ID or Name.\n");
cin >> op2;
if (op2 == '1') {
cin >> id;
bookIt it = find_book_id(id);
if (it != Books.end()) del_book(it);
} else if (op2 == '2') {
cin >> name;
bookIt it = find_book_name(name);
if (it != Books.end()) del_book(it);
}
break;
case '3':
printf("Tape 1 for find book in ID, 2 for find in Name.\n");
printf("Then type in ID or Name.\n");
cin >> op2;
if (op2 == '1') {
cin >> id;
bookIt it = find_book_id(id);
if (it != Books.end()) {
Book bo = (*it);
bo.print();
}
} else if (op2 == '2') {
cin >> name;
bookIt it = find_book_name(name);
if (it != Books.end()) {
Book bo = (*it);
bo.print();
}
}
break;
case 'R':
break;
default:
cout << "Incorrect input." << endl;
break;
}
}
void edit_reader() {
printf("Tape 1 to add reader.\n");
printf("Tape 2 to delete reader.\n");
printf("Tape 3 to look for reader.\n");
printf("Tape R to return to start menu.\n");
char op, op2;
string id, name;
cin >> op;
switch (op) {
case '1':
printf("List the ID and Name of the reader:\n");
cin >> id >> name;
add_reader(id, name);
break;
case '2':
printf("Tape 1 for delete reader in ID, 2 for delete in Name.\n");
printf("Then type in ID or Name.\n");
cin >> op2;
if (op2 == '1') {
cin >> id;
readerIt it = find_reader_id(id);
del_reader(it);
} else if (op2 == '2') {
cin >> name;
readerIt it = find_reader_name(name);
del_reader(it);
}
break;
case '3':
printf("Tape 1 for find reader in ID, 2 for find in Name.\n");
printf("Then type in ID or Name.\n");
cin >> op2;
if (op2 == '1') {
cin >> id;
readerIt it = find_reader_id(id);
if (it != Readers.end()) {
Reader re = (*it);
re.print();
}
} else if (op2 == '2') {
cin >> name;
readerIt it = find_reader_name(name);
if (it != Readers.end()) {
Reader re = (*it);
re.print();
}
}
break;
case 'R':
break;
default:
cout << "Incorrect input." << endl;
break;
}
}
void borrow_return(int num) { // 1 for return, -1 for borrow
printf("Tape 1 for book in ID, 2 for in Name.\n");
printf("Then type in ID or Name.\n");
string book_id, book_name;
bookIt bookit;
char op;
cin >> op;
switch (op) {
case '1':
cin >> book_id;
bookit = find_book_id(book_id);
if (bookit == Books.end()) return;
break;
case '2':
cin >> book_name;
bookit = find_book_name(book_name);
if (bookit == Books.end()) return;
break;
default:
cout << "Incorrect input." << endl;
return;
break;
}
printf("Tape 1 for reader in ID, 2 for in Name.\n");
printf("Then type in ID or Name.\n");
string reader_id, reader_name;
readerIt readerit;
cin >> op;
switch (op) {
case '1':
cin >> reader_id;
readerit = find_reader_id(reader_id);
if (readerit == Readers.end()) return;
break;
case '2':
cin >> reader_name;
readerit = find_reader_name(reader_name);
if (readerit == Readers.end()) return;
break;
default:
cout << "Incorrect input." << endl;
return;
break;
}
Book new_book = *bookit;
Reader new_reader = *readerit;
if (!new_book.borrow_return(num,
baseReader(new_reader.id, new_reader.name)) &&
!new_reader.borrow_return(num,
baseBook(new_book.id, new_book.name, 1))) {
Books.erase(bookit);
Books.insert(new_book);
Readers.erase(readerit);
Readers.insert(new_reader);
printf("Borrowed successfully.\n");
}
}
void help() {
printf("Tape 1 to edit Books.\n");
printf("Tape 2 to edit Readers.\n");
printf("Tape 3 to borrow Books.\n");
printf("Tape 4 to return Books.\n");
printf("Tape E to exit.\n");
}
bool do_loop() {
char op;
cin >> op;
switch (op) {
case '1':
edit_book();
break;
case '2':
edit_reader();
break;
case '3':
borrow_return(-1);
break;
case '4':
borrow_return(1);
break;
case 'E': // exit
return 1;
break;
case 'H':
help();
break;
default:
cout << "Incorrect input." << endl;
break;
}
return 0;
}
int main() {
cout << "Welcom to My Palace." << endl;
cout << "Tape H for help." << endl;
while (1) {
if (do_loop() != 0) break;
}
}
/*
H
1
1
123 FFT 4
2
1
345 lms
3
1 123
2 lms
1
3
2 FFT
2
3
1 345
*/