用C++编写的图书管理系统[合集五篇]

时间:2019-05-12 21:32:56下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《用C++编写的图书管理系统》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《用C++编写的图书管理系统》。

第一篇:用C++编写的图书管理系统

C++实现图书管理系统 一:功能:

1.需要有个系统管理员和普通读者;

2.对图书库存图书的创建,添加,删除,修改,查询;

3.对读者借阅信息的创建,添加,删除,修改,查询; 4:普通读者只有查询上述两个文件的权利;

5:管理员可对普通读者的创建,添加,修改,删除; 6:管理员拥有上述全部权利;

7:要与文件流进行关联,如:创建,添加,读取,删除,查询;

第二篇:C++课程设计(简单图书管理系统)

课 程 设 计

课程名称

C++课程设计 题目名称

图书管理系统

2016 年月 29 日

目录

一.设计内容与要求...............................................................................................................2 二.设计思路:.......................................................................................................................4 三.关键模块实现及主要代码...............................................................................................4 四.实验结果及分析.............................................................................................................13

五、心得体会.........................................................................................................................16

六、参考文献.........................................................................................................................17

一.设计内容与要求

(1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的 录入、查询、删除等功能。

(2)、实现用户管理,系统具有用户注册功能。管理员的账号和密码由系统指定,登录后可进行修改。一般用户注册后才能登录使用系统。管理员具有录入、查询、删除图书信息及一般用户的功能。一般用户只有图书查询功能。

(3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。

(4)、图书管理功能,管理员能够录入、查询、删除图书信息。(5)、图书查询功能,管理员及一般用户能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。

提示:上述为基本功能,可参考实际的系统进行扩展。

二.设计思路:

为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。程序主要分为4个页面:(1)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。

(2)图书查询页面。由Cdialog类派生出CSearch类。包含读取所有图书数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。

(3)管理员图书管理页面。由Cdialog类派生出CBookdata类。包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。(4)用户信息管理页面,由Cdialog类派生出CUserdata类。包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。

因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。

三.关键模块实现及主要代码

(1)自己建立的类 1.用户类: class CUser { public: int num;char password[20];};

2.图书信息类:

class Book

//图书类 { public:

char author[10];

//设置作者姓名

char bname[20];

//设置图书书名

char pub_name[20];

//设置出版社名称

int pub_date;

//设置出版年月 };

(2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。1.用户注册处理响应函数:

void CMyprojectDlg::OnButton3()

//用户注册 { // TODO: Add your control notification handler code here

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持用户记录数,//后面依次保持用户记录注意,写用户的每个信息的顺序要与读取时的顺序一致。

UpdateData(TRUE);CUser user;int n_user=0;

//用户的个数,管理员默认为第一个。自己输入为账号:1111,密码:0000。

int size=0;

fstream file(“user.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。

file.seekg(ios::beg);

//将文件指针指向文件头。

file.read((char*)&n_user,sizeof(n_user));

//读取用户数。

n_user+=1;file.seekp(ios::beg);file.write((char*)&n_user,sizeof(n_user));//写学生记录个数

user.num=m_num;

//之前定义user.password为string,导致密码匹配时有错误。。。

memcpy(user.password,m_password.GetBuffer(m_password.GetLength()),m_password.GetLength());// 把类CString对象的内容赋值到字符数组中

user.password[m_password.GetLength()]='';//在数组末尾加结束符号

//在文件末尾,把新的记录写入。

file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg);

//这里出错

file.write((char*)&user.num,sizeof(user.num));file.write((char*)&user.password,sizeof(user.password));

file.close();

///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示

CString str;str.Format(“成功注册,成为第 %d 个注册用户,请按确定返回重新登录.”,n_user-1);

///因为第一个为管理员,不算为用户人数。

AfxMessageBox(str);

} 2.用户登录处理响应函数。其中包含判断是管理员,还是普通用户。void CMyprojectDlg::OnButton2()

//用户登录 { // TODO: Add your control notification handler code here

UpdateData(TRUE);

CUser m_user[100];int i;int size;int n_user=0;//文件中用户的个数

////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取用户记录 放在成员变量m_st数组中(已在类体中声明了)

CFile file;

file.Open(“user.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件

if(size>0){

file.SeekToBegin();

file.Read(&n_user,sizeof(n_user));}

if(n_user>0 && n_user<99)//实验中限定为0~100个用户记录

{

for(i=0;i

{

//请注意与写入数据的顺序要保持一样,否则会读错数据。

file.Read(&(m_user[i].num),sizeof(m_user[i].num));

file.Read(&(m_user[i].password),sizeof(m_user[i].password));

} } file.Close();///////////////////////////////////////////////// if(m_num==1111&&m_password==“0000”)

//管理员进入管理员页面

{

CAdministrators administrators;

administrators.DoModal();}

CString str_password;for(i=0;i

//普通用户,进入图书查询页面

{

str_password=m_user[i].password;

if(m_user[i].num==m_num)

{

if(str_password==m_password)

{

CSearch search;

search.DoModal();

}

else

{

CString str;

str.Format(“密码或者账号错误,请重新输入!”);

AfxMessageBox(str);

}

} } }

(3)图书查询页面。包含读取所有图书数据,以及根据作者姓名或者书名来查询图书。1.读取所有图书响应函数。

void CSearch::OnButton5()

//显示出所有图书 { // TODO: Add your control notification handler code here int i;int size;int n_book=0;//文件book的本数

////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的书本记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取书籍记录 放在成员变量m_user_book数组中(已在类体中声明了)

CFile file;

file.Open(“book.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件

if(size>0){

file.SeekToBegin();

file.Read(&n_book,sizeof(n_book));}

if(n_book>0 && n_book<99)//实验中限定为0~100个书本记录

{

m_num_book=n_book;

for(i=0;i

{

//请注意与写入数据的顺序要保持一样,否则会读错数据。

file.Read(&(m_user_book[i].author),sizeof(m_user_book[i].author));

file.Read(&(m_user_book[i].bname),sizeof(m_user_book[i].bname));

file.Read(&(m_user_book[i].pub_name),sizeof(m_user_book[i].pub_name));

file.Read(&(m_user_book[i].pub_date),sizeof(m_user_book[i].pub_date));

} } file.Close();///////////////////////////////////////////////// //在列表控件中显示所有条记录

//插入每列的表头;

m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);//每一行插入一条书本记录

for(i=0;i

CString str;

str=m_user_book[i].author;

m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_user_book[i].bname;

m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名

str=m_user_book[i].pub_name;

m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_user_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期

} }

2.图书查询响应函数。

void CSearch::OnButton4()

//查询图书 { // TODO: Add your control notification handler code here

UpdateData(TRUE);m_list.DeleteAllItems();int num=0;//表示查找结果的个数

int i;

for(i=0;i

{

CString str;

int ret1=0,ret2=0;

str=m_user_book[i].author;

ret1=str.Find(m_author,0);//ret1>=0, 表示str中包含了m_author的字段

str=m_user_book[i].bname;

ret2=str.Find(m_bname,0);//ret2>=0, 表示str中包含了m_bname的字段

if(ret1>=0)

//按作者查询

{

str=m_user_book[i].author;

m_list.InsertItem(num,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_user_book[i].bname;

m_list.SetItemText(num,1,str);//设置第i行第1列的的数据为书名

str=m_user_book[i].pub_name;

m_list.SetItemText(num,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_user_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(num,3,str);//设置第i行第3列的的数据为出版日期

num+=1;//结果+1;

}

} }

(4)管理员图书管理页面。包含读取所有图书,添加图书,修改图书,删除图书的功能。1.读取所有图书功能实现与(3)的实现一样。2.添加图书响应函数。

void CBookdata::OnButton7()

//添加图书 { UpdateData(TRUE);Book book;int n_book=0;

//书本的个数

int size=0;

fstream file(“book.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。

file.seekg(ios::beg);

//将文件指针指向文件头。

file.read((char*)&n_book,sizeof(n_book));

//读取书籍数。

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持书本记录数,//后面依次保持书本记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

n_book+=1;file.seekp(ios::beg);file.write((char*)&n_book,sizeof(n_book));//写学生记录个数

memcpy(book.author,m_add_author.GetBuffer(m_add_author.GetLength()),m_add_author.GetLength());// 把类CString对象的内容赋值到字符数组中 book.author[m_add_author.GetLength()]='';//在数组末尾加结束符号

memcpy(book.bname,m_add_bname.GetBuffer(m_add_bname.GetLength()),m_add_bname.GetLength());// 把类CString对象的内容赋值到字符数组中

book.bname[m_add_bname.GetLength()]='';//在数组末尾加结束符号

memcpy(book.pub_name,m_add_pub_name.GetBuffer(m_add_pub_name.GetLength()),m_add_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中

book.pub_name[m_add_pub_name.GetLength()]='';//在数组末尾加结束符号

book.pub_date=m_add_pub_date;

//在文件末尾,把新的记录写入。

file.seekp(4+(n_book-1)*54,ios::beg);

file.write((char*)&book.author,sizeof(book.author));file.write((char*)&book.bname,sizeof(book.bname));file.write((char*)&book.pub_name,sizeof(book.pub_name));file.write((char*)&book.pub_date,sizeof(book.pub_date));

file.close();///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示

CString str;str.Format(“文件中已有 %d 本书籍记录.”,n_book);AfxMessageBox(str);}

3.修改图书响应函数。

void CBookdata::OnButton5()

//修改图书,,必须先读取图书才能修改图书。{ // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);

CString str_author,str_bname,str_pub_name,str;

//将book类的字符串数组赋值为字符串变量,方便比较。

CFile file;// 建立一个文件类,关于其用法,请baidu。

file.Open(“book.dat”,CFile::modeReadWrite);//打开文件

file.SeekToBegin();

file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数

for(int i=0;i

{

str_author=m_book[i].author;

str_bname=m_book[i].bname;

str_pub_name=m_book[i].pub_name;

if(str_author==m_author||str_bname==m_bname||str_pub_name==m_pub_name||m_book[i].pub_date==m_pub_date)

{

memcpy(m_book[i].author,m_modify_author.GetBuffer(m_modify_author.GetLength()),m_modify_author.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].author[m_modify_author.GetLength()]='';//在数组末尾加结束符号

memcpy(m_book[i].bname,m_modify_bname.GetBuffer(m_modify_bname.GetLength()),m_modify_bname.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].bname[m_modify_bname.GetLength()]='';//在数组末尾加结束符号

memcpy(m_book[i].pub_name,m_modify_pub_name.GetBuffer(m_modify_pub_name.GetLength()),m_modify_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].pub_name[m_modify_pub_name.GetLength()]='';//在数组末尾加结束符号

m_book[i].pub_date=m_modify_pub_date;

}

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

file.Write(&m_book[i].author,sizeof(m_book[i].author));

file.Write(&m_book[i].bname,sizeof(m_book[i].bname));

file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name));

file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date));

///////////////////////////////////////////////////////////////////////////////////////// //在列表控件中显示所有条记录

str=m_book[i].author;

m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_book[i].bname;

m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名

str=m_book[i].pub_name;

m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期

}

file.Close();

//用消息框提示

str.Format(“成功修改书籍记录.”);AfxMessageBox(str);}

4.删除图书响应函数。

void CBookdata::OnButton6()

//删除图书,,读取了图书数据后才能删除图书 { // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);

CString str_author,str_bname,str_pub_name,str;

//将book类的字符串数组赋值为字符串变量,方便比较。

int n_book,n_flag=0;

// n_flag为删除标志,1为有元素删除了

CFile file;// 建立一个文件类,关于其用法,请baidu。

file.Open(“book.dat”,CFile::modeReadWrite);//新建一个文件并且打开文件

file.SeekToBegin();

file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数,先填入本来的书本数。

for(int i=0;i

{

str_author=m_book[i].author;

str_bname=m_book[i].bname;

str_pub_name=m_book[i].pub_name;

if(str_author==m_del_author||str_bname==m_del_bname||str_pub_name==m_del_pub_name||m_book[i].pub_date==m_del_pub_date)

{

n_flag=1;

//删除标志置1

i+=1;

//第i个元素为要删除元素,跳过

}

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持 学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

file.Write(&m_book[i].author,sizeof(m_book[i].author));

file.Write(&m_book[i].bname,sizeof(m_book[i].bname));

file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name));

file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date));

}

