您的当前位置:首页正文

C++图书管理系统

来源:帮我找美食网


学 号:

《面向对象程序设计》作业

题 目 图书管理系统 学 院 信息工程学院 专 业 通信工程

班 级

姓 名 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 #include

精选范本

.

#include #include #include #include using namespace std;

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;iborbook[i]=0;

}//增加读者

void borrowbook(int bookid)

精选范本

{ for(int i=0;i}

}

}//借书操作

int retbook(int bookid) { for(int i=0;i}

}

return 0;

}//还书操作

void disp() { cout<for(int i=0;i精选范本

.

[\"; .

};

}

if(borbook[i]!=0)

cout<cout<<\"]\"</******************读者库类,实现建立读者的个人资料****************/ class RDatabase {

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.退 出 ……\"<> choice; int i=0; switch (choice) { case '1': cout << \"输入读者编号:\"; cin >> readerid;

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<<\"您所查找的读者信息如下\"<disp();

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)</**************图书库类,实现对图书的维护,查找,删除等**************/ class BDatabase {

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\\\********* 图*********\"<> choice; switch (choice) { case '1': cout << \"输入图书编号:\"<> bookid;

cout << \"输入图书书名:\"<cin >> bname;

精选范本

书 维……\"<

精选范本

.

cout << \" 输入图书作者:\"<> bwriter;

cout << \" 输入图书出版社:\"<> bconcem;

cout << \" 输入图书出版时间:\"<>btime;

cout << \" 输入图书价格:\"<>bprice;

addbook(bookid,bname,bwriter,bconcem,btime,bprice); cout<<\"图书添加成功\"<break;

case '2': cout << \"输入图书编号:\"<> bookid; b=query(bookid); if (b==NULL) { cout << \" 该图书不存在\"<}

cout << \"输入新的书名:\"<> bname; b->setname(bname);

break;

case '3': cout <<\" 读入图书编号:\"<> bookid; b=query(bookid);

if (b==NULL)

.

{

}

精选范本

cout <<\" 该图书不存在\" << endl; break;

}

b->delbook();

break;

case '4': cout << \" 读入图书编号:\"<> bookid; b=query(bookid); if (b==NULL) { cout <<\" 该图书不存在\"<< endl; break;

}

cout<<\"您所查找的图书信息如下\"<disp();

break;

case '5': disp();

break;

case '6': clear();

cout<<\"所有图书已删除\"<break;

default:

cout<<\"输入错误,请从新输入:\";

.

}

}

/*************main() 函数的实现,程序的主界面的引导*************/ void main() {

char choice;

int bookid,readerid; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b;

while(choice!='0') {

cout <cout <<\"\\\★☆☆★☆☆★☆☆★☆☆★☆☆★☆☆★\"<> choice; switch (choice) {

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日

精选范本

.

精选范本

因篇幅问题不能全部显示,请点此查看更多更全内容

Top