注册 登录
编程论坛 C++教室

我做的简易图书馆。

当当 发布于 2005-06-07 19:55, 8799 次点击

程序说明书 一. 各模块的功能: readtxt(),读读者文件writetxt(),写读者文件addreader(reader s) ,添加读者delreader(int number),删除读者searchreader(int number),查找读者readerdata() ,读者数据管理readbtxt(),读图书文件writebtxt(),写图书文件addbook(libook s),添加图书delbook(int number),删除图书searchbook(int number),查找图书bookdata(),图书数据管理borbook(),读者借书retbook(),读者还书main()主函数 二. 程序流程图: void main() : 三. 用户手册:1,使用程序前先对图书库,读者库进行初始化,然后才能进行相应的操作2,本程序又一定的纠错功能 ①调用子函数对功能进行相应的选择的时候,如果选择的端子不正确,则提示错误 ②对添加的读者函数操作的时候如果读者库已经满了,读者申请的编号已经存在的情况则提示错误 ③对删除读者函数操作的时候,如果输入的读者编号不存在则提示错误 ④对查找读者函数操作的时候,如果输入的读者编号不存在的时候则提示错误 ⑤对新书入库函数操作的时候,如果书库已经满或者申请的书编号已经存在,则提示错误 ⑥对删除的图书函数进行操作的时候,如果要删除的图书编号不存在,则提示出错 ⑦对查找函数操作的时候,如果要查找的图书函数不存在,则提示出错 ⑧对借书函数进行操作时,如果读者编号不存在,不能在借书,所要借的书已经借出,或者要借的书不存在的时候,则提示出错 ⑨对还书函数操作的时候,如果读者编号不存在,所还图书不为图书馆所有时,则提示出错。 这是论坛上的一个题目,我看了在我之前那个人做的代码之后,受到了启发,就利用自己所学的有限的知识,花了一个星期的时间,终于做了出来。请大家批评指证。在VC6.0下运行通过,运行时得注意的几个地方如下:读者与书籍编号全部为3位,读者库,书籍库最好不要存满,至少留有一个空位.代码与注释,及原程序及原程序附件如下: #include <iostream.h> #include <fstream.h> #include <string.h> #include <iomanip.h> class reader { private: char code[4]; //读者编号 char name[10]; //读者姓名 public: void get() //输入读者资料 { cout<<"请输入读者编号:"; cin>>code; cout<<"请输入读者姓名:"; cin>>name; } void print() //打印读者资料 { cout<<"读者编号:"<<code<<endl; cout<<"读者姓名:"<<name<<endl; } char* getcode() { return(code); } char* getname() { return(name); } };

class book { private: char code[4]; //书籍编号 char name[10]; //书籍名称 char writer[10]; //书籍作者 char concern[10]; //书籍出版社 float price; //书籍价格 public: char flag; //判断此书是否借出 book() //利用构造函数,将flag变量默认为'N',即没有借出 { flag = 'N'; } void get() //输入书籍资料 { cout<<"请输入书籍编号:"; cin>>code; cout<<"请输入书籍名称:"; cin>>name; cout<<"请输入书籍作者:"; cin>>writer; cout<<"请输入书籍出版社:"; cin>>concern; cout<<"请输入书籍价格:"; cin>>price; } void print() { cout<<"书籍编号:"<<code<<endl; cout<<"书籍名称:"<<name<<endl; cout<<"书籍作者:"<<writer<<endl; cout<<"书籍出版社:"<<concern<<endl; cout<<"书籍价格:"<<price<<endl; } void getflag() { cout<<"确认要租此书吗?[Y/N]"; cin>>flag; } char* getcode() { return(code); } char* getname() { return(name); } };

class readerborrowbook //用于记录租书情况的类 { public: char readercode[4]; char bookcode[4];

void borrowbook() { cout<<"请输入您的读者编号:"; cin>>readercode; cout<<"请输入您要借的书籍的编号:"; cin>>bookcode; } void print() { cout<<"借书证号:"<<readercode<<endl; cout<<"借的书籍:"<<bookcode<<endl; }

};

reader readerzlk[50]; //定义读者库数组(读者库) book library[100]; //定义书籍数组(书籍库) readerborrowbook rbb[100]; //定义借书记录数组(借书库)

fstream file_reader; //定义读者库文件对象(全局的) fstream file_book; //定义书籍库文件对象(全局的) fstream file_rbb; //定义借书库文件对象(全局的)

int r = 0; //记录读者个数 int b = 0; //记录书籍本数 int t = 0; //记录借书记录

只有本站会员才能查看附件,请 登录

[此贴子已经被作者于2005-6-19 10:54:39编辑过]

65 回复
#2
当当2005-06-07 20:03

void CSHreader() //初始化读者库函数 { file_reader.open("readerfile.txt", ios::in); //打开文件 file_reader.read((char*)&readerzlk[0], sizeof(readerzlk[0]));//将文件内容读到读者库数组的第一个对象 if (strlen(readerzlk[0].getcode()) == 0)//判断第一个对象的内容是否为空,如为空,则文件为空 { cout<<"读者库信息为空,请建立读者信息。"<<endl; } else { while(!file_reader.eof())//否则将文件后面的内容读到读者库数组后面的对象之中,从而达到初始化的效果 { r++; file_reader.read((char*)&readerzlk[r], sizeof(readerzlk[r])); if (r >= 50) { cout<<"读者库已满!"<<endl; break; } } cout<<"初始化读者库成功……"<<endl; } file_reader.close(); }

void CSHbook() //初始化书籍库函数(注释同读者库一样) { file_book.open("bookfile.txt", ios::in); file_book.read((char*)&library[0], sizeof(library[0])); if (strlen(library[0].getcode()) == 0) { cout<<"书籍库信息为空,请建立书籍信息。"<<endl; } else { while(!file_book.eof()) { b++; file_book.read((char*)&library[b], sizeof(library[b])); if (b >= 100) { cout<<"书籍库已满!"<<endl; break; } } cout<<"初始化书籍库成功……"<<endl; } file_book.close(); }