if(n_flag==1)

{

n_book=m_num_book-1;

//表示删除了一本书,则将文件的书本数减1。

file.SeekToBegin();

file.Write(&n_book,sizeof(n_book));//写书本记录本数,先填入本来的书本数。

//用消息框提示

str.Format(“成功删除书籍记录.”);

AfxMessageBox(str);

}

else

{

//用消息框提示

str.Format(“没有这一本书的记录,不能删除.”);

AfxMessageBox(str);

}

file.Close();}

(5)、用户信息管理页面,包含读取所有用户信息,删除、添加、修改用户信息。1.读取所有用户信息以(4)基本相同。

2.删除用户信息实现基本方法与(4)基本相同。3.添加用户信息实现基本方法与(4)基本相同。4.修改用户信息实现基本方法与(4)基本相同。

四.实验结果及分析

(1.)登录页面 成功注册

普通用户成功登录页面

查询结果

管理员登录页面

图书管理页面

成功添加图书。

用户信息管理页面

分析:基本功能是可以实现的,但是因为是用数组来存放图书信息与用户信息,所以对于数据大了之后处理能力不够方便以及效率不高。而且删除信息的时候只是删除该条数据的信息,数据后面的信息往上移动,所以最后面会有两条重复的信息,虽然文件开头储存信息数目已经减一,读取数据是按照文件开头储存的信息数目来读取信息,但是有时候读取会有乱码。我在程序中找不到那个隐藏的bug,五、心得体会

这次C++课程设计学到了很多,懂得了C++看起来虽然简单,可是要用这个计算机语言来实现一些有用的功能,怎么运用确实是一门挺高深的学问,我们学习计算机语言不能只是看书看概念,要多上机实验,这样才能对计算机语言有比较深的了解,才能够提高自己的编程以及调试找BUG的能力。现在来总结一下编程过程中遇到的一些值得注意的问题。

