小小图书馆

本文介绍了一个图书管理系统的详细设计,包括图书类和读者类的定义,实现了借书、还书、图书和读者信息维护等功能,提供了完整的类定义和方法实现。

小小图书馆

2、设计一个图书管理系统中的图书类,要求:

(1)私有属性:书名,书号,上架标志(0代表未上架,1代表上架,未上架的图书不能借阅),删除标志(1删除,0未删除),图书数量

(2)方法有:构造函数,析构函数,获得书名,获得删除标志,获得图书数量,获得图书编号,设置书名,删除图书,添加图书借书操作,还书操作,输出图书信息

(3)完善该类的设计,设计借还书等操作的逻辑实现

(4)提示:添加、删除、借阅、归还等操作都需要改变图书的数量
头文件:
book.h

#ifndef _BOOK_H_
#define _BOOK_H_
#include<iostream>
using namespace std;
class Book
{
private:
	int note;//删除标志(1:已删,0:未删)
	int number;//图书编号
	char name[30];//书名
	int onshelf;//上架标志
public:
	char *getname();
	int getnote();
	int getnumber();
	int getonshelf();
	void setname(char na[]);
	void delbook();
	void addbook(int n, char *na);
	void borrowbook();
	void retbook();
	
	void list();
};
#endif

reader.h

#ifndef _Rearder_h_
#define _Rearder_h_
#include<iostream>
using namespace std;
 const int Maxbor = 5;
class Reader
{
private:
	int note;//删除标致(1:已删 0:未删)
	int number;//读者编号
	char name[30];//读者姓名
	int borbook[Maxbor];//所借图书
public:
	char *getname();
	int getnote();//获得删除标志
	int getnumber();
	void setname(char na[]);//设置姓名
	void delreader();//设置删除标志
	void addreader(int n, char *na);
	void borrowbook(int bookid);//借书操作
	int retbook(int bookid);
	void list();//输出读者信息

};
#endif

bdatabase.h

#ifndef _BDATABASE_H_
#define  _BDATABASE_H_
#include"book.h"
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
const int Maxb = 100;
class Bdatabase
{
private:
	int top;//图书记录指针
	Book book[Maxb];//这里的构造注意
public:
	Bdatabase();//构造函数初始化:读文件;有另外一个类对象时的初始化
	void clear();
	int addbook(int n, char *na);
	Book *query(int bookid);//查找图书
	void list();
	void bookdata();//图书库维护
	~Bdatabase();
};
#endif

rdatabase.h

#ifndef _RDATABASE_H_
#define _RDATANASE_H_
#include<iostream>
#include"reader.h"
using namespace std;
const int Maxr = 100;
class Rdatabase
{
private:
	int top;//读者记录指针
	Reader read[Maxr];
public:
	Rdatabase();
	void clear();//清除所有读者信息
	int addreader(int n, char *na);//添加读者记录时,先确定他是否已经存在
	Reader *query(int readerid);
	void list();
	void readerdata();//读者信息维护
	~Rdatabase();//写文件

};
#endif

book.cpp

#include<iostream>
#include<string>
#include<iomanip>
#include"book.h"
using namespace std;
char *Book::getname()
{
	return name;
}
int Book::getnote()
{
	return note;
}
int Book::getonshelf()
{
	return onshelf;
}
void Book::setname(char na[])
{
	strcpy_s(name, na);
}
void Book::addbook(int n, char *na)
{
	note = 0;
	number = n;
	strcpy_s(name, na);
	onshelf = 1;
}
void Book::delbook()
{
	note=1;

}
void Book::borrowbook()
{
	 onshelf=0;//修改过
}
void Book::retbook()
{
	onshelf = 1;
}
void Book::list()
{
	
	if (note == 0)
	{
		
		cout << setw(10) << number << setw(20) << name << setw(5) << onshelf << endl;
	}
}
int Book::getnumber()
{
	return number;
}

reader.cpp

#include<iostream>
#include"reader.h"
#include<string>
#include<iomanip>
using namespace std;

char *Reader::getname()
{
	return name;
}
int Reader::getnote()
{
	return note;
}
int Reader:: getnumber()
{
	return number;
}
void Reader::setname(char na[])
{
	strcpy_s(name, na);
}
void Reader::addreader(int n, char *na)
{
	note = 0;
	number = n;
	strcpy_s(name, na);
	for (int i = 0; i < Maxbor; i++)
		borbook[i] = 0;
}
void Reader::delreader()
{
	note = 1;
}
void Reader::borrowbook(int bookid)
{
	for (int i = 0; i < Maxbor; i++)
	{
		if (borbook[i] == 0)
		{
			borbook[i] = bookid;
			break;//有疑惑修改过
		}
	}
}
int Reader::retbook(int bookid)
{
	for (int i = 0; i < Maxbor; i++)
	{
		if (borbook[i] == bookid)
		{
			borbook[i] = 0;
			return 1;
		}
	}
	return 0;
}
void Reader::list()
{
	if (note ==0)
	{
	
	cout << setw(10) << number << setw(15) << name << "  借书编号:[";
	for (int i = 0; i < Maxbor; i++)
		//if (borbook[i] == 0)
			cout << borbook[i] << " ";//有疑惑
	cout << "]" << endl;
}
}

