图书馆管理系统

图书馆管理系统

要求

模拟图书馆管理系统。每名读者只能借一本书,读者可借书或还书。管理员可对图书和读者信息进行录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
大作业。恶臭代码。有时间了加注释,加用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


*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值