1.派生出一个类时,为编辑框增加变量名后,然后在类声明中自己增加类成员,如果再想在对话框中增加编辑框并且添上变量名会出现错误。(如下,在Csearch 类中自己添加下面箭头指向的代码后,会出现下图右的错误,解决方法是把箭头指向的代码放到//}}AFX_DATA后面,因为此语句为MFC对话框自行添加编辑变量的结束,如果我们将自己定义的变量也添加到此语句前,编译器不清楚是MFC自行添加的变量还是用户自行添加的变量。)2.遇到编译器没有出错,可是运行结果与自己想象的不一样,很可能是逻辑错误。如: 在用户注册时,我是将用户数据直接存到文件尾,这是不正确的,因为管理员页面有删除用户的功能,这个功能的原理是先读文件头的用户数(假定为10个),然后将用户的数据先读取出来,然后经过一个判断,再储存重新储存回文件,而文件中储存的用户数据大小是没有变化的,也就是说文件尾会有两份最后一个用户的数据(即如果删除的是第七个,文件中最后会有两份第十个用户的数据,文件头的记录用户数为9个),如果添加用户直接储存在文件尾则会储存在第11个用户的位置,可是以后读取的话只是读取到第10个。所以会出现读取错误,密码不匹配的问题。应该根据记录的用户数让文件指针指向最后一个用户数据后面。file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg);

以上两个问题是困扰我比较久的,其他问题经过百度还有自己的调试,解决还算快,不值得重点说。

六、参考文献

1.C++面向对象程序设计(第二版)

谭浩强 编著 2.成绩管理系统MFC教程

3.CNDN论坛,关于文件操作的指针运算。

第三篇:用mysql数据库实现的C++图书管理系统

#include #include #include #include #include

#include #include #include #include

#include //改变字体颜色

#define NONE “33[m” #define RED “33[0;32;31m” #define GREEN “33[0;32;32m” #define BLUE “33[0;32;34m” #define YELLOW “33[1;33m”

#define LIGHT_RED “33[1;31m” #define LIGHT_GREEN “33[1;32m” #define LIGHT_BLUE “33[1;34m” /* 在编译程序之前,请先开启mysql服务器(命令为 sudo mysqld_safe &),然后再登录mysql客户端(命令为 mysql-u root-p)建立数据库 stu;建立数据表reader,book;具体操作语句如下:

create database stu;

create table reader(stu_name varchar(20),stu_phone varchar(15),stu_password varchar(10),stu_num int,debt float,lend_time double,back_time double,count int);

create table book(book_name varchar(40),book_aut varchar(40),book_pre varchar(40),book_num int,book_mux int,book_con int);

编译时用如下命令:

g++ $(mysql_config--cflags)110.cpp-o t $(mysql_config--libs)*/

//定义mysql数据库变量

MYSQL

mysql;MYSQL_RES * results;

MYSQL_FIELD *fileds;

MYSQL_ROW rows;

char strHost[] = “localhost”;

char strUser[] = “root”;

char strPasswd[] = “3335599”;

char strDb[] = “stu”;char strSQL[200];

unsigned int num_fields;/* 程序导读:

1.程序中对书的操作,可通过书名,编号来进行,flag=0按书名来操作,flag=1按书编号来操作

2.程序中对用户的操作,也可通过姓名,用户ID号或编号两种方式来进行,flag=0按姓名来操作,flag=1按用户ID号或编号来操作

3.本程序分5个部分,具体已标识如(1)图书管理...4.本程序即可实现将数据保存至本地即stu.txt,book.txt,又可将数据保存至mysql数据库,只

需稍加修改,具体如何修改,在此就不做说明 */

using namespace std;class Book { public: string book_name;string book_num;//编号

string book_pre;//出版社

string book_aut;//作者

int book_con;//这样的书还有几本

int book_mux;//这样的书总共有几本

public: Book(){book_con=0;book_mux=0;} void show_book();

};

/****************************************(1)图书管理*******************************************/ void Book::show_book(){ cout<<“书名:”<

class BookNode { public: Book book;BookNode *next;};BookNode *headbook=NULL;

void savebook(BookNode *p);//保存图书信息到数据库

void del_sql_book(BookNode *p);//将图书信息从数据库中删除

class BookManage {

public: int totolbook;public: BookManage(){totolbook=0;} void addbook();

void delbook(string s,int num,int flag);void findbook(string s,int flag);//查询图书 };

void BookManage::addbook(){ string h;

cout<<“添加输入0,退出输入-1”<>h;if(h==“-1”)return;else if(h==“0”)while(1){

if(h==“-1”)break;else if(h==“0”){

string na,nu,p1,aut;int con;BookNode *p=new BookNode;cout<<“请输入书名:”<>na;p->book.book_name=na;cout<<“请输入ISBN编号:”<>nu;p->book.book_num=nu;cout<<“请输入出版社:”<>p1;p->book.book_pre=p1;cout<<“请输入此书的作者:”<>aut;p->book.book_aut=aut;cout<<“请输入此书共有几本:”<>con;p->book.book_con=con;p->book.book_mux=con;p->next=headbook;headbook=p;savebook(p);//添加至数据库 BookManage::totolbook+=con;

cout<<“继续添加输入0,取消添加输入-1”<

cin>>h;

}

else

cout<

void BookManage::delbook(string s,int num,int flag){ BookNode *p=headbook;if(headbook!=NULL){

switch(flag)

{

case 0:

if(headbook->book.book_name==s)

{

if(headbook->book.book_con>1)

{headbook->book.book_con-=num;headbook->book.book_mux-=num;}

else { headbook=p->next;totolbook-=num;

del_sql_book(p);//从数据库中删除

//delete p;

}

}

else if(p->next)

{

for(p=headbook;p->next!=NULL&&p!=NULL;p=p->next)

{

if(p->next->book.book_name==s)

{

if(p->next->book.book_con>1)

{

p->next->book.book_con-=num;headbook->book.book_mux-=num;

break;

}

else

{

p->next=p->next->next;

totolbook-=num;

del_sql_book(p->next);//从数据库中删除

//delete p->next;

break;

}

}

}

if(p->next==NULL)

cout<

break;case 1:

if(headbook->book.book_num==s){

if(headbook->book.book_con>1)

{headbook->book.book_con-=num;headbook->book.book_mux-=num;}

else

{

headbook=p->next;

totolbook-=num;

del_sql_book(p);//从数据库中删除

//delete p;

}

}

else if(p->next)

{

for(p=headbook;p->next!=NULL&&p!=NULL;p=p->next)

{

if(p->next->book.book_num==s)

{

if(p->next->book.book_con>1)

{

p->next->book.book_con-=num;headbook->book.book_mux-=num;

break;

}

else

{

p->next=p->next->next;

totolbook-=num;

del_sql_book(p->next);//从数据库中删除

//delete p->next;

break;

}

}

}

if(p->next==NULL)

cout<

}

break;

default:

cout<

} } }

void BookManage::findbook(string s,int flag){ BookNode *p;int h=0;switch(flag){

case 0:

for(p=headbook;p!=NULL;p=p->next)//先查看是否有此书

{

if(p->book.book_name==s)break;} if(NULL==p)cout<next)//查看名为s的图书共有几本 { if(p->book.book_name==s)h++;} if(h>0)cout<next)//查看图书,把所有名为s的图书的信息都{

if(p->book.book_name==s){ p->book.show_book();//显示出图书的基本信息

if(p->book.book_con==0)

打印出来

}

cout<

cout<

} } break;case 1: for(p=headbook;p!=NULL;p=p->next){

if(p->book.book_num==s)

{

p->book.show_book();

if(p->book.book_con==0)

cout<

} } if(NULL==p)cout<

/****************************************(*******************************************/

class Admin//管理员 { public: string adm_name;//帐号

string adm_passw;//密码

public: Admin(){

adm_name=“adm”;

adm_passw=“123”;} };

class LendBook { public: string bookname[3];int count;//借多少本数

time_t lend_time;time_t back_time;LendBook(){count=0;} };

class Stu { public: string stu_name;

};

2)用户管理

string stu_phone;//联系方式

string stu_num;//学号(登录帐号)string password;//密码 float debt;//欠费额

LendBook lendbook;//用户借书信息

public: void show_stu();//把此人所有信息(包括借书)显示出来

void Stu::show_stu(){ cout<<“姓名:”<

class StuNode { public: Stu stu;StuNode *next;};StuNode *headstu=NULL;

void savestu(StuNode *p);//保存读者信息到数据库

void del_sql_stu(StuNode *p);//将读者信息从数据库中删除

class StuManage:public BookManage { private: int totolstu;//用户总数

public: StuManage(){totolstu=0;} void addstu();//增加用户

void delstu(string s,int flag);//删除用户

void findstu(string s,int flag);//查找用户

void lendbook(string ss,string s,int flag);//借书

void backbook(string ss,string s,int flag);//还书

void paydebt(string s);//还款

void mux_stu_book();//查询图书管总的图书量与总的用户量 };

void StuManage::addstu(){ string h;

cout<<“添加输入0,退出输入-1”<>h;if(h==“-1”)return;else if(h==“0”)while(1){

if(h==“-1”)break;else if(h==“0”){

string na,num,p1,pa,pa1,pa2;

StuNode *p=new StuNode;

cout<<“请输入姓名:”<

cin>>na;

p->stu.stu_name=na;

cout<<“请输入联系电话:”<>p1;p->stu.stu_phone=p1;cout<<“请输入ID:”<>num;p->stu.stu_num=num;p->stu.lendbook.lend_time=0;p->stu.lendbook.back_time=0;while(1){

cout<<“请输入六位密码:”<>pa1;cout<<“请确认六位密码:”<>pa2;if(pa1==pa2){ pa=pa2;p->stu.password=pa;break;} else cout<stu.debt=0;p->next=headstu;headstu=p;savestu(p);//保存至数据库

(StuManage::totolstu)++;//用户总数加一

cout<<“继续添加输入0,取消添加输入-1”<>h;

} else cout<

void StuManage::delstu(string s,int flag){ StuNode *p=headstu;if(headstu!=NULL){

switch(flag)

{

case 0:

if(headstu->stu.stu_name==s)//当要删除的用户位于链表的头结点位置 { headstu=p->next;StuManage::totolstu--;del_sql_stu(p);//从数据库中删除

delete p;}

else if(p->next)//非头结点位置 {

for(p=headstu;p->next!=NULL&&p!=NULL;p=p->next){

if(p->next->stu.stu_name==s)

{

p->next=p->next->next;

totolstu--;

del_sql_stu(p->next);//从数据库中删除

//delete p->next;

break;

}

}

if(p->next==NULL)

cout<

break;case 1:

if(headstu->stu.stu_name==s){

headstu=p->next;totolstu--;del_sql_stu(p);//从数据库中删除

delete p;}

else if(p->next){

for(p=headstu;p->next!=NULL&&p!=NULL;p=p->next){

if(p->next->stu.stu_name==s)

{

p->next=p->next->next;

totolstu--;

del_sql_stu(p->next);//从数据库中删除

//delete p->next;

break;

}

}

if(p->next==NULL)

cout<

}

break;

default:

cout<

} } }

void StuManage::findstu(string s,int flag){ StuNode *p;int h=0,m=1;switch(flag){

case 0:

for(p=headstu;p!=NULL;p=p->next)

{

if(p->stu.stu_name==s)

break;

}

if(p==NULL)

cout<

for(p=headstu;p!=NULL;p=p->next)

{

if(p->stu.stu_name==s)h++;} if(h>0)cout<next){ if(p->stu.stu_name==s){

p->stu.show_stu();

if(p->stu.lendbook.count>=3)

{

cout<stu.lendbook.count;if(i>0)

”NONE<

cout<<“所借书的名字为:”<

while(i)

{

cout<<“t(”<stu.lendbook.bookname[i-1]<

}

cout<

}

else

{

int i=p->stu.lendbook.count;

if(i>0)

cout<<“所借书的名字为:”<

while(i)

{

cout<<“t(”<stu.lendbook.bookname[i-1]<

}

} } break;case 1:

}

cout<<“您已借了”<

stu.lendbook.count<<“本书!”<stu.lendbook.count<<“本书!”<

for(p=headstu;p!=NULL;p=p->next)

{

if(p->stu.stu_num==s)

{

p->stu.show_stu();

if(p->stu.lendbook.count>=3)

{

cout<

int i=p->stu.lendbook.count;

cout<<“所借书的名字为:”<

//输出用户所借书的名字 cout<<“t(”<stu.lendbook.bookname[i-1]<

}

cout<

}

else

{

int i=p->stu.lendbook.count;

cout<<“所借书的名字为:”<

while(i)

{ //输出用户所借书的名字

cout<<“t(”<stu.lendbook.bookname[i-1]<

}

cout<<“您已借了”<

stu.lendbook.count<<“本书!”<

cout<<“您还可以借”<<3-p->stu.lendbook.count<<“本书!”NONE<

cout<

}

break;

}

}

if(p==NULL)

cout<

break;

default:

cout<

}

void StuManage::mux_stu_book(){ StuNode *p;BookNode *q;int i=0,j=0,h=0;for(p=headstu;p!=NULL;p=p->next)i++;cout<<“当前图书馆注册用户数为:”<next){

h+=q->book.book_mux;

j+=q->book.book_con;}

} cout<<“当前图书馆库存的总书记数为:”<next){

if(q->stu.stu_num==ss)

{del_sql_stu(q);break;}//丛数据库中删除

} if(q==NULL){cout<

switch(flag){

case 0:

for(p=headbook;p!=NULL;p=p->next)

{

if(p->book.book_name==s)

{

“NONE<

del_sql_book(p);//从数据库中删除 int i=q->stu.lendbook.count;if(i>=3||q->stu.debt>0){ if((i>=3)&&(q->stu.debt==0)){cout<

if((i<3)&&(q->stu.debt>0))

{cout<

if((i>=3)&&(q->stu.debt>0))

{cout<

}

else

{

//记录下所借书的名字存入用户信息中

q->stu.lendbook.bookname[i]=p->book.book_name;

time_t now;

time(&now);

q->stu.lendbook.lend_time=time(&now);//保存借书时间

q->stu.lendbook.count++;//所借书数目加一

p->book.book_con--;//同样的书的个数减一

}

break;

}

}

if(p==NULL)

cout<

break;

case 1:

for(p=headbook;p!=NULL;p=p->next)

{

if(p->book.book_num==s)

{

del_sql_book(p);//从数据库中删除

int i=q->stu.lendbook.count;

if(i>=3||q->stu.debt>0)

{

if((i>=3)&&(q->stu.debt==0))

{cout<

if((i<3)&&(q->stu.debt>0))

{cout<

if((i>=3)&&(q->stu.debt>0))

{cout<

}

else

{

}

q->stu.lendbook.bookname[i]=p->book.book_name;

time_t now;

time(&now);

q->stu.lendbook.lend_time=time(&now);

q->stu.lendbook.count++;

p->book.book_con--;//同样的书的个数减一

}

break;

} } if(p==NULL)

cout<

break;default:

cout<

void StuManage::backbook(string ss,string s,int flag)//还书 { BookNode *p;StuNode *q;for(q=headstu;q!=NULL;q=q->next){

if(q->stu.stu_num==ss)

{del_sql_stu(q);break;}//丛数据库中删除

} if(q==NULL){cout<

switch(flag){

case 0:

for(p=headbook;p!=NULL;p=p->next)

{

if(p->book.book_name==s)

{

del_sql_book(p);//从数据库中删除

time_t now;

time(&now);

q->stu.lendbook.back_time=time(&now);

q->stu.lendbook.count--;

p->book.book_con++;//同样的书的个数加一

time_t s=difftime(q->stu.lendbook.lend_time,q->stu.lendbook.back_time);

if(s>2592000)//2592000为一个月的秒数

{

int t=ceil((s-2592000)/86400);

q->stu.debt=t*0.1;

}

break;} } if(p==NULL)

cout<

break;

case 1:

for(p=headbook;p!=NULL;p=p->next)

{

if(p->book.book_num==s)

{

del_sql_book(p);//从数据库删除

time_t now;

time(&now);

q->stu.lendbook.back_time=time(&now);

q->stu.lendbook.count--;

p->book.book_con++;//同样的书的个数加一

//计算借用图书的时间,超过一个月,开始计费

time_t s=difftime(q->stu.lendbook.lend_time,q->stu.lendbook.back_time);

}

if(s>2592000)//2592000为一个月的秒数

{

int t=ceil((s-2592000)/86400);

q->stu.debt=t*0.1;

}

break;

} } if(p==NULL)cout<

}

void StuManage::paydebt(string s){ StuNode *p;

for(p=headstu;p!=NULL;p=p->next)//查找用户 { if(p->stu.stu_num==s){

p->stu.debt=0;

cout<

stream << result;//将string输入流

stream >> stu_str;//从i中抽取前面插入的string值

return stu_str;}

void savestu(StuNode *p)//保存读者信息到数据库 {

memset((void*)strSQL,0,200);sprintf(strSQL,“insert into reader values(%s,%s,%s,%s,%f,%ld,%ld,%d)”,change_char(p->stu.stu_name),change_char(p->stu.stu_phone),change_char(p->stu.password),change_char(p->stu.stu_num),p->stu.debt,(long)(p->stu.lendbook.lend_time),(long)(p->stu.lendbook.back_time),p->stu.lendbook.count);if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0)

printf(“记录插入失败!n”);}

void savebook(BookNode *p)//保存图书信息到数据库 { memset((void*)strSQL,0,200);sprintf(strSQL,“insert into book values(%s,%s,%s,%s,%d,%d)”,change_char(p->book.book_name),change_char(p->book.book_aut),change_char(p->book.book_pre),change_char(p->book.book_num),p->book.book_mux,p->book.book_con);if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0)

printf(“记录插入失败!n”);

}

void del_sql_stu(StuNode *p)//将读者信息从数据库中删除 {

memset((void*)strSQL,0,200);sprintf(strSQL,“delete from reader where stu_name='%s'”,change_char(p->stu.stu_name));if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0)

printf(“记录删除失败!n”);}

void del_sql_book(BookNode *p)//将图书信息从数据库中删除 { memset((void*)strSQL,0,200);sprintf(strSQL,“delete from book book_name='%s'”,change_char(p->book.book_name));if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0)

printf(“记录删除失败!n”);

} /* void savestu()//保存读者信息文件 { ofstream outfile(“./stu.txt”,ios::out);

if(!outfile){

cerr<<“open error!”<

return;} StuNode *p;

for(p=headstu;p!=NULL;p=p->next)//数据写入文件

{

outfile<

stu.stu_name<<“ ”<

stu.stu_phone;

outfile<<“ ”<

stu.password<<“ ”<

stu.stu_num;

where

outfile<<“ ”<

stu.debt;

outfile<<“ ”<

stu.lendbook.lend_time;

outfile<<“ ”<

stu.lendbook.back_time;

outfile<<“ ”<

stu.lendbook.count;

outfile<<“ ”<

} outfile.close();}

void savebook()//保存图书信息文件 { ofstream outfile(“./book.txt”,ios::out);

if(!outfile){

cerr<<“open error!”<

return;} BookNode *p;

for(p=headbook;p!=NULL;p=p->next)//数据写入文件

{

outfile<

book.book_name<<“ ”<

book.book_num;

outfile<<“ ”<

book.book_pre<<“ ”<

book.book_aut;

outfile<<“ ”<

book.book_mux;

outfile<<“ ”<

book.book_con;

outfile<<“ ”<

void loadstu()//从学生数据数据库reader中读取 { int i = 0;memset((void*)strSQL,0,100);

strcpy(strSQL,“select * from reader”);

mysql_query(&mysql,strSQL);

//查询

results = mysql_store_result(&mysql);

//获取记录

num_fields = mysql_num_fields(results);

//获取字段数

fileds = mysql_fetch_fields(results);

//获取字段数组

while((rows = mysql_fetch_row(results))!= NULL)

//循环显示

{

while(i < num_fields)

{

StuNode *p=new StuNode;

p->stu.stu_name =(rows[i]?rows[i++]:“NULL”);

p->stu.stu_phone =(rows[i]?rows[i++]:“NULL”);

p->stu.password =(rows[i]?rows[i++]:“NULL”);

p->stu.stu_num =(rows[i]?rows[i++]:“NULL”);

p->stu.debt = atof(rows[i]?rows[i++]:“NULL”);

p->stu.lendbook.lend_time =(time_t)(rows[i]?rows[i++]:“NULL”);

p->stu.lendbook.back_time =(time_t)(rows[i]?rows[i++]:“NULL”);

p->stu.lendbook.count = atoi(rows[i]?rows[i++]:“NULL”);

p->next=headstu;//建立用户链表

headstu=p;

}

i = 0;} }

void loadbook()//从书数据库中读取 { int i = 0;memset((void*)strSQL,0,100);

strcpy(strSQL,“select * from book”);

mysql_query(&mysql,strSQL);

//查询

results = mysql_store_result(&mysql);

//获取记录

num_fields = mysql_num_fields(results);

//获取字段数

fileds = mysql_fetch_fields(results);

//获取字段数组

while((rows = mysql_fetch_row(results))!= NULL)

//循环显示

{

while(i < num_fields)

{

BookNode *p=new BookNode;

p->book.book_name =(rows[i]?rows[i++]:“NULL”);

p->book.book_aut =(rows[i]?rows[i++]:“NULL”);

p->book.book_pre =(rows[i]?rows[i++]:“NULL”);

p->book.book_num =(rows[i]?rows[i++]:“NULL”);

p->book.book_mux = atoi(rows[i]?rows[i++]:“NULL”);

p->book.book_con = atoi(rows[i]?rows[i++]:“NULL”);

p->next=headbook;//建立用户链表

headbook=p;

}

i = 0;} }

/* void loadstu()//从学生数据文件读取 { ifstream infile(“./stu.txt”,ios::in);

if(!infile){

cout<

return;} if(infile.eof()){

cout<

infile.close();} else {

while(infile.peek()!=EOF)//数据从文件读出

{

StuNode *p=new StuNode;

infile>>p->stu.stu_name>>p->stu.stu_phone;

infile>>p->stu.password>>p->stu.stu_num;

infile>>p->stu.debt>>p->stu.lendbook.lend_time;

infile>>p->stu.lendbook.back_time>>p->stu.lendbook.count;

if(p->stu.stu_name!=“")

{

p->next=headstu;//建立用户链表

headstu=p;

}

else

delete p;

}

infile.close();} }

void loadbook()//从书数据文件读取 {

ifstream infile(”./book.txt“,ios::in);

if(!infile){

} cout<

while(infile.peek()!=EOF)//数据从文件读出

{

BookNode *p=new BookNode;infile>>p->book.book_name>>p->book.book_num;infile>>p->book.book_pre>>p->book.book_aut;infile>>p->book.book_mux>>p->book.book_con;

if(p->book.book_name!=”“){ p->next=headbook;//建立图书链表

headbook=p;} else delete p;

} } */ } infile.close();/****************************************(*******************************************/

void MenuAdmin(){

4)界面部分 cout<>>>>>>>>>>>>>>>>>>>>>>>>>>>欢迎来到图书管理系统<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<“NONE<

$“NONE<

$“NONE<

$“NONE<

删除书目

$“NONE<

$“NONE<

cout<

借书

$“NONE<

$“NONE<

cout<

还书

$“NONE<

$“NONE<

查询图书

$“NONE<

$“NONE<

$“NONE<

$“NONE<

$“NONE<

$“NONE<

查询用户

$“NONE<

$“NONE<

用户交费

$“NONE<

$“NONE<

$“NONE<

$“NONE<

0 退出

$“NONE<

$“NONE<>>>>>>>>>>>>>>>>>>>>>>>>>[请字)]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<“NONE<

void MenuStu(){

(输

数 cout<>>>>>>>>>>>>>>>>>>>>>>>>>>>欢迎来到图书管理系统<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<“NONE<

cout<

$“NONE<

cout<

借书

$“NONE<

$“NONE<

cout<

还书

$“NONE<

$“NONE<

查询图书

$“NONE<

$“NONE<

个人信息

$“NONE<

$“NONE<

0 退出

$“NONE<

$“NONE<>>>>>>>>>>>>>>>>>>>>>>>>>[请选择(输入相应数字)]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<“NONE<

int getch()//密码不回显函数1 { int c=0;

struct termios org_opts, new_opts;

int res=0;

//-----store old settings-----------

res=tcgetattr(STDIN_FILENO, &org_opts);

assert(res==0);

//----set new terminal parms--------

memcpy(&new_opts, &org_opts, sizeof(new_opts));

new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);

tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);

c=getchar();

//------restore old settings---------

res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);

assert(res==0);

return c;}

string set_passwd()//密码不回显函数2 { string result;char pd[128];int i;getch();/* 当帐号和密码一起输入,且刚输完帐号后就要输入密码时,set_passwd会把帐号结束时的回车赋‘n’拿过来作为自己的第一个输入,这样容易造成密码输入的错 误,为避免

这种情况的发生,所以就可以在for循环之前假如了getch()把‘n’吸收掉 */

for(i=0;;i++)

{

pd[i]=getch();

if(pd[i]=='n')

{

pd[i]='';

break;

}

if(pd[i]==127)

{

printf(”b b“);

i=i-2;

}

else

printf(”*“);

if(i<0)

pd[0]='';

} stringstream stream;stream << pd;//将char输入流

stream >> result;//从stream中抽取前面插入的char值

return result;}

