学生实验报告
实验课名称: 软件工程——理论·方法与实践
实验项目名称: 图书管理系统
专业名称: 软件工程
班级: 240600804
学号: 2406080426
学生姓名: 宋辉
教师姓名: 杜瑾
2010 年 5 月 14 日
实验日期: 2010 年 5 月 14 日 实验室名称: WM2502
图书管理系统
三.实验内容:
1图书管理系统分析
图书管理系统分析是对图书管理系统的现状进行分析。根据图书管理系统的目标、需求分析和功能分析,制定和选择一个较好的图书管理系统方案,从而达到一个合理的优化图书管理系统。
2确定图书管理系统目标
图书管,最初由于图书数量和种类较少,人工手动管理比较方便和灵活。随着社会的发展,图书的数量和种类越来越多,人工手动管理会降低工作的效率,希望建立一个图书馆图书信息管理系统,是为了解决了人工手动管理图书信息在实践的问题,从而达到系统化、规范化、标准化的水平。该系统的建立不但给管理者带来了方便,也节省了工作时间从而提高了工作效率。
3图书管理系统需求分析
在构造系统时,首先从需求出发构造数据库表,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的图书管理系统分解成了几个小系统。这里把图书管理系统的层次划分为了三个部分:一个自由态:即面向任何用户的界面,提供登录功能,以便不同身份的用户登录子系统;一个是一般用户态:即图书有服务子系统;还有一个是管理员界面:提供图书的管理和维护功能。对于不同子系统之间的功换,采用了登录功能和用户注销功能。
图书管理系统划分了子系统后,下一步的工作是继续划分子系统的小模块。先考虑在进入子系统时应该做什么,进入系统之后又应该做什么,提供那些服务等。对于图书信息服务子系统,在用户进入时首先得调用相关数据库表,找出用户的图书借阅情况;进入系统后,子系统得提供图书查询、图书借阅和还书功能。另外,针对本系统的特殊情况,同时也考虑系统的可移植性,在系统中增加了数据库路径的维护部分。最后,考虑到系统的安全性,还在系统中特别增加了“加密界面”的功能。
4功能分析
图书馆图书信息管理系统由两大子系统组成:图书管理和维护子系统以及图书信息服务子系统。
1.图书管理和维护子系统的功能包括:
(1)图书信息入库(建立信息库,以便查询和借阅)。
(2)理图书库(包括删除图书图书信息和统计图书信息)。
(3)查看图书信息。
(4)查询图书的借阅情况(包括借出情况查询、未借出情况查询和超时情况查询,同时还要知道:如果某本图书被借出,那么可直接查询到借阅者的信息,以便催还等)。
(5)图书馆的规则管理和维护(包括每人可借阅图书数目、每人每本书可持有天数以及每超时一天的罚金数目等)。
(6) 用户信息的管理和维护(例如删除已毕业学生信息、增加新生信息等)。
(7) 数据库路径的管理和维护,主要是为了提高系统的通用性而设置的。
2.图书信息服务子系统的功能包括:
(1) 书信息的查询(例如在借书前可先查询某本图书是否被借出)。
(2)图书的借阅(按图书馆的规则进行借阅,例如不超过5本,如果已有超时借阅的图书,则在归还前不允许再借阅等等)。
(3)图书的归还。
四.实验设备与软件环境:
图书管理系统计算机,MicrosoftWord2003 , Microsoftvisio2003
五.实验步骤与结果:
数据库需求分析
(1)书信息查询:调用图书信息表、借出信息表、查询图书编号、书名、作者、出版社、类别、是否借出等基本信息。
(2)图书的借阅:调用图书信息表和用户信息表,生成包括图书编号、学生证号和借出时间三项的借出信息表。
(3)图书归还:调用用户信息表和借出信息表,删除借出表中的相应信息等。
(4)管理和维护图书信息:包括图书编号、书名、作者、出版社、出版时间、类别等。
(5)用户信息维护:调用用户信息表,设置用户名、学生证号、等级数据项。
(6)学生信息维护:调用学生信息表,设置学生证号、姓名、性别、系别和专业数据项。
1:软件体系结构图
2:程序流程图
六.实验中遇到的问题、解决方法及体会:
在具体的设计与实施中,我看到并感受到了一个管理系统从无到有的过程,对具体的设计步骤、思路、方法、技巧都有了进一步的了解,并感受深刻。
在设计中我基本能按照规范的方法和步骤进行,首先对现有的系统进行调查,并查阅有关资料,最后确定设计方案,然后设计并制作,实施过程中我深刻的认识到认真执行管理系统软件标准的重要性,我由于对管理系统软件相关的标准和规范不太了解,缺少行为操作准则,所以在设计中手法比较生硬,主与次也没能很好把握住,这些方面通过这次我都要加强了解。
第二篇:c++图书管理系统实验报告+源代码
1 设计任务
1.1 设计目的
运用所学知识,完成图书馆管理系统,通过实践加强对所学知识的理解和巩固
1.2设计内容
建立图书馆管理系统,用户分为图书管理人员,读者。管理人员可以增加删除查看图书、读者。读者只能查看自身信息,和借还书
1.3设计指标或者要求
管理人员可以访问任意图书和读者,而读者只能借还图书馆存在的图书和查看自己的信息。
2 设计过程
分析:由于管理系统用户有图书管理员和读者,但两者的权限不同,管理员有权访问所有图书信息和管理员信息,而读者只能访问所有图书信息和自身的信息。所以他们的相同点:都能访问所有图书信息
不同点:管理员能访问所有读者信息而管理员只能访问自身信息而不能访问其它读者信息;故此设计了三个类
程序包含三个类:图书类(books),管理员类(manager),读者类reader,books类为抽象类,manager,和reader类为books类的派生类。为了能让管理员和读者访问所有图书信息,所有都继承了books类;而为了分出两者的权限的不同,所以把所有读者的信息做为一个链表作为管理员的一个私有成员,而读者却只能放一个自身节点作为读者的私有成员,然后分别设计各个类的成员函数。
2.1 程序功能
Class books ///虚基类
{
protected:
books_node *broot;
public:
books();//构造函数
savebooks();//保存修改的内容
search_book();//查找某一本书
print_books();//输出所有书的信息
virtual add_book()=0;//对于读者是还书,对于管理员添加书
virtual delet_book()=0;//对于读者是借书,对于管理员是去掉某一本书
};
Class manager:public books //管理员类
{
protected:
readers_node *rroot;
public:
manager(readers_node*);
savereaders();
add_book();//添加图书信息
delet_book();//删除图书
search_reader();//查找读者信息
add_reader();//添加读者
delet_reader();//删除读者
print_readers();//输出所有读者
};
class reader:public books{//读者类
private:readers_node* personnel;//存放读者自身信息
public:
reader(readers_node*);
add_book();//还书
reader_borrow();
delet_book();
reader_return();//借书
print_me();//查看自己借书情况
save_readers(readers_node*);
};
2.2程序流程图
3软件运行或者测试结果(1)管理员身份登录:
(2)读者身份登录:
4 软件设计过程中遇到的问题以及解决办法
由于编写前期做了大量的设计工作,在编写过程中基本没有遇到难解决的问题提,倒是在设计类时有些茫然,经过反复斟酌还是做了一些取舍,比如把读取读者文件放在了类的外面等。。
5 总结
通过本次课程设计学到了很多东西,对于c++对象的含义有了进一步的认识,从而对类的封装和设计有了一种新的认识,不只是停留在表面,为以后的学习积累了经验,设计不比编写容易,类设计好是整个程序写好的前提,只有一个好的规划才能写出好的程序。不过也通过本次发现了自己的不足之处。总是:本次课程设计受益匪浅,动手能力大大增强;
附录(程序源代码)
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#define max 3
typedef struct Books{
char book_name[15];
int total_num;
int borrow_num;
char book_num[15];
Books *next;
}books_node;
typedef struct Readers{
char reader_name[15];
char reader_no[15];
int reader_borrow_num;
struct Reader_borrow_books{
char borrow_books_name[15];
char borrow_books_no[15];
}reader_borrow_book[max];
Readers *next;
}readers_node;
class books {
protected:
books_node *broot;
public:
books();
savebooks();
search_book();
print_books();
virtual add_book()=0;
virtual delet_book()=0;
};
class manager:public books
{
protected:
readers_node *rroot;
public:
manager(readers_node*);
savereaders();
add_book();
delet_book();
search_reader();
add_reader();
delet_reader();
print_readers();
};
class reader:public books{
private:readers_node* personnel;
public:
reader(readers_node*);
add_book();
reader_borrow();
delet_book();
reader_return();
print_me();
save_readers(readers_node*);
};
books::books()
{
books_node *r;
broot=new books_node;
r=new books_node;
r->next=NULL;
broot=r;
ifstream inFile;
inFile.open("c:\\books.dat",ios::binary);
if(inFile.is_open()==-1)cout<<"con't open books.dat"<<endl;
else
{
int i=0;
while(1)
{
i++;
books_node *node;
node=new books_node;
inFile.read( (char*)node,sizeof(books_node));
if(inFile.eof()) break;
node->next=r->next;
r->next=node;
}
inFile.close();
if(i<2)cout<<"暂时没有图书数据"<<endl;
}
}
books::savebooks()
{
books_node *L;
L=new books_node;
L=broot->next;
ofstream outFile;
outFile.open("c:\\books.dat",ios::binary);
while(L)
{
outFile.write((char*)L,sizeof(books_node));
L=L->next;
}
outFile.close();
}
books::search_book()
{
char searchedbook[15];
cout<<"输入要查找的书的名子:";
cin>>searchedbook;
books_node *r;
r=new books_node;
r=broot->next;
while(r)
{
if((strcmp(searchedbook,r->book_name))==0)
{
cout<<"书名:"<<r->book_name<<" 书的总量:"<<r->total_num<<" 借出:"<<r->borrow_num<<" 书的编号:"<<r->book_num<<endl;break;
}
r=r->next;
}
if(r==NULL)cout<<"对不起,没有此书"<<endl;
}
books::print_books()
{
books_node *r;
r=new books_node;
r=broot->next;
while(r)
{
cout<<"书名:" <<r->book_name<<" 书的总量:"<<r->total_num<<" 借出:"<< r->borrow_num <<" 书的编号:"<<r->book_num<<endl;
r=r->next;
}
delete r;
}
manager::add_book()
{
books_node *L;
L=new books_node;
L=broot;
while(1)
{
books_node *r;
r=new books_node;
r->next=NULL;
cout<<"输入书名:";
cin>>r->book_name;
cout<<"输入书的编号:";
cin>>r->book_num;
r->borrow_num=0;
cout<<"输入总数:";
cin>>r->total_num;
r->next=L->next;
L->next=r;
cout<<"add more?(n终止,其它键继续)";
char sign;
cin>>sign;
if(sign=='n'||sign=='N')
break;
}
broot=L;
savebooks();
}
manager::delet_book()
{
char deleted[15];
cout<<"输入要删除的图书名字:";
cin>>deleted;
books_node *node,*L;
node=new books_node;
L=new books_node;
node=broot;
while(node->next)
{
if((strcmp(deleted,node->next->book_name))==0)break;
node=node->next;
}
if(node->next==NULL)
{
cout<<"sorry!There is no the book!"<<endl;
}
else
{
if(node->next->borrow_num==0)
{
node->next=node->next->next;
savebooks();
}
else
cout<<"对不起,暂时不能删除,因为还有没有归还的书"<<endl;
}
}
manager::manager(readers_node*node)
{
rroot=new readers_node;
rroot=node;
}
manager::savereaders()
{
readers_node *L;
L=new readers_node;
L=rroot->next;
ofstream outFile;
outFile.open("c:\\Readers.dat",ios::binary);
while(L)
{
outFile.write((char*)L,sizeof(readers_node));
L=L->next;
}
outFile.close();
}
manager::add_reader()
{
readers_node *L;
L=new readers_node;
L=rroot;
int sign=0;
while(1)
{
readers_node *r;
r=new readers_node;
r->next=NULL;
cout<<"输入姓名:";
cin>>r->reader_name;
cout<<"输入读者的编号:";
cin>>r->reader_no;
r->reader_borrow_num=0;
r->next=L->next;
L->next=r;
cout<<"add more?(n终止,其它键继续)";
char sign;
cin>>sign;
if(sign=='n'||sign=='N')
break;
}
rroot=L;
savereaders();
}
manager::delet_reader()
{
char deleted[15];
cout<<"输入要删除读者的名字:";
cin>>deleted;
readers_node *node,*L;
node=new readers_node;
L=new readers_node;
node=rroot;
while(node->next)
{
if((strcmp(deleted,node->next->reader_name))==0)break;
node=node->next;
}
if(node->next==NULL)
{
cout<<"sorry!There is no the reader!"<<endl;
}
else
{
node->next=node->next->next;
savereaders();
}
}
manager::search_reader()
{
readers_node *r;
r=new readers_node;
r=rroot->next;
char reader[15];
cout<<"输入要查找读者的姓名:";
cin>>reader;
while(r)
{
if((strcmp(reader,r->reader_name))==0)
{
cout<<"姓名:"<<r->reader_name<<" 编号:"<<r->reader_no<<" 借书总数:"<<r->reader_borrow_num<<endl;
for(int i=0;i<r->reader_borrow_num;i++)
{
cout<<"书名:"<<r->reader_borrow_book[i].borrow_books_name<<" "<<"书的编号:"<<r->reader_borrow_book[i].borrow_books_no;
}
break;
}
else r=r->next;
}
if(!r)cout<<"没有此人"<<endl;
}
manager::print_readers()
{
readers_node *printL;
printL=new readers_node;
printL=rroot->next;
while(printL)
{
cout<<"姓名 编号 借书总数"<<endl;
cout<<printL->reader_name<<" "<<printL->reader_no<<" "<<printL->reader_borrow_num<<endl;
for(int i=0;i<printL->reader_borrow_num;i++)
{
cout<<"书名:"<<printL->reader_borrow_book[i].borrow_books_name<<" "<<"书的编号:"<<printL->reader_borrow_book[i].borrow_books_no;
}
printL=printL->next;
}
delete printL;
}
reader::reader(readers_node*node)
{
(personnel)=new readers_node;
personnel=node;
}
reader::add_book()
{
books_node*node;
node=new books_node;
node=broot->next;
char returned[15];
cout<<"输入要还书的名子:";
cin>>returned;
for(int i=0;i<personnel->reader_borrow_num;i++)
{
if((strcmp(returned,personnel->reader_borrow_book[i].borrow_books_name))==0)break;
}
if(i==personnel->reader_borrow_num+1)
{
printf("不好意思,你没有此书");system("pause");
}
else{
while(node)
{
if((strcmp(node->book_name,returned)==0))break;
else node=node->next;
}
if(node)
{
personnel->reader_borrow_num--;
node->borrow_num--;
savebooks();
}
else cout<<"对不起,没有你要还的书或者所还书被删除"<<endl;
}
}
reader::delet_book()
{
if(personnel->reader_borrow_num<max)
{
books_node*node;
node=new books_node;
node=broot->next;
char borrowed[15];
cout<<"输入要借书的名子:";
cin>>borrowed;
while(node)
{
if((strcmp(node->book_name,borrowed)==0))break;
else node=node->next;
}
if(node&&(node->total_num-node->borrow_num)>0)
{
strcpy(personnel->reader_borrow_book[personnel->reader_borrow_num].borrow_books_name,node->book_name);
strcpy(personnel->reader_borrow_book[personnel->reader_borrow_num++].borrow_books_no,node->book_num);
node->borrow_num++;
savebooks();
}
else cout<<"对不起,没有你要借的书或者所要借的书已经借完!"<<endl;
}
else cout<<"对不起,你借书的数量已经超过最大借数量"<<endl;
}
reader::print_me()
{
cout<<"姓名"<<personnel->reader_name<<" 编号:"<<personnel->reader_no<<" 借书总数:"<<personnel->reader_borrow_num<<endl;
for(int i=0;i<personnel->reader_borrow_num;i++)
{
printf("书名:%s,书的编号:%s",personnel->reader_borrow_book[i].borrow_books_name,personnel->reader_borrow_book[i].borrow_books_no);
}
}
void Pause()
{
getch();
fflush(stdin);
}
reader::reader_borrow()
{
delet_book();
}
reader::reader_return()
{
add_book();
}
reader::save_readers(readers_node *L)
{
readers_node *root;
root=new readers_node;
root=L->next;
ofstream outFile;
outFile.open("c:\\Readers.dat",ios::binary);
while(root)
{
outFile.write((char*)root,sizeof(readers_node));
root=root->next;
}
outFile.close();
}
readers_node* read_readers()
{
readers_node *r;
r=new readers_node;
r->next=NULL;
int flag=0;
ifstream inFile;
inFile.open("c:\\Readers.dat",ios::binary);
if(inFile.is_open()==-1)
{
cout<<"con't open readers.dat"<<endl;return r;
}
else
{
while(1)
{
flag++;
readers_node *node;
node=new readers_node;
inFile.read((char*)node,sizeof(readers_node));
if(inFile.eof()) break;
node->next=r->next;
r->next=node;
}
inFile.close();
if(flag<2)
{
cout<<"暂无读者 "<<endl; return r;
}
else
return r;
}
}
password()
{
system("cls");
char a[]="111111",b[10],c;int n=0,k;
cerr<<"\n\n\n\n\t\t\t请输入密码,你将拥有3次机会:\n";
while(1)
{
n++;
k=0;
cerr<<"\t\t\t输入密码:";
while(1)
{
c=getch();
if(c==13)break;
b[k]=c;k++;
cerr<<"*";
}
b[k]='\0';
cout<<"\n";
if(n>2)
{
printf("你已经超过输入次数,系统将退出\n");
getch();
}
if(strcmp(a,b)==0)break;
else cout<<"密码错误,请重新输入\n";
cerr<<"\n";
}
}
void manager_menu_1(manager M)
{
int N;
while(1)
{
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃ 图书管图书管理系统 ┃\n";
cout<<"┃ 菜单 ┃\n";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n";
cout<<"┃①增加图书 ┃\n";
cout<<"┃ ②.删除图书 ┃\n";
cout<<"┃ ③.查找图书 ┃\n";
cout<<"┃ ④.输出所有 ┃\n";
cout<<"┃ 退出请按0 ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<"请输入您的选择(0--4):( )\b\b";
cin>>N;
switch (N)
{
case 1: M.add_book();getch();break;
case 2: M.delet_book();getch();break;
case 3: M.search_book();getch();break;
case 4: M.print_books();getch();break;
case 0: return;
}
system("cls");
}
}
void manager_menu_2(manager M)
{
int N;
while(1)
{
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃ 图书管图书管理系统 ┃\n";
cout<<"┃ 菜单 ┃\n";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n";
cout<<"┃①增加读者 ┃\n";
cout<<"┃ ②删除读者 ┃\n";
cout<<"┃③查找读者 ┃\n";
cout<<"┃④输出所有 ┃\n";
cout<<"┃ 退出请按0 ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<"请输入您的选择(0--4):( )\b\b";
cin>>N;
switch (N)
{
case 1: M.add_reader();getch();break;
case 2: M.delet_reader();getch();break;
case 3: M.search_reader();getch();break;
case 4: M.print_readers();getch();break;
case 0: return;
}
system("cls");
}
}
void manager_menu(readers_node*L)
{
system("cls");
password();
manager Manager(L);
int N;
while(1)
{
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃ 图书管图书管理系统 ┃\n";
cout<<"┃ 菜单 ┃\n";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n";
cout<<"┃①图书维护 ┃\n";
cout<<"┃②读者维护 ┃\n";
cout<<"┃退出请按0 ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<"请输入您的选择(0--2):( )\b\b";
cin>>N;
switch (N)
{
case 1: system("cls"); manager_menu_1(Manager); break;
case 2: system("cls"); manager_menu_2(Manager);break;
case 0: return;
}
system("cls");
}
}
reader_menu(readers_node*L)
{
char name[15];
cout<<"输入用户名:";
cin>>name;
readers_node* node;
node=new readers_node;
node=L->next;
while(node)
{
if((strcmp(name,node->reader_name))==0)
break;
else
node=node->next;
}
if(node)
{
reader Reader(node);
int N;
while(1)
{
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃图书管图书管理系统 ┃\n";
cout<<"┃ 菜单 ┃\n";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n";
cout<<"┃①借书 ┃\n";
cout<<"┃ ②还书 ┃\n";
cout<<"┃③查找书 ┃\n";
cout<<"┃ ④.输出所有 ┃\n";
cout<<"┃ ⑤自身信息 ┃\n";
cout<<"┃退出请按0 ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<"请输入您的选择(0--5):( )\b\b";
cin>>N;
switch (N)
{
case 1: system("cls") ;Reader.reader_borrow();Reader.save_readers(L);break;
case 2: system("cls"); Reader.reader_return();Reader.save_readers(L);break;
case 3: system("cls");Reader.search_book();system("pls");break;
case 4: system("cls");Reader.print_books();getch();break;
case 5: system("cls");Reader.print_me(); Pause();break;
case 0: return;
}
system("cls");
}
}
else
{
printf("没有这个用户!按任意键继续");
getch();
return;
}
}
main()
{
readers_node* Reader_root;
Reader_root=new readers_node;
Reader_root=read_readers();
int N;
while(1)
{ system("cls");
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃ 图书管图书管理系统 ┃\n";
cout<<"┃ 菜单 ┃\n";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n";
cout<<"┃①图书管理员 ┃\n";
cout<<"┃ ②.读 者 ┃\n";
cout<<"┃推出请按0 ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<"请输入您的选择(0--2):( )\b\b";
cin>>N;
switch (N)
{
case 1: manager_menu(Reader_root);break;
case 2: reader_menu(Reader_root);break;
case 0:exit(0);break;
}
}
}