void CSHrbb() //初始化借书库 { file_rbb.open("rbb.txt", ios::in); file_rbb.read((char*)&rbb[0], sizeof(rbb[0])); if (strlen(rbb[0].readercode) == 0) { cout<<"借书库信息为空,暂时无借书情况。"<<endl; } else { while (!file_rbb.eof()) { t++; file_rbb.read((char*)&rbb[t], sizeof(rbb[t])); if (t >= 100) { cout<<"借书库已满,请速让读者归还书籍。"<<endl; break; } } cout<<"初始化借书库成功……"<<endl; } file_rbb.close(); }

void borrowbook() //借书函数 { int d = 0; //逻辑判断值 int i = 0; char flag = 'y'; readerborrowbook temp; while (flag == 'y' || flag == 'Y') { temp.borrowbook(); for (i = 0; i < r; i++)//判断有无此读者编号 { if (strcmp(temp.readercode, readerzlk[i].getcode()) == 0) { d = 1; //为1则有此编号,否则无此编号 break; } } if (d == 0) { cout<<"对不起!您的编号不存在!"<<endl; return; } d = 0, i = 0; //恢复初始值,进行书的编号的判断 for (i = 0; i < b; i++) //判断有无此书籍编号 { if (strcmp(temp.bookcode, library[i].getcode()) == 0) { d = 1; //同上 break; } } if (d == 0) { cout<<"对不起!我们这里没有此书籍!"<<endl; return; } //判断书籍是否借出,本意是想通过".flag"是否等于'Y'或'y'来判断书是否借出的,可是总是判断不成功。 //本意是if (library[i].flag == 'Y' || library[i].flag == 'y') // {cout<<"非常抱歉,此书已经租出。"<<endl;return;} int j = 0; for (j = 0; j < t; j++) { if (strcmp(temp.bookcode, rbb[j].bookcode) == 0) { cout<<"非常抱歉,此书已经租出。"<<endl; return; } } library[i].getflag(); if (library[i].flag == 'Y' || library[i].flag == 'y') { file_rbb.open("rbb.txt", ios::app); library[i].print(); rbb[t] = temp; file_rbb.write((char*)&rbb[t], sizeof(rbb[t])); t++; cout<<"借书成功!请按时归还!"<<endl; file_rbb.close(); } else { cout<<"您不中意此书吗?借书未成功。"<<endl; } cout<<"要继续租书吗?[Y/N]"; cin>>flag; } }

void Printborrowbook() //查看借书情况函数 { int i = 0; for (i = 0; i < t; i++) { rbb[i].print(); cout<<endl; } }

void borrow() { char ch; cout<<"1.凭证借书 2.查看借书情况 3.退出"<<endl; cout<<"请输入功能代码:"; cin>>ch; switch (ch) { case '1': borrowbook(); break; case '2': Printborrowbook(); break; case '3': return; break; default: cout<<"输入错误,请重新输入:"<<endl; } }

void replacebook() //还书模块 { char bookcode[4]; int i = 0, d = 0;