/****************************************(5)主函数部分*******************************************/

int main(){ mysql_init(&mysql);//数据库初始化

if(!mysql_real_connect(&mysql,strHost,strUser,strPasswd,strDb,0,NULL,0))//连接数据库

{

printf(”连接数据库失败!/n“);

return 0;

} loadstu();loadbook();

mysql_free_result(results);//释放数据库结果集

BookManage bookmanage;StuManage stumanage;

Admin admin;int i;string s;int num,flag;string s1,s2,ss;StuNode *p;system(”clear“);//清理屏幕

cout<

~Welecome to come in~“NONE<>i;

switch(i){

case 0:

break;

case 1:

while(1)

{

cout<<”请输入管理员登录名:“<

cin>>s1;

if(s1==”0“)

return 0;

cout<<”请输入密码:“<

s2=set_passwd();

cout<

if(admin.adm_name==s1)

{

while(1)

{

if(admin.adm_passw==s2)

break;

else

{

cout<

s2=set_passwd();cout<

if(s2==”0“)return 0;

//cin>>s2

}

}

}

if(s1!=admin.adm_name)

cout<

else

break;

}

while(1){ MenuAdmin();int t;cin>>t;switch(t){

”<

“<

case 0: //savestu();savebook();

mysql_close(&mysql);//关闭数据库链接

return 0;break;

case 1:bookmanage.addbook();//增加书本

system(”clear“);break;//清理屏幕

case 2:

cout<<”按书名删除请输入 0 “<

cin>>flag;

if(flag==0)

{cout<<“请输入书名:”;cin>>s;}

else if(flag==1)

{cout<<“请输入书编号:”;cin>>s;}

else

cout<

cout<<“请输入要删除书的数目:”<

cin>>num;

bookmanage.delbook(s,num,flag);//删除书本

system(“clear”);//清理屏幕

break;

case 3:

cout<<“按书名借书请输入 0 ”<

cin>>flag;

if(flag==0)

{cout<<”请输入书名:“;cin>>s;}

else if(flag==1)

{cout<<”请输入书编号:“;cin>>s;}

else

cout<

cout<<”请输入借书人的编号:“<

cin>>ss;

stumanage.lendbook(ss,s,flag);

system(”clear“);//清理屏幕

break;

case 4: cout<<”按书名还书请输入 0 “<

cin>>flag;if(flag==0)

{cout<<”请输入书名:“;cin>>s;} else if(flag==1){cout<<”请输入书编号:“;cin>>s;} else

”<

“<

”<

cout<>ss;stumanage.backbook(ss,s,flag);system(“clear”);//清理屏幕

break;case 5: cout<<“按书名查找请输入 0 ”<>flag;if(flag==0){cout<<”请输入书名:“;cin>>s;} else if(flag==1){cout<<”请输入编号:“;cin>>s;}

else cout<

system(”clear“);//清理屏幕

break;case 7: cout<<”按姓名删除请输入 0 “<>flag;

if(flag==0){cout<<“请输入姓名:”;cin>>s;} else if(flag==1){cout<<“请输入学号:”;cin>>s;} else cout<

system(“clear”);//清理屏幕

break;case 8: cout<<“按姓名查找请输入 0 ”<

cin>>flag;

if(flag==0)

{cout<<”请输入姓名:“;cin>>s;} else if(flag==1)

{cout<<”请输入学号:“;cin>>s;} else cout<

break;case 9:

cout<<”请输入要缴费人的学号!“<>s;

stumanage.paydebt(s);system(”clear“);//清理屏幕

break;case 10: stumanage.mux_stu_book();system(”clear“);//清理屏幕

break;default:

cout<

}

}

break;case 2: while(1){

cout<<”请输入用户登录名[用户编号]:“<

cin>>s1;

if(s1==”0“){return 0;}

cout<<”请输入密码:“<next){ if(p->stu.stu_name==s1){

while(1)

{

if(p->stu.password==s2)

break;

else

0”NONE<

{

if(s2==“0”)return 0;

cout<

”<

“<

s2=set_passwd();

cout<

//cin>>s2

}

}

break;

} } if(p==NULL)cout<

break;}

while(1){ MenuStu();int t;cin>>t;switch(t){

case 0: //savestu();savebook();

mysql_close(&mysql);//关闭数据库链接

return 0;break;

case 1:

cout<<”按书名借书请输入 0 “<

cin>>flag;

if(flag==0)

{cout<<“请输入书名:”;cin>>s;}

else if(flag==1)

{cout<<“请输入书编号:”;cin>>s;}

else

cout<

stumanage.lendbook(s1,s,flag);

system(“clear”);//清理屏幕

break;

case 2: cout<<“按书名还书请输入 0 ”<

cin>>flag;if(flag==0)

{cout<<”请输入书名:“;cin>>s;} else if(flag==1)

{cout<<”请输入书编号:“;cin>>s;} else

cout<

”<

}

system(“clear”);//清理屏幕

break;case 3: cout<<“按书名查找请输入 0 ”<

cin>>flag;if(flag==0)

{cout<<”请输入书名:“;cin>>s;} else if(flag==1)

} {cout<<”请输入编号:“;cin>>s;} else cout<

break;

case 4: stumanage.findstu(s1,1);system(”clear“);//清理屏幕

break;

default: cout<

} break;default: cout<<”输入数字无效!"<