bdatabase.cpp

#include<string>
#include<fstream>
#include<iomanip>
#include<iostream>
#include"bdatabase.h"
using namespace std;
Bdatabase::Bdatabase()
{
	Book s;
	top = -1;
	fstream file;
	file.open("book.dat", ios::in | ios::binary);
	while (1)
	{
		file.read((char*)&s, sizeof(s));
		if (!file) break;
		top++;
		book[top] = s;
	}
	file.close();
}
void Bdatabase::clear()
{
	top = -1;

}
Book *Bdatabase::query(int bookid)
{
	for (int i = 0; i <= top; i++)
	{
		if (book[i].getnumber() == bookid && book[i].getnote() == 0)
			return &book[i];
	}
		return NULL;

}
int Bdatabase::addbook(int n, char *na)
{
	Book *p = query(n);
	if (p == NULL)
	{
		top++;
		book[top].addbook(n, na);
		return 1;
	}
	cout << "该编号图书已经存在"<<endl;
	return 0;
}
void Bdatabase::list()
{
	cout << setw(10) << "图书编号" << setw(20) << "图书书名" << setw(10) << "上架标志" << endl;
	for (int i = 0; i <= top; i++)
	{
		book[i].list();
	}
}
Bdatabase::~Bdatabase()
{
	fstream file;
	file.open("book.dat", ios::out | ios::binary);
	for (int i = 0; i <= top; i ++ )
	{
		if (book[i].getnote() == 0)
			file.write((char*)&book[i], sizeof(book[i]));//???
		
	}
	file.close();
}
void Bdatabase::bookdata()
{
	int choice = 1;
	char bookname[20];
	int bookid;
	Book *b;
	while (choice != 0)
	{
		system("cls");
		cout << "图书维护:" << endl;
		cout << "----------------------------------------------" << endl;
		cout << "1:新增  2:更改  3:删除  4:查找  5:显示  6:全删  0;退出" << endl;
		cin >> choice;
		cout << "----------------------------------------------" << endl;
		switch (choice)
		{
		case 1:cout << "输入图书编号:";
			cin >> bookid;
			cout << "输入图书名";
			cin >> bookname;
			addbook(bookid, bookname);//??
			system("pause");
			break;
		case 2:cout << "输入图书编号";
			cin >> bookid;
			b = query(bookid);
			if (b == NULL)
			{
				cout << "该图书不存在!!!" << endl;
				system("pause");
				break;
			}
			cout << "输入新的图书名";
			cin >> bookname;
			b->setname(bookname);
			system("pause");
			break;
		case 3:cout << "输入图书编号:";
			cin >> bookid;
			b = query(bookid);
			if (b == NULL)
			{
				cout << "该图书不存在!!" << endl;
				break;
			}
			b->delbook();
			system("pause"); 
			break;
		case 4:cout << "输入图书编号:";
			cin >> bookid;
			b = query(bookid);
			if (b == NULL)
			{
				cout << "该图书不存在!" << endl;
				break;
			}
			b->list();
			system("pause");
			break;
		case 5:
			list();
			system("pause");
			break;
		case 6:clear();
			system("pause");
			break;
		case 0:break;
		default:cout << "请输入正确的选项" << endl;
			system("pause");
			break;

			
		
		}
	}
}



rdatabase.cpp

