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;
}
}
}