资源描述
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2011年秋季学期
面向对象 课程设计
题 目:在线音像制品销售系统
专业班级:计算机科学与技术1班
姓 名:赵王正
学 号:10240136
指导教师:年福忠
成 绩:
摘 要
在线音像制品销售系统是用于管理音像的出租和出售的系统。该系统用于音像出租或销售店,方便出售、销售、还回、查找等操作,可自定义音像,方便添加、管理音像和会员。提供完善的出租和还回操作,完全独立的数据库系统,数据管理提供:音像管理,会员管理。数据查询提供:租借情况,音像查询,会员查询。本系统界面美观,操作简单。
关键词:销售;信息查询;会员管理;数据库
目 录
摘 要 2
一、需求分析 1
1.1需求概述 1
1.2需求说明 1
二、总体设计 2
2.1算法设计 2
2.2功能模块: 3
2.3组织结构 3
三、详细设计 4
3.1 系统IPO图 4
3.2 数据库设计 6
1. 概念结构设计 6
2. 逻辑结构设计 7
3. 数据库表格设计 8
四、编码 11
五、调试 13
六、设计总结 18
致谢 19
参考文献 20
附录(源程序清单) 21
一、需求分析
1.1需求概述
设计一个在线音像制品销售系统,使之能提供以下功能:
(1)顾客查询管理功能
(2)管理人员查询音像制品功能
(3)管理人员添加音像制品功能
1.2需求说明
(1)系统要实现基本信息录入、修改、查询等功能:
●客户管理。
●库存管理(包括入库和发货)。
●统计分析。
(2)系统要实现满足多种条件的统计分析功能,有些统计数据要采用图表的格式呈现;
(3)销售管理系统所涉及的信息有:
●客户信息。包括的数据项有:客户代码、名称、联系人,地址、电话,手机,传真,邮编,E-mail,税号,开户行,账号,信誉度等。
●商品信息。包括的数据项有:商品代码、商品名称、品牌、供应商名称、尺码、款式、颜色、面料、包装方式等。
●入库/发货信息。包括的数据项有:入库/发货单号、客户代码、经手人、商品代码、数量、单价、金额、日期等。
●统计分析。主要包括库存信息、销售信息、利润分析等。
二、总体设计
2.1算法设计
系统主要流程如图1所示:
结束
选择4,退出程序
调用相应的函数
Choice
判断
进入菜单界面,选择相应的操作的编号。
开始
图1 系统主要流程图
2.2功能模块:
模块如图2所示:
音像店管理系统
管理员属性
顾客管理
影碟管理
图2 模块图
2.3组织结构
组织结构如图3所示
负责人
业务柜台
采购中心
采
购
员
员
工
顾
客
会
员
图3 组织结构图
三、详细设计
3.1 系统IPO图
音像管理模块完成音像店音像信息相关的操作如图4所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:音像管理
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
添加音像、修改音像、删除音像、查询音像
输入:
输出:
编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数
音像管理操作是否成功
处理内容:
检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。
图4 音像管理IPO图
客户管理模块完成会员顾客信息相关的操作如图5所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:客户管理
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
添加会员、修改会员、删除会员、查询会员
输入:
输出:
顾客编号,姓名,电话,OICQ,Email
会员管理操作是否成功
处理内容:
检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。
图5 音像管理IPO图
操作员管理模块完成系统操作员即员工信息相关的操作如图6所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:操作员管理
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
添加、修改、删除和查询操作员
输入:
输出:
编号,姓名,密码,锁屏密码
操作员管理操作是否成功
处理内容:
检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。
图6 操作员管理IPO图
日常操作模块是完成日常业务工作操作的模块如图7所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:日常操作模块
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
销售音像、出租音像、归还音像
输入:
输出:
顾客编号,音像编号,日期
售/借/还操作是否成功
处理内容:
检查输入信息的合法性后,调用数据库修改操作,完成音像的销售、出租或者归还操作,修改数据库信息。
图7 日常操作IPO图
查询模块是完成顾客对库存音像信息、可租音像信息查询的操作如图8所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:查询模块
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
输入:
输出:
查询关键词和关键词的类型
满足条件的查询结果
处理内容:
检查输入信息的合法性后,调用数据库查询操作,完成对音像信息、顾客信息或者租借记录的查询。
图8 查询模块IPO图
用户登录模块是系统用户登录该管理系统进行身份认证的操作如图9所示。
IPO图
系统名:音像制品出租及销售管理系统
制图者:冯伟强
模块图:用户登录
日期:2011-06-23
由下列模块调用:
调用下列模块:
系统主模块
输入:
输出:
用户名、密码。
处理内容:
验证用户名和密码的合法性,并根据用户权限,进入不同的主界面。
图9 用户登陆IPO图
3.2 数据库设计
1. 概念结构设计
概念模型可以看成是现实世界到机器世界的一个过渡的中间层,是整个数据库设计的关键。概念结构设计的结果是产生概念模型,将现实世界中的客观对象首先抽象为不依赖任何具体机器的信息结构,这种信息结构不是DBMS支持的数据模型,而是概念型模型。然后再把概念模型转换为具体机器上的DBMS支持的数据模型。要对数据词典中的数据存储进行分析,得到系统的关系模型,可以采用实体联系图(简称E-R图)的方法来进行数据结构分析,从而得出概念模型。E-R图由实体、联系、属性三部分组成。
(1)、实体和属性
实体指客观存在并可相互区分的事物,可以是人、物、实际对象、某些概念、事物本身,也可指事物和事物之间的联系。属性是实体具有的某一特性。一个实体可以由若干个属性来描述。具体到该系统,概念设计得到的实体和对应属性如表10所示:
实体
属性
音像制品
编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数
顾客
顾客编号,姓名,电话,OICQ,Email
操作员
编号,姓名,密码,锁屏密码
系表10 系统实体及其属性表
(2)、实体间联
联系是指现实世界的事物之间的联系。这种联系反映到信息世界中,就分为两类,一类是实体内部的联系,另一类是实体之间的联系。两个实体之间的联系可分为三类:
1)一对一的联系(1:1)
2)一对多的联系(1:n)
3)多对多的联系(n: m)
本系统包括的联系如表11所示:
实体一
实体二
联系名称
联系类别
备注
音像
顾客
租借
M:N
对应租借日志表
表11 系统联系表
2. 逻辑结构设计
逻辑结构设计的任务是根据DBMS的特征把概念模型转换为相应的逻辑结构。概念设计所得到的E-R模型,是独立与DBMS的,这里的转换就是把表示概念结构的E-R图转换为层次模型或网状模型或关系模型的逻辑结构。E-R图向关系模型的转化要解决的问题是如何将实体和实体间的联系转换为关系模型,如何确定这些关系模式的属性和码。E-R模型转换为关系模型的一般转换规则包括以下两条:
(1)、实体类型的转换
将每个实体类型转换为一个关系模式,实体的属性即为关系模式的属性,实体标志符即为关系模式的键。
(2)、联系类型的转换
根据不同的情况做不同的处理:
1)若实体间的联系是1:1的,可以在两个实体类型转换成的两个关系模式中的任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。
2)若实体间的联系是1:N的,可以在N端实体类型转换成的关系模式中加入1端实体类型转换成的关系模式的键和联系类型的属性。若实体间的联系是M:N的,可以将联系也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。
根据上述转换规则,得到本系统的关系模式如下:
音像制品:(音像编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数)
顾客:(顾客编号,姓名,电话,OICQ,Email)
操作员:(编号,姓名,密码,锁屏密码)
租借日志:(顾客编号#、音像编号#、借阅日期、归还日期)
销售日志(顾客编号#、音像编号#、销售日期)
3. 数据库表格设计
我在系统中定义的表格都严格地按照范式的思想和要求去完成,数据库中的所有表格都达到了三范式的要求。针对本系统的特点和需要实现的功能,在对所搜集的数据进行规范化之后,定义了如下9表格,分别是管理员表、客户管理表、客户日志表、演员表、演员格式、影片类型、影片资料、价格自定义表。通过对这九张表格的操作可以较好地完成系统设计的各项功能,9张表格之间有着不同程度的联系。
(1)、管理员表
管理员表主要用于记录音像店管理操作员的的详细信息,包括姓名、密码、销售总数、级别、解屏密码等相关信息,主要提供管理员对相关信息的管理,在此表中姓名是主键。管理员可以对管理员信息进行添加、查询、删除、修改等操作。
ID
姓名
密码
销售数量
级别
解屏密码
1
文本
数字
数字
文本
数字
表12 管理员表
(2)、客户表
客户表主要用于记录有客户会员的各类信息,包括客户姓名、客户号、电话、OICQ等。它主要用来为管理员提供本音像店所有会员的有关信息以进行相关的优惠或者奖励。
ID
客户姓名
客户号
电话
OICQ
Email
1
文本
数字
数字
数字
文本
表13 客户表
(3)、客户日志表
主要是为操作员提供客户是否已经租借音像制品信息信息,操作员根据这些信息进行操作,就可以在此表中查询日志的相关信息,比如:客户姓名、影片编号、借出时期。
ID
客户姓名
影片编号
借出时期
1
文本
数字
日期/时间
表14 客户日志表
(4)、演员表
每一影片都有自己的主要的演员,这个表就为顾客全面的介绍了所有影片的演员,帮助顾客了解和选取自己满意的影片。
ID
影片编号
演员
1
文本
文本
表15 演员表
(5)、影片格式表
影片格式表定义了影片的格式,有三种选择:VCD,DVD,RM。
ID
影片格式
1
文本
表16 影片格式表
(6)、影片类型表
影片类型表里集中了关于影片类型的信息,包括科幻、动画、喜剧、恐怖、贺岁、警匪、历史、伦理、动作、战争、灾难、爱情等类型。
ID
影片类型
1
文本
表17 影片类型表
(7)、影片语言表
因为所有影片的语言不是一样的,所以我们设计出了这个表,语言包括中文、英语、日语、法语。
ID
影片语言
1
文本
表18 影片语言表
(8)、影片资料表
影片资料是总表,基本包括了影片的所有属性,包括:影片编号、影片名称、时间长度、导演、发行年度、影片介绍等等,顾客根据这些影片资料进行选择影片。
ID
编号
名称
时间
导演
年度
价格
类型
格式
语言
介绍
租价
数字
1
数字
文本
数字
文本
数字
数字
文本
文本
文本
文本
数字
数字
表19 影片资料表
(9)、价格定义表
主要介绍影片资料的出租以及销售的价格。
ID
购买价格
租出价格
1
数字
数字
表20 购买价格表
四、编码
# include <fstream.h> //包含文件读写
# include <iostream.h>
# include <string.h> //包含strcmp()字符是否相等
#include <stdlib.h> //包含system("cls")清屏
#define MAX 20 //下列字符数组的大小
struct Date{//日期
char year[MAX];//年
char month[MAX];//月
char day[MAX];//日
};
struct Goods{//物品信息
char name[MAX];//音像名称
char price[MAX];//音像价格
char number[MAX];//音像数量
char cost[MAX];//音像总价
char kind[MAX];//音像的种类
Date indate;//购进日期
Goods * next;//下一个结点
};
class yinxiangzhipini { //类定义与实现
private:
int length;//客户数量
Goods * head;//列表的头结点
Goods * current;//当前结点
public:
yinxiangzhipin ()//构造函数
{
head=new Goods;//创建头结点
current=head;
current->next=NULL;
length=0;//长度为0
}
void Creatlist()//创建新的列表
{
char g='Y';
int s=0;
length=0;//初始长度为0;
current=head;
do {
Goods * temp=new Goods ;//构建新结点信息
length++; //每加一个结点 链表长度增1
temp->next=NULL;
cout<<" 请输入音像名称: ";
cin>>temp->name;
cout<<" 请输入音像单价 : ";
cin>>temp->price;
cout<<" 请输入音像数量: ";
cin>>temp->number;
cout<<" 请输入总费用 : ";
cin>>temp->cost;
cout<<" 请输入日期 (**** ** **) : ";
cin>>temp->indate.year>>temp->indate.month>>temp->indate.day;
cout<<" 请输入的种类: ";
cin>>temp->kind;
if(head==NULL){head=temp;current=temp;} //head头指针,current尾指针
else {current->next=temp,current=temp;}
do{
cout<<" next ? (Y N) "; //是否继续存入新产品
cin>>g;
if(g!='Y'&&g!='N')
{
cout<<"\n error !!!!\n ";
}
}while(g!='Y'&&g!='N');
}while(g=='Y');//判断是否继续插入新结点
}
五、调试
程序输入与结果输出:
5.1主菜单:
5.2音碟管理子菜单:
5.3查找音碟:
5.4查看音碟库存:
5.5打印音碟详情:
5.6顾客管理子菜单:
5.7显示已有顾客的信息:
5.8注册新顾客
5.9顾客出租一张音碟:
5.10顾客返回一张音碟:
5.11管理员属性子菜单:
5.12重设音碟数量:
5.13增加管理员:
5.14管理员一览:
5.15退出总程序:
六、设计总结
此次课程设计是第一次利用面向对象程序设计思想来编写程序。在整个过程中并不是十分成功的,但结果还是令人满意的,最终程序还是可以运行了。不但完成了实验的要求,而且还更加深刻了自己对面向对象编程的思想:面向对象程序设计是对数据的封装;范式(模板)的程序设计是对算法的封装。利用面向对象思想编程是可以简化程序员的懒惰,无论是对象,还是函数,如果你输入有问题,那么都会在编译的时候报告出来,方便你修改,而不是在执行的时候出错,害的你到处去捉虫子。 这就是用面向对象思想编程的好处。通过此次实验,我学到了许多知识。
程序的成功运行离不开老师的教导,在此,十分感谢课程设计老师的指导!
致谢
在这次课程设计的撰写过程中,我得到了很多人的帮助。
首先,我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次课设的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢帮过我的同学,他们也为我解决了不少我不太明白的问题。同时也感谢学院为我提供良好的做课程设计的坏境。最后,再一次的感谢所有在设计中帮助过我的良师益友和同学。
参考文献
[1] 周靖译.C++面向对象程序设计—基础、数据结构与编程思想,清华大学出版
[2] 王连相.C/C++程序设计上机指导与测试. 北京:中国铁道出版社,2006
[3] 钱能.C++程序设计教程,清华大学出版社,1999
[4] 王育坚等.Visual C++程序基础教程,北京邮电大学出版社,2000
[5] 陈文宇.面向对象程序设计语言C++ 机械工业出版社,2004
[6] 廉师友.C++面向对象程序设计简明教程,西安电子科技大学出版社,1998
[7] 刁成嘉.面向对象C++程序设计,机械工业出版社,2004
[8] 江明德.面向对象的程序设计,电子工业出版社,1993
附录(源程序清单)
#include <vector>
#include <fstream>
#include <string.h>
#include "VideoType.h"
#include "VideoListType.h"
#include "CustomerType.h"
#include "CustomerListType.h"
#include "AdminstratorType.h"
#include "AdminstratorListType.h"
using namespace std;
int Member = 0;//顾客会员号
int Num=0;//管理员工作号
//从文件VideoData.txt中读取数据并创建影碟列表
void createVideoList(ifstream &infile, VideoListType &videolist)
{
char title[50], star1[50], star2[50], producer[50], director[50], productionco[70], ch;
int instock, videoid;
VideoType newvideo;
infile.get(title, 50);
infile.get(ch);
while (infile)
{
infile.get(star1, 50);
infile.get(ch);
infile.get(star2, 50);
infile.get(ch);
infile.get(producer, 50);
infile.get(ch);
infile.get(director, 50);
infile.get(ch);
infile.get(productionco, 50);
infile.get(ch);
infile >> instock;
infile.get(ch);
infile >> videoid;
infile.get(ch);
newvideo.setVideoInfo(title, star1, star2, producer, director, productionco, instock, videoid);
videolist.push_back(newvideo);
infile.get(title, 50);
infile.get(ch);
}
}
//从文件CustomerData.txt中读取数据并创建顾客会员列表
void createCustomerList(ifstream &infile, CustomerListType &customerlist)
{
char name[20],ch,str1[50];
int num,id[50];
CustomerType newcustomer;
infile.get(name, 20);
infile.get(ch);
while (infile)
{
Member++;
infile.get(str1,50);
infile.get(ch);
infile >> num;
infile.get(ch);
for(int i=0;i<50;i++)
{
id[i]=str1[i];
id[i]=id[i]-48;
}
newcustomer.setCustomerInfo(name,num,id);
customerlist.push_back(newcustomer);
infile.get(name, 20);
infile.get(ch);
}
}
//从文件AdminstratorData.txt中读取数据并创建管理员列表
void createAdminstratorList(ifstream &infile, AdminstratorListType &Adminstratorlist)
{
char name[20],ch;
int num;
AdminstratorType newadminstrator;
infile.get(name, 20);
infile.get(ch);
while (infile)
{
Num++;
infile >> num;
infile.get(ch);
newadminstrator.setAdminstratorInfo(name,num);
Adminstratorlist.push_back(newadminstrator);
infile.get(name, 20);
infile.get(ch);
}
}
void Menu1()
{
cout << "\t\t┏━━━━━━━━━━━━━━━━━━━┓" <<endl;
cout << "\t\t┃ 欢迎进入影像店系统 ┃" <<endl;
cout << "\t\t┃ 1: 音碟管理 ┃" <<endl;
cout << "\t\t┃ 2: 顾客管理 ┃" <<endl;
cout << "\t\t┃ 3: 管理员属性 ┃" <<endl;
cout << "\t\t┃ 4: 退出 ┃ "<<endl;
cout << "\t\t┗━━━━━━━━━━━━━━━━━━━┛" <<endl;
}
void Menu2()
{
cout << "*********************************" <<endl;
cout << "** 欢迎进入音碟管理 **" <<endl;
cout << " 1: 查找音碟 *" << endl;
cout << " 2: 库存音碟 *" << endl;
cout << " 3: 打印所有音碟详情 *" << endl;
cout << " 4: 退出 *" <<endl;
cout << "*********************************" <<endl;
}
void Menu3()
{
cout << "*******************************" <<endl;
cout << "** 欢迎进入顾客管理 **" <<endl;
cout << " 1: 显示已有顾客的信息 *" << endl;
cout << " 2: 注册新顾客 *" << endl;
cout << " 3: 顾客出租一张影碟 *" << endl;
cout << " 4: 顾客返回一张影碟 *" << endl;
cout << " 5: 退出 *" <<endl;
cout << "*******************************" <<endl;
}
void Menu4()
{
cout << "*******************************" <<endl;
cout << "** 欢迎进入管理员属性 **" <<endl;
cout << " 1: 重新设置某张影碟的数量 *" << endl;
cout << " 2: 增加管理员 *" << endl;
cout << " 3: 管理员一览 *" << endl;
cout << " 4: 退出 *" <<endl;
cout << "*******************************" <<endl;
}
//从文件中写入注册的新会员
void login(CustomerListType &customerlist)
{
Member++;
char name[50];
int title[50] = {0};
CustomerType customer;
ofstream file;
//打开CustomerData.txt输入文件
file.open("f:\\CustomerData.txt",ios::app);
cout << "输入新会员的名字:" << endl;
cin >> name;
file << name;
file << "\n";
file << 0;
file << "\n";
file << Member;
file << "\n";
file.close();
customer.setCustomerInfo(name,Member,title);
customerlist.push_back(customer);
cout << "注册成功!会员号为:" << Member << endl << endl;
}
//从文件中写入增加的新管理员
void creat(AdminstratorListType &Adminstratorlist)
{
Num++;
char name[50];
int title[50] = {0};
AdminstratorType adminstrator;
ofstream file;
//打开AdminstratorData.txt输入文件
file.open("f:\\AdminstratorData.txt",ios::app);
cout << "输入新管理员的名字:" << endl;
cin >> name;
file << name;
file << "\n";
file << Num;
file << "\n";
file.close();
adminstrator.setAdminstratorInfo(name, Num);
Adminstratorlist.push_back(adminstrator);
cout << "注册成功!工作号为:" << Num << endl << endl;
}
int main()
{
VideoListType videolist;
CustomerListType customerlist;
AdminstratorListType Adminstratorlist;
int choice, number;
char ch, title[50], name[50];
ifstream file1,file2,file3;
//打开VideoData.txt输入文件
file1.open("f:\\VideoData.txt");
if (!file1)
{
cout << "VideoData.txt文件不存在!" << endl;
return 1;
}
//创建影碟列表
createVideoList(file1, videolist);
file1.close();
//打开AdminstratorData.txt输入文件
file2.open("f:\\AdminstratorData.txt");
if (!file2)
{
cout << "AdminstratorData.txt文件不存在!" << endl;
return 1;
}
//创建管理员列表
createAdminstratorList(file2, Adminstratorlist);
file2.close();
//打开CustomerData.txt输入文件
file3.open("f:\\CustomerData.txt");
if (!file3)
{
cout << "CustomerData.txt文件不存在!" << endl;
return 1;
}
//创建顾客会员列表
createCustomerList(file3, customerlist);
file3.close();
//显示菜单
Menu1();
cout << "输入选项:" << endl;
cin >> choice;
//处理输入
while (choice != 4)
{
switch (choice)
{
case 1:
int a;
Menu2();
cout<<"请输入选项:"<<endl;
cin>>a;
while (a!=4)
{
switch (a)
{
case 1:
cout << "输入音碟名称:" << endl;
cin.get(ch);
ci
展开阅读全文