第四篇:用VB编写一个简单的图书管理系统分解

用VB编写一个简单的图书管理系统

Srl2011009(学号)石二辽(姓名)

指导教师 徐哲鑫

【摘 要】笔者采用Visual Basic 6.0 为开发工具,设计一款具备友好的图形用户界面、简便操作的图书管理系统。充分利用计算机功能实现读者管理、书籍管理、借还书籍管理等信息的自动化控制,将使图书管理员从繁杂、重复的劳作中解放出来。

【关键词】图书;面向对象;软件工程

1概述

1.1开发背景

用计算机管理图书馆里一切信息是一种计算机应用技术的创新,在计算机还未普及之前图书管理都是由图书管理人员手工记帐的方式来操作的.现在一般的图书馆都是采用计算机作为工具,使用实用的图书管理程序来帮助图书馆管理员进行更有效的图书管理。

1.2图书管理系统产生的背景

图书管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于台数据库的建立和维护要求建立起数据一致性和完整性强、数据安全性好的库。

[1]而对于前端应用程序则要求应用程序具备功能完备、友好的图形用户界面、便捷使用等特点。

1.3 系统功能要求的分析

开发本系统的总体任务是实现图书管理系统的系统化和自动化,帮助图书管理员更好更高效地完成图书管理工作,本系统要完成的功能主要有: 书籍管理部分:图书类别管理和图书信息管理。其中,书籍类别管理包括添加书籍类别、修改书籍类别、删除书籍类别等;书籍信息管理包括书籍信息的添加、修改、查询、删除等。

读者管理部分:读者类别管理和读者信息管理,读者类别管理包括读者类别添加、修改、删除等;读者信息包括读者添加读者信息、修改读者信息、查询读者信息、删除读者信息等。

借阅管理部分:借书信息管理和还书信息管理,借书信息管理、还书信息管理均包括其信息的添加、修改、查询等。

系统管理部分:添加管理员,修改密码,退出系统。

2开发环境及实现技术介绍

2.1开发软件介绍

由于我的工作单位是一所中心小学,有大量的书籍,读者有学生、老师,于是本人想设计一款实用的图书管理系统,方便学校图书管理员工作,增强图书借阅力度,良好地管理书籍及其借阅信息。

2.2模块设计[2]

书籍管理部分实现对书籍类别、书籍信息的添加、修改、删除等操作。读者管理部分实现对读者类别、读者信息的添加、修改、删除等操作。借阅管理部分实现对借书信息、还书信息的添加、修改、查询等操作。

系统管理部分实现超级用户对普通用户的用户名和密码对注册、修改等操作。

2.3程序预览

运行本系统程序,首先出现登录界面(图2),输入正确用户名及密码后进入主窗体(图3),主窗体上的主菜单栏有:书籍管理、读者管理、借阅管理、系统设置及帮助。

图2

图3

2.3.1书籍管理功能

“书籍管理”菜单下有两个一级菜单:“书籍信息管理”和“书籍类别管理”。具体操作如下: 1.“书籍类别管理”下有三个子菜单:“新增”、“修改”、“删除”。单击“新增”菜单,打开“新增书籍类别”窗体(图4)。单击“修改”或“删除”,都会打开“书籍类别信息管理”窗体(图5)。

图4 图5 2.“书籍信息管理”下有四个子菜单:“新增图书”、“修改书籍信息”、“删除书籍信息”、“查询书籍信息”。单击“新增图书”菜单,打开“新增书籍”窗体(图6)。单击“修改”或“删除”,都会打开“书籍信息管理”窗体(图7)。单击“查询书籍信息”菜单,打开“查询图书”窗体(图8)

图6

图7

图8 2.3.2读者管理功能

“读者管理”菜单下有两个一级菜单:“读者类别管理”和“读者信息管理”。1.“读者类别管理”下有3个子菜单:“添加读者类别”、“修改读者类别”、“删除读者类别”。单击“添加读者类别”菜单,打开“添加读者类别”窗体(图9);单击“修改读者类别”和“删除读者类别”菜单,都会打开“读者类别管理”窗体(图10)。

图9 图10

2.“读者信息管理”菜单下有4个子菜单:“添加读者信息”、“修改读者信息”、“删除读者信息”和“查询读者信息”。单击“添加读者信息”菜单,打开“添加读者信息”窗体(图11),单击“修改读者信息”和“删除读者信息”菜单,都会打开“读者信息管理”窗体(图12),单击“查询读者信息”菜单,打开“查询读者信息”窗体(图13)。

图11

图12 图13

2.3.3图书借阅管理功能

“借阅管理”菜单下有2个一级菜单:“借书管理”和“还书管理”。

1.“借书管理”菜单下有2个子菜单:“添加借书信息”和“查询借书信息”。单击“添加借书信息”先打开的是“查询图书”窗体(图8),找到需要借阅的图书后,单击“借这本书按钮”,打开“借书”窗体(图14);单击“查询借书信息”菜单,打开“查询借书信息”窗体(图15)。

图14 图15

2.单击“还书管理”,打开“还书”窗体(图16)。

图16 2.3.4系统管理功能

“系统管理”菜单下有3个子菜单,分别是“添加管理员”、“修改密钥”和“退出系统”。单击“添加管理员”子菜单,打开“添加管理员”窗体(图17),单击“修改密钥”子菜单,打开“修改密码”窗体(图18),单击“退出系统”,备份数据并退出本系统。

图17 图18

2.3.5帮助菜单

单击“帮助”菜单,打开系统信息窗体(图1),点击系统信息窗体任何一处,关闭该信息窗体,返回主窗体。

图1 2.4数据库设计

数据库名为sj.mdb,在库中设计六张表,它们分别为dzlb(读者类别表)、dzxx(读者信息表)、jyxx(借阅信息表)、sjxx(书籍信息表)、sjlb(书籍类别表)、sys(系统管理表)。

2.4.1读者类别表,表名为dzlb,字段名称有读者类别名称、读者借书数量、借书期限及有限期限,设置“读者类别名称”为主键,是必填字段,不允许空值。

2.4.2读者信息表: 设置“读者编号”为主键,“读者编号”、“读者姓名”为必填字段,不允许空值。

2.4.3 借阅信息表:

2.4.4书籍信息表: 设置“图书编号”为主键,“图书编号”、“书籍名称”为必填字段,不允许空值。

2.4.5图书类别表:

2.4.6系统管理表:

2.4.7数据库连接方式选择

Visual basic6.0连接数据库的主要方式有以下几种方式:一是用data控件进行数据库链接,二是利用adodc(ADO Data Control)进行数据库链接。三是:利用DataEnvironment进行数据库链接,四是利用ADO(ActiveX Data Objects)进行编程。

[3]利用DAO对数据库进行操纵: 在visual basic 中提供了两种与jet数据引擎接口的方法:data控件与数据访问对象(DAO)DAO是database object的英文缩写,要访问数据库一方面数据库要提供访问接口,另一方面要在编程环境中有对数据库的支持.DAO模型是设计关系数据库系统结构的对象类的集合.他们提供了管理关系型数据库系统所需要的全部操作属性和方法,这其中包括建立数据库,定义表,字段和建立表间关系,定位和查询数据库等.[4] 关系数据库介绍: 关系数据库是目前各类数据库中最重要、最流行的数据库,他应用数学方法来处理数据库数据,是目前使用最广泛的数据库系统。20世纪70年代以后开发的数据库管理系统产品几乎都是基于关系的。在数据库发展的历史上,最重要的成就就是关系模型。

关系数据库系统与非关系数据库系统的区别是:关系系统只有“表“这一种数据结构;而非关系数据库系统还有其他数据结构,对这些数据结构有其他的操作。

结构化查询语言SQL(Structured Query Language)是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的、功能极强的关系数据库语言。目前已成为关系数据库的标准语言。

Microsoft Access介绍: 使用 Microsoft Access,可以在单一的数据库文件中管理所有的信息。在这个文件中,用户可以将自己的数据分别保存在各自独立的存储空间中,这些空间称作表;可以使用联机窗体来查看、添加及更新表中的数据;使用查询来查找并检索所要的数据;也可以使用报表以特定的版面布置来分析及打印数据。

如果要保存数据,请为每一种类型的信息创建一个表。如果要从查询、窗体或报表中的多个表中将数据合并在一起,就要定义各个表之间的关系。

如果要搜索并检索符合指定条件的数据,包括来自多个表中的数据,就要创建查询。查询的同时也可以更新或删除多条记录,并对数据执行内嵌或自定义的计算。

如果要简单地直接在某个表中查看、输入及更改数据,请创建一个窗体。在打开一个窗体时,Microsoft Access 将从一个或多个表中检索数据,并使用用户在“窗体向导”选择的版面布局或所创建的版面布局,将窗体显示在屏幕上。

如果要分析数据或将数据以特定的方式打印出来,请创建一个报表。例如,可以打印一份将数据分组并计算数据总和的报表,也可以打印另一份带有各种数据格式的打印邮件标签的报表。

2.5系统代码[5]

2.5.1主界面代码: 2.5.1.1添加管理员菜单

Private Sub addadmin_Click()addadminf.Show End Sub 2.5.1.2添加读者类别菜单 Private Sub adddzlb_Click()Adddzlbf.Show End Sub 2.5.1.3添加读者信息菜单

Private Sub adddzxxf_Click()Adddzxxf.Show End Sub 2.5.1.4添加还书信息菜单 Private Sub addhs_Click()hsf.Show End Sub 2.5.1.5添加借书信息菜单 Private Sub addjs_Click()Jsf.Show End Sub 2.5.1.6添加图书类别菜单 Private Sub addlb_Click()addtslb.Show End Sub 2.5.1.7查询读者信息菜单 Private Sub cxdzxx_Click()cxdzxxf.Show End Sub 2.5.1.8查询借书信息菜单 Private Sub cxjs_Click()cxjsxxf.Show End Sub 2.5.1.9查询书籍信息菜单 Private Sub cxsj_Click()cxsjf.Show End Sub 2.5.1.10删除读者类别菜单 Private Sub Deldzlb_Click()dzlbxxf.Show End Sub 2.5.1.11删除读者信息菜单 Private Sub Deldzxx_Click()dzxxglf.Show End Sub 2.5.1.12删除书籍类别菜单 Private Sub dellb_Click()sjlbxxf.Show End Sub 2.5.1.13帮助菜单

