C++课程设计报告电影院售票系统Word下载.docx
《C++课程设计报告电影院售票系统Word下载.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告电影院售票系统Word下载.docx(96页珍藏版)》请在冰点文库上搜索。
可不定时地增加放映数据。
(2)浏览放映信息,可显示出某日期所有放映信息,如果当前系统时间超过了某电影的放映时间,则显示“此电影放映结束”的提示信息。
(4)售票和退票功能
A:
查询电影名。
当剩余座位数大于0,并且当前系统时间小于放映时间时才能售票,计算会员折扣,售票后自动更新剩余座位数。
B:
退票时,输入退票的电影名和场次,当电影未放映时才能退票,如果以会员折扣购买的电影票,退票按照折扣价退款,退票后自动更新剩余座位数。
2.设计要求及成果
根据系统功能要求,可以将问题解决分为以下步骤:
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
(3)完成类层次中各个类的描述(包括属性和力一法);
(4)完成类中各个成.员函数的定义;
(5)完成系统的应用模块;
(6)功能调试;
(7)完成系统总结报告以及系统使用说明书。
第二章问题分析
二.1阐述你对问题的理解、解决问题的方案说明
由设计题目知电影院售票管理系统主要可分为两个大模块:
1.管理系统2.售票系统。
对整个系统进行功能分析不难发现,管理系统和售票系统的权限是不一样的,管理系统具有管理员权限,可以对所有数据的信息进行操作,比如:
录入(input)、显示(show)、查找(search)、修改(change)、删除(del);
而售票系统则只进行售票(sell)和退票(refund)。
所以需要设计一个manager和customer函数来区分权限的函数。
所以,manager里包含了需要实现的input、show、search、change、del等函数来满足管理要求的功能。
Customer包含sell和refund。
二.2系统功能模块的划分
系统的模块图如下:
欢迎界面
主函数
售票customer
管理manager
删除
退票
售票
显示
输入
查找
修改
管理函数进入时需要管理密码:
1234
运行程序时,需要先输入数据,根据需要在对数据进行简单操作。
录入时,每录入一个信息就会对现有信息进行插入排序。
显示数据时,会先跟系统时间比较,如果小于系统当前时间,则输出提示“已播放”。
查找时满足要求的按名字查找和按日期查找。
找到之后与系统时间比较输出提示,如果没找到,输出提示。
修改函数支持多种修改,可以避免输入的一些错误。
也可以修改日期,以调整放映时间。
删除函数是为防止输入错误,或是内存不够用而设计的。
比如前几天已播放的,在内存中如果作用不是很大,完全是可以删除的。
这样能跟有效利用资源。
售票系统设计较为简单,主要是订票和退票。
订票函数中会先给出可预订的提示,这样可以更有效订票。
输入之后会先检查是否播放,若播放则给出提示,退出。
若未找到,则同样给出提示。
如果票卖光了,仍然有提示,如果电影达到预定要求,则先给出现有座位的预订情况,方便用户高效率订票。
当客户输入一座位时程序会判断这个作为是否被预订,如果是,则给出提示;
如果no就输出用户需要支付的金额,并记录在座位号对应的数组中。
方便退票时退款。
订票成功后还会输出现有座位的信息方便核实。
其中订票和退票函数都是用大篇幅(一两百行)来构建起强大而有完善的提示功能,趋于人性化的设计跟拉近了与客户的距离。
第三章数据模型
三.1相关数据结构的说明类的设计
程序中定义的数据:
structnode
{
intyear;
intmonth;
intday;
inthour;
intminute;
intdatetime[5];
//装时间,方便比较
intnum;
stringname;
floatprice;
floatdiscount;
intrest;
floatseat[10][10];
};
classticket
private:
nodetic[N];
intlen;
public:
ticket();
~ticket();
intsort(inti);
voidinput();
voidshow();
voidsearch();
voidchange();
voiddel();
voidsell();
voidrefund();
}tick;
对系统进行数据分析就会知道电影院售票管理系统主要处理的是基本电影信息。
每个电影的基本信息放在structnode中定义,包括基本的放映日期(date),时间(time),场次(num),影片名(name),票价(price),会员折扣(discount)及余座(rest)。
其中日期是包含有年、月、日,时间包含时、分,整形数据,其中还有一个数组(detetime[5])是把该影片时间存储进去,方便以后的排序和与系统时间比较。
还有一个而二维数组seat[10][10],是用来存储座位信息(初始化全为0),如果此座位被预定,则对应的座位存的就是订票时的付款,这也方便了退票时的退款。
还要解决数据的组织问题,怎么才能把不同的电影存起来呢?
方法目前只学了两种,数组和链表。
数组和链表各有优缺点。
用链表实现虽然对空间进行了充分利用,但其对数据的存储让人实在无奈,并且操作也不容易实现。
剩下就是数组了,虽然需要定义一个大点的数组,但其对数据操作非常方便,这深受初学者的我们的青睐。
所以在ticket类中定义了个node[50]。
如果需要扩大直接改文件前的#defineN后的数字就可以了。
其实质随意选择把电影信息存在结构体而不是类中,主要考虑到,结构体存取数据的方便性,而采用类无疑会给程序很多负担存取。
数据组织结构图:
ticket类
Input()
Show()
Search()
Change()
Del()
Sell()
Refund()
len
node[50]
三.2程序结构说明,即程序各个部分之间如何协调来完成任务
程序的主要实现过程是在ticket类中定义的成员函数来实现完成,并且在类外定义。
这样方便了对数据进行操作。
并且定义了一个全局的比较函数timecmp,可以比较两个时间数组的大小。
此函数在程序中用途很广泛,每次输入输出都需要与系统时间进行比较,所以在每个操作函数中都用到了。
此外sort函数也是非常有用的,它主要用在输入和修改上。
每次更新数据都会根据现有数据的时间进行排序。
这也方便了读数据的客户。
其中程序总很多代码是重复用到的,但是没有写成函数来调用有两点原因。
首先如果写成函数调用的话会降低程序的可读性,其次写成函数的话,代码就固定下来了,使得程序不够灵活。
所以在程序不必要的地方,就用代码来代替函数调用。
举个例子说,在修改,删除,订票,退票中都会用到按电影名查找。
可是没有单独把按电影名查找单独写成函数来调用,是因为在按电影名查找会输出很多详细的电影信息,会使客户感觉到是在浪费时间。
下面是按电影名查找的代码片段:
for(i=0;
i<
tick.len;
i++)//遍历
{
if(timecmp(tick.tic[i].datetime,temp,3)==0)//找到
{
k++;
//找到的记录数
if(j==1)
{
cout<
<
"
\n查找结果如下:
endl;
cout<
_______________________________________________________________________________"
日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"
endl<
}
j++;
tick.tic[i].year<
-"
tick.tic[i].month<
tick.tic[i].day<
\t"
;
cout<
tick.tic[i].hour<
:
tick.tic[i].minute<
tick.tic[i].num<
tick.tic[i].name<
\t\t"
tick.tic[i].price<
tick.tic[i].discount<
tick.tic[i].rest;
time_tt;
structtm*tim;
t=time(NULL);
//获取当前系统时间
tim=localtime(&
t);
intarray[5]={tim->
tm_year+1900,tim->
tm_mon+1,tim->
tm_mday,tim->
tm_hour,tim->
tm_min};
ints;
s=timecmp(tick.tic[i].datetime,array,5);
//与系统时间比较
if(s<
=0)
cout<
\a(已播放!
)"
<
}
else
{
}
\t\t\t\t当前预订情况"
for(intm=0;
m<
10;
m++)
for(intn=0;
n<
n++)
["
if(tick.tic[i].seat[m][n]!
cout<
有人"
}
else
无人"
]"
if(j!
=1)
system("
pause"
);
//任意键继续
return;
if(i==tick.len&
&
k==0)
\n\a\t\t\t\t未找到结果!
}
而在另一些函数种植需要提示用户找没找到就可以了。
下面是del函数的按电影名查找
for(i=0;
i++)
if(tick.tic[i].name==na)//找到
j++;
for(intj=i+1;
j<
j++)
tick.tic[j-1]=tick.tic[j];
\t\t\t\t删除成功!
\n"
tick.len--;
}
if(i==tick.len&
j==0)
\n\a\t\t\t\t未找到结果,删除失败!
system("
后面的就不再一一列举。
三.3全局变量,重要形式参数、局部变量等等,它们的命名及用途解释
1.#defineN50//可存电影总数
2.程序中定义的数据:
//年
//月
//日
//时
//分
//场次
//电影名
//票价
//会员折扣
//余票
//座位信息
//存电影的数组
//现有电影数量
//构造函数
//析构函数
//排序
//录入
//显示
//查找
//修改
//删除
//订票
voidrefund()//退票;
3.inttimecmp(inta[],intb[],intn)//时间比较函数,先把时间装入两个数组,把数组地址传进来,比较a,b分别是数组名。
n表示循环比较的次数。
4.charch;
//接受日期中的字符—或:
5.stringna;
//输入的姓名
6.time_tt;
//时间变量,已包含在头文件库函数ctime中。
7.structtm*tim;
//时间类型的结构体
8.t=time(NULL);
9.tim=localtime(&
10.intarray[5]={tim->
//将系统时间装入数组,方便比较
11.intk=0;
//标记找到的记录
12.r=timecmp(tick.tic[i].datetime,array,5);
//与系统时间比较,返回值给r。
13.intj=0;
//修改函数中标记修改数量
14.stringinpass;
//manager函数中的管理员密码初始值1234
15.Flag,as,choice//是用来存接受的选择的
第四章算法描述
四.1解题算法的设计思路介绍
timecmp函数是用来比较日期时间函数,它需要先把两个时间装入数组再传进来地址,然后从年月日时分进行比较。
如果有大小区分,直接返回。
inttimecmp(inta[],intb[],intn)
for(inti=0;
n;
if(a[i]>
b[i])
return1;
if(a[i]<
return-1;
if(i==n)
return0;
//
Sort函数主要是对第i个元素进行插入排序。
需要先遍历数组然后插入到第一个比他大的元素前面。
intticket:
sort(inti)
intr,n,j;
for(j=0;
i;
j++)//从首元素开始比较日期
r=timecmp(tick.tic[i].datetime,tick.tic[j].datetime,5);
if(r==-1)//找到第一个比他大的日期,插入其前面
break;
if(j==tick.len-1)
returnj;
if(j==i)
for(j=i+1;
nodetemp=tick.tic[i];
if(j<
i)
for(n=i;
n>
j;
n--)
tick.tic[n]=tick.tic[n-1];
tick.tic[j]=temp;
returnj;
if(j==tick.len)
for(n=i;
j-1;
tick.tic[n]=tick.tic[n+1];
else
for(n=i;
tick.tic[n]=temp;
returnn;
四.2主要程序代码,加上详细的注释
下面简单介绍一下程序运行结果
主函数开始运行界面:
do
\t\t\t\t欢迎使用电影售票系统"
\n\t\t\t\t1.管理系统"
\n\t\t\t\t2.售票系统"
\n\n\n\t\t\t\t请选择:
cin>
>
choice;
switch(choice)
case'
1'
manager();
break;
2'
customer();
default:
exit(0);
while
(1);
Manager系统代码及运行截图
密码输入界面代码
请输入管理员密码:
stringinpass;
chara;
inpass;
if(inpass==password)
\a\t\t\t\t密码错误!
是否继续输入?
(Y/N)"
a;
if(a=='
N'
||a=='
n'
)
exit(0);
}while
(1);
选择菜单代码
do
\n\t\t\t\t欢迎进入管理系统\n\n"
\n\t\t\t\t1.录入影片"
\n\t\t\t\t2.显示影片"
\n\t\t\t\t3.查找影片"
\n\t\t\t\t4.修改影片"
\n\t\t\t\t5.删除影片"
\n\t\t\t\t6.退出"
cin>
as;
switch(as)
case'
tick.input();
tick.show();
3'
tick.search();
4'
tick.change();
5'
tick.del();
6'
default:
system("
//任意键继续
选择1——管理系统——>
输入密码
选择1——>
录入
voidticket:
input()//录入信息
{
system("
cls"
//清屏
charch;
\n\n\n\t\t\t\t《录入模块》\n\n\n"
for(inti=tick.len;
N;
{
\n请输入日期(2011-11-11):
tick.tic[i].year>
ch>
tick.tic[i].month>
tick.tic[i].day;
\n请输入放映时间(12:
30):
tick.tic[i].hour;
ch;
tick.tic[i].minute;
tick.tic[i].datetime[0]=tick.tic[i].year;
tick.tic[i].datetime[1]=tick.tic[i].month;
tick.tic[i].datetime[2]=tick.tic[i].day;
tick.tic[i].datetime[3]=tick.tic[i].hour;
tick.tic[i].datetime[4]=tick.tic[i].minute;
\n请输入场次:
tick.tic[i].num;
\n请输入电影名称:
tick.tic[i].name;
\n请输入电影票价:
tick.tic[i].price;
\n请输入会员折扣:
tick.tic[i].discount;
tick.tic[i].rest=100;
tick.tic[i].seat[m][n]=0;
tick.len++;
//个数加1
if(i!
=0)//按时间,插入排序
intj=sort(i);
是否继续录入?
(y/n):
while
(1)
if(ch=='
y'
||ch=='
Y'