cout<<"您要还的书籍的编号是:"; cin>>bookcode; for (i = 0; i < t; i++) { if (strcmp(bookcode, rbb[i].bookcode) == 0) { d = 1; //逻辑判断,为1则租出,否则没有租出 break; //因为书籍编号具有唯一性,故退出循环 } } if (d == 0) { cout<<"此书尚未租出或者不存在。"<<endl; return; } else { cout<<"此书租出情况如下:"<<endl; rbb[i].print(); } char flag; cout<<"确认要还此书吗?[Y/N]"; cin>>flag; if (flag == 'y' || flag == 'Y') { int p, j = 0; p = t - i; //P为要循环的次数 for (j = 0; j <= p; j++) { rbb[i] = rbb[i + 1]; i++; } t--; //以下为观察借书数组变化的代码 for (i = 0; i < t; i++) { rbb[i].print(); cout<<endl; } } }

void rbbwritefile() //将借书库删除内容后的数组写入文件,以达到还书的效果,在程序结束之前调用即可 { int i = 0; file_rbb.open("rbb.txt", ios::out); for (i = 0; i < t; i++) { file_rbb.write((char*)&rbb[i], sizeof(rbb[i])); } file_rbb.close(); }

void addreader() //增加读者函数 { if (r >= 50) { cout<<"读者库已经满,无法添加!"<<endl; return; }

char f = 'y'; int j = 0; int p = 0; //逻辑判断值 reader temp; file_reader.open("readerfile.txt", ios::app); while (f == 'Y' || f == 'y') { p = 0; //假设编号为不存在 temp.get(); for (j = 0; j < r; j++)//判断读者编号是否重复 { if (strcmp(temp.getcode(), readerzlk[j].getcode()) == 0) { cout<<"对不起!此读者编号已经存在!"<<endl; p = 1;//为1则存在,为0则不存在 } } if (p == 0) { readerzlk[r] = temp; file_reader.write((char*)&readerzlk[r], sizeof(readerzlk[r])); //写入读者库 cout<<"写入读者库成功……"<<endl; r++; } cout<<"要继续吗?[Y/N]"; cin>>f; } file_reader.close(); }

void addbook() //增加书籍函数 { if (b >= 100) { cout<<"读者库已经满,无法添加!"<<endl; return; }

char f = 'Y'; int j = 0; int p = 0; book temp; file_book.open("bookfile.txt", ios::app); while (f == 'Y' || f == 'y') { p = 0; temp.get(); for (j = 0; j < b; j++) { if (strcmp(temp.getcode(), library[j].getcode()) == 0) { cout<<"对不起!此书籍编号已经存在!"<<endl; p = 1; } } if (p == 0) { library[b] = temp; file_book.write((char*)&library[b], sizeof(library[b])); cout<<"写入书籍库成功……"<<endl; b++; } cout<<"要继续吗?[Y/N]"; cin>>f; } file_book.close(); }

void readerLC() //列出所有读者 { for (int j = 0; j < r; j++) { readerzlk[j].print(); cout<<endl; } }

void bookLC() //列出所有书籍 { for (int j = 0; j < b; j++) { library[j].print(); cout<<endl; } }

void readFind_code() //读者编号查找函数 { int j = 0; int p = 0; //保存对象下标 int d = 0; //逻辑判断值 char flag = 'Y'; char code[4]; while (flag == 'Y' || flag == 'y') { d = 0; //默认为没有找到 cout<<"请输入要查找的读者的编号:"; cin>>code; for (j = 0; j < r; j++) { if (strcmp(code, readerzlk[j].getcode()) == 0) { p = j; //将下标传给p d = 1; //为1则找到对象 break; //因为code具有唯一性,故后面的不用找了,所以跳出循环. } } if (d == 1) { readerzlk[p].print(); } else { cout<<"非常抱歉!没有找到你想要的!"<<endl; } cout<<"要继续查找吗?[Y/N]"; cin>>flag; } }

void bookFind_code() //书籍编号查找函数 { int j = 0; int p = 0; //保存对象 int d = 0; //逻辑判断值 char flag = 'Y'; char code[4]; while (flag == 'Y' || flag == 'y') { d = 0; //默认为没有找到 cout<<"请输入要查找的书籍的编号:"; cin>>code; for (j = 0; j < b; j++) { if (strcmp(code, library[j].getcode()) == 0) { p = j; //将下标传给p d = 1; //为1则找到对象 break; //因为code具有唯一性,故后面的不用找了,所以跳出循环. } } if (d == 1) { library[p].print(); } else { cout<<"非常抱歉!没有找到你想要的!"<<endl; } cout<<"要继续查找吗?[Y/N]"; cin>>flag; } }

void readFind_name() //读者姓名查找模块 { char name[10]; char flag = 'Y'; int d = 0; //逻辑判断值 while (flag == 'Y'|| flag == 'y') { d = 0; //默认为没有找到. cout<<"请输入要查找读者的姓名:"; cin>>name; for (int i = 0; i < r; i++) { if (strcmp(name, readerzlk[i].getname()) == 0) { d = 1; //找到记录,将d值变为1 readerzlk[i].print(); //因为姓名不具有唯一性,所以得循环完. cout<<endl; } } if (d == 0) { cout<<"非常抱歉!没有找到你想要的!"<<endl; } cout<<"要继续查找吗?[Y/N]"; cin>>flag; } }

void bookFind_name() //书籍名称查找模块 { char name[10]; char flag = 'Y'; int d = 0; while (flag == 'Y'|| flag == 'y') { d = 0; cout<<"请输入要查找书籍的名称:"; cin>>name; for (int i = 0; i < b; i++) { if (strcmp(name, library[i].getname()) == 0) { d = 1; library[i].print(); cout<<endl; } } if (d == 0) { cout<<"非常抱歉!没有找到你想要的!"<<endl; } cout<<"要继续查找吗?[Y/N]"; cin>>flag; } }

void readerFind() //读者查找 { char flag; while (1) { cout<<"1.按读者编号查找 2.按读者姓名查找 3.退出"<<endl; cout<<"请输入功能代码:"; cin>>flag; switch (flag) { case '1': //编号查找模块 readFind_code(); break; case '2': //姓名查找模块 readFind_name(); break; case '3': return; break; default: cout<<"输入错误,请重新输入:"<<endl; } } }

#3
当当2005-06-07 20:04

void bookFind() //书籍查找 { char flag; while (1) { cout<<"1.按书籍编号查找 2.按书名查找 3.退出"<<endl; cout<<"请输入功能代码:"; cin>>flag; switch (flag) { case '1': //按书籍编号查找模块 bookFind_code(); break; case '2': //按书名查找模块 bookFind_name(); case '3': return; break; default: cout<<"输入错误,请重新输入:"<<endl; } } }

void readerdelete() //读者删除 { char code[4]; int d = 0, i = 0, j = 0; cout<<"请输入要删除的读者的编号:"; cin>>code; for (i = 0; i < r; i++) //首先判断读者库有没有此读者 { if (strcmp(code, readerzlk[i].getcode()) == 0) { d = 1;//为1则有 break; } } if (d == 0) { cout<<"对不起,此读者不存在."<<endl; return; } d = 0, j = 0;//恢复初值,在借书库进行判断 for (j = 0; j < t; j++) { if (strcmp(code, rbb[j].readercode) == 0) { d = 1;//为1则有书未还 break; } } if (d == 1) { cout<<"此读者有书未还,还书后方可删除此读者."<<endl; return; } char flag; int p = r - i; cout<<"确认删除此读者吗?[Y/N]"; cin>>flag; if(flag == 'Y' || flag == 'y') { for (j = 0; j <= p; j++) //挪动读者数组; { readerzlk[i] = readerzlk[i +1]; i++; } r--; cout<<"读者删除成功"<<endl; }

for (i = 0; i < r; i++) { readerzlk[i].print(); cout<<endl; } }

void readerdeletefile() //删除读者文件上的操作 { int i = 0; file_reader.open("readerfile.txt", ios::out); for (i = 0; i < r; i++) { file_reader.write((char*)&readerzlk[i], sizeof(readerzlk[i])); } file_reader.close(); }

