1、C+课程设计报告目 录1.设计目标32.题目要求33.设计思想34.类及对象设计45.关键代码56.调试记录147. 总结171设计目标设计一个小型的图书管理系统,用链表来存储读者的基本信息(包括姓名、读者编号、读者借书情况等),完成借书、还书、图书维护、读者维护、离开等功能。2. 题目要求小型图书管理系统1需求分析:本系统对一个小型图书馆图书、读者以及借阅信息进行管理2程序的基本功能:1)、增加、修改、删除一个图书资料。2)、增加、修改、删除一个读者资料。3)、增加、修改、删除借阅信息。4)、按条件显示读者、图书以及借阅信息3设计思想(1) 设计class Reader读者信息库,实现对读者
2、信息的描叙; class RDatabase读者类库实现建立读者的个人资料;class Book图书类,实现对图书的描述,图书的编号,书名,借出,还入等;class BDatabase图书库类,实现对图书的维护,查找,删除等。以下是函数功能表: 函数功能char *getname()获取姓名int gettag()获取删除标记int getno()获取读者编号void setname(char na)设置姓名以及编号void addreader(int n,char *na)增加读者void delbook()设置删除标记void borrowbook(int bookid)借书操作int r
3、etbook(int bookid)还书操作void disp()读出读者信息BDatabase()构造函数,将book.txt读到book中int addbook(int n,char *na)增加图书Book *query(int bookid)查找图书void bookdata()图书库维护BDatabase()析构函数,将book写到book.txt文件(2)用类的成员函数对链表的数据进行操作,其功能如上表所列。(3)设计菜单来实现功能设计 1、 借 书 2、 还 书 3、 图 书 维 护 4 、读 者 维 护 0 、离 开4设计类及对象(1) 本程序定义了三个类,定义如下:class
4、 Reader private: char *getname() return name; /获取姓名 int gettag() return tag; /获取删除标记 int getno() return no; /获取读者编号 void setname(char na) /设置姓名 void delbook() tag=1; /设置删除标记 1:已删 0:未删 void addreader(int n,char *na)/增加读者 int retbook(int bookid)/还书操作void disp()/读出读者信息;class RDatabase private: int top;
5、 /读者记录指针 Reader readMaxr;/读者记录 public: RDatabase() /构造函数,将reader.txt读到read中void clear()/删除所有读者信息int addreader(int n,char *na)/添加读者时先查找是否存在 Reader *query(int readerid)/按编号查找void disp() /输出所有读者信息void readerdata();/读者库维护RDatabase() /析构函数,将read写到reader.txt文件中;class Book private: char *getname() return n
6、ame; /获取姓名 int getno() return no; /获取图书编号 int gettag() return tag; /获取删除标记 void setname(char na)/设置书名 void delbook() tag=1;/删除图书 void addbook(int n,char *na)/增加图书int borrowbook()/借书操作 void retbook()/还书操作 void disp()/输出图书class BDatabase private: BDatabase()/构造函数,将book.txt读到book中 void clear()/全删 int a
7、ddbook(int n,char *na)/增加图书 Book *query(int bookid)/查找图书 void bookdata();/图书库维护 BDatabase()/析构函数,将book写到book.txt文件中;(2)分别利用类class Reader 、class RDatabase、class Book 、class BDatabase 定义了各自的对象Book bookMaxb、RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b;对其函数进行调用实现各种功能。(3)主函数实现,调用各种函数。5关键代码cla
8、ss Reader private: int tag; /删除标记 1:已删 0:未删 int no; /读者编号 char name10; /读者姓名 int borbookMaxbor;/所借图书 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:未
9、删 void addreader(int n,char *na)/增加读者 tag=0; no=n; strcpy(name,na); for(int i=0;iMaxbor;i+) borbooki=0; void borrowbook(int bookid)/借书操作 for(int i=0;iMaxbor;i+) if (borbooki=0) borbooki=bookid; return; int retbook(int bookid)/还书操作 for(int i=0;iMaxbor;i+) if(borbooki=bookid) borbooki=0; return 1; ret
10、urn 0; void disp()/读出读者信息 cout setw(5) no setw(10) name借书编号:; for(int i=0;iMaxbor;i+) if(borbooki!=0) cout borbooki |; cout endl; ; /读者类库,实现建立读者的个人资料 class RDatabase private: int top; /读者记录指针 Reader readMaxr;/读者记录 public: RDatabase() /构造函数,将reader.txt读到read中 Reader s; top=-1; fstream file(reader.txt
11、,ios:in);/打开一个输入文件 while (1) file.read(char *)&s,sizeof(s); if (!file)break; top+; readtop=s; file.close(); /关闭 reader.txt void clear()/删除所有读者信息 top=-1; int addreader(int n,char *na)/添加读者时先查找是否存在 Reader *p=query(n); if (p=NULL) top+; readtop.addreader(n,na); return 1; return 0; Reader *query(int rea
12、derid)/按编号查找 for (int i=0;i=top;i+) if (readi.getno()=readerid & readi.gettag()=0) return &readi; return NULL; void disp() /输出所有读者信息 for (int i=0;i=top;i+) readi.disp(); void readerdata();/读者库维护 RDatabase() /析构函数,将read写到reader.txt文件中 fstream file(reader.txt,ios:out); for (int i=0;i=top;i+) if (readi
13、.gettag()=0) file.write(char *)&readi,sizeof(readi); file.close(); ; void RDatabase:readerdata() char choice; char rname20; int readerid; Reader *r; while (choice!=0) cout nnttt读 者 维 护nnntt 1 新 增nntt 2 更改nntt 3 删 除nntt 4 查 找nntt 5 显 示nntt 6 全 删nntt 0 退出 choice; switch (choice) case 1: cout readerid;
14、 cout rname; addreader (readerid,rname); break; case 2: cout readerid; r=query(readerid); if (r=NULL) cout 该读者不存在 endl; break; cout rname; r-setname(rname); break; case 3: cout readerid; r=query(readerid); if (r=NULL) cout 该读者不存在 delbook(); break; case 4: cout readerid; r=query(readerid); if (r=NULL
15、) cout 该读者不存在disp(); break; case 5: disp(); break; case 6: clear(); break; default:cout输入错误,请从新输入:;break; /图书类,实现对图书的描述,图书的编号,书名,借出,还入等 class Book private: int tag;/删除标记 1:已删 0:未删 int no;/图书编号 char name20;/书名 int onshelf;/是否再架 1:再架 2:已借 public: Book() char *getname() return name; /获取姓名 int getno() r
16、eturn no; /获取图书编号 int gettag() return tag; /获取删除标记 void setname(char na)/设置书名 strcpy(name,na); void delbook() tag=1;/删除图书 void addbook(int n,char *na)/增加图书 tag=0; no=n; strcpy(name,na); onshelf=1; int borrowbook()/借书操作 if (onshelf=1) onshelf=0; return 1; return 0; void retbook()/还书操作 onshelf=1; void
17、 disp()/输出图书 cout setw(6) no setw(18) name setw(10) (onshelf=1? 在架:已借) endl; ; /图书库类,实现对图书的维护,查找,删除等 class BDatabase private: int top; /图书记录指针 Book bookMaxb; /图书记录 public: BDatabase()/构造函数,将book.txt读到book中 Book b; top=-1; fstream file(book.txt,ios:in); while (1) file.read(char *)&b,sizeof(b); if (!f
18、ile) break; top+; booktop=b; file.close(); void clear()/全删 top=-1; int addbook(int n,char *na)/增加图书 Book *p=query(n); if (NULL=p) top+; booktop.addbook(n,na); return 1; return 0; Book *query(int bookid)/查找图书 for (int i=0;i=top;i+) if (booki.getno()=bookid &booki.gettag()=0) return &booki; return NUL
19、L; void bookdata();/图书库维护 void disp() for (int i=0;i=top;i+) if (booki.gettag()=0) booki.disp(); BDatabase()/析构函数,将book写到book.txt文件中 fstream file(book.txt,ios:out); for (int i=0;i=top;i+) if (booki.gettag()=0) file.write(char *)&booki,sizeof(booki); file.close(); ; void BDatabase:bookdata() char cho
20、ice; char bname40; int bookid; Book *b; while (choice!=0) cout nnnttt图 书 维 护 endlendl; couttt1 新 增n tt2 更 改ntt3 删 除ntt4 查 找ntt5 显示ntt6 全 删ntt0 退 出 choice; switch (choice) case 1: cout 输入图书编号: bookid; cout 输入图书书名: bname; addbook(bookid,bname); break; case 2: cout 输入图书编号: bookid; b=query(bookid); if (
21、b=NULL) cout 该图书不存在 endl; break; cout 输入新的书名: bname; b-setname(bname); break; case 3: cout 读入图书编号: bookid; b=query(bookid); if (b=NULL) cout 该图书不存在 delbook(); break; case 4: cout 读入图书编号: bookid; b=query(bookid); if (b=NULL) cout 该图书不存在disp(); break; case 5: disp(); break; case 6: clear(); break; def
22、ault:cout输入错误,请从新输入:; 6.调试纪录 1、读者维护界面,新增读者功能2、程序的主界面以及图书维护界面 3、查找读者功能界面 7总结 通过这次课程设计,让我了解了更多关于设计时容易出现的错误,而且进一步的认识到平时学习积累的重要性。在刚进行编译的时候发现了很多的错误,都是平时应该注意的细节问题,还好与同学进行了很好的交流,得以纠正错误。 由于能力问题,我只能设计这个简单的图书管理系统。它存在很多缺陷,在很多地方都存在不足。编写程序最重要的是谨慎,认真,因为哪怕是一个字符或一个标点的错误都会导致程序的错误,从而使程序无法调试运行。 由这次编写课程设计的过程中让我更加了解到了自己的不足,那就是对编写程序的经验不足以及对理论知识的掌握不够透彻,以致程序中还存在许多缺点。如:在程序中还有部分功能不能按我的意识表达运行,当经人指点还是比较不错的实现了。16共17页16页