小小图书馆
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;
}