void librarydelete() //书籍删除 { char code[4]; int d = 0, i = 0, j = 0; cout<<"请输入要删除的书籍编号:"; cin>>code; for (i = 0; i < b; i++) //首先判断读者库有没有此读者 { if (strcmp(code, library[i].getcode()) == 0) { d = 1;//为1则有 break; } } if (d == 0) { cout<<"对不起,此书籍不存在."<<endl; return; } d = 0, j = 0;//恢复初值,在借书库进行判断 for (j = 0; j < t; j++) { if (strcmp(code, rbb[j].bookcode) == 0) { d = 1;//为1则有书未还 break; } } if (d == 1) { cout<<"此书未还,还后方可删除此书籍."<<endl; return; } char flag; int p = b - i; cout<<"确认删除此书籍吗?[Y/N]"; cin>>flag; if(flag == 'Y' || flag == 'y') { for (j = 0; j <= p; j++) //挪动读者数组; { library[i] = library[i +1]; i++; } b--; cout<<"书籍删除成功"<<endl; }

for (i = 0; i < b; i++) { library[i].print(); cout<<endl; } }

void librarydeletefile() //删除书籍文件上的操作 { int i = 0; file_book.open("bookfile.txt", ios::out); for (i = 0; i < b; i++) { file_book.write((char*)&library[i], sizeof(library[i])); } file_book.close(); }

void readerWH() //读者维护 { char flag; while (1) { cout<<"1.增加读者 2.删除读者 3.查找读者 4.列出所有读者 5.退出"<<endl; cout<<"请输入功能代码:"; cin>>flag; switch (flag) { case '1': addreader();//增加读者 break; case '2': readerdelete();//删除读者 break; case '3': readerFind();//查找读者 break; case '4': readerLC();//列出所有读者 break; case '5': return; break; default: cout<<"输入错误,请重新输入:"<<endl; } } }

void bookWH() //图书维护 { char flag; while (1) { cout<<"1.增加图书 2.删除图书 3.查找图书 4.列出所有图书书 5.退出"<<endl; cout<<"请输入功能代码:"; cin>>flag; switch (flag) { case '1': addbook();//增加图书 break; case '2': librarydelete();//删除图书 break; case '3': bookFind();//查找图书 break; case '4': bookLC();//列出图书 break; case '5': return; break; default: cout<<"输入错误,请重新输入:"<<endl; } } }

