资源描述
word格式文档
目录
一、 设计目的 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<<"输入错误,请从新输入:";
}
}
}
专业整理
展开阅读全文