课程设计
题 目 名 称 图书管理系统设计 课 程 名 称 信息系统分析与设计 学 生 姓 名 吕季干
学 号 0840819035 系 、专 业 理学与信息科学系 信息与计算科学 指 导 教 师 戴亚滨老师
20xx年 12 月 18 日
1
邵阳学院课程设计(论文)任务书
年级专业 08级信息与计算科学
题目名称 学生姓名 吕季干 学 号 设计时间
080800116 设计地点 0840819035 2011.12.18 2210 图书管理系统设计 课程编号 课程名称 信息系统分析与设计
一、课程设计(论文)目的
图书管理系统以方便、快捷、费用低的优点正慢慢地进入人们的生活,将传统的图书管理方式彻底的解脱出来,提高效率,减轻工人人员以往繁忙的工作,减小出错的概率,使读者可以花更多的时间在选择书和看书上。从而使人们有更多时间来获取信息、了解信息、掌握信息 。
二、已知技术参数和条件
1.学习了信息系统分析与设计
2.掌握了基础的编程原理
3.电脑室有现成的电脑
4.老师的帮助
三、任务和要求
任务:
1. 分析题目,查阅相关资料;
2. 编写代码并调试;
3. 完成课程设计报告。
要求:
1.培养学生自学参考书籍,查阅手册、图表和文献资料的能力。
2. 了解与课程有关的工程技术规范,能正确解释和分析实验结果。
3. 题目具有足够的工作量。
注:1.此表由指导教师填写,经系、教研室审批,指导教师、学生签字后生效;
2.此表1式3份,学生、指导教师、教研室各1份。
2
图书管理系统设计目录
3
一.问题分析与功能定义..............................5
二、对象(类)设计及实现...........................6
三、核心控制设计...................................7
四、测试分析.......................................10
五、源程序代码.....................................13
六、总结...........................................25
七、参考文献.......................................26
八、致谢........................................26
图书管理系统设计
4
一、 问题分析与功能定义
二十一世纪是信息的社会,信息作为社会最主要的资源,将成为战略资源引起人们广泛的关注。如何获取信息?图书是我们最好的获取信息的方式,但由于图书馆图书收藏量大大增加,使传统的图书管理员的工作日益繁重起来。迫使人们起用新的管理方法来管理图书,但如何把图书管理员从繁重的工作中解脱出来呢?
科学技术日新月异的进步,让人类生活发生了巨大的变化,计算机技术的飞速发展,使各行各业在计算机技术应用方面得到了广泛的普及和使用。信息化时代的到来成为不可抗拒的潮流,人类文明正在进入一个崭新的时代。因此,图书管理系统也以方便、快捷、费用低的优点正慢慢地进入人们的生活,将传统的图书管理方式彻底的解脱出来,提高效率,减轻工人人员以往繁忙的工作,减小出错的概率,使读者可以花更多的时间在选择书和看书上。从而使人们有更多时间来获取信息、了解信息、掌握信息 。
1、设计内容及要求
设计一个图书馆管理系统,完成图书管理和读者管理的功能,并能对借阅信息进行管理,要求完成一下功能,图书资料管理,可以添加、修改、删除、查询书籍信息,读者资料管理,可以添加、修改、删除、查询读者信息;借书管理,可以进行添加借书信息;还书管理,可以进行还书信息;
该项目是在Visual C++ 6.0的平台下用c++语言实现,创建对象,程序运行开始,打开文件并将其分别链入链表之中;程序结束关闭并保存文件。
2、模块图
二、对象(类)设计及实现
5
1、概要设计
Reader读者类、RDatabase 读者库类、Book 图书类、BDatabase 图书库类
2、详细设计
6
三、核心控制设计
1、在主函数中我们要做的操作包括:
(1)建立1个Reader读者类、1个RDatabase 读者库类、1个Book 图书类、1个BDatabase 图书库类
(2)建立菜单界面。完成以下内容:
①进入功能必须打开菜单,然后用户根据菜单选择相应的操作方式,如查看数据、编辑图书数据以及修改图书数据、维护图书的采购信息。添加、删除、查看读者个人信息,浏览图书信息。
② 能够对图书基本信息、图书采购信息、图书的借阅人信息进行统计,统计的结果能够以表格的形式来表示。
(3) 将图书基本信息、图书采购信息、图书的借阅人信息存储在相应的文件中。
(4) 系统界面友好,易操作。
2、本程序应具备的功能:
A.添加、借阅、还书功能:
(1)添加读者和图书信息。
(2)借阅尚在架的图书。
(3)读者归还的图书。
B.查找功能
(1) 根据图书的编号查找图书信息。
(2)根据读者的编号查找读者的信息。
C.系统的操作
(1) 系统在进入时,要有菜单提示;
(2) 系统在用户退出时,有一定的提示。
3、算法分析
1)添加操作:(读者信息的添加与图书信息的添加类似)
包括两个部分,先通过输入设备输入信息,系统获取;然后添加入读者数据库read.txt文件中。
㈠获取信息
void Reader::addreader(int n,char *na) //增加读者
{
tag=0; no=n;
strcpy(name,na); for (int i=0;i<Maxbor;i++)
borbook[i]=0; }
int RDatabase::addreader(int n,char *na) //增添读者信息
7
{
der *p=query(n);
if (p==NULL)
{
top++;
read[top].addreader(n,na);
cout<<"读者添加成功"<<endl; return 1;
}
return 0;
}
流程图:
der *p=query(n); p==NULL
N Y
top++;
read[top].addreader(n,na);
cout<<"读者添加成功
"<<endl;
return 1;
return 0;
㈡析构函数写入新读者的编号跟姓名
RDatabase::~RDatabase() {
fstream file("reader.txt",ios::out);
for (int i=0;i<=top;i++)
{
if(read[i].gettag()==0)
file.write((char *)&read[i],sizeof(read[i])); else
file.close();
}
}
流程图:
8
fstream file("reader.txt",ios::out); int i=0 当i<=top read[i].gettag()==0 Y N
file.write((char
*)&read[i],sizeof(reafile.close();
d[i]));
i++
2)借书操作:利用for语句和if语句,通过判断图书的borbook的编号是否为0,来判断图书是否未被借走或还没有被借完。
void Reader::borrowbook(int bookid) //借书操作
{
for (int i=0;i<Maxbor;i++)
if (borbook[i]==0)
{
borbook[i]=bookid;
return;
} int i=0 } 当i<Maxbor 流程图: borbook[i]==0 Y N borbook[i]=bookid; return; i++
3)还书操作:利用for语句和if语句,通过判断图书的borbook的编号是否为要还书的编号,来判断是否借出此书。
int Reader::retbook(int bookid) //还书操作
{
for(int i=0;i<Maxbor;i++)
{
9
if(borbook[i]==bookid)
{
borbook[i]=0;
return 1; int i=0 } else
continue; 当i<Maxbor
borbook[i]==bookid }
Y N 流程图:
continue borbook[i]=0; return 1; i++
(4)查找功能:利用for语句和if语句,寻找与要查询的编号相同的读者编号或图书编号,如果找到,向系统返回相应的编号,输出相应的信息。(读者的查找与图书查找类似)
Reader *query(int readerid) //按编号查找
{
for (int i=0;i<=top;i++)
if(read[i].getno()==readerid&&read[i].gettag()==0)
return &read[i];
return NULL;
}
int i=0 流程图:
当i<=top
Y N
return &read[i];
i++;
return NULL;
四、测试分析
(一)、此系统存在问题
1) 未设登录密码保护系统,是整个图书管理系统失去了一定的安全性;
2) 程序运行界面
10
11
此界面运行时选择4有时会出现内存读取错误;
1)当输入错的数据类型时 可能导致内存错误;
2)读者、图书信息不完善;
12
3)命名不是很规范;
4)信息存储有限;
五、源程序代码
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>//输入/输出文件流类
using namespace std;
const int Maxr=100;//最多的读者
const int Maxb=100;//最多的图书
const int Maxbor=5;//每位读者最多借五本书
//读者类,实现对读者的信息的描述
class Reader
{
private:
int tag; //删除标记 1:已删 0:未删
int no; //读者编号
char name[10]; //读者姓名
int borbook[Maxbor];//所借图书
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;
13
}
void addreader(int n,char *na); //增加读者
void borrowbook(int bookid); //借书操作
int retbook(int bookid); //还书操作
void disp(); //输出读者信息
};
void Reader::addreader(int n,char *na) //增加读者
{
tag=0;
no=n;
strcpy(name,na);
for (int i=0;i<Maxbor;i++)
borbook[i]=0;
}
void Reader::borrowbook(int bookid) //借书操作
{
for (int i=0;i<Maxbor;i++)
{
if (borbook[i]==0)
{
borbook[i]=bookid;
return;
}
}
}
int Reader::retbook(int bookid) //还书操作
{
for(int i=0;i<Maxbor;i++)
{
if(borbook[i]==bookid)
{
borbook[i]=0;
return 1;
}
else
continue;
}
return 0;
}
void Reader::disp() //输出读者信息
{
cout << setw(5) << no << setw(10) << name << " 借书编号:["; for (int i=0;i<Maxbor;i++)
14
if (borbook[i]!=0)
cout <<borbook[i] <<"|";
cout<<"]"<<endl;
}
//读者类库,实现建立读者的个人资料
class RDatabase
{
private:
int top; //读者记录指针
Reader read[Maxr];//读者记录
public:
RDatabase(); //构造函数,将reader.txt读到read[]中 void clear() //删除所有读者信息
{
top=-1;
}
int addreader(int n,char *na); //增添读者信息
Reader *query(int readerid) //按编号查找
{
for (int i=0;i<=top;i++)
if(read[i].getno()==readerid&&
read[i].gettag()==0)
return &read[i];
return NULL;
}
void disp(); //输出所有读者信息
int Readernum(); //得到读者编号
void readerdata(); //读者库维护
~RDatabase(); // 析构函数,将read[]写入reader.txt文件中
};
RDatabase::RDatabase() //构造函数,将reader.txt读到read[]中
{
Reader s;
top=-1;
fstream file("reader.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file) break;
top++;
read[top]=s;
15
}
file.close();
}
RDatabase::~RDatabase() // 析构函数,将read[]写入reader.txt文件中
{
fstream file("reader.txt",ios::out);
for (int i=0;i<=top;i++)
if(read[i].gettag()==0)
file.write((char *)&read[i],sizeof(read[i]));
else
file.close();
}
int RDatabase::addreader(int n,char *na) //增添读者信息
{
Reader *p=query(n);
if (p==NULL)
{
top++;
read[top].addreader(n,na);
cout<<"读者添加成功"<<endl;
return 1;
}
return 0;
}
void RDatabase::disp() //输出所有读者信息
{
for (int i=0;i<=top;i++)
read[i].disp();
}
int RDatabase::Readernum()
{
return top;
}
void RDatabase::readerdata() //读者库维护
{
char choice;
char rname[100]; //读者姓名
int readerid;
Reader *r;
do
{
cout <<"\n\n\t\t\t欢迎进入读者维护界面\n\n\n\t\t 1 新
16 增\n\n\t\t
2 更 改\n\n\t\t 3 删 除\n\n\t\t 4 查 找\n\n\t\t 5 显 示\n\n\t\t 6 全 删\n\n\t\t 0 退 出"<<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;
17
}
r->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:if (choice!='0') cout<<"输入错误,请从新输入:";break; }
}while (choice!='0');
}
//图书类,实现对图书的描述,图书的编号,书名,借出,还入等 class Book
{
private:
int tag;//删除标记 1:已删 0:未删
int no;//图书编号
char name[20];//书名
int onshelf;//是否再架 1:再架 0:已借
public:
Book(){}
char *getname() { return name; }//获取姓名
int getno(){ return 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;
18
}
return 0;
}
void retbook()//还书操作
{
onshelf=1;
}
void disp()//输出图书
{
cout << setw(6) << no << setw(18) << name << setw(10) <<(onshelf==1? "在架":"已借") <<endl;
}
};
//图书库类,实现对图书的维护,查找,删除等
class BDatabase
{
private:
int top; //图书记录指针
Book book[Maxb]; //图书记录
public:
BDatabase()//构造函数,将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()//全删
{
top=-1;
}
int addbook(int n,char *na);//增加图书
Book *query(int bookid)//查找图书
{
for (int i=0;i<=top;i++)
if (book[i].getno()==bookid &&book[i].gettag()==0) {
19
return &book[i];
}
return NULL;
}
void bookdata();//图书库维护
void disp() //输出图书
{
for (int i=0;i<=top;i++)
if (book[i].gettag()==0)
book[i].disp();
}
~BDatabase();//析构函数,将book[]写到book.txt文件中
};
int BDatabase::addbook(int n,char *na)//增加图书
{
Book *p=query(n);
if (NULL==p)
{
top++;
book[top].addbook(n,na);
return 1;
}
return 0;
}
BDatabase::~BDatabase()//析构函数,将book[]写到book.txt文件中
{
fstream file("book.txt",ios::out);
for (int i=0;i<=top;i++)
if (book[i].gettag()==0)
file.write((char *)&book[i],sizeof(book[i]));
file.close();
}
void BDatabase::bookdata()
{
char choice;
char bname[40];
int bookid;
Book *b;
do
{
cout <<"\n\n\n\t\t\t欢迎进入图书维护界面 "<<endl<<endl;
cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 删 除\n\t\t4 查 找\n\t\t5 显 示\n\t\t6 全 删\n\t\t0 退 出"<<endl; cin >> choice;
20
switch (choice)
{
case '1':
cout << "输入图书编号:"<<endl;
cin >> bookid;
cout << "输入图书书名:"<<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;
21
case '5':
disp();
break;
case '6':
clear();
break;
default:if(choice!='0') cout<<"输入错误,请从新输入:";
}
}while (choice!='0');
}
void showmenu()
{
cout<<" ";
cout<<"|---------------------------------------------------------------------|"<<endl;
cout<<" ";
cout<<"|-----设计者:童安蓉,杨丹,刘蕙娟,邓小伟----完成时间:20xx年12月
28日---|"<<endl;
cout<<" ";
cout<<"|-------------------图 书 管 理 系 统-----------------------|"<<endl;
cout<<" ";
cout<<"|-------------------------------------------------------|"<<endl;
cout<<" ";
cout<<"| 1.借 书 |"<<endl;
cout<<" ";
cout<<"| 2.还 书 |"<<endl;
cout<<" ";
cout<<"| 3.图 书 维 护 |"<<endl;
cout<<" ";
cout<<"| 4.读 者 维 护 |"<<endl;
cout<<" ";
cout<<"| 0.退出:将数据保存到磁盘 |"<<endl;
cout<<" ";
cout<<"|----------------------------------------------------------------|"<<endl;
}
void showtip()
{
cout<<"\n\t\t----------------操作完成!-----------------"<<endl;
cout<<"\t\t----------------选择0-5继续------------------"<<endl;
22
cout<<" ";
cout<<"|-------------------------------------------------------|"<<endl;
cout<<" ";
cout<<"| 1.借 书 |"<<endl;
cout<<" ";
cout<<"| 2.还 书 |"<<endl;
cout<<" ";
cout<<"| 3.图 书 维 护 |"<<endl;
cout<<" ";
cout<<"| 4.读 者 维 护 |"<<endl;
cout<<" ";
cout<<"| 0.退出:将数据保存到磁盘 |"<<endl;
cout<<" ";
cout<<"|----------------------------------------------------------------|"<<endl;
}
//main() 函数的实现,程序的主界面的引导
int main()
{
char choice;
int bookid,readerid; //图书编号,读者编号
RDatabase ReaderDB; //读者库
Reader *r; //读者
BDatabase BookDB; //图书库
Book *b; //图书
cout<<"正在打开系统,请稍后..."<<endl;
showmenu(); //显示菜单
cout<<"\t\t\t请选择菜单中的数字以便处理数据:";
cin >> choice;
while (choice!='0')
{
switch (choice)
{
case '1': //输入读者编号和要借的图书
cout <<" 借书 读者编号:";
cin >>readerid;
cout <<" 图书编号: ";
cin >>bookid;
r=ReaderDB.query(readerid); //按编号查找
23
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': //还书操作 cout<<"还书\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; 24
default:if ((choice!='0')) cout<<"输入错误,请从新输入:";
}
showtip();
cin >> choice;
}
cout<<"谢谢您的使用!再见!"<<endl;
return 0;
}
六、总结
通过这次课程设计让我逐步学会了如何运用C++面向对象程序设计的设计思想和方法来解决实际问题。
比如这次设计图书管理系统,首先我考虑是在实际应用时用户一般进行什么操作,对哪些对象进行操作。很显然我需要建立两个类,包括图书类和读者类,同时考虑到图书和读者不止一个,所以还需两个类,图书库类和读者库类,这两个类分别将其信息传递给图书类和读者类。确定了类之后,则需要对类的内容进行扩充。由于我需要这个系统完成对图书管理和读者管理的功能,并能对借阅信息进行管理,要求完成一下功能,图书资料管理,可以添加、修改、删除、查询书籍信息,读者资料管理,可以添加、修改、删除、查询读者信息;借书管理,可以进行添加借书信息;还书管理,可以进行还书信息。所以在对应的类下建立相应功能函数。建立功能函数后就是构造主函数。主函数的作用就是通过向对象发送信息、对象接受信息启动相应的方法来实现相应的操作。
当然在这些过程中要保证面向对象程序设计的抽象、封装、多态和继承的特点。在设计本系统中虽然综合考虑到了图书管理的各个方面,界面设计简洁,数据库设计合理,但依然还有一些不足。
为了能够较好地完成本次课程设计,我详细阅读教材,以及网上搜索,和到图书馆查找相关资料等。在做课程设计的过程中,我在利用所学的知识同时,又学到了很多实例化的理论知识和软件工程的一些实践,总结了一些经验和方法强化了我的实际动手能力,同时也找到自己的不足,我一定会继续学习增加自己的编程能力和调试能力,在今后的学习中我将会更加的努力,增加自己的知识储备,拓宽自己的知识面,锻炼自己的能力,使我的综合素质得到较大的提高。
在这设计的过程中我也出现过一些比较严重的错误,后来在同学的指点下我改正了自己的错误,并最终成功调试除了程序。当程序调试出来的那一瞬间,我感觉自己完成了一件非常了不起的事,好有成就感。在以后的日子,我将会继续我的兴趣继续深入学习程序设计,相信在越来越多的尝试之后,自己会不断进步不断提高的。
最后感谢老师的指导与同学的帮助,使我能顺利完成这次程序设计。
25
七、参考文献
1.《C++程序设计》(第二版),谭浩强著,清华大学出版社
2.《C++面向对象程序设计》(第二版),陈维兴 林小茶著,中国铁道出版社
3. 李明方,SQL Server数据库开发实例教程,北京大学出版社
4. 郑阿奇 ,SQL Server教程,清华大学出版社
5. Jeffrey D.Ullman,数据库系统基础教程,机械工业出版社
八、致谢
经过这么长的时间来对系统的分析、设计,使我对图书管理系统有了全面的
了解与认识,在戴亚滨老师的指导下完成此次课程设计。从开始接到课程设计题
目到系统的实现,再到设计的完成,每走一步对我来说都是新的尝试与挑战。
但系统也存在设计上的不足,首先因为初次设计制作完整的系统,在初期阶
段需求分析和考虑数据库设计的时候都做的不全面,以至不能很好的保证数据的
完整性,在长时间使用删除一些数据后,会有一些脏数据留存,也可能有其他一
些问题发生。其次,仍然有一些地方没有及时的给用户反馈,没有做操作可逆的
处理。另外,对图书馆工作的了解不够深入,会有些功能和操作方式还没有考虑
到。
由于本人的知识水平有限,系统存在着一些需要改进和不足的问题,还望各位读
者和教师们多多批评指正,不胜感激。
26
邵阳学院课程设计(论文)评阅表
学生姓名 吕季干 学 号 0840819035
系 理学与信息科学系 专业班级 08信计一班
题目名称 图书管理系统设计 课程名称 信息系统分析与设计
一、学生自我总结
通过这次课程设计让我逐步学会了如何运用C++面向对象程序设计的设计思想和方法来解决实际问题。
通过本次设计,深刻了解本课程的重要性,对以后的学习有很大帮助。我对SQL Server2000有了更深的了解,数据库和表是SQL Server 2000用于组织和管理数据的基本对象,用户使用SQL Server 2000设计和实现查询信息,首要的任务是实现数据库的数据的表示和存储,即创建数据库和表。
学生签名:吕季干 20xx年12 月 18日
二、指导教师评定
评分项目 资料查阅 编写规范 基本技能 设计能力 科学静养 工作量
权 重
单项成绩
指导教师评语: 10 12 25 30 13 10 综合成绩
指导教师(签名): 年 月 日
注:1、本表是学生课程设计(论文)成绩评定的依据,装订在设计说明书(或论文)的“任务书”页后面;
2、表中的“评分项目”及“权重”根据各系的考核细则和评分标准确定。
27