学 号:
《面向对象程序设计》作业
题 目 图书管理系统 学 院 信息工程学院 专 业 通信工程
班 级
姓 名 ZXY 指导教师
鄢红国
精选范本
.
大
.
2015 年 12 月 20 日
一、需求分析
图书馆管理系统是我国大部分院校或其它部门不可缺少的部分,书籍是人类精神食
粮,尤其对一些学校,图书馆来说,非常重要。在软件开发中,以计算机图书为主,称“计算机图书管理系统”。计算机图书管理系统能够为用户实现借阅图书、管理等,随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书资源信息进行管理,具有着手工管理所无法比拟的优点.例如:查阅迅速、安全性高、可靠性高、存储量大、保密性好、成本低等。这些优点能够极大地提高图书馆管理的效率。因此,开发这样一套管理软件是很有必要.
并且,通过此课题,能使我们熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用。 (一) 系统总体功能需求
图书馆可以为借阅者提供借还书、查询书目等服务。借阅者每次最多能借5本书。借书员主要负责借还及新增更改书目读者,查询等工作,图书管理员负责图书信息的增减及读者信息的维护。所有人员都可以浏览和查询图书信息。经过初步分析,图书馆管理系统应该具有以下几个模块:
1)借书模块 2)还书模块 3)图书维护模块 4)读者维护模块 5)统计分析模块 6)提示 7)离开
(二)图书借书模块功能分析
图书借阅功能需要完成借阅者对相应图书的借阅。借阅者的借阅数量是有限定的,系统会自动检查是超过限定借阅的数量,若超过限定数量则不允许借阅。若当前要借阅的图书已经被其他人预约,读者也无法完成借阅。
精选范本
.
输入:借阅者的编号及图书的编号
(三)图书还书模块功能分析
图书归还功能需要完成图书的归还工作。 (四)图书维护模块功能的需求
实现对图书的描述,图书的编号,书名,借出,还入等,需要实现的功能为:图书编目,图书注册,更新书目,图书删除。
1、图书的新增:首先给图书编号,在给图书编号之前先判断是否有图书为该编号,如果有则编号不成功重新输入编号,如果没有则编号成功,继续添加图书的其他信息,包括书名、作者、出版社、出版时间、价格等信息。
2、图书的删除:输入图书的编号,删除该编号图书的所有信息,并提示删除成功信息,若输入无效的编号则提示删除不成功。
3、图书的查找:输入要查找图书的编号,输出该编号图书的所有信息,若输入无效的编号则提示查找失败。
4、图书的显示:按照出版时间的先后顺序输出图书馆所有书籍的信息。 5、图书的全删:删除图书馆所有书籍的所有信息。 (五) 读者维护模块功能的需求
对读者信息描述,建立读者个人资料,借阅者管理需要实现的功能包括:借阅者注册,借阅者信息更新,借阅者注销,借阅者信息的查询。
1、读者的新增:先给读者编号,如果该编号已经有人,则提示错误,否则继续输入读者的其他信息,包括读者的名字和初始密码输出添加成功提示。
2、读者的更改:输入读者的编号,更改读者的名字,若输入的编号无效则更该失
输出:是否允许借阅 处理:系统进行分析比较借阅数量及是否预约 精选范本
.
败。
3、读者的删除:输入要删除读者的编号,判断该编号是否有人,有则删除该读者的所有信息,没有则提示删除失败。
4、读者的查找:输入要查找的读者编号,编号正确则输出读者的信息,否则查找失败。
5、读者的显示:显示图书馆里所有读者的信息。 6、读者的删除:删除图书馆里所有读者的信息。 (六)统计分析功能
随时可以进行统计分析,以便及时了解当前的借阅情况和相关的资料状态。 (七) 提示功能
当出现库存查无此书或读者时,给予相应提示。 (八) 离开功能
实现管理后的系统退出。
二、总体设计
1.基本思路:
采用面向对象分析方法,把一个系统分成多个类进行处理。主要是运用到类和对象,还有带参数的构造函数以及析构函数以及数组来实现本程序,并在主函数对各个功能模块就行调用。即:1)读者类,实现对读者信息的描述 2)读者库类,实现建立读者的个人资料 3)图书类,实现对图书的描述,图书的编号,书名,借出,还入等 4)图书库类,实现对图书的维护,查找,删除等 最后用main函数做界面的引导。
精选范本
.
2.遇到的问题及解决方法
图读借还书者离书书维维开 1)用户密码验证的问题:怎么让用户在输入密码时用号覆盖密码
护护时屏幕上不显示,然后用putch('*')就可以输出*覆盖密码。 2)用getch()函数 编译时出现问题。
3.4.解决办法:通过翻阅之前的C语言教材,发现书中有类似的例子,即getch()输入密码
解决办法:通过仔细检查代码,发现忘记添加头文件 conio.h 。添加后,即可编译。
3)问题三:指针的操作问题:如果定义char a[4]={'1','2','3','4'};char *p=a; 然后输出p指向的字符串,cout<
解决办法:通过查找相关的书籍,发现当指针p指向没有串结束符的字符串时,就会 输出乱码,所以要在字符串的后面加一个串结束符'\\0'。 4)初次编译时,错误较多。
解决方法:一个一个错误耐心改正,遇到不会的,通过翻书或者上网查资料解决。 其中很多是很简单的语法错误,如:忘加分号,左右括号不对称…… 下次写程序时需细心。
3.完成本次大作业的完整过程
1)选题:通过查看老师提供的参考题目,由于大一时已经用C语言做过“班级通讯录”和“学生成绩管理系统”的选题,这次决定做点不一样的,将“图书管理系统”作为本次大作业的选题。
2)类的确定:“类”是对具有相同数据结构和相同操作的一类对象的描述。经过思考,本次大作业需要完成 借阅管理、读者管理、图书管理、统计分析的功能,所以将其分为读者类、读者库类、图书类、图书库类。 3)每个类代码的编写 4)main函数的编写。 5)编译,修改,完善。 6)撰写实验报告。
三、详细设计
1. 读者类,实现对读者信息的描述
1. 2. 0. 精选范本
.
函数清单:char *getname()获取姓名,int gettag()获取删除标记,int getno()获取读者编号,void setname(char na[])设置姓名,void delbook()设置删除标记 1:已删 0:未删,char* getmima()获取读者的密码,void addreader(int n,char*na,char* mi) 增加读者[形参分别为编号,姓名,密码],void borrowbook(int bookid) 借书操作[形参为图书编号],int retbook(int bookid) 还书操作[形参为图书编号],void disp()显示函数。
2. 读者库类,实现建立读者的个人资料
函数清单:RDatabase()构造函数,将reader.txt读到read[]中,void clear()//删除所有读者信息,int addreader(int n,char *na,char* mi) //添加读者时先查找是否存在[形参分别为编号,姓名,密码],Reader *query(int readerid)//按编号查找,void disp() //输出所有读者信息,void readerdata();//读者库维护 读者库维护函数流程图:
1.3.2.4.5.6. 0.新增 更改删除查找显示全删退出 Case 2/3/4 输入读者编号 N r==Null? 精选范本 输出“该读者不存在” Case2:输入新的姓名 Case3: r->delbook(); Case4:输出读者信息 Y .
3. 图书类,实现对图书的描述,图书的编号,书名,借出,还入等 break 函数清单:char *getname()//获取姓名,int getno()//获取图书编号,int gettag()//获取删除标记,void setname(char na[])//设置书名,char*Book::getwriter()//获取书籍作者,char*Book::getconcem() { return concem; }//获取书籍出版社,char* Book::gettime() {return Time;} ,float Book::getprice() { return price; }//获取书籍价格,void delbook()//删除图书,void Book::addbook(int n,char *na, char *wri, char *con, char* tm,float pr) //增加图书[形参为书名,编号,作者,出版社,出版时间,价格],int borrowbook()//借书操作,void retbook()//还书操作,void disp()//输出图书。
4. 图书库类,实现对图书的维护,查找,删除等
函数清单:BDatabase()//构造函数,将book.txt读到book[]中,void clear()//全删,nt BDatabase::addbook(int n,char *na, char *wri, char *con,char *tm, float pr) //增加图书[形参为书名,编号,作者,出版社,出版时间,价格],Book* BDatabase::query(int bookid)//查找图书[形参为图书编号],int BDatabase::qname(char* nm),void bookdata();//图书库维护,void disp()显示函数。
精选范本
.
精选范本 .
四、程序运行结果测试与分析
运行结果:
精选范本
.
精选范本
.
精选范本
.
精选范本
.
精选范本
.
分析:由于时间有限,程序在显示上仍有小问题,待改进。
五、程序源代码
#include 精选范本 . #include const int Maxr=100;//最多的读者 const int Maxb=100;//最多的图书 const int Maxbor=5;//每位读者最多借五本书 /****************读者类,实现对读者信息的描述****************/ class Reader { private: int tag ; int no ; char name[10] ;//读者姓名 int borbook[Maxbor];//所借图书 char mima[6]; 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; }//设置删除标记 1:已删 0:未删 char* getmima()//获取读者的密码 { } return mima; void addreader(int n,char*na,char* mi) { tag=0; no=n; strcpy(name,na); strcpy(mima,mi); for(int i=0;i }//增加读者 void borrowbook(int bookid) 精选范本 { for(int i=0;i } }//借书操作 int retbook(int bookid) { for(int i=0;i } return 0; }//还书操作 void disp() { cout< . [\"; . }; } if(borbook[i]!=0) cout< private: int top;//读者记录指针 Reader read[Maxr];//读者记录 public: RDatabase() //构造函数,将reader.txt读到read[]中 { } Reader s; top=-1; fstream file(\"reader.txt\打开一个输入文件 while (1) { } file.close(); //关闭reader.txt file.read((char *)&s,sizeof(s)); if (!file)break; top++; read[top]=s; void clear()//删除所有读者信息 { 精选范本 . } top=-1; int addreader(int n,char *na,char* mi) //添加读者时先查找是否存在 { Reader *p=query(n); if (p==NULL) { } top++; read[top].addreader(n,na,mi); 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 NULL; return &read[i]; } void disp() //输出所有读者信息 { for (int i=0;i<=top;i++) if (read[i].gettag()==0) read[i].disp(); 精选范本 . }; } void readerdata();//读者库维护 ~RDatabase() //析构函数,将read[]写到reader.txt文件中 { } fstream file(\"reader.txt\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=1; char rname[20]; int readerid; char rmima[6]; Reader *r; while (choice!='0') { cout <<\"\\\********* 读 者 维 护 *********\"< 精选范本 . cout <<\"\\\…… 0.退 出 ……\"< while(query(readerid)!=NULL); cout << \" 输入读者密码:\"; for(i;i<6;i++) { rmima[i]=getch(); putch('*'); } cout << \"输入读者姓名:\"; cin >> rname; addreader(readerid,rname,rmima); break; case '2': cout << \"输入读者编号:\"; cin >> readerid; r=query(readerid); if (r==NULL) { cout << \"该读者不存在\"< 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; break; } cout<<\"您所查找的读者信息如下\"< break; case '5': disp(); break; . } } case '6': clear(); break; default:cout<<\"输入错误,请从新输入\";break; } /*******************图书类,实现对图书的描述,图书的编号,书名,借出,还入等****************/ class Book { private: int tag;//删除标记1:已删0:未删 public: Book(){} char *getname() { return name; }//获取姓名 int getno(){ return no; }//获取图书编号 int gettag(){ return tag; }//获取删除标记 void setname(char na[])//设置书名 { int no;//图书编号 char name[20];//书名 char writer[10]; //作者 char concem[30]; //出版社 char Time[10]; float price; int onshelf;//是否在架1:在架 2:已借 精选范本 . } strcpy(name,na); char*Book::getwriter() { return writer; }//获取书籍作者 char*Book::getconcem() { return concem; }//获取书籍出版社 char* Book::gettime() {return Time;} float Book::getprice() { return price; }//获取书籍价格 void delbook(){ tag=1;}//删除图书 void Book::addbook(int n,char *na, char *wri, char *con, char* tm,float pr) //增加图书 { } int borrowbook()//借书操作 { } void retbook()//还书操作 if (onshelf==1) { } return 0; onshelf=0; return 1; tag=0; no=n; strcpy(name,na); strcpy(writer,wri); strcpy(concem,con); strcpy(Time,tm); price=pr; onshelf=1; 精选范本 . { } void disp()//输出图书 { cout << setw(6) << no << setw(18) << name << onshelf=1; setw(10)< private: int top; //图书记录指针 Book book[Maxb]; //图书记录 } public: BDatabase()//构造函数,将book.txt读到book[]中 { Book b; top=-1; fstream file(\"book.txt\while (1) { file.read((char *)&b,sizeof(b)); if (!file) break; top++; 精选范本 . } } book[top]=b; file.close(); void clear()//全删 { } int BDatabase::addbook(int n,char *na, char *wri, char *con,char *tm, float top=-1; pr) //增加图书 { } Book* BDatabase::query(int bookid)//查找图书 { } for (int i=0;i<=top;i++) if (book[i].getno()==bookid &&book[i].gettag()==0) { } return NULL; return &book[i]; Book *p=query(n); if (NULL==p) { } return 0; top++; book[top].addbook(n,na,wri,con,tm,pr); return 1; 精选范本 . int BDatabase::qname(char* nm) { } Book* BDatabase::Qname(char* nm) { } int BDatabase::qzuozhe(char *wr) { int e=0; for (int i=0;i<=top;i++) if ((strcmp(book[i].getwriter(),wr)==0) && book[i].gettag()==0) e++; int j=0; Book b[100]; for (int i=0;i<=top;i++) if ((strcmp(book[i].getname(),nm)==0) && book[i].gettag()==0) b[j++]=book[i]; int j=0; for(int i=0;i<=top;i++) if((strcmp(book[i].getname(),nm)==0)&&book[i].gettag()==0) j++; if(j==0) return 0; else return j; if(j==0) return NULL; else return b; 精选范本 . } if(e==0) return 0; else return e; Book* BDatabase::Qzuozhe(char *wr) { } int BDatabase::qchuban(char *cb) { } Book* BDatabase::Qchuban(char *cb) int g=0; for (int i=0;i<=top;i++) if ((strcmp(book[i].getconcem(),cb)==0) && book[i].gettag()==0) g++; int f=0; Book b[100]; for (int i=0;i<=top;i++) if ((strcmp(book[i].getwriter(),wr)==0) && book[i].gettag()==0) b[f++]=book[i]; if(f==0) return NULL; else return b; if(g==0) return NULL; else return g; 精选范本 . }; { int h=0; Book b[100]; for (int i=0;i<=top;i++) if ((strcmp(book[i].getconcem(),cb)==0) && book[i].gettag()==0) b[h++]=book[i]; if(h==0) return NULL; else return b; } void bookdata();//图书库维护 void disp() { } ~BDatabase()//析构函数,将book[]写到book.txt文件中 { } fstream file(\"book.txt\for (int i=0;i<=top;i++) if (book[i].gettag()==0) file.write((char *)&book[i],sizeof(book[i])); for (int i=0;i<=top;i++) if (book[i].gettag()==0) book[i].disp(); file.close(); void BDatabase::bookdata() 精选范本 { char choice; char bname[40]; int bookid; Book *b; char bwriter[15]; char bconcem[15]; char btime[15]; float bprice; int r=0; while (choice!='0') { cout <<\"\\n\\n\\n\\\********* 图*********\"< cout << \"输入图书书名:\"< 精选范本 书 维……\"< 精选范本 . cout << \" 输入图书作者:\"< cout << \" 输入图书出版社:\"< cout << \" 输入图书出版时间:\"< cout << \" 输入图书价格:\"< addbook(bookid,bname,bwriter,bconcem,btime,bprice); cout<<\"图书添加成功\"< case '2': cout << \"输入图书编号:\"< cout << \"输入新的书名:\"< break; case '3': cout <<\" 读入图书编号:\"< if (b==NULL) . { } 精选范本 cout <<\" 该图书不存在\" << endl; break; } b->delbook(); break; case '4': cout << \" 读入图书编号:\"< } cout<<\"您所查找的图书信息如下\"< break; case '5': disp(); break; case '6': clear(); cout<<\"所有图书已删除\"< default: cout<<\"输入错误,请从新输入:\"; . } } /*************main() 函数的实现,程序的主界面的引导*************/ void main() { char choice; int bookid,readerid; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b; while(choice!='0') { cout < 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; ; } r->borrowbook(b->getno()); break; case '2': cout<<\"还书\\n 读者编号:\"; cin >>readerid; cout << \" 图书编号:\"; cin >>bookid; . } r=ReaderDB.query(readerid); if (r==NULL) { } b=BookDB.query(bookid); if (b==NULL) { } b->retbook(); r->retbook(b->getno()); break; cout <<\" 不存在该图书,不能还书\" << endl; break; cout <<\" 不存在该读者,不能还书\" << endl; break; case '3': BookDB.bookdata(); break; case '4': ReaderDB.readerdata(); break; default:cout<<\"输入错误,请从新输入:\"; } } 六、结论与心得 本系统实现了图书管理系统的典型功能,包括查询所有记录的信息,添加查找等功 精选范本 . 能,而且具有较高的安全性。但是因为自己独立完成且时间有限,还有部分功能未能完善,例如对书名,编号的排序等等,这些局限性都是有待逐步完善的方面。而且通过这次课程设计,我培养了自己对C++编程的兴趣,编程能力也有所提高,但仍存在许多不足。 通过这次大作业使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。本次大作业结束了,通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我处理问题的能力.编写程序是件细心活,稍不留神就会出错,这就必须要求我对待事情要认真! 我总结出了一点点的经验如下: 1、要对系统的功能和要求做出详细的分析,并合理分解任务。 2、把分解出来的子任务,做给一个相对独立的模块。 3、在设计一个模块之前,要简单构想一下总界面的显视情况。 4、针对构想出来的界面进行程序的编写。 七、致谢 感谢鄢红国老师的悉心教导,感谢老师课堂上认真细致地讲解。 感谢室友们在我熬夜编代码时的鼓励与陪伴。 感谢我的眼药水。 八、参考资料 [1]谭浩强. C程序设计(第三版) . 北京:清华大学出版社, 2005 [2]陈维新、林晓茶. C++面向对象程序设计教程(第三版) . 北京:清华大学出版社, 2009 [3]网上相关资料 精选范本 . 本科生大作业成绩评定表 班级: 姓名: 学号: 序号 1 2 3 4 5 6 评分项目 学习态度认真、遵守纪律 设计分析合理性 设计方案正确性、可行性、创造性 设计结果正确性 设计报告的规范性 设计验收 满分 10 10 20 40 10 10 总得分/等级 实得分 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格 指导教师签名: 2015 年12月20日 精选范本 . 精选范本 因篇幅问题不能全部显示,请点此查看更多更全内容