Private Sub hlep_Click()frmSplash.Show End Sub 2.5.1.14退出系统菜单

Private Sub Unload_Click()end End Sub 2.5.1.15修改读者类别菜单 Private Sub Xgdzlb_Click()dzlbxxf.Show End Sub 2.5.1.16修改读者信息菜单 Private Sub xgdzxx_Click()dzxxglf.Show End Sub 2.5.1.17修改书籍类别菜单 Private Sub xglb_Click()sjlbxxf.Show End Sub 2.5.1.18修改用户密码菜单 Private Sub xgmm_Click()xgmmf.Show End Sub 2.5.1.19修改书籍信息菜单 Private Sub xgts_Click()sjxxf.Show End Sub 2.5.1.20新增图书信息菜单 Private Sub xzts_Click()addtsf.Show End Sub 2.5.2添加图书类别

添加图书类别代码: Private Sub Command1_Click()Dim Sq1 As String Dim rs_add As New ADODB.Recordset Sql = “select * from sjlb where 类别名称='” & Text1.Text & “'” rs_add.Open Sql, Sjk, adOpenKeyset, adLockPessimistic If Trim(Text1.Text)= “" Then MsgBox ”图书类别不能为空“, vbOKOnly + vbExclamation, ”注意“ Text1.SetFocus Exit Sub End If If Trim(Text2.Text)= ”“ Then MsgBox ”图书编号不能为空“, vbOKOnly + vbExclamation, ”注意“ Text2.SetFocus Exit Sub End If

If rs_add.EOF = True Then rs_add.AddNew rs_add.Fields(0)= Trim(Text2.Text)rs_add.Fields(1)= Trim(Text1.Text)rs_add.Update MsgBox ”成功地添加 “ & Text1.Text & ” 这一图书类别“, vbOKOnly, ”恭喜“ rs_add.Close Else MsgBox ” “ & Text1.Text & ” 这一图书类别已存在“, vbOKOnly + vbExclamation, ”图书类别不能重复“ rs_add.Close End If Text1.SetFocus Text1.Text = ”“ Text2.Text = ”“ End Sub Private Sub Command2_Click()Unload Me End Sub 2.5.3修改图书类别: 修改图书类别代码: Option Explicit Dim Myjl As New ADODB.Recordset Private Sub Form_Load()Dim Sq1 As String On Error GoTo loaderror Sq1 = ”select * from sjlb “ Myjl.CursorLocation = adUseClient Myjl.Open Sq1, Sjk, adOpenKeyset, adLockPessimistic Cmdcancel.Enabled = False Cmdupdate.Enabled = False Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False Set Dg.DataSource = Myjl Exit Sub loaderror: MsgBox Err.Description End Sub Private Sub Cmdadd_Click()Dg.AllowAddNew = True Dg.AllowUpdate = True Cmdadd.Enabled = False Cmdupdate.Enabled = True End Sub Private Sub Cmdadd_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Cmdadd.Caption = ”点击此处也可以添加“ Cmdadd.Width = 3000 End Sub Private Sub Cmdcancel_Click()Myjl.CancelUpdate Dg.Refresh Dg.AllowAddNew = False Dg.AllowUpdate = False Cmdxg.Enabled = True Cmddel.Enabled = True Cmdcancel.Enabled = False Cmdupdate.Enabled = False End Sub

Private Sub Cmddel_Click()Dim Srl As String On Error GoTo delerror Srl = MsgBox(”确定要删除吗?“, vbYesNo)If Srl = vbYes Then Dg.AllowDelete = True Myjl.Delete Myjl.Update Dg.Refresh Else Exit Sub End If delerror: MsgBox Err.Description End Sub Private Sub Cmdupdate_Click()If Not IsNull(Dg.Bookmark)Then Myjl.Update Cmddel.Enabled = True Cmdxg.Enabled = True Cmdcancel.Enabled = False Cmdupdate.Enabled = False Dg.AllowUpdate = False MsgBox ”修改成功“, vbOKOnly + vbExclamation, ”恭喜成功“ End If Cmdadd.Width = 1550 Cmdadd.Caption = ”高级“ Cmdadd.Enabled = True End Sub Private Sub Cmdxg_Click()Dim Srl As String On Error GoTo xg Cmddel.Enabled = False Cmdxg.Enabled = False Cmdupdate.Enabled = True Cmdcancel.Enabled = True Dg.AllowUpdate = True xg: If Err.Number <> 0 Then MsgBox Err.Description End If End Sub Private Sub Form_Unload(Cancel As Integer)Set Dg.DataSource = Nothing Myjl.Close End Sub 2.5.4添加读者类别界面: Private Sub Command1_Click()Dim Srl As String Dim Mybook As New ADODB.Recordset If Trim(Text1.Text)= ”“ Then MsgBox ”读者类别名称不能为空“, vbOKOnly + vbExclamation, ”注意“ Text1.SetFocus Exit Sub End If If Trim(Text2.Text)= ”“ Then MsgBox ”借书数量不能为空“, vbOKOnly + vbExclamation, ”注意“ Text2.SetFocus Exit Sub End If If Trim(Text3.Text)= ”“ Then MsgBox ”借书期限不能为空“, vbOKOnly + vbExclamation, ”注意“ Text3.SetFocus Exit Sub End If If Trim(Text4.Text)= ”“ Then MsgBox ”有效期限不能为空“, vbOKOnly + vbExclamation, ”注意“ Text4.SetFocus Exit Sub End If On Error GoTo Cw Srl = ”select * from dzlb where 读者类别名称='“ & Text1.Text & ”'“ Mybook.Open Srl, Sjk, adOpenKeyset, adLockPessimistic If Mybook.EOF Then Mybook.AddNew Mybook.Fields(0)= Trim(Text1.Text)Mybook.Fields(1)= Trim(Text2.Text)Mybook.Fields(2)= Trim(Text3.Text)Mybook.Fields(3)= Trim(Text4.Text)Mybook.Update MsgBox ” 您已经成功添加“ & Text1.Text & ”这一读者类别 “, vbOKOnly + vbExclamation, ”添加成功!“ Mybook.Close Else MsgBox ”读者类别名称为“ & Text1.Text & ” 重复“, vbOKOnly + vbExclamation, ”注意重复“ Text1.SetFocus Text1.Text = ”“ Mybook.Close Exit Sub End If Cw: MsgBox Err.Description End Sub Private Sub Command2_Click()Unload Me

End Sub

Private Sub Form_Load()Dim Sq1 As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量 End Sub

2.5.5查询读者信息代码: Private Sub Form_Load()Dim Sq1 As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量 Sq1 = ”select * from dzlb“ Myjl.Open Sq1, Sjk, adOpenKeyset, adLockPessimistic Do While Not Myjl.EOF Combo1.AddItem Myjl.Fields(0)Myjl.MoveNext Loop Combo1.ListIndex = 0 Myjl.Close End Sub

Private Sub Command1_Click()Dim Srl As String '定义一个字符串变量 Dim Mybook As New ADODB.Recordset '定义一个Recordset对象变量 If Check1.Value = vbChecked Then Srl = ”读者编号='“ & Trim(Text1.Text & ”“)& ”'“ End If

If Check2.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”读者姓名='“ & Trim(Text2.Text & ”“)& ”'“ Else Srl = Srl & ”and 读者编号='“ & Trim(Text2.Text & ”“)& ”'“ End If End If

If Check3.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”读者类别='“ & Trim(Combo1.Text & ”“)& ”'“ Else Srl = Srl & ”and 读者类别='“ & Trim(Combo1.Text & ”“)& ”'“ End If End If

If Srl = ”“ Then MsgBox ”请选择一种查询依据“, vbOKOnly + vbExclamation, ”查询方式“ Exit Sub End If

Srl = ”select * from dzxx where “ & Srl Mybook.CursorLocation = adUseClient Mybook.Open Srl, Sjk, adOpenKeyset, adLockPessimistic Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False Set Dg.DataSource = Mybook End Sub

Private Sub Command2_Click()Unload Me End Sub

2.5.6图书借阅管理模块代码: 2.5.6.1查询书籍窗体代码

Private Sub Form_Load()’窗体加载时就书籍类别加载到列表框中。Dim Sq1 As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量 Sq1 = ”select * from sjlb“ Myjl.Open Sq1, Sjk, adOpenKeyset, adLockPessimistic Do While Not Myjl.EOF Combo1.AddItem Myjl.Fields(1)Myjl.MoveNext Loop Combo1.ListIndex = 0 Myjl.Close End Sub

Private Sub Command1_Click()’查询命令按钮代码 Dim Srl As String '定义一个字符串变量

Dim Mybook As New ADODB.Recordset '定义一个Recordset对象变量

If Check1.Value = vbChecked Then Srl = ”书籍名称='“ & Trim(Text1.Text & ”“)& ”'“ End If

If Check2.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”图书编号='“ & Trim(Text2.Text & ”“)& ”'“ Else Srl = Srl & ”and 图书编号='“ & Trim(Text2.Text & ”“)& ”'“ End If End If If Check3.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”作者='“ & Trim(Text3.Text & ”“)& ”'“ Else Srl = Srl & ”and 作者='“ & Trim(Text3.Text & ”“)& ”'“ End If End If

If Check4.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”出版社='“ & Trim(Text4.Text & ”“)& ”'“ Else Srl = Srl & ”and 出版社='“ & Trim(Text4.Text & ”“)& ”'“ End If End If

If Check5.Value = vbChecked Then If Trim(Srl)= ”“ Then Srl = ”类别='“ & Trim(Combo1.Text & ”“)& ”'“ Else Srl = Srl & ”and 类别='“ & Trim(Combo1.Text & ”“)& ”'“ End If End If

If Srl = ”“ Then MsgBox ”请选择一种查询依据“, vbOKOnly + vbExclamation, ”查询方式“ Exit Sub End If

Srl = ”select * from sjxx where “ & Srl Mybook.CursorLocation = adUseClient Mybook.Open Srl, Sjk, adOpenKeyset, adLockPessimistic Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False Set Dg.DataSource = Mybook End Sub

为了获取表格某一单元格值,为DataGrid控件DG添加如下代码:

Private Sub Dg_RowColChange(LastRow As Variant, ByVal LastCol As Integer)On Error GoTo Cw Pand = Dg.Columns(7).CellValue(Dg.Bookmark)Bookunm = Dg.Columns(0).CellValue(Dg.Bookmark)’ Pand 和Bookunm是公共模块中定义的一个公共变量,Bookunm用来记录表格中某一书籍的图书编号,便于在借书窗体中再次调用。Exit Sub Cw: MsgBox Err.Description End Sub