#include<iostream>
#include<string>
#include<iomanip>
#include"rdatabase.h"
#include<fstream>
using namespace std;
Rdatabase::Rdatabase()
{
	Reader s;
	top = -1;
	fstream file;
	file.open("reader.dat", ios::in | ios::binary);
	while (1)
	{
		file.read((char *)&s, sizeof(s));
		if (!file)
			break;
		top++;
		read[top] = s;
	}
	file.close();
}
void Rdatabase::clear()
{
	top = -1; 
}
Reader *Rdatabase::query(int readerid)
{
	for (int i = 0; i <= top; i++)
	{
		if (read[i].getnumber() == readerid && read[i].getnote() == 0)
		{
			return &read[i];
		}
		
	}
	return NULL;//很关键,在这里的位置要在for循环下面,不然总是返回NULL,错了很多次
}
int Rdatabase::addreader(int n, char *na)
{
	Reader *p = query(n);
	if (p == NULL)
	{
		top++;
		read[top].addreader(n, na);
		return 1;
	}
	return 0;
}
void Rdatabase::list()
{
	cout <<setw(10) << "读者编号"  <<setw(15)<< "读者姓名" << endl;
	
	for (int i = 0; i <= top; i++)
	{
		read[i].list();
	}
}
Rdatabase::~Rdatabase()
{
	fstream file;
	file.open("reader.dat", ios::out | ios::binary);
		for (int i = 0; i <= top; i++)
		{
			if (read[i].getnote() == 0)
			{
				file.write((char *)&read[i], sizeof(read[i]));
			}
		}
		file.close();
}
void Rdatabase::readerdata()
{
	int choice = 1;
	char readername[20];
	int readerid;
	Reader *r;
	while (choice)
	{
		system("cls");
		cout << "读者维护:" << endl;
		cout << "-------------------------------------------------" << endl;
		cout << "1:新增  2:更改  3:删除  4:查找  5:显示  6:全删  0:退出" << endl;
		cin >> choice;
		cout << "---------------------------------------------------" << endl;
		switch (choice)
		{
		case 1:cout << "输入读者编号:";
			cin >> readerid;
			cout << "输入读者的姓名:" << endl;
			cin >> readername;
			addreader(readerid, readername);
			system("pause");
			break;
		case 2:cout << "输入读者编号:";
			cin >> readerid;
			r = query(readerid);
			if (r == NULL)
			{
				cout << "该读者不存在!!" << endl;
				system("pause");
				break;
			}
			cout << "输入新的姓名" << endl;
			cin >> readername;
			r->setname(readername);
			system("pause");
			break;
		case 3:cout << "输入读者编号:" << endl;
			cin >> readerid;
			r = query(readerid);
			if (r == NULL)
			{
				cout << "该读者不存在!!" << endl;
				system("pause");
				break;

			}
			r->delreader();
			system("pause");
			break;
		case 4:cout << "输入读者编号:" << endl;
			cin >> readerid;
			r = query(readerid);
			if (r == NULL)
			{
				cout << "该读者不存在:" << endl;
				system("pause");
				break;
			}
			r->list();
			system("pause");
			break;
		case 5:
			list();
			system("pause");
			break;
		case 6:clear();
			system("pause");
			break;
		case 0:break;
		default:cout << "请输入正确的选项" << endl;
			system("pause");
			break;
		}
	}
	
}

library.cpp

#include<iostream>
#include"bdatabase.h"
#include"book.h"
#include"reader.h"
#include"rdatabase.h"
using namespace std;
int main()
{
	int choice = 1, bookid, readerid;
	Rdatabase  ReaderDB;
	Bdatabase BookDB;
	Reader *r;
	Book *b;
	cout << "欢迎进入“小小图书馆”管理软件" << endl;
	cout << "--------------------------------" << endl;
	
	system("pause");
	while (choice != 0)
	{
		system("cls");
		
		cout << "--------------------------------" << endl;
		cout << "1:借书  2:还书  3:图书管理  4:读者维护  0:离开" << endl;
		cin >> choice;
		cout << "-----------------------------------" << endl;
		switch (choice)
		{
			
		case 1:
			cout << "输入借书读者编号" << endl;
			cin >> readerid;
			cout << "输入图书编号" << endl;
			cin >> bookid;
			r = ReaderDB.query(readerid);
			if (r == NULL)
			{
				cout << "该读者不存在,不能借书!" << endl;
				break;
			}
			b = BookDB.query(bookid);
			if (b == NULL)
			{
				cout << "该图书不存在,不能借书!" << endl;
				break;
			}
			if (b->getonshelf() == 0)
			{
				cout << "该图书已借出,不能借书!" << endl;
				break;
			}
			b->borrowbook();
			r->borrowbook(b->getnumber());
			cout << "成功借到图书:" << b->getname() << endl;
			r->list();
			system("pause");
			break;
		case 2:
			cout << "输入还书读者编号" << endl;
			cin >> readerid;
			cout << "输入图书编号" << endl;
			cin >> bookid;
			r = ReaderDB.query(readerid);
			if (r == NULL)
			{
				cout << "该读者不存在,不能还书" << endl;
				break;
			}
			b = BookDB.query(bookid);
			if (b == NULL)
			{
				cout<<"该图书不存在,不能还书!"<<endl;
				break;
			}
			b->retbook();
			r->retbook(b->getnumber());
			cout << "成功还书:" << b->getname() << endl;
			r->list();
			system("pause");
			break;
		case 3:
			BookDB.bookdata();
			system("cls");
			break;
		case 4:
			ReaderDB.readerdata();
			system("cls");
			break;
		case 0:break;
		default:cout << "请输入正确的选项" << endl;
			system("pause");
			break;

		}
		
	}
	

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值