WORD格式石河子大学信息科学与技术学院计算机科学与技术专业课程设计报告二、结构图1.功能结构图图书管理系统新增图查询在恢复被为读者办理借办理还退出系书信息架的图删除图办理借书手续书手续统的输入书信息书信息书注册2.主流程图Start设置选择变量choice输出提示让用户选择要实行的操作 .借书功能还书功能图书维护读者维护退出系统Choice=Choice=1Choice=2Choice=3Choice=4Choice=0‘其它数值’提示输入错误Stop三、程序设计的想法和具体思路图书管理系统分为图书管理和会员管理两大部分。
设计一个图书类Book,包括一本图书的基本管理功能,具有以下私有数据:inttag;// 删除标记1:已删0:未删intno;// 图书编号charname[20];// 书名intonshelf;// 是否再架 1:再架2:已借1inttop; // 图书记录指针Bookbook[Maxb];// 图书记录在其构造函数中,将book.txt 文件的所有录入读到book[]中。
处理完毕,在析构函数中将book[]中的所有未删除记录笑道book.txt 文件中,中间的处理是对book[]进行的。
设计一个读者类 Reader,包括一个读者的基本管理功能,具有以下私有数据:inttag;// 删除标记1:已删0:未删intno; // 读者编号charname[10];// 读者姓名intborbook[Maxbor];// 所借图书设计一个读者库类RDatabase,具有以下私有数据:inttop; // 读者记录指针Readerread[Maxr];// 读者记录在其构造函数中,将reader.txt 文件的所有记录读到read[] 中。
处理完毕,在析构函数中将 read[] 中的所有未删除记录写到reader.txt 文件中,中间的处理都是对reader[] 进行的。
四、参考文献1)谭浩强,《C++程序设计》,北京,清华大学出版社,2006年2)李振鹏,张小莉,郑艳娟,《数据结构》,中国铁道出版社,2007年3)杨小平,《VisualC++项目案例导航》,北京,科学出版社,2002年4)DavidConger,《软件开发:编程与设计》,北京,清华大学出版社,2006年.5) FrancisGlassborowRobertaAllen ,《YouCanDoIt!——C++编程新手互动教程》,北京,人民邮电出版社,2005年五、课程设计总结心得体会选到这个课程设计题目的时候,感觉挺简单的,查找,增加,,显示,统计,这些平时都学过,用过,但是实际操作中还是遇到了很多问题,所以特意到图书馆专门借了几本关于数据结构程序设计方面的书,同时也希望能把平时没有学好的地方好好补一补,能对知识有更深层次的理解.一切准备就绪,把平时写的相关的程序出来参考,对比,慢慢才找到一些感觉,把源程序写出来.经过几天终于写完了程序的初稿,然后输入电脑,一编译,发现错误几十个,还有好多警告,只得一条一条的看,一个一个的改,首当其冲的是再输入电脑过程中不小心漏掉的标点符号,有些括号忘了,有些是忘了写分号等粗心导致的小毛病,这些错误很容易改正.到后面的错误就有些麻烦了,当中有个头文件忘了写,编译过程中好几十个错误就是改不过来, 后来和同学讨论才知道原来错在什么地方,这样一下就变成了几个错误,这时信心大增,有些错误都看不懂错在那里,由于英文水平不太好,只好去查字典,还要推敲这个单词在这里到底是哪个意思,再加上以往的经验和同学的帮助下,好不容易才得到零错误零警告,那时真开心,我的程序终于可以运行了,激动的按下运行,得到了预想的界面,按照提示操作,都很顺利,一个一个的实验每一个功能,都以为成功了,当运行到了删除功能时,突然出现死循环,只见操作界面不停的闪.这是逻辑错误,很难找,后来只有一步一步的,一句一句的检查,找到了错误的根源,并改正.从进入大学来,我们学习了C++,数据结构。
特别是高老师的认真授课,精心讲解下,同学们学到了很多东西,知识方面的很多,还有平时?心的习惯也养成了.这对我们以后的学习生活很有好处,最后感谢常老师一学期以来对我们的教育帮助,对我们程序设计时的辅导.六、程序运行结果附录:源代码#include<iostream> #include<iomanip>#include<string>#include<fstream>// 输入/输出文件流类usingnamespacestd;constintMaxr=100;// 最多的读者constintMaxb=100;// 最多的图书constintMaxbor=5;// 每位读者最多借五本书//读者类,实现对读者的信息的描述classReader{private:inttag;// 删除标记1:已删0:未删intno; // 读者编号charname[10];// 读者姓名intborbook[Maxbor];// 所借图书public:Reader(){}char*getname(){returnname;} // 获取姓名intgettag(){returntag;} // 获取删除标记intgetno(){returnno;} // 获取读者编号voidsetname(charna[]) // 设置姓名{strcpy(name,na);}voiddelbook(){tag=1;}// 设置删除标记1:已删0:未删voidaddreader(intn,char*na)// 增加读者{tag=0;no=n;strcpy(name,na);for(inti=0;i<Maxbor;i++)borbook[i]=0;}voidborrowbook(intbookid)// 借书操作{for(inti=0;i<Maxbor;i++){if(borbook[i]==0){borbook[i]=bookid;return;}intretbook(intbookid)// 还书操作5{for(inti=0;i<Maxbor;i++){if(borbook[i]==bookid){borbook[i]=0;return1;}}return0;}voiddisp()/ /读出读者信息{cout<<setw(5)<<no<<setw(10)<<name<<" 借书编号:[";for(inti=0;i<Maxbor;i++)if(borbook[i]!=0)cout<<borbook[i]<<"|";cout<<"]"<<endl;}};//读者类库,实现建立读者的个人资料classRDatabase{private:inttop; // 读者记录指针Readerread[Maxr];// 读者记录public:RDatabase() // 构造函数,将reader.txt 读到read[] 中{Readers;top=-1;fstreamfile("reader.txt",ios::in);//打开一个输入文件while(1){file.read((char*)&s,sizeof(s));if(!file)break;top++;read[top]=s;}{top=-1;6}intaddreader(intn,char*na)// 添加读者时先查找是否存在{Reader*p=query(n);if(p==NULL){top++;read[top].addreader(n,na);return1;}return0;}Reader*query(intreaderid)// 按编号查找{for(inti=0;i<=top;i++)if(read[i].getno()==readerid&&read[i].gettag()==0){return&read[i];}returnNULL;}voiddisp()// 输出所有读者信息{for(inti=0;i<=top;i++)read[i].disp();}voidreaderdata();// 读者库维护~RDatabase()// 析构函数,将read[] 写到reader.txt 文件中{fstreamfile("reader.txt",ios::out);for(inti=0;i<=top;i++)if(read[i].gettag()==0)file.write((char*)&read[i],sizeof(read[i]));file.close();}};voidRDatabase::readerdata(){charchoice;charrname[20];intreaderid;Reader*r;while(choice!='0')7{cout<<"读者维护:t1.新增t2.更改t3.删除t4.查找t5.显示t6.全删t0.退出"<<endl;cin>>choice;switch(choice){case'1':cout<<" 输入读者编号:";cin>>readerid;cout<< "输入读者姓名:";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;break;8}r->disp();break;case'5':disp();break;case'6':clear();break;default:cout<<" 输入错误,请从新输入:";break;}}}//图书类,实现对图书的描述,图书的编号,书名,借出,还入等classBook{private:inttag;// 删除标记 1:已删0:未删intno;// 图书编号charname[20];// 书名intonshelf;// 是否再架1:再架2:已借public:Book(){}char*getname(){returnname;}// 获取姓名intgetno(){returnno;}// 获取图书编号intgettag(){returntag;}// 获取删除标记voidsetname(charna[])// 设置书名{strcpy(name,na);}voiddelbook(){tag=1;}// 删除图书voidaddbook(intn,char*na)// 增加图书{tag=0;no=n;strcpy(name,na);onshelf=1;}intborrowbook()// 借书操作{if(onshelf==1){onshelf=0;return1;9}return0;}voidretbook()// 还书操作{onshelf=1;}voiddisp()// 输出图书{cout<<setw(6)<<no<<setw(18)<<name<<setw(10) <<(onshelf==1?" 在架":"已借")<<endl;}};//图书库类,实现对图书的维护,查找,删除等classBDatabase{private:inttop; // 图书记录指针Bookbook[Maxb];// 图书记录public:BDatabase()// 构造函数,将book.txt 读到book[]中{Bookb;top=-1;fstreamfile("book.txt",ios::in);while(1){file.read((char*)&b,sizeof(b));if(!file)break;top++;book[top]=b;}file.close();}voidclear()// 全删{top=-1;}intaddbook(intn,char*na)// 增加图书{Book*p=query(n);if(NULL==p){top++;book[top].addbook(n,na);10return1;}return0;}Book*query(intbookid)// 查找图书{for(inti=0;i<=top;i++)if(book[i].getno()==bookid&&book[i].gettag()==0){return&book[i];}returnNULL;}voidbookdata();// 图书库维护voiddisp(){for(inti=0;i<=top;i++)if(book[i].gettag()==0)book[i].disp();}~BDatabase()// 析构函数,将book[]写到book.txt 文件中{fstreamfile("book.txt",ios::out);for(inti=0;i<=top;i++)if(book[i].gettag()==0)file.write((char*)&book[i],sizeof(book[i]));file.close();}};voidBDatabase::bookdata(){charchoice;charbname[40];intbookid;Book*b;while(choice!='0'){cout<<"图书维护:t1.新增t2.更改t3.删除t4.查找t5.显示t6.全删t0.退出"<<endl;cin>>choice;switch(choice){case'1':cout<<" 输入图书编号:"<<endl;cin>>bookid;11cout<<" 输入图书书名:"<<endl;cin>>bname;addbook(bookid,bname);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;case'5':disp();break;case'6':clear();12break;default:cout<<" 输入错误,请从新输入:";}}}//main() 函数的实现,程序的主界面的引导voidmain(){charchoice;intbookid,readerid;RDatabaseReaderDB;Reader*r;BDatabaseBookDB;Book*b;while(choice!='0'){ cout<<endl<<endl<<" ttt图书管理系统n";cout<<"1.借书t2.还书t3.图书维护t4.读者维护t0.离开"<<endl;cin>>choice;switch(choice){case'1':cout<<" 借书n读者编号:";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':13cout<<"还书n读者编号:";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'3':BookDB.bookdata();break;case'4':ReaderDB.readerdata();break;default:cout<<" 输入错误,请从新输入:";}}}14。