资源描述
内蒙古科技大学
课程设计论文
题 目:C++课程设计
——电影院售票管理系统
学生姓名:张雪婉
学 号:
专 业:通信工程
班 级:-2
指导老师:郝斌
【摘要】 1
第一章 问题描述
1.1 电影院售票管理系统设计
第二章 问题分析
2.1 叙述你对问题了解、处理问题方案说明
2.2 系统功效模块划分
第三章 数据模型
3.1 相关数据结构说明类设计
3.2 程序结构说明,即程序各个部分之间怎样协调来完成任务
第四章 算法描述
4.1 解题算法设计思绪介绍
4.2 关键程序代码,加上具体注释
第五章 设计总结
第六章 附录
【摘要】
电影院售票管理系统实现功效:
1、录入信息:且可不定时增加数据。并依据放映时间排序。
2、浏览信息:可显示出某日期全部放映信息,假如目前系统时间超出了某电影放映时间,则显示“此电影放映结束”提醒信息。
3、查询电影:可按日期或电影名查询。并显示目标具体信息。
4、售票:售票即为影片预定。可依据输出可预订信息选择订票,假如该影片已放映,则提醒不能订票,假如售票成功,自动跟新座位数。
5、退票:影片退订即退票。依据放映时间和系统时间来判定是否能进行退票,并自动更新座位数。
其它参数:程序中定义了一个moive结构和一个ticket类,在结构体和类外还定义了seat()和putout()两个函数。moive结构用来存放电影数据(属性)信息;ticket类实现管理moive结构体里面数据和系统功效模块;seat()和putout()函数用来辅助结构体和类,简化程序。
第一章: 问题描述
1.1、设计资料及参数
用C++设计一个系统,能提供下列服务:
(1)录入放映信息,格式为:
放映日期
放映时间
场次
电影名称
票价
会员折扣
剩下座位
-11-2
10:30
1
桃姐
30
8
78
-11-2
14:00
2
桃姐
30
8
86
可不定时地增加放映数据。
(2)浏览放映信息,可显示出某日期全部放映信息,假如目前系统时间超出了某电影放映时间,则显示“此电影放映结束”提醒信息。
(3)查询电影:可按日期或电影名查询。
(4)售票和退票功效
A:查询电影名。当剩下座位数大于0,而且目前系统时间小于放映时间时才能售票,计算会员折扣,售票后自动更新剩下座位数。
B:退票时,输入退票电影名和场次,当电影未放映时才能退票,假如以会员折扣购置电影票,退票根据折扣价退款,退票后自动更新剩下座位数。
1.2、设计要求及结果
依据系统功效要求,能够将问题处理分为以下步骤:
(1)分析系统中各个实体之间关系及其属性和行为;
(2)依据问题描述,设计系统类层次;
(3)完成类层次中各个类描述(包含属性和方法);
(4)完成类中各个组员函数定义;
(5)完成系统应用模块;
(6)功效调试;
(7)提交课程设计汇报:完成系统总结汇报和系统使用说明书
第二章:问题分析
2.1、对问题了解叙述、处理方案说明
由设计题目知电影院售票管理系统关键由1、录入(input)2、显示(show)3、查询(search)4、售票(sell)5、退票(refund)五个模块组成。
对整个系统进行功效分析不难发觉,电影院管理系统能够对全部数据信息进行操作,比如:录入(input)、显示(show)、查询(search)、售票(sell)和退票(refund)。所以需要设计一个moive结构体和ticket类来实现对基础数据储存和模块功效实现。考虑到程序实现程序尽可能简练明了,又增加了时间比较函数(timecmp)、座位判定函数(seat)和信息输出函数(putout)三个函数,对程序实现一定程度简化。
2.2、系统模块功效步骤图以下:
运行程序时,需要先输入数据。并定义了时间输入格式。如(-6-21 22:00)。
显示数据时,会先跟系统时间比较,假如小于系统目前时间,则输出提醒“已播放”。
查找时满足要求按名字查找和按日期查找。找到以后和系统时间比较输出提醒,假如没找到,输出提醒。
查询时分为按电影名和日期两种查询功效。查询时将会出现界面来供操作者选择。
订票函数中会先给出可预订提醒,这么能够更有效订票。输入以后会先检验是否播放,若播放则给出提醒,退出。若未找到,则一样给出提醒。假如票卖光了,仍然有提醒,假如电影达成预定要求,则先给出现有座位预订情况,方便用户高效率订票。当用户输入一座位时程序会判定这个作为是否被预订,假如是,则给出提醒;假如no就输出用户需要支付金额,并统计在座位号对应数组中。方便退票时退款。订票成功后还会输出现有座位信息方便核实。
退票时,操作者要先输入电影名,若电影名不存在或时间以过,会提醒“输入错误”或“电影已播放,无法退票”。若在预定电影中,还会要求输入退订座位号,方便深入确定是否真正该电影。若两道确定全部成功经过,就会输出要腿还金额。
其中订票和退票函数全部是用大篇幅(一两百行)来构建起强大而有完善提醒功效,已完成快捷而又便利操作。
第三章:数据模型
3.1相关数据结构和类说明
struct moive //定义moive结构体,存放数据
{
int year;//年
int month;//月
int day;//日
int hour;//时
int minute;//分
int datetime[5];//装电影放映时间,方便比较和系统时间比较
int num;//场次
string name;//电影名
float price;//票价
float discount;//折扣
int rest;//余票
float seat[10][10];//初始值全部为0,只在预定后改变其值
};
class ticket//定义ticket类
{
private:
moive tic[N];//存电影数据数组
int len;//现有电影数量
public:
ticket();//结构函数
~ticket();//析构函数
friend void seat(int i);//把seat函数定义为类ticket友元函数
friend void putout(int i);//把putout函数定义为类ticket友元函数
void input();//录入
void show();//显示
void search();//查找
void sell();//订票
void refund();//退票;
}tick;
在类中把seat()和putout()函数定义为类友元函数,实现类外函数访问类内组员,这么能够源代码篇章幅度,实现在一定程度上简化程序。
私有数据组员moive tic[N],便于操作数据。
数据组织结构图:
3.2 程序结构说明,即程序各个部分之间怎样协调来完成任务
程序关键实现过程是在ticket类 中定义组员函数和友元函数来实现完成,而且在类外实现。这么方便了对数据进行操作。而且定义了一个全局比较函数timecmp,能够比较两个时间数组大小;函数seat实现判定某一座位是否被预定;函数putout实现对电影信息输出。这三个函数在程序中用途很广泛,在整个程序中数次有时间比较,座位检索,电影信息输出,当用到某一函数时,直接在模块调用即可,无须数次编写,实现程序简化。
其中程序总很多代码是反复用到,不过没有写成函数来调用有两点原因。首先假如写成函数调用话会降低程序可读性,其次写成函数话,代码就固定下来了,使得程序不够灵活。所以在程序无须要地方,就用代码来替换函数调用。举个例子说,在修改,删除,订票,退票中全部会用到按电影名查找。可是没有单独把按电影名查找单独写成函数来调用,是因为在按电影名查找会输出很多具体电影信息和提醒信息。这么也不便于调用函数。
第四章:算法描述
4.1 解题算法设计思绪介绍
timecmp函数是用来比较日期时间函数,它需要先把两个时间装入数组再传进来地址,然后从年月日时分进行比较。假如有大小区分,直接返回。
int timecmp(int a[],int b[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]>b[i])
{
return 1;
}
if(a[i]<b[i])
{
return -1;
}
}
if(i==n)
{
return 0;
}
}
Seat函数作为检索某一座位是否已被预订,因为seat[m][n]=0,即初始化全部为0。二当该座位被预订后就会给予座位号,所以用两层for循环,把全部座位全部检索了一遍。在输出,就一下子看出那些座位被预定,那些没有。
因为seat函数是类外函数,不能直接操作类ticket组员,所以要在类中写入“friend voidseat(int i);”即定义为类友元函数。若不加,编译将会犯错。
void seat(int i)
{ for(int m=0;m<10;m++)
{
cout<<endl<<"\t";
for(int n=0;n<10;n++)
{
cout<<"[";
if(tick.tic[i].seat[m][n]!=0)
{
cout<<"有些人";
}
else
{
cout<<"无人";
}
cout<<"]";
}
}
}
putout函数是便于把电影属性(数据信息)输出,因为tic[]是类中数据组员且又是结构体moive类型变量,故要用两层引用。但putout函数也是全局类外函数,要想访问类ticket中组员,也需把其定义为类友元函数。不然编译阶段会犯错。
void putout(int i)
{ cout<<tick.tic[i].year<<"-"<<tick.tic[i].month<<"-"<<tick.tic[i].day<<"\t";
cout<<tick.tic[i].hour<<":"<<tick.tic[i].minute<<"\t";
cout<<tick.tic[i].num<<"\t"<<tick.tic[i].name<<"\t\t";
cout<<tick.tic[i].price<<"\t"<<tick.tic[i].discount<<"\t"<<tick.tic[i].rest<<endl;
}
4.2 关键程序代码和运行结果图
主函数,即选择菜单:
char as;
while(1)
{
cout<<"\n\t\t\t\t欢迎进入管理系统\n\n";
cout<<"\n\t\t\t\t1.录入影片";
cout<<"\n\t\t\t\t2.显示影片";
cout<<"\n\t\t\t\t3.查找影片";
cout<<"\n\t\t\t\t4.售票";
cout<<"\n\t\t\t\t5.退票"<<endl;
cout<<"输入数字 实施对应功效:";
cin>>as;
switch(as)
{
case '1':tick.input();break;
case '2':tick.show();break;
case '3':tick.search();break;
case '4':tick.sell();break;
case '5':tick.refund();break;
default :system("pause"); return;//任意键继续
}
}
录入电影信息:
void ticket::input()
{
system("cls");//清屏
char ch;//接收日期中字符-或:
cout<<"\n\n\n\t\t\t\t《录入模块》\n\n\n"<<endl;
for(int i=tick.len;i<N;i++)
{
cout<<"\n请输入日期如(-11-11):";
cin>>tick.tic[i].year>>ch>>tick.tic[i].month>>ch>>tick.tic[i].day;
cout<<"\n请输入放映时间如(12:30):";
cin>>tick.tic[i].hour;
cin>>ch;
cin>>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;
cout<<"\n请输入场次:";
cin>>tick.tic[i].num;
cout<<"\n请输入电影名称:";
cin>>tick.tic[i].name;
cout<<"\n请输入电影票价:";
cin>>tick.tic[i].price;
cout<<"\n请输入会员折扣:";
cin>>tick.tic[i].discount;
tick.tic[i].rest=100;
for(int m=0;m<10;m++)
{ for(int n=0;n<10;n++)
tick.tic[i].seat[m][n]=0;
}
tick.len++;//个数加1
cout<<endl;
cout<<"是否继续录入?(y/n):";
while(1)
{ cin>>ch;
if(ch=='y' || ch=='Y' || ch=='n' || ch=='N')
break;
else
cout<<"输入错误请重新输入:";
}
if(ch=='n' || ch=='N')
break;
}
}
显示电影信息:
void ticket::show()
{
system("cls");//清屏
cout<<"\n\n\n\t\t\t\t《显示模块》\n\n\n"<<endl;
cout<<" 全部电影信息以下:"<<endl;
cout<<"日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<<endl<<endl;
time_t t;
struct tm *tim;//时间变量,已包含在头文件库函数ctime中
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int r;
for(int i=0;i<tick.len;i++)
{
r=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较 ,返回值给r
putout( i);//调用putout函数
if(r<=0)
{
cout<<"\a(已播放!)" <<endl;
}
else
{
cout<<endl;
}
}
}
查询电影:
void ticket::search()
{
char flag;
int i;
int k=0;//标识找到统计
system("cls");//清屏
cout<<"\n\n\n\t\t\t\t《查找模块》\n\n\n"<<endl;
while(flag!='1'&&flag!='2')
{
cout<<endl<<"\t\t\t\t1.按影片名查找";
cout<<endl<<"\t\t\t\t2.按日期查找";
cout<<endl<<"\t\t\t\t请输入查找模式:";
cin>>flag;
if(flag!='1'&&flag!='2')
{
cout<<"\n\a\t\t\t\t选择有误!请选择正确查找模式。"<<endl;
}
}
【按电影名查询】
if(flag=='1')
{
string na;
int j=1;
cout<<"\n请输入影片名:";
cin>>na;
for(i=0;i<tick.len;i++)
{
if(tick.tic[i].name==na)//找到
{
k++;//找到统计数
if(j=1)
{
cout<<"\ n 查找结果以下:"<<endl;
cout<<"日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<<endl<<endl;
}
j++;
putout( i);//调用putout函数
time_t t;
struct tm *tim;
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int r;
r=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较
if(r<=0)
{
cout<<"\a(已播放!)" <<endl;
}
else
{
cout<<endl;
}
cout<<endl<<"\t\t\t\t目前预订情况";
seat(i);//调用seat函数
}
}
if(j!=1)
{
cout<<endl;
system("pause");//任意键继续
return;
}
if(i==tick.len&&k==0)
{
cout<<"\n\a\t\t\t\t未找到结果!"<<endl;
system("pause");//任意键继续
return;
}
}
【按日期查询】
else
{
char ch;
int temp[3];
cout<<"\n请输入放映日期:";
cin>>temp[0]>>ch>>temp[1]>>ch>>temp[2];
int j=1;
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<<endl;
}
j++;
putout( i);//调用putout函数
time_t t;
struct tm *tim;//时间类型结构体
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int s;
s=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较
if(s<=0)
{
cout<<"\a(已播放!)" <<endl;
}
else
{
cout<<endl;
}
cout<<endl<<"\t\t\t\t目前预订情况";
seat(i);//调用seat函数
cout<<endl;
}
}
if(j!=1)
{
cout<<endl;
system("pause");//任意键继续
return;
}
if(i==tick.len&&k==0)
{
cout<<"\n\a\t\t\t\t未找到结果!"<<endl;
system("pause");//任意键继续
return;
}
}
}
售票:
void ticket::sell()
{
system("cls");//清屏
cout<<"\n\n\n\t\t\t\t《售票模块》\n\n\n"<<endl;
cout<<" 可预订电影信息以下:"<<endl;
cout<<"日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<<endl<<endl;
time_t t;
struct tm *tim;
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int r,i;
int k=0;//标识可供预定影片数量
for(i=0;i<tick.len;i++)
{
r=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较
if(r>0)
{
k++;
putout( i);//调用putout函数
}
}
if(i==tick.len&&k==0)
{ cout<<"\n\a\t\t\t\t暂无可供预定影片!"<<endl;
system("pause");//任意键继续
return;
}
string na;
cout<<endl<<"请输入要预订影片名:";
cin>>na;
k=0;//再次做标识
for(i=0;i<tick.len;i++)
{
if(tick.tic[i].name==na)//找到
{
k++;//找到统计数
int j=1;
if(j=1)
{
cout<<"\n 查找结果以下:"<<endl;
cout<<"日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<<endl<<endl;
}
j++;
putout( i);//调用putout函数
time_t t;
struct tm *tim;
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int s;
s=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较
if(s<=0)
{ cout<<"\a\n\t\t\t此电影已播放,无法订票!" <<endl;
system("pause");//任意键继续
return;
}
cout<<endl<<"\t\t\t\t目前预订情况";
int m,n;
seat(i);//调用seat函数
cout<<endl<<"\n请输入预订座位号(1~100):";
int seatnum;
cin>>seatnum;
if(seatnum>100||seatnum<1)
{ cout<<endl<<"\a\t\t对不起,无此座位!";
system("pause");//任意键继续
return;
}
m=(seatnum-1)/10;
n=(seatnum-1)%10;
if(tick.tic[i].seat[m][n]==0&&tick.tic[i].rest!=0)
{ cout<<endl<<"\n是否以会员权限购置(Y/N):";
char a;
cin>>a;
if(a!='N'&&a!='n')
{
tick.tic[i].seat[m][n]=tick.tic[i].price*tick.tic[i].discount/10;
}
else
{ tick.tic[i].seat[m][n]=tick.tic[i].price;
}
tick.tic[i].rest--;
cout<<endl<<"\t\t\t\t您需要支付:"<<tick.tic[i].seat[m][n]<<"元。"<<endl;
cout<<endl<<"\t\t\t\t您座位号是:"<<seatnum<<endl;
cout<<endl<<"\t\t\t\t预订成功!";
seat(i);//调用seat函数
cout<<endl;
system("pause");//任意键继续
return;
}
else
{ if(tick.tic[i].rest==0)
{
cout<<endl<<"\a\t\t\t\t对不起,没有票了!";
system("pause");//任意键继续
return;
}
else if(tick.tic[i].seat[m][n]!=0)
{
cout<<endl<<"\a\t\t对不起,无此座位或此座位已被预订!";
system("pause");//任意键继续
return;
}
}
}
}
if(i==tick.len&&k==0)
{
cout<<"\n\a\t\t\t\t没有找到您要预定电影!"<<endl;
system("pause");//任意键继续
return;
}
}
退票:
void ticket::refund()
{
system("cls");//清屏
cout<<"\n\n\n\t\t\t\t《退票模块》\n\n\n"<<endl;
string na;
int i;
int k=0;//标识修改数量
cout<<"\n请输入影片名:";
cin>>na;
for(i=0;i<tick.len;i++)
{
if(tick.tic[i].name==na)//找到
{
k++;//找到统计数
int j=1;
if(j=1)
{
cout<<"\n 查找结果以下:"<<endl;
cout<<"日-----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<<endl<<endl;
}
j++;
putout( i);//调用putout函数
time_t t;
struct tm *tim;
t=time(NULL);//获取目前系统时间
tim=localtime(&t);
int array[5]={tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min};
int r;
r=timecmp(tick.tic[i].datetime,array,5);//和系统时间比较
if(r<=0)
{
cout<<"\a\n此电影已播放,不能申请退票!" <<endl;
system("pause");//任意键继续
return;
}
else
{
cout<<endl<<"\t\t\t\t目前预订情况";
int m,n;
seat(i);//调用seat函数
cout<<endl<<"\n请输入退订座位号(1~100):";
int seatnum;
cin>>seatnum;
if(seatnum>100||seatnum<1)
{
cout<<endl<<"\a\t\t对不起,无此座位!";
system("pause");//任意键继续
return;
}
m=(seatnum-1)/10;
n=(seatnum-1)%10;
展开阅读全文