c++课程设计报告电影院自动售票机.docx
《c++课程设计报告电影院自动售票机.docx》由会员分享,可在线阅读,更多相关《c++课程设计报告电影院自动售票机.docx(56页珍藏版)》请在冰豆网上搜索。
c++课程设计报告电影院自动售票机
面向对象程序课程设计
(2012/2013学年第一学期第20周)
指导教师:
******
浙江理工大学
班级:
计算机科学与技术
(1)班
学号:
*************
姓名:
***
面向对象程序课程设计任务书
【题目】电影院自动售票机
【目的】
通过设计一个小型电影院的自动售票系统,训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念,使自己的程序设计与调试水平有一个明显的提高。
【要求】
1、每个学生必须独立完成;
2、课程设计时间为1周;
3、设计语言采用C++;
4、学生有事离校必须请假。
课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,未按规定上交实验报告的学生,其成绩按不及格处理。
【内容简介】
有一个小型的电影院,这个电影院只有一个放映厅,厅里有10排座位,每排10个座位。
这个电影院从早上8:
00开始营业,每2小时放映一部电影,营业至次日凌晨2点结束。
这个电影院现在打算使用自动售票机,来让观众自己购票。
现在请你为这个自动售票机编写一个程序,使得这个自动售票机能够正确工作。
【考核标准】
1、能够正确出售某一场次,某一座位的票,成绩≥60;
2、能够统计每一场次的出票情况,成绩≥70;
3、能够统计每一天每一场次的出票情况,成绩≥80;
4、能够考虑不同场次的票价,不同座位的票价,界面设计友好,成绩≥90。
请仔细考虑这个题目中出现的各个实体,考虑如何保存数据。
【工作内容及工作计划】
时间
地点
工作内容
指导教师
1月21日
上午
10-306
任务布置,需求分析
庄巧莉、杨东鹤
下午
10-306
系统功能划分
庄巧莉、杨东鹤
1月
22日
上午
10-306
类的整体设计
庄巧莉、杨东鹤
下午
10-306
类的详细设计
庄巧莉、杨东鹤
1月
23日
上午
10-306
编写代码
庄巧莉、杨东鹤
下午
10-306
编写代码
庄巧莉、杨东鹤
1月
24日
上午
10-306
程序测试
庄巧莉、杨东鹤
下午
10-306
程序测试
庄巧莉、杨东鹤
1月
25日
上午
10-306
上机检查、答辩
庄巧莉、杨东鹤
下午
10-306
上机检查、答辩
庄巧莉、杨东鹤
面向对象程序课程设计
一、题目
二、需求分析
三、系统结构图
四、类的设计
五、程序代码与说明
六、运行结果与分析
七、心得与体会
一、题目
【题目】
电影院自动售票机
【目的】
通过设计一个小型电影院的自动售票系统,训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念,使自己的程序设计与调试水平有一个明显的提高。
【要求】
1、每个学生必须独立完成;
2、课程设计时间为1周;
3、设计语言采用C++;
4、学生有事离校必须请假。
课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,未按规定上交实验报告的学生,其成绩按不及格处理。
【内容简介】
有一个小型的电影院,这个电影院只有一个放映厅,厅里有10排座位,每排10个座位。
这个电影院从早上8:
00开始营业,每2小时放映一部电影,营业至次日凌晨2点结束。
这个电影院现在打算使用自动售票机,来让观众自己购票。
现在请你为这个自动售票机编写一个程序,使得这个自动售票机能够正确工作。
二、需求分析
电影院自动售票机用户使用时,必须先登录或者注册,不同的用户登录后进入不同功能界面,管理员账户系统默认“CFY”,密码:
“1101”,顾客账户,由顾客自己注册,然后每个顾客会有一个以账户名为文件名的txt文本,文本中第一行存账户密码,接下来,存的是用户的订票信息。
管理员账户则不用建立相应的文本,只有有一个MovieInfo.txt用来存储影片信息即可。
电影院自动售票机主要功能可分为两个板块:
1、管理员板块2、售票板块。
管理员板块拥有最高权限,可对电影的信息进行修改,比如:
录入(input)、显示(show)、查找(search)、修改(change)、删除(del);而售票系统则只进行售票(book)和退票(refund)。
顾客板块拥有最小权限,只能对影片的预定(book)和退订(refund)两项功能。
三、系统结构图
系统的结构图如下:
管理员账户无法注册,系统默认账户名:
CFY,密码:
1101。
顾客无论是注册还是登录成功,都会自动转入售票模块,然后由用户进行相应的选择。
管理员登录成功后,系统会自动进入管理板块,在进入管理板块时,先通过read()把MovieInfo.txt中的数据读入管理员类中自定义的vector中,然后管理员可实现对影片的诸多操作,
录入功能:
根据影讯录入新的电影信息。
显示功能:
将电影的播放时间与系统时间比较,以判断电影是否已经播放或正在播放。
查找功能:
有按电影名称查询和按播放时间查询两种查询方式。
修改功能:
可对影片的每个属性进行修改。
删除功能:
通入输入要删除的影片名,通过vector自身的删除函数erase()。
管理员退出后,系统调用save()函数,把vector中的数据写入文件MovieInfo.txt,MovieInfo.txt的打开方式为清空。
顾客登录或注册成功后,系统自动进入售票板块,顾客可进行订票与退票两项操作。
订票功能:
系统先分别冲MovieInfo.txt中和用户文本中读入相应的数据到customer的vector容器P中和User的vector容器Q中,然后通过预定,得到相应的订票信息。
结束订票时,把两个容器中的数据更新到两个文本中,并清空容器中的数据。
退票功能:
同样需要先从文本中读入信息,然后通过PQ两容器中的数据,先将Q容器中的信息输出到屏幕,可直观得到已定的票的情况,然后根据PQ两容器中的数据信息,对所要退的票进行判断,判断能否退票。
最后同样更新文件中的数据,清空PQ容器中的数据。
四、类的设计
首先设计一个电影信息Ticket类作为基类:
classTicket
{
protected:
charMovieName[20];
doubleprice;
doublediscount;
intnum;
intyear;
intmonth;
intday;
inthour;
intminute;
intrest;
boolmap[10][10];
};
基类Ticket包含了影片的所有基本信息,以便被管理员Manager类和顾客Custom类继承。
用户信息User类:
classUser
{
charname[20];
intyear;
intmonth;
intday;
inthour;
intminute;
intn;
intSeat[10][10];
};
User类中包含了用户订票的信息,方便在Custom类中建立相应的数据容器。
管理员Manager类:
classManager:
publicTicket
{
vectorP;
vector:
:
iteratorpos;
staticstringUserName;
staticstringPassword;
public:
voidinput();
voidshow();
voidsearch();
voidchange();
voiddel();
voidread();
voidsave();
stringgetUserName(){returnUserName;}
stringgetPassword(){returnPassword;}
boolcmp(Ticketa,Ticketb);
};
管理员Manager类由Ticket类派生,主要包含一个Ticket容器和对基类Ticket数据处理的功能函数。
顾客Custom类:
classCustomer:
publicTicket
{
vectorP;
vectorQ;
vector:
:
iteratorpos;
vector:
:
iteratorpos1;
public:
voidbook(charIDName[]);
voidrefund(charIDName[]);
};
顾客Custom类同样继承于Ticket,类中主要包含一个Ticket的vector容器P及其迭代器pos和User的vector容器Q已经迭代器pos1;和两个带参功能函数book(char[])和defund(char[]);
界面Interface类:
classInterface
{
public:
voiddisplay();
voidIntroduceFace();
voidManagerFace();
voidCustomerFace();
};
界面Interface类中的四个函数分别显示不同的界面,display()为登录界面,IntroduceFace();为欢迎界面,ManagerFace();为管理员功能界面,CustomerFace();顾客功能界面。
菜单Menu类:
classMenu
{
public:
voidmanager(Interfacecfy);
voidcustomer(Interfacecfy,charIDName[]);
};
此类设计,是为了主函数显示简单明了,类中两成员函数manager(Interfacecfy);customer(Interfacecfy,charIDName[]);分别显示管理与售票的功能,接收功能选择。
账户操作UserInfo类:
classUserInfo
{
charIDName[30];
charpassword[7];
public:
UserInfo();
voidLogin();
voidRegister();
};
此类实现对账户的注册与登录。
其实管理员只能登录,无法注册!
五、程序代码与说明
一、功能函数:
1、注册
//——————————————注册——————————————
voidUserInfo:
:
Register()
{
charid[30];
while
(1)
{
cout<<"请输入您要注册的用户名:
\n";
gets(IDName);
cout<<"请输入您要注册的密码(6位):
\n";
gets(password);
if(strcmp(IDName,"CFY")==0)//保证不能注册管理员账户
{
cout<<"CFY为管理员账户,您不能注册!
请重新注册"<continue;
}
strcpy(id,IDName);
strcat(IDName,".txt");
ifstreamiFile(IDName,ios:
:
in);
if(!
iFile){
ofstreamoFile(IDName,ios:
:
out|ios:
:
app);
oFile.write((char*)&password,sizeof(password));
oFile.close();
cout<for(inti=1;i<=3;i++)
{
cout<
Sleep(1000);
}
system("cls");
Menucom;
Interfacecfy;
com.customer(cfy,IDName);
break;
}
else{
cout<<"对不起,您注册的账户名已存在,请重新输入一个新的账户名"<iFile.close();
}
}
}
2、登录
//——————————————登录——————————————
voidUserInfo:
:
Login()
{
charpw[7];
charid[30];
Menucom;
Interfacecfy;
cout<<"请输入用户名:
\n";
gets(IDName);
cout<<"请输入密码:
\n";
gets(password);
strcpy(id,IDName);
strcat(IDName,".txt");
ifstreamiFile(IDName,ios:
:
in);
if(!
iFile)
{
if(strcmp(IDName,"CFY.txt")==0&&strcmp(password,"1101")==0)
{
cout<<"欢迎管理员CFY,正在为您转入管理员系统,请稍后……"<for(inti=1;i<=3;i++)
{
cout<
Sleep(1000);
}
com.manager(cfy);
}
else
{
cout<"<<<"请重输入正确用户信息或进行注册"<<"\n\n\n摁回车键继续……"<getchar();
system("cls");
cfy.display();
}
}
else
{
iFile.read((char*)&pw,sizeof(pw));
if(strcmp(pw,password)==0)
{
cout<<"欢迎顾客"<for(inti=1;i<=3;i++)
{
cout<
Sleep(1000);
}
com.customer(cfy,IDName);
}
else
{
cout<<"用户名或密码错误,请重新登录!
"<<<"请重新登录或退出注册"<<"\n\n\n摁回车键继续……"<getchar();
system("cls");
cfy.display();
}
}
}
3、管理员功能选择:
//——————————————选择———————————————
voidMenu:
:
manager(Interfacecfy)
{
system("cls");
Managerboss;
boss.read();
intchoice2;
cfy.ManagerFace();
cin>>choice2;
do
{
switch(choice2)
{
case1:
boss.input();
break;
case2:
boss.show();
break;
case3:
boss.search();
break;
case4:
boss.change();
break;
case5:
boss.del();
break;
case6:
default:
boss.save();
system("pause");
system("cls");
cfy.display();
return;
}
getchar();
getchar();
system("cls");
cfy.ManagerFace();
cin>>choice2;
}
while
(1);
}
4、管理员——从文件中读取
//——————————————读取———————————————
voidManager:
:
read()
{
ifstreamiFile("MovieInfo.txt",ios:
:
in);
/*if(!
iFile)
cout<<"原库中不存在电影,请管理员添加"<Tickets;
iFile.read((char*)&s,sizeof(Ticket));
while(!
iFile.eof())
{
P.push_back(s);
iFile.read((char*)&s,sizeof(Ticket));
}
iFile.close();
}
5、管理员——录入
//——————————————录入——————————————
voidManager:
:
input()
{
system("cls");
cout<<"\n\n\n\t\t\t\t《录入模块》\n\n\n"<TicketMovie;
charch;
while
(1)
{
intdate[5],n;
charna[20];
doubley1,y2;
cout<<"\n请输入日期(2013-01-21):
";
cin>>date[0]>>ch>>date[1]>>ch>>date[2];
Movie.setYear(date[0]);
Movie.setMonth(date[1]);
Movie.setDay(date[2]);
cout<<"\n请输入放映时间(12:
30):
";
cin>>date[3]>>ch>>date[4];
Movie.setHour(date[3]);
Movie.setMinute(date[4]);
cout<<"\n请输入场次:
";
cin>>n;
Movie.setNum(n);
cout<<"\n请输入电影名称:
";
cin>>na;
Movie.setMovieName(na);
cout<<"\n请输入电影票价:
";
cin>>y1;
Movie.setPrice(y1);
cout<<"\n请输入会员折扣:
";
cin>>y2;
Movie.setDiscount(y2);
//Movie.setMap();
//Movie.setRest(100);
P.push_back(Movie);
cout<<"\n是否继续添加(y/n):
";
cin>>ch;
if(ch=='y')
continue;
if(ch=='n')
break;
}
}
6、管理员——显示
//——————————————显示——————————————
intTicket:
:
timecmp(inta[],intb[],intn)
{
inti;
for(i=0;i{
if(a[i]>b[i])
return1;
if(a[i]
return-1;
}
if(i==n)
return0;
}
voidManager:
:
show()
{
system("cls");
cout<<"\n\n\n\t\t\t\t《显示模块》\n\n\n"<cout<<"所有电影信息如下:
"<cout<<"_______________________________________________________________________________"<cout<<"日----期\t时-间\t场次\t电影名称\t票价\t折扣\t余票"<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};
pos=P.begin();
for(pos=P.begin();pos!
=P.end();pos++)
{
intdatatime[5];
datatime[0]=pos->getYear();
datatime[1]=pos->getMonth();
datatime[2]=pos->getDay();
datatime[3]=pos->getHour();
datatime[4]=pos->getMinute();
intr=timecmp(datatime,array,5);
cout<getYear()<<"-"<getMonth()<<"-"<getDay()<<"\t";
cout<getHour()<<":
"<getMinute()<<"\t";
cout<getNum()<<"\t"<getMovieName()<<"\t\t";
cout<getPrice()<<"\t"<getDiscount()<<"\t"<getRest();
if(r<=0)
cout<<"\a(已播放!
)"<else
cout<}
}
7、管理员——查找
//——————————————查找——————————————
voidManager:
:
search()
{
system("cls");
cout<<"\n\n\n\t\t\t\t《查找板块》\n\n\n"<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};
intchoice;
intok=0;
do
{
cout<cout<cout<";
cin>