Private Sub Command2_Click()Unload Me End Sub

Private Sub Command3_Click()’这是“借这本书”命令按钮,如果条件满足,就进入借书窗体了。If Trim(Bookunm)= ”“ Then MsgBox ”请选择要借阅的书籍“, vbOKOnly + vbExclamation, ”选择书籍“ Exit Sub End If If Trim(Pand)= ”是“ Then MsgBox ”此书已经被借出,请选择其它书籍“, vbOKOnly + vbExclamation, ”选择书籍“ Exit Sub End If Unload Me Jsf.Show End Sub

2.5.6.2借书窗体代码 Option Explicit Dim Lb As String '该读者类别

Dim Qx As String '该读者可借书的期限 Dim Yjsl As String '该读者已借书的数量 Dim Maxm As String '该读者借书量的限制

‘由在查询书籍的窗体满足了可以借书的条件进入此借书窗体,根据此书的图书编号,在本窗体加载时就加载了书籍的信息和读者列表。Private Sub Form_Load()Dim Mybook As New ADODB.Recordset Dim Mydz As New ADODB.Recordset Dim Srl As String Dim Sql As String Srl = ”select * from sjxx where 图书编号='“ & Bookunm & ”'“ Mybook.Open Srl, Sjk, adOpenKeyset, adLockPessimistic Label8.Caption = Mybook.Fields(0)Label9.Caption = Mybook.Fields(1)Label10.Caption = Mybook.Fields(2)Label11.Caption = Mybook.Fields(3)Label12.Caption = Mybook.Fields(4)Label13.Caption = Mybook.Fields(5)Label14.Caption = Mybook.Fields(6)Sql = ”select * from dzxx “ Mydz.Open Sql, Sjk, adOpenKeyset, adLockPessimistic If Not Mydz.EOF Then Do While Not Mydz.EOF Combo1.AddItem Mydz.Fields(0)Combo2.AddItem Mydz.Fields(1)Mydz.MoveNext Loop Combo1.ListIndex = 0 Else MsgBox ”请先登记读者“, vbOKOnly + vbExclamation, ”注意“ Exit Sub End If

Mybook.Close Mydz.Close

End Sub ‘由于读者编号与读者姓名是一一对应的,必须对用来加载这两个信息的两个列表框编写如下代码: Private Sub Combo1_Click()Combo2.ListIndex = Combo1.ListIndex End Sub Private Sub Combo2_Click()Combo1.ListIndex = Combo2.ListIndex End Sub

Private Sub Command1_Click()’这是借书的“确定”按钮 Dim Myjl As New ADODB.Recordset Dim Sql As String

Sql = ”select * from dzxx where 读者编号='“ & Combo1.Text & ”'“ Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Lb = Myjl.Fields(3)Yjsl = Myjl.Fields(8)Myjl.Close

Sql = ”select * from dzlb where 读者类别名称='“ & Lb & ”'“ Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Qx = Myjl.Fields(2)Maxm = Myjl.Fields(1)Myjl.Close

If Yjsl >= Maxm Then MsgBox ”该读者借书数额已满!“, vbOKOnly + vbExclamation Exit Sub End If

‘以上条件满足了,就将新借书信息添加到借阅信息数据库中,代码如下: Sql = ”select * from jyxx“ Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Myjl.AddNew Myjl.Fields(1)= Combo1.Text Myjl.Fields(2)= Combo2.Text Myjl.Fields(3)= Label8.Caption Myjl.Fields(4)= Label9.Caption Myjl.Fields(5)= Date Myjl.Fields(6)= DateAdd(”Ww“, Qx, Date)Myjl.Update Myjl.Close ‘同时,将此书在书籍信息(sjxx)表中的“是否被借出”设置为“是”。Sql = ”select * from sjxx where 图书编号='“ & Bookunm & ”'“ Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Myjl.Fields(7)= ”是“ Myjl.Update Myjl.Close

‘同时将该读者已借书数量上加1。

Sql = ”select * from dzxx where 读者编号='“ & Combo1.Text & ”'“ Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Myjl.Fields(8)= Myjl.Fields(8)+ 1 Myjl.Update Myjl.Close

MsgBox ”《“ & Label9.Caption & ”》 这本书成功地借给了读者姓名为 “ & Combo2.Text & ” 的读者!“, vbOKOnly + vbExclamation, ”借阅成功“ Unload Me End Sub

Private Sub Command2_Click()Unload Me End Sub

2.5.6.3查询借书窗体代码

Private Sub Command1_Click()Dim Sql As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量

If Option1.Value = True Then Sql = ”select * from sjxx where 是否被借出='是'“ End If

If Option2.Value = True Then Sql = ”select * from sjxx where 是否被借出='否'“ End If

If Option3.Value = True Then Sql = ”select * from jyxx where 读者姓名='“ & dzxm.Text & ”'“ End If

Myjl.CursorLocation = adUseClient Myjl.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False Set Dg.DataSource = Myjl End Sub

Private Sub Command2_Click()Unload Me

End Sub

Private Sub Option3_Click()dzxm.Visible = True End Sub

2.5.6.4还书窗体代码 Private Sub Form_Load()Dim mybook As New ADODB.Recordset Dim Mydz As New ADODB.Recordset Dim Srl As String Dim Sql As String Sql = ”select * from dzxx “ Mydz.Open Sql, Sjk, adOpenKeyset, adLockPessimistic If Not Mydz.EOF Then Do While Not Mydz.EOF Combo1.AddItem Mydz.Fields(0)Combo2.AddItem Mydz.Fields(1)Mydz.MoveNext Loop End If Mydz.Close Sql = ”select * from jyxx “ mybook.Open Sql, Sjk, adOpenKeyset, adLockPessimistic If Not mybook.EOF Then Do While Not mybook.EOF Combo3.AddItem mybook.Fields(3)Combo4.AddItem mybook.Fields(4)mybook.MoveNext Loop End If mybook.Close End Sub

Private Sub Combo1_Click()Combo2.ListIndex = Combo1.ListIndex End Sub Private Sub Combo2_Click()Combo1.ListIndex = Combo2.ListIndex End Sub

Private Sub Combo3_Click()Combo4.ListIndex = Combo3.ListIndex End Sub Private Sub Combo4_Click()Combo3.ListIndex = Combo4.ListIndex End Sub

Private Sub Command1_Click()Dim Mydz As New ADODB.Recordset Dim Sql As String findform = True Sql = ”select * from jyxx where 读者姓名='“ & Combo2.Text & ”' “ Mydz.CursorLocation = adUseClient Mydz.Open Sql, Sjk, adOpenKeyset, adLockPessimistic

Set Dg.DataSource = Mydz Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False End Sub

Private Sub Command2_Click()Dim mybook As New ADODB.Recordset Dim Sql As String findform = False Sql = ”select * from jyxx where 书籍编号='“ & Combo3.Text & ”' “ mybook.CursorLocation = adUseClient mybook.Open Sql, Sjk, adOpenKeyset, adLockPessimistic Set Dg.DataSource = mybook Dg.AllowAddNew = False Dg.AllowDelete = False Dg.AllowUpdate = False End Sub

Private Sub Command3_Click()Dim Book As String Dim Dz As String Dim Sql As String Dim W As String Dim mybook As New ADODB.Recordset On Error GoTo Cw Book = Dg.Columns(3).CellValue(Dg.Bookmark)Dz = Dg.Columns(1).CellValue(Dg.Bookmark)W = MsgBox(”确定要还这本书吗?“, vbYesNo, ”“)If W = vbYes Then Sql = ”select * from jyxx where 书籍编号='“ & Book & ”' “ mybook.CursorLocation = adUseClient mybook.Open Sql, Sjk, adOpenKeyset, adLockPessimistic mybook.Delete mybook.Update mybook.Close

Sql = ”select * from sjxx where 图书编号='“ & Book & ”'“ mybook.CursorLocation = adUseClient mybook.Open Sql, Sjk, adOpenKeyset, adLockPessimistic mybook.Fields(7)= ”否“ mybook.Update mybook.Close Sql = ”select * from dzxx where 读者编号='“ & Dz & ”' “ mybook.CursorLocation = adUseClient mybook.Open Sql, Sjk, adOpenKeyset, adLockPessimistic mybook.Fields(8)= mybook.Fields(8)-1 mybook.Update mybook.Close

If findform = True Then Command1_Click Else Command2_Click End If MsgBox ”还书成功!“, vbOKOnly + vbExclamation, ”“ Dg.AllowDelete = False Else Exit Sub End If Cw: MsgBox Err.Description End Sub

Private Sub Command4_Click()Unload Me End Sub

2.5.7系统管理

2.5.7.1登录界面代码 Option Explicit Dim cnt As Integer’用来记录点击“确定”的次数

Private Sub Form_Load()’

Dim ConnectionString As String ConnectionString = ”provider=Microsoft.Jet.oledb.4.0;data source=sj.mdb“ Sjk.Open ConnectionString’ Sjk是公用模块中定义的一个公共变量。cnt = 0 End Sub

Private Sub Cmdcancel_Click()End End Sub

Private Sub cmdOK_Click()Dim Sql As String Dim rs_add As New ADODB.Recordset If Trim(Text1.Text)= ”“ Then MsgBox ”用户名不能为空“, vbOKOnly + vbExclamation, ”注意“ Exit Sub Text1.SetFocus Else Sql = ”select * from sys where Uname='“ & Text1.Text & ”'“ rs_add.Open Sql, Sjk, adOpenKeyset, adLockPessimistic If rs_add.EOF = True Then MsgBox ”没 “ & Text1.Text & ” 有这个用户“, vbOKOnly + vbExclamation, ”“ Text1.SetFocus Else If Trim(rs_add.Fields(1))= Trim(Text2.Text)Then 'Unema = Text1.Text 'Uid = rs_add.Fields(2)rs_add.Close Mf.Show Unload Me Else

MsgBox ”密码不正确“, vbOKOnly + vbExclamation, ”注意“ Text2.SetFocus Text2.Text = ”“ End If End If End If cnt = cnt + 1 If cnt = 3 Then Unload Me

End If End Sub

Private Sub cmdOK_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)cmdOK.Caption = ”确定登录“ ‘只为增强动画效果,移动鼠标到cmdok按钮上时,显示的文字由原来的“确定”变为“确定登录” End Sub

2.5.7.2添加用户界面代码 Private Sub Form_Load()Dim Sjk As ADODB.Connection Dim Sj As ADODB.Recordset Combo1.AddItem ”管理员“ Combo1.AddItem ”来宾用户“ Set Sjk = New ADODB.Connection Set Sj = New ADODB.Recordset Sjk.ConnectionString = ”DSN=cn;UID=;PWD=;“ Sjk.ConnectionTimeout = 30 Sjk.Open If Sjk.State = adStateOpen Then _ MsgBox ”数据库加载成功,欢迎进入“添加管理员”界面!“ Sjk.Close End Sub