void main() { char ch,dh; cout<<"欢迎使用简易图书馆!"<<endl; CSHreader();//初始化读者库 CSHbook(); //初始化书籍库 CSHrbb(); //初始化借书库 stop: while(1) { cout<<"1. 进入系统 2.退出系统"<<endl; cout<<"请输入功能代码:"; cin>>ch; switch (ch) { case '1': while (1) { cout<<"1.借书 2.还书 3.图书维护 4.读者维护 5.返回上一层"<<endl; cout<<"请输入功能代码:"; cin>>dh; switch (dh) { case '1': //借书模块 borrow(); break; case '2': //还书模块 replacebook(); break; case '3': //图书维护 bookWH(); break; case '4': //读者维护 readerWH(); break; case '5': goto stop; break; default: cout<<endl<<"输入错误!请重新输入:"<<endl; } } case '2': rbbwritefile(); //重写借书库 librarydeletefile();//重写书籍库 readerdeletefile();//重写读者库 cout<<"谢谢您的使用!BYEBYE!"<<endl; return; break; default: cout<<endl<<"输入错误!请重新输入:"<<endl; } } }

#4
当当2005-06-07 20:06
呵呵,是不是眼睛都花了啊,这是我学习C++以来写的最长的一个程序,大家看不习惯的话把附件下载后运行啊。
#5
tary2005-06-07 21:07
不错!!!

[此贴子已经被作者于2005-6-7 21:09:50编辑过]


#6
shan1832005-06-08 16:06
眼花缭乱,继续努力!
#7
当当2005-06-08 19:28
我上传的附件呢?
#8
当当2005-06-19 10:51
顶一下。
#9
lihuashiwd2005-06-19 21:33
呵呵
不错啊
我是学C语言的
不过看得懂这个
#10
当当2005-06-20 01:15
呵呵,看得懂就好。
#11
7758852005-06-20 18:13
还不错噢!!
#12
Ghost№麻雀2005-06-26 20:15
我只能看懂仅仅的几句话而已 虽然少了些 不过 还是有好处的 希望本版块 可以多发些这样的代码 有助于学习

支持楼主!
#13
飞舞留香2005-06-27 15:00
怎么像是课本后的泛例?
#14
yujiahao19822005-06-28 19:26
老哥···我想學習一下這個圖書館的詳細工作流程··如果妳附上圖就好了```

可否给一張詳細的工作流程圖·····我想學習學習···
#15
当当2005-07-02 00:45
图?我没有画流程图的习惯哦!
#16
qiqiaizhuzhu2005-07-05 11:08

楼主帮我做一下嘛!急用呀! 用c或者c++做呀,救命呀!

图书借阅管理系统

主要分为两大功能:

1) 图书管理(增加图书、查询图书、删除图书、图书借阅、还书);

2) 会员管理(增加会员、查询会员、删除会员、借书信息);

#17
当当2005-07-05 16:23
这个里面已经都有了啊,并且注释好详细的,你只需要把函数重组一下就行了,我做的函数没有传参数,又是全局的,所以只需要把函数重新组织一下,把switch语句重新写一下就行了。
#18
qiqiaizhuzhu2005-07-07 08:31
我就是不懂,好急呀
帮帮我嘛
#19
qiqiaizhuzhu2005-07-07 08:38

我按你的改了一些 不过还是不全,你帮我改对它可以吗? 帮帮忙嘛 好急的哈

#20
qiqiaizhuzhu2005-07-07 08:39

#include <string.h>

#include <iomanip.h>

class reader

{

private:

char code[4]; //读者编号

char name[10]; //读者姓名

public:

void get() //输入读者资料

{

cout<<"请输入读者编号:";

cin>>code;

cout<<"请输入读者姓名:";

cin>>name;

}

void print() //打印读者资料

{

cout<<"读者编号:"<<code<<endl;

cout<<"读者姓名:"<<name<<endl;

}

char* getcode()

{

return(code);

}

char* getname()

{

return(name);

}

};

class book

{

private:

char code[4]; //书籍编号

char name[10]; //书籍名称

char writer[10]; //书籍作者

char concern[10]; //书籍出版社

float price; //书籍价格

public:

char flag; //判断此书是否借出

book() //利用构造函数,将flag变量默认为'N',即没有借出

{

flag = 'N';

}

void get() //输入书籍资料

{

cout<<"请输入书籍编号:";

cin>>code;

cout<<"请输入书籍名称:";

cin>>name;

cout<<"请输入书籍作者:";

cin>>writer;

cout<<"请输入书籍出版社:";

cin>>concern;

cout<<"请输入书籍价格:";

cin>>price;

}

void print()

{

cout<<"书籍编号:"<<code<<endl;

cout<<"书籍名称:"<<name<<endl;

cout<<"书籍作者:"<<writer<<endl;

cout<<"书籍出版社:"<<concern<<endl;

cout<<"书籍价格:"<<price<<endl;

}

void getflag()

{

cout<<"确认要租此书吗?[Y/N]";

cin>>flag;

}

char* getcode()

{

return(code);

}

char* getname()

{

return(name);

}

};

class readerborrowbook //用于记录租书情况的类

{

public:

char readercode[4];

char bookcode[4];

void borrowbook()

{

cout<<"请输入您的读者编号:";

cin>>readercode;

cout<<"请输入您要借的书籍的编号:";

cin>>bookcode;

}

void print()

{

cout<<"借书证号:"<<readercode<<endl;

cout<<"借的书籍:"<<bookcode<<endl;

}

};

//}

class MainClass{

public:

reader readerzlk[50]; //定义读者库数组(读者库)

book library[100]; //定义书籍数组(书籍库)

readerborrowbook rbb[100]; //定义借书记录数组(借书库)

fstream file_reader; //定义读者库文件对象(全局的)

fstream file_book; //定义书籍库文件对象(全局的)

fstream file_rbb; //定义借书库文件对象(全局的)

int r;// = 0; //记录读者个数

int b;// = 0; //记录书籍本数

int t;// = 0; //记录借书记录

void CSHreader() //初始化读者库函数

{

file_reader.open("readerfile.txt", ios::in); //打开文件

file_reader.read((char*)&readerzlk[0], sizeof(readerzlk[0]));//将文件内容读到读者库数组的第一个对象

if (strlen(readerzlk[0].getcode()) == 0)//判断第一个对象的内容是否为空,如为空,则文件为空

{

cout<<"读者库信息为空,请建立读者信息。"<<endl;

}

else

{

while(!file_reader.eof())//否则将文件后面的内容读到读者库数组后面的对象之中,从而达到初始化的效果

{

r++;

#21
qiqiaizhuzhu2005-07-07 08:46

file_reader.read((char*)&readerzlk[r], sizeof(readerzlk[r]));

if (r >= 50)

{

cout<<"读者库已满!"<<endl;

break;

}

}

cout<<"初始化读者库成功……"<<endl;

}

file_reader.close();

}

void CSHbook() //初始化书籍库函数(注释同读者库一样)

{

file_book.open("bookfile.txt", ios::in);

file_book.read((char*)&library[0], sizeof(library[0]));

if (strlen(library[0].getcode()) == 0)

{

cout<<"书籍库信息为空,请建立书籍信息。"<<endl;

}

else

{

while(!file_book.eof())

{

b++;

file_book.read((char*)&library[b], sizeof(library[b]));

if (b >= 100)

{

cout<<"书籍库已满!"<<endl;

break;

}

}

cout<<"初始化书籍库成功……"<<endl;

}

file_book.close();

}

void CSHrbb() //初始化借书库

{

file_rbb.open("rbb.txt", ios::in);

file_rbb.read((char*)&rbb[0], sizeof(rbb[0]));

if (strlen(rbb[0].readercode) == 0)

{

cout<<"借书库信息为空,暂时无借书情况。"<<endl;

}

else

{

while (!file_rbb.eof())

{

t++;

file_rbb.read((char*)&rbb[t], sizeof(rbb[t]));

if (t >= 100)

{

cout<<"借书库已满,请速让读者归还书籍。"<<endl;

break;

}

}

cout<<"初始化借书库成功……"<<endl;

}

file_rbb.close();

}

void borrowbook() //借书函数

{

int d = 0; //逻辑判断值

int i = 0;

char flag = 'y';

readerborrowbook temp;

while (flag == 'y' || flag == 'Y')

{

temp.borrowbook();

for (i = 0; i < r; i++)//判断有无此读者编号

{

if (strcmp(temp.readercode, readerzlk[i].getcode()) == 0)

{

d = 1; //为1则有此编号,否则无此编号

break;

}

}

if (d == 0)

{

cout<<"对不起!您的编号不存在!"<<endl;

return;

}

d = 0; i = 0; //恢复初始值,进行书的编号的判断

for (i = 0; i < b; i++) //判断有无此书籍编号

{

if (strcmp(temp.bookcode, library[i].getcode()) == 0)

{

d = 1; //同上

break;

}

}

if (d == 0)

{

cout<<"对不起!我们这里没有此书籍!"<<endl;

return;

}

//判断书籍是否借出,本意是想通过".flag"是否等于'Y'或'y'来判断书是否借出的,可是总是判断不成功。

//本意是if (library[i].flag == 'Y' || library[i].flag == 'y')

// {cout<<"非常抱歉,此书已经租出。"<<endl;return;}

int j = 0;

for (j = 0; j < t; j++)

{

if (strcmp(temp.bookcode, rbb[j].bookcode) == 0)

{

cout<<"非常抱歉,此书已经租出。"<<endl;

return;

}

}

library[i].getflag();

if (library[i].flag == 'Y' || library[i].flag == 'y')

{

file_rbb.open("rbb.txt", ios::app);

library[i].print();

rbb[t] = temp;

file_rbb.write((char*)&rbb[t], sizeof(rbb[t]));

t++;

cout<<"借书成功!请按时归还!"<<endl;

file_rbb.close();

}

else

{

cout<<"您不中意此书吗?借书未成功。"<<endl;

}

cout<<"要继续租书吗?[Y/N]";

cin>>flag;

}

}

void Printborrowbook() //查看借书情况函数

{

int i = 0;

for (i = 0; i < t; i++)

{

rbb[i].print();

cout<<endl;

}

}

void borrow()

{

char ch;

cout<<"1.凭证借书 2.查看借书情况 3.退出"<<endl;

cout<<"请输入功能代码:";

cin>>ch;

switch (ch)

{

case '1':

borrowbook();

break;

case '2':

Printborrowbook();

break;

case '3':

return;

break;

default:

cout<<"输入错误,请重新输入:"<<endl;

}

}

void replacebook() //还书模块

{

char bookcode[4];

int i = 0, d = 0;

cout<<"您要还的书籍的编号是:";

cin>>bookcode;

for (i = 0; i < t; i++)

{

if (strcmp(bookcode, rbb[i].bookcode) == 0)

{

d = 1; //逻辑判断,为1则租出,否则没有租出

break; //因为书籍编号具有唯一性,故退出循环

#22
qiqiaizhuzhu2005-07-07 08:48

}

}

if (d == 0)

{

cout<<"此书尚未租出或者不存在。"<<endl;

return;

}

else

{

cout<<"此书租出情况如下:"<<endl;

rbb[i].print();

}

char flag;

cout<<"确认要还此书吗?[Y/N]";

cin>>flag;

if (flag == 'y' || flag == 'Y')

{

int p, j = 0;

p = t - i; //P为要循环的次数

for (j = 0; j <= p; j++)

{

rbb[i] = rbb[i + 1];

i++;

}

t--;

//以下为观察借书数组变化的代码

for (i = 0; i < t; i++)

{

rbb[i].print();

cout<<endl;

}

}

}

void rbbwritefile() //将借书库删除内容后的数组写入文件,以达到还书的效果,在程序结束之前调用即可

{

int i = 0;

file_rbb.open("rbb.txt", ios::out);

for (i = 0; i < t; i++)

{

file_rbb.write((char*)&rbb[i], sizeof(rbb[i]));

}

file_rbb.close();

}

void addreader() //增加读者函数

{

if (r >= 50)

{

cout<<"读者库已经满,无法添加!"<<endl;

return;

}

char f = 'y';

int j = 0;

int p = 0; //逻辑判断值

reader temp;

file_reader.open("readerfile.txt", ios::app);

while (f == 'Y' || f == 'y')

{

p = 0; //假设编号为不存在

temp.get();

for (j = 0; j < r; j++)//判断读者编号是否重复

{

if (strcmp(temp.getcode(), readerzlk[j].getcode()) == 0)

{

cout<<"对不起!此读者编号已经存在!"<<endl;

p = 1;//为1则存在,为0则不存在

}

}

if (p == 0)

{

readerzlk[r] = temp;

file_reader.write((char*)&readerzlk[r], sizeof(readerzlk[r])); //写入读者库

cout<<"写入读者库成功……"<<endl;

r++;

}

cout<<"要继续吗?[Y/N]";

cin>>f;

}

file_reader.close();

}

void addbook() //增加书籍函数

{

if (b >= 100)

{

#23
qiqiaizhuzhu2005-07-07 08:49

cout<<"读者库已经满,无法添加!"<<endl;

return;

}

char f = 'Y';

int j = 0;

int p = 0;

book temp;

file_book.open("bookfile.txt", ios::app);

while (f == 'Y' || f == 'y')

{

p = 0;

temp.get();

for (j = 0; j < b; j++)

{

if (strcmp(temp.getcode(), library[j].getcode()) == 0)

{

cout<<"对不起!此书籍编号已经存在!"<<endl;

p = 1;

}

}

if (p == 0)

{

library[b] = temp;

file_book.write((char*)&library[b], sizeof(library[b]));

cout<<"写入书籍库成功……"<<endl;

b++;

}

cout<<"要继续吗?[Y/N]";

cin>>f;

}

file_book.close();

}

void readerLC() //列出所有读者

{

for (int j = 0; j < r; j++)

{

readerzlk[j].print();

cout<<endl;

}

}

void bookLC() //列出所有书籍

{

for (int j = 0; j < b; j++)

{

library[j].print();

cout<<endl;

}

}

void readFind_code() //读者编号查找函数

{

int j = 0;

int p = 0; //保存对象下标

int d = 0; //逻辑判断值

char flag = 'Y';

char code[4];

while (flag == 'Y' || flag == 'y')

{

d = 0; //默认为没有找到

cout<<"请输入要查找的读者的编号:";

cin>>code;

for (j = 0; j < r; j++)

{

if (strcmp(code, readerzlk[j].getcode()) == 0)

{

p = j; //将下标传给p

d = 1; //为1则找到对象

break; //因为code具有唯一性,故后面的不用找了,所以跳出循环.

}

}

if (d == 1)

{

readerzlk[p].print();

}

else

{

cout<<"非常抱歉!没有找到你想要的!"<<endl;

}

cout<<"要继续查找吗?[Y/N]";

cin>>flag;

}

}

void bookFind_code() //书籍编号查找函数

{

int j = 0;

int p = 0; //保存对象

int d = 0; //逻辑判断值

char flag = 'Y';

char code[4];

while (flag == 'Y' || flag == 'y')

{

d = 0; //默认为没有找到

cout<<"请输入要查找的书籍的编号:";

cin>>code;

for (j = 0; j < b; j++)

{

if (strcmp(code, library[j].getcode()) == 0)

{

p = j; //将下标传给p

d = 1; //为1则找到对象

break; //因为code具有唯一性,故后面的不用找了,所以跳出循环.

}

}

if (d == 1)

{

library[p].print();

}

else

{

cout<<"非常抱歉!没有找到你想要的!"<<endl;

}

cout<<"要继续查找吗?[Y/N]";

cin>>flag;

}

}

void readFind_name() //读者姓名查找模块

{

char name[10];

char flag = 'Y';

int d = 0; //逻辑判断值

while (flag == 'Y'|| flag == 'y')

{

d = 0; //默认为没有找到.

cout<<"请输入要查找读者的姓名:";

cin>>name;

for (int i = 0; i < r; i++)

{

if (strcmp(name, readerzlk[i].getname()) == 0)

#24
qiqiaizhuzhu2005-07-07 08:51

{

d = 1; //找到记录,将d值变为1

readerzlk[i].print(); //因为姓名不具有唯一性,所以得循环完.

cout<<endl;

}

}

if (d == 0)

{

cout<<"非常抱歉!没有找到你想要的!"<<endl;

}

cout<<"要继续查找吗?[Y/N]";

cin>>flag;

}

}

void bookFind_name() //书籍名称查找模块

{

char name[10];

char flag = 'Y';

int d = 0;

while (flag == 'Y'|| flag == 'y')

{

d = 0;

cout<<"请输入要查找书籍的名称:";

cin>>name;

for (int i = 0; i < b; i++)

{

if (strcmp(name, library[i].getname()) == 0)

{

d = 1;

library[i].print();

cout<<endl;

}

}

if (d == 0)

{

cout<<"非常抱歉!没有找到你想要的!"<<endl;

}

cout<<"要继续查找吗?[Y/N]";

cin>>flag;

}

}

void readerFind() //读者查找

{

char flag;

while (1)

{

cout<<"1.按读者编号查找 2.按读者姓名查找 3.退出"<<endl;

cout<<"请输入功能代码:";

cin>>flag;

switch (flag)

{

case '1':

//编号查找模块

readFind_code();

break;

case '2':

//姓名查找模块

readFind_name();

break;

case '3':

return;

break;

default:

cout<<"输入错误,请重新输入:"<<endl;

}

}

}

void bookFind() //书籍查找

{

char flag;

while (1)

{

cout<<"1.按书籍编号查找 2.按书名查找 3.退出"<<endl;

cout<<"请输入功能代码:";

cin>>flag;

switch (flag)

{

case '1':

//按书籍编号查找模块

bookFind_code();

break;

case '2':

//按书名查找模块

bookFind_name();

case '3':

return;

break;

default:

cout<<"输入错误,请重新输入:"<<endl;

}

}

}

void readerdelete() //读者删除

{

char code[4];

int d = 0, i = 0, j = 0;

cout<<"请输入要删除的读者的编号:";

cin>>code;

for (i = 0; i < r; i++) //首先判断读者库有没有此读者

{

if (strcmp(code, readerzlk[i].getcode()) == 0)

{

d = 1;//为1则有

break;

}

}

if (d == 0)

{

cout<<"对不起,此读者不存在."<<endl;

return;

}

d = 0, j = 0;//恢复初值,在借书库进行判断

for (j = 0; j < t; j++)

{

if (strcmp(code, rbb[j].readercode) == 0)

{

d = 1;//为1则有书未还

break;

}

}

if (d == 1)

{

cout<<"此读者有书未还,还书后方可删除此读者."<<endl;

return;

}

char flag;

int p = r - i;

cout<<"确认删除此读者吗?[Y/N]";

cin>>flag;

if(flag == 'Y' || flag == 'y')

{

for (j = 0; j <= p; j++) //挪动读者数组;

{

readerzlk[i] = readerzlk[i +1];

i++;

}

r--;

cout<<"读者删除成功"<<endl;

}

for (i = 0; i < r; i++)

{

readerzlk[i].print();

cout<<endl;

}

}

void readerdeletefile() //删除读者文件上的操作

{

int i = 0;

file_reader.open("readerfile.txt", ios::out);

for (i = 0; i < r; i++)

{

file_reader.write((char*)&readerzlk[i], sizeof(readerzlk[i]));

}

file_reader.close();

}

void librarydelete() //书籍删除

{

char code[4];

int d = 0, i = 0, j = 0;

cout<<"请输入要删除的书籍编号:";

cin>>code;

for (i = 0; i < b; i++) //首先判断读者库有没有此读者

{

if (strcmp(code, library[i].getcode()) == 0)

{

d = 1;//为1则有

break;

}

}

#25
qiqiaizhuzhu2005-07-07 08:51

if (d == 0)

{

cout<<"对不起,此书籍不存在."<<endl;

return;

}

d = 0, j = 0;//恢复初值,在借书库进行判断

for (j = 0; j < t; j++)

{

if (strcmp(code, rbb[j].bookcode) == 0)

{

d = 1;//为1则有书未还

break;

}

}

if (d == 1)

{

cout<<"此书未还,还后方可删除此书籍."<<endl;

return;

}

char flag;

int p = b - i;

cout<<"确认删除此书籍吗?[Y/N]";

cin>>flag;

if(flag == 'Y' || flag == 'y')

{

for (j = 0; j <= p; j++) //挪动读者数组;

{

library[i] = library[i +1];

i++;

}

b--;

cout<<"书籍删除成功"<<endl;

}

for (i = 0; i < b; i++)

{

library[i].print();

cout<<endl;

}

}

void librarydeletefile() //删除书籍文件上的操作

{

int i = 0;

file_book.open("bookfile.txt", ios::out);

for (i = 0; i < b; i++)

{

file_book.write((char*)&library[i], sizeof(library[i]));

}

file_book.close();

}

void readerWH() //读者维护

{

char flag;

while (1)

{

cout<<"1.增加读者 2.删除读者 3.查找读者 4.列出所有读者 5.退出"<<endl;

cout<<"请输入功能代码:";

cin>>flag;

switch (flag)

{

case '1':

addreader();//增加读者

break;

case '2':

readerdelete();//删除读者

break;

case '3':

readerFind();//查找读者

break;

case '4':

readerLC();//列出所有读者

break;

case '5':

return;

break;

default:

cout<<"输入错误,请重新输入:"<<endl;

}

}

}

void bookWH() //图书维护

{

char flag;

while (1)

{

cout<<"1.增加图书 2.删除图书 3.查找图书 4.列出所有图书书 5.退出"<<endl;

cout<<"请输入功能代码:";

cin>>flag;

switch (flag)

{

case '1':

addbook();//增加图书

break;

case '2':

librarydelete();//删除图书

break;

case '3':

bookFind();//查找图书

break;

case '4':

bookLC();//列出图书

break;

case '5':

return;

break;

default:

cout<<"输入错误,请重新输入:"<<endl;

}

}

}

void main()

{

char ch,dh;

cout<<"欢迎使用简易图书馆!"<<endl;

CSHreader();//初始化读者库

CSHbook(); //初始化书籍库

CSHrbb(); //初始化借书库

stop:

while(1)

{

cout<<"1. 进入系统 2.退出系统"<<endl;

cout<<"请输入功能代码:";

cin>>ch;

switch (ch)

{

case '1':

while (1)

{

cout<<"1.借书 2.还书 3.图书维护 4.读者维护 5.返回上一层"<<endl;

cout<<"请输入功能代码:";

cin>>dh;

switch (dh)

{

case '1':

//借书模块

borrow();

break;

case '2':

//还书模块

replacebook();

break;

case '3':

//图书维护

bookWH();

break;

case '4':

//读者维护

readerWH();

break;

case '5':

goto stop;

break;

default:

cout<<endl<<"输入错误!请重新输入:"<<endl;

}

}

case '2':

rbbwritefile();

librarydeletefile();//重写书籍库

readerdeletefile();//重写读者库

cout<<"谢谢您的使用!BYEBYE!"<<endl;

return;

break;

default:

cout<<endl<<"输入错误!请重新输入:"<<endl;

}

}

#26
qiqiaizhuzhu2005-07-07 08:52

}

};

void main()

{

}

#27
qiqiaizhuzhu2005-07-07 08:52
帮帮我呀
好急哦
#28
softwarelan2005-07-11 10:29
哎呀,我的地啊!What's this?
#29
当当2006-02-21 14:49
顶一下,呵呵!
#30
混吃等死2006-02-21 16:18
羡慕楼主啊, 真有毅力, 写这么多你需要多长时间???
#31
zy_fei2006-10-09 22:29

大哥.好强哦,我一定向你看齐.

#32
zy_fei2006-10-09 22:30
你是我的榜样!
#33
qiuhai19852006-10-10 15:59
好强哦楼主,我也要努力学习编程了
#34
天使坠落的眼泪2006-10-11 09:23
提几点意见,首先,如果图书馆系统做的非常大,那么能不能考虑考虑系统的开销,
如果只是意味着使用for循环去一个一个的查找数据,是不是开销会很大。
第二,在考虑机器运行效率的时候,是不是直接可以定义指针,然后用文件指针去搜索去加快运行的效率。
#35
天使坠落的眼泪2006-10-11 09:24
对了,还有一点,当考虑到系统的实用性的时候,是不是需要加如身份的验证,
在这点,还要考虑到系统的安全性能,
希望楼主能改进
#36
majia7752006-10-11 13:26
已经不错了,楼主只是做了一个模型``还可以加很多东西~
#37
当当2006-10-17 14:26
现在在学Java,所以C++丢下了,
#38
zkkpkk2006-10-17 17:30
用顺序存储结构,不是很复杂,是很麻烦。
#39
longerhe2006-10-17 23:19

顶...

#40
show_12006-10-18 22:23
不错。。。。
觉得多提供一些代码给观赏比较好点。。。
#41
rmfish2006-10-18 22:35
发现程序有错 在先后输入1 3 1 进入增加图书的功能时  当输入价格为字符时 程序会混乱的  楼主可以自己试试
#42
yushui2006-10-19 12:45

呵呵  代码好长哦 我这有一个 差不多的 暑假做的 没有用类 用的结构 呵呵 没那么长 

#43
wangyou2006-10-19 18:31
谢谢了
#44
当当2006-10-23 10:38
此程序没有输入是否合法的验证功能.
#45
天使坠落的眼泪2006-10-25 08:34
是因为搂主做的好所以才能提出改进的意见,现在做程序不能制作到能够实现功能,要去考虑到开销,那样才能有更好的长进更好对程序语言的理解,如果说做的东西不值得去改进,那么也不会说很多,
所以,需要在做的好的情况下去提出点意见,这样才能从中更好的学习,
#46
song42006-10-25 21:55
以下是引用当当在2006-10-23 10:38:00的发言:
此程序没有输入是否合法的验证功能.

哈哈,久仰久仰肯定有马甲
要不这么久的贴,怎么不见LZ出现呢???
现在才出现

#47
fecktty2006-10-26 21:30

确实不错
不过本人认为在实际中这是不现实的.
最起码你的信息都要保存起来
但当你这程序运行后关闭后,数据就会丢失.

所以我的意思是能不能运用MFC中的连接数据库的类实现用数据库存储信息
那样的话信息就不会丢失啊

我今年在着手做一个系统,目前还在构思中.你的程序不错.
但我们老师要求太高,所以我就在这里说说我的意见

哪位高人能写出带有数据库连接的程序来就好了啊!!!!

#48
长安之星2006-10-27 23:36
交个朋友怎么样???我的QQ是61872738```````偶是新来的~~~~~
看完你编的程决得挺不错的。。。。想问你学了几年了????
好了,,多说无益。。。希望你百尺竿头哦~~~~~
#49
liang1232006-10-28 10:16
不错  不错        
#50
文山胡子2006-10-28 19:25
做的不错阿!
#51
清水香里2006-10-29 10:48
niu
12