// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>
#include <fstream>
#include <iomanip>
const int Maxr = 300;
const int Maxb = 300;
const int Maxbor = 10;
class Reader
{
private:
int tag;
int No;
char name[20];
int borbook[Maxbor];
public:
Reader() {}
char *getname() { return name; }
int gettag() { return tag; }
int getno() { return No; }
void setname(char na[])
{
strcpy(name, na);
}
void delbook(){ tag = 1; }
void addreader(int n, char *na)
{
tag = 0;
No = n;
strcpy(name, na);
for (int i = 0; i<Maxbor; i++)
borbook[i] = 0;
}
void borrowbook(int bookid)
{
for (int i = 0; i<Maxbor; i++)
{
if (borbook[i] == 0)
{
borbook[i] = bookid;
return;
}
}
}
int retbook(int bookid)
{
for (int i = 0; i<Maxbor; i++)
{
if (borbook[i] == bookid)
{
borbook[i] = 0;
return 1;
}
}
return 0;
}
void disp()
{
cout << setw(10) << No << setw(15) << name << "借书检索号:[";
for (int i = 0; i<Maxbor; i++)
if (borbook[i] != 0)
cout << borbook[i] << "|";
cout << "]" << endl;
}
};
class RDatabase
{
private:
int top;
Reader read[Maxr];
public:
RDatabase()
{
Reader s;
top = -1;
fstream file("reader.txt", ios::in);
while (1)
{
file.read((char *)&s, sizeof(s));
if (!file)break;
top++;
read[top] = s;
}
file.close();
}
void clear()
{
top = -1;
}
int addreader(int n, char *na)
{
Reader *p = query(n);
if (p == NULL)
{
top++;
read[top].addreader(n, na);
return 1;
}
return 0;
}
Reader *query(int readerid)
{
for (int i = 0; i <= top; i++)
if (read[i].getno() == readerid &&
read[i].gettag() == 0)
{
return &read[i];
}
return NULL;
}
void disp()
{
for (int i = 0; i <= top; i++)
read[i].disp();
}
void readerdata();
~RDatabase()
{
fstream file("reader.txt", ios::out);
for (int i = 0; i <= top; i++)
if (read[i].gettag() == 0)
file.write((char *)&read[i], sizeof(read[i]));
file.close();
}
};
void RDatabase::readerdata()
{
char choice;
char rname[20];
int readerid;
Reader *r;
cout << "\n\n\t\t\t借阅者信息\n\n\n\t\t 1 增加借阅者信息\n\n\t\t 2 修改借阅者信息\n\n\t\t 3 删除借阅者信息\n\n\t\t 4 查询借阅者信息\n\n\t\t 0 退出" << endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "输入借阅者学号:";
cin >> readerid;
cin >> rname;
addreader(readerid, rname);
break;
case '2':
cout << "输入借阅者学号:";
cin >> readerid;
r = query(readerid);
if (r == NULL)
cout << " 借阅者信息错误" << endl;
break;
cout << "重新输入姓名:"; cin >> rname;
r->setname(rname);
break;
case '3':
cout << " 输入借阅者学号:";
cin >> readerid; r = query(readerid);
if (r == NULL)
cout << " 借阅者信息错误" << endl;
break;
r->delbook();
break;
case '4':
cout << "输入借阅者学号:";
cin >> readerid;
r = query(readerid);
if (r == NULL)
{
cout << "学号信息错误" << endl;
} r->disp();
break;
break;
case '5':
disp();
break;
default:cout << "信息错误,请重新输入:";
break;
}
}
class Book
{
private:
float price;
char author[10];
int tag;
int No;
char place[40];
char name[20];
int onshelf;
public:
Book(){}
char *getname() { return name; }
int getNo(){ return No; }
char *getplace(){ return place; }
int gettag(){ return tag; }
char*getauthor(){ return author; }
char getprice(){ return price; }
void setname(char na[])
{
strcpy(name, na);
}
void setauthor(char au[])
{
strcpy(author, au);
}
void delbook(){ tag = 1; }
void addbook(int N, char *na, char*au, int pr, char *bp)
{
tag = 0;
No = N;
price = pr;
strcpy(author, au);
strcpy(name, na);
onshelf = 1;
}
int borrowbook()
{
if (onshelf == 1)
{
onshelf = 0;
return 1;
}
return 0;
}
void retbook()
{
onshelf = 1;
}
void disp()
{
cout << setw(6) << "检索号: " << No << setw(18) << "书名: " << name << setw(10) << "作者: " << author << setw(18) << "单价: " << price << setw(10) << (onshelf == 1 ? "有现存" : "已借完") << endl;
}
};
class BDatabase
{
private:
int top;
Book book[Maxb];
public:
BDatabase()
{
Book b;
top = -1;
fstream file("book.txt", ios::in);
while (1)
{
file.read((char *)&b, sizeof(b));
if (!file) break;
top++;
book[top] = b;
}
file.close();
}
void clear()
{
top = -1;
}
int addbook(int n, char *na, char*au, int pr, char *bp)
{
Book *p = query(n);
if (NULL == p)
{
top++;
book[top].addbook(n, na, au, pr, bp);
return 1;
}
return 0;
}
Book *query(int bookid)
{
for (int i = 0; i <= top; i++)
if (book[i].getNo() == bookid &&book[i].gettag() == 0)
{
return &book[i];
}
return NULL;
}
void bookdata();
void disp()
{
for (int i = 0; i <= top; i++)
if (book[i].gettag() == 0)
book[i].disp();
}
~BDatabase()
{
fstream file("book.txt", ios::out);
for (int i = 0; i <= top; i++)
if (book[i].gettag() == 0)
file.write((char *)&book[i], sizeof(book[i]));
file.close();
}
};
void BDatabase::bookdata()
{
char choice;
char bauthor[10];
int bprice;
char bname[40];
int bookid;
char bplace[40];
Book *b;
cout << "\n\n\n\t\t\t图书信息" << endl << endl; cout << "\t\t1 增加图书信息\n \t\t2 修改图书信息\n\t\t3 删除图书信息\n\t\t4 查询图书信息\n\t\t0 退出" << endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "输入图书检索号:" << endl;
cin >> bookid;
cout << "输入图书书名:" << endl;
cin >> bname;
cout << " 输入作者名:";
cin >> bauthor;
cout << "输入图书价格:" << endl;
cin >> bprice;
cout << "输入图书出版社:" << endl;
cin >> bplace;
addbook(bookid, bname, bauthor, bprice, bplace);
break;
case '2':
cout << "输入图书检索号:" << endl;
cin >> bookid;
b = query(bookid);
if (b == NULL)
{
cout << " 信息错误" << endl;
break;
}
cout << "重新输入书名:" << endl;
cin >> bname;
b->setname(bname);
break;
case '3':
cout << " 读入图书检索号:" << endl;
cin >> bookid;
b = query(bookid);
if (b == NULL)
{
cout << " 信息错误" << endl;
break;
}
b->delbook();
break;
case '4':
cout << " 读入图书检索号:" << endl;
cin >> bookid;
b = query(bookid);
if (b == NULL)
{
cout << " 信息错误" << endl;
break;
}
b->disp();
break;
default:cout << "信息错误,请重新输入:";
}
}
void main()
{
char choice;
int bookid, readerid;
RDatabase ReaderDB;
Reader *r;
BDatabase BookDB;
Book *b;
cout << endl << endl << "\t\t\t 图书管理系统\n\n\n";
cout << "\t\t\t1 借还情况\n\n\t\t\t2 图书信息表\n\n\t\t\t3 借阅者信息表\n\n\t\t\t0 退出" << endl;
while (true)
{
cin >> choice;
switch (choice)
{
case '0':
break;
case '1':
cout << "\t\t\t1 借书\n\n\t\t\t2 还书\n\n\t\t\t0 退出" << endl;
cin >> choice;
switch (choice)
{
case '1':
cout << " 借阅者学号:";
cin >> readerid;
cout << " 图书检索号:";
cin >> bookid;
r = ReaderDB.query(readerid);
if (NULL == r)
{
cout << " 借阅者信息错误,不能借书" << endl;
break;
}
b = BookDB.query(bookid);
if (b == NULL)
{
cout << "图书信息错误,不能借书" << endl;
break;
}
if (b->borrowbook() == 0)
{
cout << "该图书没有现存,不能借书" << endl;
break;
}
r->borrowbook(b->getNo());
break;
case '2':
cout << "借阅者学号:";
cin >> readerid;
cout << "图书检索号:";
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->getNo());
break;
}
case '2':
BookDB.bookdata();
break;
case '3':
ReaderDB.readerdata();
break;
default:cout << "信息错误,请从新输入:";
}
}
}