资源描述
<p>图书管理系统(C++)陈明明
———————————————————————————————— 作者:
———————————————————————————————— 日期:
17
个人收集整理 勿做商业用途
东华理工大学信息工程学院
《面向对象程序设计》课程设计报告
图书馆管理系统
指导教师: 谢小林
姓名:陈明明
学号:201140030117
班级:1140301
20 13 年 1 月 10 日
一、 需求分析:
建立一个图书馆管理系统,可以处理以下对象
.图书馆基本信息
.图书馆的书籍
.图书馆管理员
.读者信息
二、 程序的主要功能:
1. 查询图书馆的总信息
2. 查询图书馆管理员的信息
3。 查询图书馆藏书信息
4。 存入新书(有管理员加入,需进行身份验证)
5. 旧书处理
6. 存入新的管理员的信息
7。 修改管理员的信息(增加工龄,加薪)
8。 两所图书馆的最大藏书量之和
9. 根据书名检索书刊信息
10. 查询读者的借阅信息
11。 查询读者信息(包括借书情况,到期时间,罚款情况.)
12.管理员可以修改用户的欠款和交款的金额
13。读者氛围学生、研究生和教师。所有学生的租期为1月,所有教师的租期为2月。
三、程序运行平台:
软件环境:w7
编程软件
VC++6。0
运行平台: Win32
硬 件: 普通个人pc机
四、 系统总框架图
五、 程序类的说明:
类的设计
Book类的设计:
(1)数据成员
char name[StrNum]; 用来存放书名。
char number[StrNum]; 用来存放图书的编号。
char kind[Type]; 用来存放图书的类型。
int tag; 定义删除标记。
int num; 定义图书编号为整形。
int add; 增加标记。
(2)函数成员
Book(){} 无参构造函数,用于为书名和作者姓名设置默认值。
char getkind() 用于获取图书类型.
char getname() 用于获取书名。
int getnum() 用于获取图书编号。
int gettag() 用于获取删除标记。
void setname(char na[]) 用于设置书名。
void setkind(char kin[]) 用于设置类型。
void delbook() 用于删除图书。
void addbook(int n,char *na,char *kin) 用于增加图书。
void disp() 用于输出图书。
六、 模块分析
class BDatabase{} 图书管理类的设置,实现对图书的添加,查找,删除等。
int top; 设置图书记录指针。
Book book[Maxb]; 设置图书记录(Maxb定义为最多可存储的图书数,定义为整形)。
void clear() 清空图书记录.
int addbook(int n,char *na,char *kin) 增加图书记录。
Book *query(int bookid) 查找图书记录.
void bookdata(); 定义图书库.
void disp() 输出。
~BDatabase() 设置析构函数,将book[]写到book.txt文件中
void BDatabase::bookdata() 由此函数开始对图书管理系统的主菜单进行调用与功能的实现.(界面参看执行界面部分)
最后用main() 函数的实现,程序的主界面的引导
七、比较有特色的函数
class BDatabase{} 图书管理类的设置,实现对图书的添加,查找,删除等。
int top; 设置图书记录指针。
Book book[Maxb]; 设置图书记录(Maxb定义为最多可存储的图书数,定义为整形)。
void BDatabase::bookdata() 由此函数开始对图书管理系统的主菜单进行调用与功能的实现。(界面参看执行界面部分)
八、存在的不足与对策
使用多关键字进行查询时,我是使用以下语句:if(bname!=null) {sqlStr+=”and Bname like ' %"+bname+”% ’”; },实现判断是否为空,从而利用给进条件实现查询,粗看之下并没有什么错误,但是在运行是却出现了异常,在找了很久被找出错误之后,我开始考虑是否是语法错误,而是使用MySQL的命令行模式来进行调试,在MySQL命令行中运行时却并没有出现错误,完全正确的查询出我想要的结果,在试了很久之后,终于发现了上面的语句有两个小的细节错误,第一个错误就是"and Bname这里没有空格,正确格式应该是" and Bname,第二个错误是’ %"+bname+”% '”中含有多余的空格,正确答案是'%"+bname+”%'”;两个错误都是由于空格引起的,一个是少了空格,另一个是含有多余的空格。
九、程序源代码
#define StrNum 20
#define Type 20
#include<iostream〉
#include <iomanip〉
#include <string〉
#include <fstream〉 //输入/输出文件流类
using namespace std;
const int Maxb=100; //最多可存储的图书
class Book
{
private:
int tag; //删除标记
int num; //图书编号
int add; //增加标记
char number[StrNum]; //编号
char name[StrNum]; //书名
char kind[Type]; //图书类型
public:
Book(){}
char getkind() //获取图书类型
{
return kind[Type];
}
char getname() //获取书名
{
return name[StrNum];
}
int getnum() //获取图书编号
{
return num;
}
int gettag() //获取删除标记
{
return tag;
}
void setname(char na[]) //设置书名
{
strcpy(name,na);
}
void setkind(char kin[]) //设置类型
{
strcpy(kind,kin);
}
void delbook() //删除图书
{
tag=1;
}
void addbook(int n,char *na,char *kin) //增加图书
{
tag=0;
num=n;
strcpy(name,na);
strcpy(kind,kin);
}
void disp() //输出图书
{
cout。flags (ios::left); //设置对齐的标志位为左
cout〈〈setw(15)<<num〈〈setw(20)<〈name〈<setw(15)〈<kind〈〈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,char *kin) //增加图书
{
Book *p=query(n);
if(NULL==p)
{
top++;
book[top].addbook(n,na,kin);
return 1;
}
return 0;
}
Book *query(int bookid) //查找图书
{
for (int i=0;i<=top;i++)
if (book[i]。getnum()==bookid &&book[i].gettag()==0)
{
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文件中
{
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];
char bkind[40];
char newType[20];
int bookid;
Book *b;
while (choice!='0’)
{
cout〈〈”\t******************************************************************\n";
cout〈<” \n\n";
cout〈<”\t\t\t图 书 管 理 系 统\n\n";
cout〈<”\t\t\t1 新增图书记录\n";
cout<〈"\t\t\t2 更改图书记录\n”;
cout〈<”\t\t\t3 删除图书记录\n”;
cout<〈"\t\t\t4 查找图书记录\n";
cout〈〈"\t\t\t5 显示图书记录\n";
cout<〈”\t\t\t6 清空全部记录(慎用)\n”;
cout<〈”\t\t\t0 退出系统\n";
cout<〈 cin="">>choice;
switch (choice)
{
case '1’:
cout〈〈"输入图书编号:”〈〈endl;
cin>〉bookid;
cout〈〈"输入图书类型:”〈</p><endl;>newType;
cout〈〈”输入图书书名:"<〈endl;>bname;
addbook(bookid,bname,newType);
break;
case '2':
cout〈〈”输入图书编号:”〈〈endl;
cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout<〈"该图书不存在"〈〈endl;
break;
}
cout<〈”输入新的书名:”<〈endl;>bname;
b—>setname(bname);
cout<〈”输入新的类型:”〈〈endl;>bkind;
b-〉setkind(bkind);
break;
case ’3':
cout<<”读入图书编号:”〈<endl;
cin〉〉bookid;
b=query(bookid);
if(b==NULL)
{
cout〈<”该图书不存在”<<endl;
break;
}
char tg1;
cout<〈”确定要删除此记录吗?(y>tg1;
if(tg1!=’n'&&tg1!='N’)
{
b—>delbook();
cout<〈"已成功删除该书记录!”<〈endl;
break;
}
case '4’:
cout〈〈"读入图书编号:"<〈endl; cin="">〉bookid;
b=query(bookid);
if (b==NULL)
{
cout〈<"该图书不存在”〈〈endl;
break;
}
cout<<"图书编号 b-="">disp();
break;
case '5':
cout<〈”图书编号 图书名称 图书类型 \n”;
disp();
break;
case '6':
char tg2;
cout<〈"确定要清空所有记录吗?(Y/N)”〈<endl; cin="">>tg2;
if(tg2!='n’&&tg2!='N')
{
clear();
cout<〈”已成功清空记录!"〈<endl;
break;
}
case ’0':
break;
default:cout〈〈"输入错误,请从新输入(数字为0~6):”;
}
}
}
//main() 函数的实现,程序的主界面的引导
void main()
{
char choice;
BDatabase BookDB;
while(choice!=’0')
{ cout〈〈"\t******************************************************************\n”;
cout<〈” \n\n";
cout<〈"\n\n\t\t\t欢迎使用图书管理系统\n\n";
cout〈〈endl<<endl〈<"\t\t\t图 书 管 理 系 统\n\n\n\n”;
cout〈<setw(83)〈<"by (姓名——)\n\n\n\n";
cout<〈” \n\n”;
cout<〈"\t******************************************************************\n";
cout〈<”\t\t\t1 进 入 系 统\n\n\t\t\t0 离 开"<<endl;
cout<<”请选择:”; cin="">〉choice;
switch(choice)
{
case ’1':
BookDB.bookdata();
break;
case ’0':
cout<〈”\n\n\t\t\t欢迎再次使用图书管理系统\n\n";
break;
default:cout〈〈"输入错误,请从新输入:";
}
}
}
<!--<”请选择:”;--></endl;><!--<"图书编号--><!--〈endl;--><!--〈”确定要删除此记录吗?(y--><!--〈”输入新的类型:”〈〈endl;--><!--〈”输入新的书名:”<〈endl;--><!--〈endl;--></endl;><!--〈-->
展开阅读全文