1、
图书管理系统(C++)陈明明 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 17 &n
2、bsp; 个人收集整理 勿做商业用途 东华理工大学信息工程学院 《面向对象程序设计》课程设计报告 图书馆管理系统 指导教师: 谢小林 姓名:陈明明 学号:2011
3、40030117 班级:1140301 20 13 年 1 月 10 日 一、 需求分析: 建立一个图书馆管理系统,可以处理以下对象 .图书馆基本信息 .图书馆的书籍 .图书馆管理员 .读者信息 二、 程序的主要功能: 1. 查询图书馆的总信息 2. 查询图书馆管理员的信息 3。 查询图书馆藏书信息 4。 存入新书(有管理员加入,需进行身份验证) 5. 旧书处理 6. 存入新的管理员的信息 7。 修改管理员的信息(增加工龄,加薪) 8。 两所图书馆的最大藏书量之和 9. 根据
4、书名检索书刊信息 10. 查询读者的借阅信息 11。 查询读者信息(包括借书情况,到期时间,罚款情况.) 12.管理员可以修改用户的欠款和交款的金额 13。读者氛围学生、研究生和教师。所有学生的租期为1月,所有教师的租期为2月。 三、程序运行平台: 软件环境:w7 编程软件 VC++6。0 运行平台: Win32 硬 件: 普通个人pc机 四、 系统总框架图 五、 程序类的说明: 类的设计 Book类的设计: (1)数据成员 char name[StrNum]; 用来存放书名。
5、char number[StrNum]; 用来存放图书的编号。 char kind[Type]; 用来存放图书的类型。 int tag; 定义删除标记。 int num; 定义图书编号为整形。 int add; 增加标记。 (2)函数成员 Book(){} 无参构造函数,用于为书名和作者姓名设置默认值。 char getkind() 用于获取图书类型. &nb
6、sp; char getname() 用于获取书名。 int getnum() 用于获取图书编号。 int gettag() 用于获取删除标记。 void setname(char na[]) 用于设置书名。 void setkind(char kin[]) &nb
7、sp; 用于设置类型。 void delbook() 用于删除图书。 void addbook(int n,char *na,char *kin) 用于增加图书。 void disp() 用于输出图书。 六、 模块分析 class BDatabase{} 图书管理类的设置,实现对图书的添加,查找,删除等。 int top; 设置图书
8、记录指针。 Book book[Maxb]; 设置图书记录(Maxb定义为最多可存储的图书数,定义为整形)。 void clear() 清空图书记录. int addbook(int n,char *na,char *kin) 增加图书记录。 Book *query(int bookid) 查找图书记录. void bookdata(); 定义图书库.
9、 void disp() 输出。 ~BDatabase() 设置析构函数,将book[]写到book.txt文件中 void BDatabase::bookdata() 由此函数开始对图书管理系统的主菜单进行调用与功能的实现.(界面参看执行界面部分) 最后用main() 函数的实现,程序的主界面的引导 七、比较有特色的函数
10、 class BDatabase{} 图书管理类的设置,实现对图书的添加,查找,删除等。 int top; 设置图书记录指针。 Book book[Maxb]; 设置图书记录(Maxb定义为最多可存储的图书数,定义为整形)。 void BDatabase::bookdata() 由此函数开始对图书管理系统的主菜单进行调用与功能的实现。(界面参看执行界面部分) 八、存在的不足与对策 使用多关键字进行查询时,我是使用以下语句:if(b
11、name!=null) {sqlStr+=”and Bname like ' %"+bname+”% ’”; },实现判断是否为空,从而利用给进条件实现查询,粗看之下并没有什么错误,但是在运行是却出现了异常,在找了很久被找出错误之后,我开始考虑是否是语法错误,而是使用MySQL的命令行模式来进行调试,在MySQL命令行中运行时却并没有出现错误,完全正确的查询出我想要的结果,在试了很久之后,终于发现了上面的语句有两个小的细节错误,第一个错误就是"and Bname这里没有空格,正确格式应该是" and Bname,第二个错误是’ %"+bname+
12、% '”中含有多余的空格,正确答案是'%"+bname+”%'”;两个错误都是由于空格引起的,一个是少了空格,另一个是含有多余的空格。 九、程序源代码 #define StrNum 20 #define Type 20 #include<iostream〉 #include <iomanip〉 #include <string〉 #include <fstream〉 //输入/输出文件流类 us
13、ing namespace std; const int Maxb=100; //最多可存储的图书 class Book { private: int tag; //删除标记 int num; &
14、nbsp; //图书编号 int add; //增加标记 char number[StrNum]; //编号 char name[StrNum]; //书名 char ki
15、nd[Type]; //图书类型 public: Book(){} char getkind() //获取图书类型 { return kind[Type]; } &nbs
16、p; char getname() //获取书名 { return name[StrNum]; } int getnum() //获取图书编号 { return num; } &
17、nbsp; int gettag() //获取删除标记 { return tag; } void setname(char na[]) //设置书名 { strcpy(name,na); } void setkind(char kin[]) //设置类型 { strcpy
18、kind,kin); } void delbook() //删除图书 { tag=1; } void addbook(int n,char *na,char *kin) //增加图书 { tag=0; num=n; strcpy(name,na); strcpy(kind,kin); } void disp() &
19、nbsp; //输出图书 { cout。flags (ios::left); //设置对齐的标志位为左 cout〈〈setw(15)<<num〈〈setw(20)<〈name〈<setw(15)〈<kind〈〈endl; } }; /*****************************************************************************************/ class BDatabase
20、 { private: int top; //图书记录指针 Book book[Maxb]; //图书记录 public: BDatabase() &nbs
21、p; //构造函数,将book.txt读到book[]中 { 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() &n
22、bsp; //全删 { top=—1; } int addbook(int n,char *na,char *kin) //增加图书 { Book *p=query(n); if(NULL==p) { top++; book[top].addbook(n,na,kin); return 1; } return 0; } Book *query(int bookid)  
23、 //查找图书 { for (int i=0;i<=top;i++) if (book[i]。getnum()==bookid &&book[i].gettag()==0) { return &book[i]; } return NULL; } void bookdata(); //图书库 void disp() { for (int i=0;i<=top;i++)  
24、if (book[i].gettag()==0) book[i]。disp(); } ~BDatabase() //析构函数,将book[]写到book。txt文件中 { fstream file(”book.txt",ios::out); for (int i=0;i<=top;i++) if (book[i]。gettag()==0
25、 file.write((char *)&book[i],sizeof(book[i])); file.close(); } }; void BDatabase::bookdata() { char choice; char bname[40]; char bkind[40]; char newType[20]; int bookid; Book *b; while (choice!='0’) { cout〈〈”\t******************
26、************************************************\n"; cout〈<” \n\n"; cout〈<”\t\t\t图 书 管 理 系 统\n\n"
27、 cout〈<”\t\t\t1 新增图书记录\n"; cout<〈"\t\t\t2 更改图书记录\n”; cout〈<”\t\t\t3 删除图书记录\n”; cout<〈"\t\t\t4 查找图书记录\n"; cout〈〈"\t\t\t5 显示图书记录\n&
28、quot;; cout<〈”\t\t\t6 清空全部记录(慎用)\n”; cout<〈”\t\t\t0 退出系统\n"; cout<〈 cin="">>choice; switch (choice) { case '1’: cout〈〈"输入图书编号:”〈〈endl; cin>〉bookid; cout〈〈"
29、输入图书类型:”〈
30、y(bookid); if(b==NULL) { cout<〈"该图书不存在"〈〈endl; break; } cout<〈”输入新的书名:”<〈endl;>bname; b—>setname(bname); cout<〈”输入新的类型:”〈〈endl;>bkind; b-〉setkind(bkind); break;  
31、case ’3': cout<<”读入图书编号:”〈<endl; cin〉〉bookid; b=query(bookid); if(b==NULL) { cout〈<”该图书不存在”<<endl; break; } char tg1; cout<〈”确定要删除此记录吗?(y>tg1; if(tg1!=’n'&&t
32、g1!='N’) { b—>delbook(); cout<〈"已成功删除该书记录!”<〈endl; break; } case '4’: cout〈〈"读入图书编号:"<〈endl; cin="">〉bookid; b=query(bookid); if (b==NULL) { cout〈<"该图书不存在”〈〈endl; break; }
33、 cout<<"图书编号 b-="">disp(); break; case '5': cout<〈”图书编号 图书名称 图书类型 \n”; disp(); break; case '6': char tg2; cou
34、t<〈"确定要清空所有记录吗?(Y/N)”〈
35、程序的主界面的引导 void main() { char choice; BDatabase BookDB; while(choice!=’0') { cout〈〈"\t******************************************************************\n”; cout<〈”
36、nbsp; \n\n"; cout<〈"\n\n\t\t\t欢迎使用图书管理系统\n\n"; cout〈〈endl<<endl〈<"\t\t\t图 书 管 理 系 统\n\n\n\n”; cout〈<setw(83)〈<"
37、by (姓名——)\n\n\n\n"; cout<〈” \n\n”; cout<〈"\t******************************************************************\n"; &n
38、bsp; cout〈<”\t\t\t1 进 入 系 统\n\n\t\t\t0 离 开"<<endl; cout<<”请选择:”; cin="">〉choice; switch(choice) { case ’1': BookDB.bookdata(); break; &
39、nbsp; case ’0': cout<〈”\n\n\t\t\t欢迎再次使用图书管理系统\n\n"; break; default:cout〈〈"输入错误,请从新输入:"; } } }