Private Sub Command1_Click()Dim Sq1 As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量 If Trim(Text1.Text)= ”“ Then '首先检查用户名是否为空 MsgBox ”用户名不能空“, vbOKOnly + vbExclamation, ”注意!“ Text1.SetFocus Exit Sub Else Sq1 = ”select * from sys“ Myjl.Open Sq1, Sjk, adOpenKeyset, adLockPessimistic While(Myjl.EOF = False)If Trim(Myjl.Fields(0))= Trim(Text1.Text)Then MsgBox ” “ & Text1.Text & ” 这个用户名已存在“, vbOKOnly + vbExclamation, ”注意!“ Text1.SetFocus Text1.Text = ”“ Text2.Text = ”“ Text3.Text = ”“ Combo1.Text = ”“ Exit Sub Else Myjl.MoveNext End If Wend If Trim(Text2.Text)<> Trim(Text3.Text)Then MsgBox ”两次输入的密码不一致,请重新设置 “, vbOKOnly + vbExclamation, ”注意!“ Text2.SetFocus Text2.Text = ”“ Text3.Text = ”“ Exit Sub Else Myjl.AddNew Myjl.Fields(0)= Text1.Text Myjl.Fields(1)= Text2.Text Myjl.Update Myjl.Close MsgBox ” 您已经成功添加“ & Text1.Text & ” 这个用户“, vbOKOnly + vbExclamation, ”注册成功!“ End If End If End Sub

Private Sub Command2_Click()Unload Me End Sub

2.5.7.3修改用户界面密码代码 Private Sub Command1_Click()Dim Sq1 As String '定义一个字符串变量

Dim Myjl As New ADODB.Recordset '定义一个Recordset对象变量

If Trim(Text1.Text)<> Trim(Text2.Text)Then MsgBox ”两次输入的密码不一致,请重新设置 “, vbOKOnly + vbExclamation, ”注意!“ Text1.SetFocus Text1.Text = ”“ Text2.Text = ”“ Exit Sub Else Sq1 = ”select * from sys where Uname='“ & Text3.Text & ”'“ Myjl.Open Sq1, Sjk, adOpenKeyset, adLockPessimistic If Myjl.EOF = True Then MsgBox ”没有“ & Text3.Text & ” 这个用户“, vbOKOnly + vbExclamation, ”“ Text3.SetFocus Else Myjl.Fields(1)= Text1.Text Myjl.Update Myjl.Close MsgBox ” 密码修改成功“, vbOKOnly + vbExclamation, ”成功!" Unload Me End If End If End Sub

Private Sub Command2_Click()Unload Me End Sub

后记:经过指导教师徐哲鑫老师的指点,本人已经竭尽全力对本系统进行具体设计,现已趋向完善,在此感谢老师的教导。

参考文献

[1] 谭浩强,薛淑斌,袁玫.Visual Basic程序设计.北京清华大学学研大厦:北京清华大学出版社.2004 [2] 林陈雷,郭安源,葛晓东.Visual Basic教育信息系统开发实例导航.人民邮电出版社.2006 [3] 张小勤.一种改进的数据库连接的设计与实现[J].电脑知识与技术(学术交流).2006年05期 [4] 田君.数字图书馆管理平台系统的研究[D].天津工业大学.2004年

[5] 陈志泊.数据库系统原理与应用教程.北京市崇文区夕照寺街14号.人民邮电出版社.2011,72-1128

第五篇:图书管理系统用例图

图书管理系统 UML建模与设计模式

实验报告

计算机与信息工程学院

一、实验目的

在熟悉用例概念与应用的基础上,掌握用例模型的建立,包括: 1.掌握用例图的建立。

2.掌握用例描述文档的编写。3.掌握建模工具的使用。

二、实验内容

根据以下需求设计一个图书馆管理系统的用例图模型,包括:用例图和主要用例的描述文档。

基本功能要求:

图书管理:新书登记,图书查询,图书注销; 借阅管理:借书,还书,查询今日到期读者;

读者管理:增加读者、删除读者、查询读者、读者类别管理(可以设置不同类的读者,并使不同类读者对应不同类的图书流通参数,如可借册数,可借天数,可续借次数,可续借天数等);

报表管理:包括图书借阅统计报表,被注销图书统计报表等;报表可以有多种格式可供选择;可以把报表输出到文件中,可以预览报表、打印报表等。

系统管理:系统管理员使用,包括用户权限管理(增加用户,删除用户,密码修改等),数据管理(提供数据修改、备份、恢复等多种数据维护工具),系统运行日志,系统设置等功能。

三、实验思想

(1)分析系统需求;

(2)确定系统参与者:读者、图书管理员、图书管理系统;(3)确定系统用例;

四、实验结果 借阅人用例图:

图书系统管理员用例图: 图书管理员用例图:

1.用例名称: 登录

用例描述:根据用户输入的用户名和密码判断用户的身份,赋予相应的权限。前置条件:无

后置条件:根据用户所有的权限进入相应的操作界面。基本操作流程: 输入用户名 2 输入密码 校验密码是否正确。根据用户身份进入相应的操作界面。

可选流程:如果密码不正确,提示重新输入密码;

如果用户名不正确,提示没有此用户。2.用例名称:查询图书

用例描述:由读者进行操作,查询图书馆中有没有需要图书,如果有,显示该图书编号、书名、作者、出版日期、当前借阅状态等信息。前置条件:以顾客身份登录 后置条件:无 基本流程: 以读者身份登录。输入图书的名称或作者名称。显示相关图书的信息。

可选流程:如果没有该图书,返回提示信息:“没有找到图书”。3.用例名称:借书

用例描述: 由图书管理员把读者的借书卡的条码读入计算机,再将读者所选图书的条码读入计算机,在不超过读者允许借书的情况下,累计该读者所借的书;否则提示超过借书数量。

前置条件:以图书管理员的身份登录系统。后置条件:图书信息中相应记录的还书日期值做改变;将借书明细加入借书记录中。

基本操作流程: 以图书管理员身份登录系统。2 进入借书功能。录入读者的借书卡条码。4 识别读者类别,提示读者可以借阅图书的数量及借阅时间

等。如果允许借阅,继续4,否则提示已达到借书数量。5 录入图书的条码,显示该图书的信息。6 还有其他图书,重复步骤3。7 保存操作。

可选流程 在保存之前,可以取消操作。4.用例名称:续借

用例描述: 由图书管理员把读者的借书卡的条码读入计算机,计算机显示读者所借图书及状态,选定需要续借的图书,系统提示还书时间,保存操作。前置条件:以图书管理员的身份登录系统。后置条件:图书信息中相应记录的还书日期值做改变;将续借明细加入借书记录中。

基本操作流程: 以图书管理员身份登录系统。2 进入续借功能。录入读者的借书卡条码。计算机显示读者所借图书及状态。如可以续借则选定需要续借的图书;否则提示无法续借。6 系统提示还书时间。7 保存操作。

可选流程:在保存之前,可以取消操作。

5.用例名称:还书

用例描述: 由图书管理员把图书的条码读入计算机,系统显示该书的读者资料,提示是否超出借阅期限。如未超出则显示还书成功;如超出则计算罚金。前置条件:以图书管理员的身份登录系统。

后置条件:图书信息中相应记录的状态值做改变;将还书明细加入还书记录中。基本操作流程: 以图书管理员身份登录系统。2 进入还书功能。3 录入读者的借书卡条码。系统显示该书的读者资料,提示是否超出借阅期限。5 如未超出则显示还书成功;如超出则计算罚金。

可选流程: 在保存之前,可以取消操作。

6.用例名称:新书登记

用例描述:由图书管理员将新书的信息录入计算机中,进行保存。前置条件:以图书管理员的身份登录系统。后置条件:图书信息中增加一条记录。基本操作流程: 以图书管理员的身份登录系统。2 进入新书登记功能。3 输入新书的相应信息。4 保存操作。

可选流程:在保存之前,可以取消操作。

7.用例名称:修改或注销图书

用例描述:由图书管理员修改图书的信息或注销图书,进行保存。前置条件:以图书管理员的身份登录系统。后置条件:图书信息中相应记录更新或删除。基本操作流程: 以图书管理员的身份登录系统。2 进入图书管理功能。选定需要修改或删除的图书。4 修改图书的相应信息或删除图书。5 保存操作。

可选流程:在保存之前,可以取消操作。

8.用例名称:增加读者

用例描述:由图书管理员将新读者的信息录入计算机中,进行保存。前置条件:以图书管理员的身份登录系统。后置条件:读者信息中增加一条记录。基本操作流程: 以图书管理员的身份登录系统。2 进入读者管理功能。输入新读者的相应信息,设置读者类别。4 保存操作。

可选流程:在保存之前,可以取消操作。

9.用例名称:修改或删除读者 用例描述:由图书管理员修改读者的信息或删除读者,进行保存。前置条件:以图书管理员的身份登录系统。后置条件:读者信息中相应记录更新或删除。基本操作流程: 以图书管理员的身份登录系统。2 进入读者管理功能。3 录入读者的借书卡条码,查询读者,确定需要修改或删

除的读者。修改读者的相应信息或删除读者。5 保存操作。

可选流程:在保存之前,可以取消操作。

五、实验心得

完成用例图之后,给我最大的感受就是一定要把课堂上学到的知识用到实践中。以前总觉得老师在上课讲的东西很简单,当真正操作起来的时候,才发现没那么容易,将课堂知识运用到实践中才是真正掌握了知识。

下载用C++编写的图书管理系统[合集五篇]word格式文档
下载用C++编写的图书管理系统[合集五篇].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    C++通讯录管理系统

    黑龙江工程学院 第一章 问题分析和任务定义 1.1 问题分析 问题: 编写一个通讯录管理系统。要求包括通讯录建立、增加号码、删除号码、查询号码(按姓名、按号码)、修改号码、......

    图书管理系统大全

    图书管理系统源代码#include #include class Book{ // 书籍基类 protected: char Title[40]; // 书名 long Code; // 条码 int Type; // 0表示书,1表示杂志 public: Book......

    图书管理系统

    目录 第一章 绪论 ..................................................................................................................................... 1 第二章......

    图书管理系统

    图书管理系统 背景:当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。......

    图书管理系统

    七个文件 1. book.txt存放书籍2.borrower.txt存放借阅信息3.chenwen.txt 存放开始信息 4. mima.txt存放密码 5.qianyan.txt前言 6.student.txt存放学生信息7. yuyue.txt......

    图书管理系统

    经过大学四年理论课程的学习,以及校内校外的实践,极大的丰富了自身的理论基础,并且也具备了一些处理简单问题的能力,但即将踏上社会的我深知这还远远不够,因此我利用了毕业设计的......

    C++程序设计—电话簿管理系统

    XXXXXXXXXXXC/C++程序设计实训 电话簿管理系统 学生姓名 ×××× 学 号 ×××× 所在学院 ×××× 专业名称 ×××× 班 级 ×××× 指导教师 XXX XXXXXXXXXXXXXXXX XX......

    C++课程设计(教务管理系统)

    #include using namespace std; #include #include #include #include #include #include"01.h" class University; void menu(University uni);//菜单函数声明class Stude......