C++程序设计课程设计说明书电影院售票系统.doc
内蒙古科技大学本科生C+程序设计课程设计说明书题 目:电影院售票系统 学生姓名: 学 号:专 业:计算机科学与技术班 级:计2010-1班指导教师: 成绩评定标准课程设计的验收答辩采取“讲解程序+提问+即时编程”的方式。考核项目评价质量成绩程序功能完全实现,并能通过答辩。(60%)A能完全正确回答提问;B问题回答的基本意思正确;C不能回答或回答错误,抽取程序小的功能即时编程,能完成;D不能回答或回答错误,即时编程无法完成;程序设计符合面向对象的思想和原则,结构合理(15)A程序结构层次分明,提取出各个实体类,类的设计合理;B程序结构层次分明,具有客户类和服务类;C类的设计基本正确;D几乎在一个类或者方法中实现了大部分的逻辑,结构不够清晰;程序的风格(10%)A遵守编码规范,有良好的风格; 以下问题每出现一项成绩降一个等级: 1类、方法和变量命名不符合规范; 2方法和属性前缺少注释; 3程序没有适当缩进;设计说明书(15%)从以下几方面考核: 1结构完整 2图表正确 3文字通顺 4版面工整目 录成绩评定标准2【摘要】5第一章 问题描述61.1 电影院售票管理系统的设计6第二章 问题分析82.1 阐述你对问题的理解、解决问题的方案说明82.2 系统功能模块的划分8第三章 数据模型103.1 相关数据结构的说明类的设计103.2 程序结构说明,即程序各个部分之间如何协调来完成任务123.3 全局变量,重要形式参数、局部变量等等,它们的命名及用途解释15第四章 算法描述184.1 解题算法的设计思路介绍184.2 主要程序代码,加上详细的注释204.3 画出程序流程图44第五章 设计总结55第六章 附录56参考文献75 【摘要】电影院售票管理系统两个模块管理系统和售票系统。1.管理系统具有如下功能:(1)录入信息:且可不定时增加数据。并根据放映时间排序。(2)浏览信息:可显示出某日期所有放映信息,如果当前系统时间超过了某电影的放映时间,则显示“此电影放映结束”的提示信息。(3)查询电影:可按日期或电影名查询。并显示目标的详细信息。 (4)修改信息:可根据电影名修改该电影的各种信息(余票除外)并简单排序。(5)删除电影:根据电影名找到该电影并删除。2.售票系统功能如下:(1)售票:售票即为影片预定。可根据输出的可预订信息选择订票,如果该影片已放映,则提示不能订票,如果售票成功,自动跟新座位数。(2)退票:影片退订即退票。根据放映时间和系统时间来判断是否能进行退票,并自动更新座位数。其他参数:程序中定义了一个node结构和一个ticket类。结构用来存信息,节点类存节点长度,和管理里面的数据。第一章 问题描述1.1 电影院售票管理系统的设计1.设计资料及参数:用C+设计一个系统,能提供下列服务:(1)录入放映信息,格式为:放映日期放映时间场次电影名称票价会员折扣剩余座位2011-11-210:301桃姐308782011-11-214:002桃姐30886可不定时地增加放映数据。(2)浏览放映信息,可显示出某日期所有放映信息,如果当前系统时间超过了某电影的放映时间,则显示“此电影放映结束”的提示信息。(3)查询电影:可按日期或电影名查询。 (4)售票和退票功能A:查询电影名。当剩余座位数大于0,并且当前系统时间小于放映时间时才能售票,计算会员折扣,售票后自动更新剩余座位数。B:退票时,输入退票的电影名和场次,当电影未放映时才能退票,如果以会员折扣购买的电影票,退票按照折扣价退款,退票后自动更新剩余座位数。2.设计要求及成果根据系统功能要求,可以将问题解决分为以下步骤:(1)分析系统中的各个实体之间的关系及其属性和行为;(2)根据问题描述,设计系统的类层次;(3)完成类层次中各个类的描述(包括属性和力一法);(4)完成类中各个成.员函数的定义;(5)完成系统的应用模块;(6)功能调试;(7)完成系统总结报告以及系统使用说明书。第二章 问题分析2.1 阐述你对问题的理解、解决问题的方案说明由设计题目知电影院售票管理系统主要可分为两个大模块:1.管理系统2.售票系统。对整个系统进行功能分析不难发现,管理系统和售票系统的权限是不一样的,管理系统具有管理员权限,可以对所有数据的信息进行操作,比如:录入(input)、显示(show)、查找(search)、修改(change)、删除(del);而售票系统则只进行售票(sell)和退票(refund)。所以需要设计一个manager和customer函数来区分权限的函数。所以,manager里包含了需要实现的input、show、search、change、del等函数来满足管理要求的功能。Customer包含sell和refund。2.2 系统功能模块的划分系统的模块图如下:欢迎界面主函数售票customer管理manager删除退票售票显示输入查找修改管理函数进入时需要管理密码:1234运行程序时,需要先输入数据,根据需要在对数据进行简单操作。录入时,每录入一个信息就会对现有信息进行插入排序。显示数据时,会先跟系统时间比较,如果小于系统当前时间,则输出提示“已播放”。查找时满足要求的按名字查找和按日期查找。找到之后与系统时间比较输出提示,如果没找到,输出提示。修改函数支持多种修改,可以避免输入的一些错误。也可以修改日期,以调整放映时间。删除函数是为防止输入错误,或是内存不够用而设计的。比如前几天已播放的,在内存中如果作用不是很大,完全是可以删除的。这样能跟有效利用资源。售票系统设计较为简单,主要是订票和退票。订票函数中会先给出可预订的提示,这样可以更有效订票。输入之后会先检查是否播放,若播放则给出提示,退出。若未找到,则同样给出提示。如果票卖光了,仍然有提示,如果电影达到预定要求,则先给出现有座位的预订情况,方便用户高效率订票。当客户输入一座位时程序会判断这个作为是否被预订,如果是,则给出提示;如果no就输出用户需要支付的金额,并记录在座位号对应的数组中。方便退票时退款。订票成功后还会输出现有座位的信息方便核实。其中订票和退票函数都是用大篇幅(一两百行)来构建起强大而有完善的提示功能,趋于人性化的设计跟拉近了与客户的距离。第三章 数据模型3.1 相关数据结构的说明类的设计程序中定义的数据:struct nodeint year;int month;int day;int hour;int minute;int datetime5;/装时间 ,方便比较 int num;string name;float price;float discount;int rest;float seat1010;class ticketprivate:node ticN;int len;public:ticket();ticket();int sort(int i);void input();void show();void search();void change();void del();void sell();void refund();tick;对系统进行数据分析就会知道电影院售票管理系统主要处理的是基本电影信息。每个电影的基本信息放在struct node中定义,包括基本的放映日期(date),时间(time),场次(num),影片名(name),票价(price),会员折扣(discount)及余座(rest)。其中日期是包含有年、月、日,时间包含时、分,整形数据,其中还有一个数组(detetime5)是把该影片时间存储进去,方便以后的排序和与系统时间比较。还有一个而二维数组seat1010,是用来存储座位信息(初始化全为0),如果此座位被预定,则对应的座位存的就是订票时的付款,这也方便了退票时的退款。还要解决数据的组织问题,怎么才能把不同的电影存起来呢?方法目前只学了两种,数组和链表。数组和链表各有优缺点。用链表实现虽然对空间进行了充分利用,但其对数据的存储让人实在无奈,并且操作也不容易实现。剩下就是数组了,虽然需要定义一个大点的数组,但其对数据操作非常方便,这深受初学者的我们的青睐。所以在ticket类中定义了个node50。如果需要扩大直接改文件前的#define N后的数字就可以了。其实质随意选择把电影信息存在结构体而不是类中,主要考虑到,结构体存取数据的方便性,而采用类无疑会给程序很多负担存取。数据组织结构图:ticket类Input()Show()Search()Change()Del()Sell()Refund()lennode503.2 程序结构说明,即程序各个部分之间如何协调来完成任务程序的主要实现过程是在ticket类 中定义的成员函数来实现完成,并且在类外定义。这样方便了对数据进行操作。并且定义了一个全局的比较函数timecmp,可以比较两个时间数组的大小。此函数在程序中用途很广泛,每次输入输出都需要与系统时间进行比较,所以在每个操作函数中都用到了。此外sort函数也是非常有用的,它主要用在输入和修改上。每次更新数据都会根据现有数据的时间进行排序。这也方便了读数据的客户。其中程序总很多代码是重复用到的,但是没有写成函数来调用有两点原因。首先如果写成函数调用的话会降低程序的可读性,其次写成函数的话,代码就固定下来了,使得程序不够灵活。所以在程序不必要的地方,就用代码来代替函数调用。举个例子说,在修改,删除,订票,退票中都会用到按电影名查找。可是没有单独把按电影名查找单独写成函数来调用,是因为在按电影名查找会输出很多详细的电影信息,会使客户感觉到是在浪费时间。下面是按电影名查找的代码片段:for(i=0;i<tick.len;i+)/遍历 if(timecmp(tick.tici.datetime,temp,3)=0)/找到 k+;/找到的记录数 if(j=1) cout<<"n 查找结果如下:"<<endl; cout<<"_"<<endl; cout<<"日-期t时-间t场次t电影名称t票价t折扣t余票"<<endl<<endl; j+; cout<<tick.tici.year<<"-"<<tick.tici.month<<"-"<<tick.tici.day<<"t" cout<<tick.tici.hour<<":"<<tick.tici.minute<<"t" cout<<tick.tici.num<<"t"<<tick.tici.name<<"tt" cout<<tick.tici.price<<"t"<<tick.tici.discount<<"t"<<tick.tici.rest; time_t t; struct tm *tim; t=time(NULL);/获取当前系统时间 tim=localtime(&t); int array5=tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min; int s; s=timecmp(tick.tici.datetime,array,5);/与系统时间比较 if(s<=0) cout<<"a(已播放!)" <<endl; else cout<<endl; cout<<endl<<"tttt当前预订情况" for(int m=0;m<10;m+) cout<<endl<<"t" for(int n=0;n<10;n+) cout<<"" if(tick.tici.seatmn!=0) cout<<"有人" else cout<<"无人" cout<<"" cout<<endl;if(j!=1)cout<<endl;system("pause");/任意键继续 return;if(i=tick.len&&k=0)cout<<"natttt未找到结果!"<<endl;system("pause");/任意键继续 return;而在另一些函数种植需要提示用户找没找到就可以了。下面是del函数的按电影名查找for(i=0;i<tick.len;i+)if(tick.tici.name=na)/找到j+;for(int j=i+1;j<tick.len;j+)tick.ticj-1=tick.ticj;cout<<endl<<"tttt删除成功!n"tick.len-; if(i=tick.len&&j=0) cout<<"natttt未找到结果,删除失败!n"<<endl;system("pause");/任意键继续 return;后面的就不再一一列举。3.3 全局变量,重要形式参数、局部变量等等,它们的命名及用途解释1.#define N 50/可存电影总数 2.程序中定义的数据:struct nodeint year;/年int month;/月int day;/日int hour;/时int minute;/分int datetime5;/装时间 ,方便比较 int num;/场次string name;/电影名float price;/票价float discount;/会员折扣int rest;/余票float seat1010;/座位信息;class ticketprivate:node ticN;/存电影的数组int len;/现有电影数量public:ticket();/构造函数ticket();/析构函数int sort(int i);/排序void input();/录入void show();/显示void search();/查找void change();/修改void del();/删除void sell();/订票void refund()/退票;tick;3. int timecmp(int a,int b,int n)/时间比较函数,先把时间装入两个数组,把数组地址传进来,比较a,b分别是数组名。n表示循环比较的次数。4. char ch;/接受日期中的字符或:5. string na;/输入的姓名6. time_t t;/时间变量,已包含在头文件库函数ctime中。7. struct tm *tim;/时间类型的结构体8. t=time(NULL);/获取当前系统时间9. tim=localtime(&t);10. int array5=tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min;/将系统时间装入数组,方便比较11. int k=0;/标记找到的记录12. r=timecmp(tick.tici.datetime,array,5);/与系统时间比较 ,返回值给r。13. int j=0;/修改函数中标记修改数量14. string inpass;/manager函数中的管理员密码初始值123415. Flag,as,choice/是用来存接受的选择的第四章 算法描述4.1 解题算法的设计思路介绍timecmp函数是用来比较日期时间函数,它需要先把两个时间装入数组再传进来地址,然后从年月日时分进行比较。如果有大小区分,直接返回。int timecmp(int a,int b,int n)for(int i=0;i<n;i+)if(ai>bi)return 1;if(ai<bi)return -1;if(i=n)return 0;/Sort函数主要是对第i个元素进行插入排序。需要先遍历数组然后插入到第一个比他大的元素前面。int ticket:sort(int i)int r,n,j;for(j=0;j<i;j+)/从首元素开始比较日期 r=timecmp(tick.tici.datetime,tick.ticj.datetime,5);if(r=-1)/找到第一个比他大的日期 ,插入其前面 break;if(j=tick.len-1)return j;if(j=i)for(j=i+1;j<tick.len;j+)/从首元素开始比较日期 r=timecmp(tick.tici.datetime,tick.ticj.datetime,5); if(r=-1)/找到第一个比他大的日期 ,插入其前面 break;node temp=tick.tici;if(j<i) for(n=i;n>j;n-) tick.ticn=tick.ticn-1; tick.ticj=temp; return j;elseif(j=tick.len)for(n=i;n<j-1;n+) tick.ticn=tick.ticn+1;else for(n=i;n<j;n+) tick.ticn=tick.ticn+1;tick.ticn=temp;return n;4.2 主要程序代码,加上详细的注释下面简单介绍一下程序运行结果主函数开始运行界面:docout<<endl<<endl<<endl<<endl;cout<<"tttt欢迎使用电影售票系统" cout<<endl<<endl<<endl;cout<<"ntttt1.管理系统"cout<<"ntttt2.售票系统"cout<<"nnntttt请选择:"cin>>choice;switch(choice)case '1':manager();break;case '2':customer();break;default :exit(0); while(1);Manager系统代码及运行截图密码输入界面代码docout<<endl<<"请输入管理员密码:"string inpass;char a;cin>>inpass; if(inpass=password)break;elsecout<<endl<<"atttt密码错误!" cout<<endl<<"是否继续输入?(Y/N)"cin>>a;if(a='N'|a='n')exit(0);while(1);选择菜单代码 do cout<<"ntttt欢迎进入管理系统nn" cout<<"ntttt1.录入影片" cout<<"ntttt2.显示影片" cout<<"ntttt3.查找影片" cout<<"ntttt4.修改影片" cout<<"ntttt5.删除影片" cout<<"ntttt6.退出" cout<<"nnntttt请选择:" cin>>as; switch(as) case '1':tick.input();break; case '2':tick.show();break; case '3':tick.search();break; case '4':tick.change();break; case '5':tick.del();break; case '6':default :system("pause"); return;/任意键继续 while(1);选择1管理系统>输入密码选择1>录入void ticket:input()/录入信息 system("cls");/清屏 char ch;/接受日期中的字符或: cout<<"nnntttt录入模块nnn"<<endl; for(int i=tick.len;i<N;i+) cout<<"n请输入日期(2011-11-11):" cin>>tick.tici.year>>ch>>tick.tici.month>>ch>>tick.tici.day; cout<<"n请输入放映时间(12:30):"cin>>tick.tici.hour;cin>>ch;cin>>tick.tici.minute; tick.tici.datetime0=tick.tici.year; tick.tici.datetime1=tick.tici.month; tick.tici.datetime2=tick.tici.day;tick.tici.datetime3=tick.tici.hour;tick.tici.datetime4=tick.tici.minute; cout<<"n请输入场次:" cin>>tick.tici.num; cout<<"n请输入电影名称:" cin>>tick.tici.name; cout<<"n请输入电影票价:" cin>>tick.tici.price; cout<<"n请输入会员折扣:" cin>>tick.tici.discount; tick.tici.rest=100; for(int m=0;m<10;m+) for(int n=0;n<10;n+)tick.tici.seatmn=0; tick.len+;/个数加1 if(i!=0)/按时间,插入排序 int j=sort(i); 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; 选择n退出>选2显示。代码如下=cout<<"nnntttt显示模块nnn"<<endl;cout<<" 所有电影信息如下:"<<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 array5=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.tici.datetime,array,5); cout<<tick.tici.year<<"-"<<tick.tici.month<<"-"<<tick.tici.day<<"t" cout<<tick.tici.hour<<":"<<tick.tici.minute<<"t" cout<<tick.tici.num<<"t"<<tick.tici.name<<"tt" cout<<tick.tici.price<<"t"<<tick.tici.discount<<"t"<<tick.tici.rest; if(r<=0) cout<<"a(已播放!)" <<endl; else cout<<endl; =选择1>继续录入选择2>显示选3>查找查找的界面代码=cout<<"nnntttt查找模块nnn"<<endl; do cout<<endl<<"tttt1.按影片名查找" cout<<endl<<"tttt2.按日期查找" cout<<endl<<"tttt请输入查找模式:" cin>>flag; if(flag!='1'&&flag!='2') cout<<"natttt选择有误!请选择正确的查找模式。"<<endl; while(flag!='1'&&flag!='2');=按电影名查找代码=string na;int j=1;cout<<"n请输入影片名:"cin>>na;for(i=0;i<tick.len;i+)if(tick.tici.name=na)/找到 k+;/找到的记录数 if(j=1) cout<<"n 查找结果如下:"<<endl; cout<<"_"<<endl; cout<<"日-期t时-间t场次t电影名称t票价t折扣t余票"<<endl<<endl; j+; cout<<tick.tici.year<<"-"<<tick.tici.month<<"-"<<tick.tici.day<<"t" cout<<tick.tici.hour<<":"<<tick.tici.minute<<"t" cout<<tick.tici.num<<"t"<<tick.tici.name<<"tt" cout<<tick.tici.price<<"t"<<tick.tici.discount<<"t"<<tick.tici.rest; time_t t; struct tm *tim; t=time(NULL);/获取当前系统时间 tim=localtime(&t); int array5=tim->tm_year+1900,tim->tm_mon+1,tim->tm_mday,tim->tm_hour,tim->tm_min; int r; r=timecmp(tick.tici.datetime,array,5);/与系统时间比较 if(r<=0) cout<<"a(已播放!)" <<endl; else cout<<e