资源描述
目录
一、 设计目标 2
二、设计内容 2
三、设计要求 2
四、设计过程 3
1、面向对象分析 3
2、数据结构分析 7
3、 系统实施步骤 8
五、 程序运行结果 11
六、 设计总结 17
参考文件 17
附录 18
图书销售管理系统
一、 设计目标
本图书销售管理系统,关键用于小型书店,进行简单图书管理,为了能够愈加好管理书店销售情况和库存情况书店销售管理系统关键功效有:
(1)图书入库管理:维护入库图书信息,图书编号、书名、价格等,自动计算库存。
(2)图书查询统计:能够依据图书分类、出版社、书名、作者等条件查询图书具体信息。
(3)销售管理:销售过图书全部统计在销售列表中,方便统计收入。图书销售后,要统计图书库存,按天天统计销售额、每个月或季度生成报表,并生成畅销书单。
二、设计内容
(1) 图书信息包含书名、书号、作者、出版社、单价、库存数量、进价、售价、利润;
(2)用户登录界面设计
(3)信息维护:包含子模块有增加图书信息、删除图书信息、修改图书信息
(4 ) 查询功效:可按书名查询、作者查询、或出版社查询
(5) 排序功效:能实现按图书销售利润进行排序功
三、设计要求
(1) 只能使用C++语言,源程序要有合适注释,使程序轻易阅读
(2) 最少采取文本菜单界面(假如能采取图形菜单界面愈加好)
(3) 学生可自动增加新功效模块(视情况可另外加分)
(4) 写出课程设计汇报,具体要求见相关说明文档
四、设计过程
1、面向对象分析
(1)对象模型设计
(2)各个类设计
系统中说明了4个类,每个类具体设计以下:
1.Book类
class book{ //book基类
protected:
string name;//名称
float price; //价格
int num; //编号
int kucun,xcl,salel; //库存,现存量,销售量
public:
int getnum(){
return num;} //编号接口函数
string getname(){//名称接口函数
return name;}
float getprice(){return price;} //价格接口函数
int getkucun(){return kucun;} //库存量接口函数
int getxcl(){return xcl;} //现存量接口函数
int getsalel(){return salel;} //销售量接口函数
virtual void input()=0; //输入虚函数
virtual void output()=0; //输出虚函数
说明:Book类是一个基类,用于定义图书基础信息。比如:其中string getname()是一个接口函数,能取得图书姓名。
2.Yule(娱乐类)
class yule:public book{//娱乐派生类
public:
void input(){//输入
cin>>name;
cin>>num;
cin>>price;
cin>>kucun;
cin>>salel;
cin>>xcl;
}
void output(){//输出
cout<<"Yule:"<<endl;
cout<<name<<" "<<num<<" "<<price<<" "<<kucun<<" "<<salel<<" "<<xcl<<endl;
}
void compute(){//计算售出剩下函数
int counts;
cout<<"输入售出图书本数"<<endl;
cin>>counts;
cout<<"售后剩下:"<<endl;
kucun=kucun-counts;//计算库存量
salel=salel+counts;//计算销售量
xcl=xcl-counts;//计算剩下量
说明: yule类用于定义娱乐图书信息,它是Book类公有派生类。其中:
Compute()是一个计算售出图书数量和剩下函数,input()和 output()函数是对图书信息输入和输出而且她们是在基类中定义纯虚函数。
study(学习类图书)
class study:public book{//学习类
public:
void input(){
cin>>name;
cin>>num;
cin>>price;
cin>>kucun;
cin>>salel;
cin>>xcl;
}
void output(){
cout<<"Learn:"<<endl;
cout<<name<<" "<<num<<" "<<price<<" "<<kucun<<" "<<salel<<" "<<xcl<<endl;
}
void compute1(){
int counts;
cout<<"输入售出图书本数"<<endl;
cin>>counts;
cout<<"售后剩下:"<<endl;
kucun=kucun-counts;
salel=salel+counts;
xcl=xcl-counts;
study类用于定义学习类图书信息,它是Book类公有派生类。其中:
Compute1()是一个计算售出图书数量和剩下函数,input()和 output()函数是对图书信息输入和输出而且她们是在基类中定义纯虚函数。
operate(功效类)
typedef vector<yule> STRVEC;//定义stl模版容器
typedef vector<study> STRVEC1;
class operate{ //定义功效类
STRVEC strvec;
STRVEC1 strvec1;
public:
void search_yulenum(int m)//娱乐类图书按编号查找
void search_yulename(string s)//查找娱乐类图书按名称
void del_yulenum(int n)//删除娱乐类图书按编号
void del_yulename(string p)//按图书名称删除
void add_study()//添加学习类图书基础信息
void add_yule()//添加娱乐类图书基础信息
void search_studynum(int m)//查找学习类图书编号
void search_studyname(string s)//查找学习类图书名称
void xiugai_yule(int m)//修改娱乐类图书剩下量
void xiugai_study(int m)//修改学习类图书剩下量
void del_studynum(int n)//删除售完图书
void del_studyname(string p) //按名称删除图书
void show_yule()//显示娱乐类图书
void show_study()//显示学习类图书
void saleamounts()//计算销售额
void changxiao1()//娱乐类图书畅销
void changxiao()//学习类图书畅销
void save()//娱乐类入库单
void save1()//学习类入库单
void load()//读取娱乐类文件
void load1()//读取学习类文件
void Menu()//应用菜单
说明:operate类用来实现图书管理系统功效,它是用来查找、添加、删除图书信息基础点信息,对系统进行维护,生成入库单、畅销书和一天销售额。
2、数据结构分析
书店销售管理系统数据结构:
英文名称
汉字名称
Book
图书类
Yule
娱乐类图书
Study
学习类图书
Strvec
娱乐类STL模版
Strvec1
学习类STL模版
Operate
运算类
search_yulenum
娱乐类编号查找
search_yulename
娱乐类书名查找
del_yulenum
娱乐类编号删除
del_yulename
娱乐类书名删除
add_study
添加学习类图书
add_yule
添加娱乐类图书
search_studynum
学习类编号查询
search_studyname
学习类书名查询
del_studynum
学习类编号删除
del_studyname
学习类书名删除
show_yule
显示娱乐类信息
show_study
显示学习类信息
save
保留娱乐类文件
load
显示娱乐类文件
Menu
菜单
main
主函数
Save1
保留学习类文件
Load1
显示娱乐类文件
saleamounts
销售量计算
xiugai_yule
娱乐类图书修改
xiugai_study
学习类图书修改
changxiao
娱乐类畅销图书
Changxiao1
学习类畅销图书
3、 系统实施步骤
(1)主页面步骤图图(1)
图(1)主页面步骤图
(2)用户登陆
简述:
用户在图书销售系统里用户登陆并查询图书内容。
基础步骤:
1 用户:在图书销售系统画面,选择用户登陆,显示图书基础信息,按提醒内容进行查找
2 查询:用户在图书销售系统中能查询图书信息;
3 显示:用户能在用户界面能看到最近图书;
4 结束。
步骤图图(2)
图(2)用户登录步骤图
(3)收银员登陆
简述:
收银员在图书销售系统里能看到图书信息并能修改出售图书数量。
基础步骤:
1 收银员:在图书销售系统画面,选择收银员登陆,输入密码,进入收银员界面。
2 修改:收银员在图书销售系统中能修改图书售出情况;
3 显示:收银员能在用户界面能看到最近录入图书;
4 结束。
步骤图图(3)
图(3)收银员登录步骤图
管理员登陆
简述:
管理员在图书销售系统填加、删除和查找图书信息,并能显示销售额。
基础步骤:
1 管理员:在图书销售系统画面,选择管理员登陆,输入密码,进入收银员界面。
2 添加: 管理员在图书销售系统中能填加图书基础情况;
3 删除: 管理员在图书销售系统中能删除图书基础信息;
4 查找: 管理员在图书销售系统中能查找图书基础信息。
5 销售额:管理员在图书销售系统中能看到销售额输出
6 畅销书:管理员在图书销售系统中能查询畅销书
7 结束
步骤图图(4)
图(4)管理员登录步骤图
五、 程序运行结果
管理员登录
在书店开始售书之前先由管理员添加书籍内容,在管理员将需要添加书籍添加完成后用户还有收银员才能实施自己对应功效。选择管理员功效会进入登陆界面;密码输入正确方能进入使用,错误则会返回输入密码界面,直到密码正确,进入使用界面。
按1添加娱乐类图书及相关内容
添加成功后好能够继续按1添加娱乐类书籍相关内容,也可按5继续添加学习类图书
添加完成后可返回主菜单(11选项)
收银员登录
在主界面按2可进入收银员登录界面,同管理员一样,收银员也一样需要输入密码,密码对方可进入修改界面,在这里收银员能够对图书销售情况进行修改,方便以后对图书销售情况便于管理
输入图书编号(娱乐类/学习类)而且输入将要售出本数,系统将会显示图书(娱乐类/学习类)售后情况
用户登录(张海东负责)
在主界面选择1能够进入用户使用界面,在这里用户能够看到所以书籍(娱乐类和学习类),并能够根据编号或图书名称查询对应图书具体内容
到此用户使用功效结束。
当然管理员也有对图书查询功效,对图书销售情况时时了解
娱乐类图书查询:
学习类图书查询:
销售额显示
在一段时间后书籍可能售完,这么管理员需要将这类书籍删除,以免误导用户,在图书删除后,用户在查询系统中将不会再查询到相关内容
娱乐类图书删除
学习类图书删除
管理员在实施完全部步骤后能够选择回到住界面,也能够选择退出系统
回到主界面选择:
退出系统选择:
六、 设计总结
(1)完成本课题花了很长时间,真正体会了作为一个程序员辛劳,而且必需含有细心、耐心品质,想要完成一项出色项目,必需精益求精,反复操作和实践。
(2)在做了本课程设计以后,我对C++了解更深了,很多知识得到了巩固,部分不懂知识也逐步明了!这其中关键是对指针使用收获很多,在指针使用过程中,对指针指向和对各函数中指针赋值会影响到整个程序运行;还有就是对文件输入输出流了解得更透彻了,知道了打开一个文件后必需还要对其关闭,不然程序无法运行,对多种文件输入输出控制符全部能基础融会贯通。
(3)即使本课题已完成,可是还是存在部分问题,比如说界面还不够好看,为了用户用得舒适,界面是很关键。
参考文件
郑莉等编著.《C++语言程序设计》.清华大学出版社
郑莉等编著.《C++语言程序设计习题和试验指导》.清华大学出版社
张基温编著.《C++程序设计基础例题和习题》.高等教育出版社
黄明等编著.《面向对象程序设计习题详解》.机械工业出版社
附录
源代码:
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
const int Maxr=100;
const int Maxb=100;
const int Maxbor=5;
class Reader
{
private:
int tag;
int no;
char name[10];
int borbook[Maxbor];
public:
Reader() {}
char *getname() {return name;}
int gettag() {return tag;}
int getno() {return no;}
void setname(char na[])
{
strcpy(name,na);
}
void delbook(){ tag=1; }
void addreader(int n,char *na)
{
tag=0;
no=n;
strcpy(name,na);
for(int i=0;i<Maxbor;i++)
borbook[i]=0;
}
void borrowbook(int bookid)
{
for(int i=0;i<Maxbor;i++)
{
if (borbook[i]==0)
{
borbook[i]=bookid;
return;
}
}
}
int retbook(int bookid)
{
for(int i=0;i<Maxbor;i++)
{
if(borbook[i]==bookid)
{
borbook[i]=0;
return 1;
}
}
return 0;
}
void disp()
{
cout << setw(5) << no <<setw(10) << name<<"借书编号:[";
for(int i=0;i<Maxbor;i++)
if(borbook[i]!=0)
cout << borbook[i] << "|";
cout << "]"<<endl;
}
};
class RDatabase
{
private:
int top;
Reader read[Maxr];
public:
RDatabase()
{
Reader s;
top=-1;
fstream file("reader.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file)break;
top++;
read[top]=s;
}
file.close();
}
void clear()
{
top=-1;
}
int addreader(int n,char *na)
{
Reader *p=query(n);
if (p==NULL)
{
top++;
read[top].addreader(n,na);
return 1;
}
return 0;
}
Reader *query(int readerid)
{
for (int i=0;i<=top;i++)
if (read[i].getno()==readerid &&
read[i].gettag()==0)
{
return &read[i];
}
return NULL;
}
void disp()
{
for (int i=0;i<=top;i++)
read[i].disp();
}
void readerdata();
~RDatabase()
{
fstream file("reader.txt",ios::out);
for (int i=0;i<=top;i++)
if (read[i].gettag()==0)
file.write((char *)&read[i],sizeof(read[i]));
file.close();
}
};
void RDatabase::readerdata()
{
char choice;
char rname[20];
int readerid;
Reader *r;
while (choice!='0')
{
cout <<"******欢迎使用图书销售管理系统终极版******”<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "******操作菜单******:";
cin >> readerid;
cout << "******收银员******";
cin >> rname;
addreader (readerid,rname);
break;
case '2':
cout << "******管理员******:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout << " ******用户****** "<<endl;
break;
}
cout << "输入新姓名:";
cin >> rname;
r->setname(rname);
break;
case '3':
cout << " 输入图书编号:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout <<" 该图书不存在" << endl;
break;
}
r->delbook();
break;
case '4':
cout << "读入图书编号:";
cin >> readerid;
r=query(readerid);
if (r==NULL)
{
cout <<"该图书不存在"<< endl;
break;
}
r->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";break;
}
}
}
class Book
{
private:
int tag;
int no;
char name[20];
int onshelf;
public:
Book(){}
char *getname() { return name; }
int getno(){ return no; }
int gettag(){ return tag; }
void setname(char na[])
{
strcpy(name,na);
}
void delbook(){ tag=1;}
void addbook(int n,char *na)
{
tag=0;
no=n;
strcpy(name,na);
onshelf=1;
}
int borrowbook()
{
if (onshelf==1)
{
onshelf=0;
return 1;
}
return 0;
}
void retbook()
{
onshelf=1;
}
void disp()
{
cout << setw(6) << no << setw(18) << name << setw(10)
<<(onshelf==1? "缺货") <<endl;
}
};
class BDatabase
{
private:
int top;
Book book[Maxb];
public:
BDatabase()
{
Book b;
top=-1;
fstream file("book.txt",ios::in);
while (1)
{
file.read((char *)&b,sizeof(b));
if (!file) break;
top++;
book[top]=b;
}
file.close();
}
void clear()
{
top=-1;
}
int addbook(int n,char *na)
{
Book *p=query(n);
if (NULL==p)
{
top++;
book[top].addbook(n,na);
return 1;
}
return 0;
}
Book *query(int bookid)
{
for (int i=0;i<=top;i++)
if (book[i].getno()==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()
{
fstream file("book.txt",ios::out);
for (int i=0;i<=top;i++)
if (book[i].gettag()==0)
file.write((char *)&book[i],sizeof(book[i]));
file.close();
}
};
void BDatabase::bookdata()
{
char choice;
char bname[40];
int bookid;
Book *b;
while (choice!='0')
{
cout <<"\n\n\n\t\t\t图 书 维 护 "<<endl<<endl;
cin >> choice;
switch (choice)
{
case '1':
cout << "输入图书编号:"<<endl;
cin >> bookid;
cout << "输入图书书名:"<<endl;
cin >> bname;
addbook(bookid,bname);
break;
case '2':
cout << "输入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout << " 该图书缺货 "<<endl;
break;
}
cout << "输入新书名:"<<endl;
cin >> bname;
b->setname(bname);
break;
case '3':
cout <<" 读入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout <<" 该图书缺货" << endl;
break;
}
b->delbook();
break;
case '4':
cout << " 读入图书编号:"<<endl;
cin >> bookid;
b=query(bookid);
if (b==NULL)
{
cout <<" 该图书不存在"<< endl;
break;
}
b->disp();
break;
case '5':
disp();
break;
case '6':
clear();
break;
default:cout<<"输入错误,请从新输入:";
}
}
}
void main()
{
char choice;
int bookid,readerid;
RDatabase ReaderDB;
Reader *r;
BDatabase BookDB;
Book *b;
while(choice!='0')
{
cout <<endl<<endl<<"\t\t\t 图 书 销售管 理 系 统\n\n\n";
cin >> choice;
switch (choice)
{
case '1':
cout <<" 买书 图书编号:";
cin >>readerid;
cout <<" 图书编号: ";
cin >>bookid;
r=ReaderDB.query(readerid);
if (NULL==r)
{
cout <<" 不存在该图书,不能买书"<< endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能买书"<< endl;
break;
}
if (b->borrowbook()==0)
{
cout << " 该图书已售完,不能买书"<< endl;
break;
}
r->borrowbook(b->getno());
break;
case '2':
cout<<"买书\n 图书编号:";
cin >>readerid;
cout << " 图书编号:";
cin >>bookid;
r=ReaderDB.query(readerid);
if (r==NULL)
{
cout <<" 不存在该图书,不能买书" << endl;
break;
}
b=BookDB.query(bookid);
if (b==NULL)
{
cout <<" 不存在该图书,不能买书" <<endl;
break;
}
b->retbook();
r->retbook(b->getno());
break;
case '3':
BookDB.bookdata();
break;
case '4':
ReaderDB.readerdata();
break;
default:cout<<"输入错误,请从新输入:";
}
}
}
展开阅读全文