MFC剧院票务管理和查询系统代码.docx
一. 主要类与算法剧目类class CDramachar m_name20;剧名char m_type10;类型char m_long10;时长char m_dire10;/导演char m_act10;主演int m_hall;/演出厅/int m_seat812;/座位号char m_date10;日期int m_price;/票价char m_starttime10;开始时间eg.14:59/int m_all;总票数int m_left;/剩余票数CDrama *next;/指向下一剧目的指针public:friend class CDramaList;CDrama(const char *a,const char *b,const char *c,const char *d,const char *e,const char *f,const char *g,int h,int j,int k) 构造函数,依次对上面声明的变量初始 化strcpy(m_name,a);strcpy(m_type,b);strcpy(m_long,c);strcpy(m_dire,d);strcpy(m_act,e);strcpy(m_date,f);strcpy(m_starttime,g);m_price=k;/m_all=i;m_left=j;m_hall=h;CDrama();剧目链表类class CDramaListCDrama *head;int CurDrama;public:CDramaList();CDramaList();AddDrama(const char *nm,const char *ty,const char *lg,const char *dr,const char *at,const char *dt,const char *st,int ha,int lf,int pr); 增加剧目int DeleteDrama(const char *nm,const char *dt,const char *st,int ha); /删除剧目int SaveDramaListToFile(const char *FileName); /保存汽车链表到文件(文件名)char* GetName(int id);/返回第id个剧目的名称char* GetType(int id);/返回第id个剧目的类型char* GetLong(int id); /返回第id个剧目的时长char* GetDire(int id);/返回第id个剧目的导演char* GetAct(int id);/返回第id个剧目的主演char* GetDate(int id);/返回第id个剧目的日期char* GetStartTime(int id); /返回第id个剧目的开始时间int GetHall(int id); 返回第id个剧目的演出厅int GetLeft(int id);/返回第id个剧目的剩余票数int GetPrice(int id);/返回第id个剧目的票价int GetCurDramaNum();获得当前列表中的车数int GetIdOfDrama(const char *nm); 返回某剧目首次出现的id号int LoadDramaListFromFile(const char *FileName);从文件中读剧目信息到链表(文件名)int GetIdOfDrama1(const char *nm,const char *dt,const char *st,int ha); /返回某剧目的 id 号int ShouPiao(const char *nm,const char *dt,const char *st,int ha);/售票int TuiPiao(const char *nm,const char *dt,const char *st,int ha);/退票/int GetStartTimeH(CString bc); 得到某班次发车时间的小时/int GetStartTimeM(CString bc); 得到某班次发车时间的分钟 ;实现增加剧目的算法int CDramaList:AddDrama(const char *nm,const char *ty,const char *lg,const char *dr,const char *at,const char *dt,const char *st,int ha,int lf,int pr) 增加剧目CDrama *check=head;while(check!=NULL)if(!strcmp(check->m_name,nm)&&!strcmp(check->m_date,dt)&&!strcmp(check->m_starttime,st)&&check->m_hall=ha) return -1;/有相同剧目check=check->next; if (head=NULL) head = new CDrama(nm,ty,lg,dr,at,dt,st,ha,lf,pr);head->next=NULL;CurDrama=1;return 0;CDrama *last=head;while(last->next !=NULL)last=last->next;last->next=new CDrama(nm,ty,lg,dr,at,dt,st,ha,lf,pr);last->next->next = NULL;CurDrama+;return 0;实现删除剧目的算法int CDramaList:DeleteDrama(const char *nm,const char *dt,const char *st,int ha) /删除剧目CDrama *pre=head,*del;if(!strcmp(pre->m_name,nm)&&!strcmp(pre->m_date,dt)&&!strcmp(pre->m_starttime,st)&&pre->m_hall=ha)head=head->next;delete pre;CurDrama-;return 0;int i;for(i=1;i<CurDrama;i+)if(!strcmp(pre->next)->m_name,nm)&&!strcmp(pre->next)->m_date,dt)&&!strcmp(pre->next)->m_starttime,st)&&(pre->next)->m_hall=ha)del=pre->next;pre->next=del->next;delete del;CurDrama-;return 0;pre=pre->next;return -1;售票算法int CDramaList:ShouPiao(const char *nm,const char *dt,const char *st,int ha) / 售票 int id;id=GetIdOfDrama1(nm,dt,st,ha);int i;CDrama *drama=head;for(i=1;i<=CurDrama;i+) if(i=id)if(drama->m_left=0)return -1;else drama->m_left-;return 0; drama=drama->next;return -1;退票算法int CDramaList:TuiPiao(const char *nm,const char *dt,const char *st,int ha) int id;id=GetIdOfDrama1(nm,dt,st,ha); int i;CDrama *drama=head;for(i=1;i<=CurDrama;i+)if(i=id)drama->m_left+;return 0; drama=drama->next;return -1;将信息存入txt文档的算法int CDramaList:SaveDramaListToFile(const char *FileName) /文件名 ofstream fout(FileName); if(!fout) return -5;fout<<"居目表n"<<endl;fout<<"剧目名称t "<<"类型 "<<"时长 "<<"导演 "<<"主演 "<<"日期 "<<"时间 "<<"演出厅"<<"剩余票数"<<"票价";if (CurDrama = 0) fout.close();return -2; 没有剧目,不输出回车直接返回 fout<<endl;int outputendl=1;让最后一行不输出回车的变量CDrama *drama=head;while(drama!=NULL) fout<<drama->m_name<<"t"<<drama->m_type<<"t " <<drama->m_long<<"t"<<drama->m_dire<<"t" <<drama->m_act<<"t"<<drama->m_date<<"" <<drama->m_starttime<<"t "<<drama->m_hall<<"t "<<drama->m_left<<"t "<<drama->m_price;if (outputendl < CurDrama) fout<<endl;outputendl+; / 让最后一行不输出回车 drama=drama->next;fout.close();return 0;/从txt文档将信息读入的算法int CDramaList:LoadDramaListFromFile(const char *FileName)/先调用与析构函数相同的代码删除整个链表(略有修改)if(head!=0) CDrama *last=head,*del=last->next;while(head->next!=NULL)while(last->next->next!=NULL) last=last->next;del=last->next;delete del;last->next=NULL;last=head;delete head;head=0;/析构函数代码引用至次ifstream fin(FileName,ios:in|ios:nocreate);if (!fin) return -1;返回一1表示读取文件失败char temp50;for (int i=1;i<=13;i+) fin>>temp;/跳过前面的表头汉字char nm10,char ty10,char lg10 ,char dr10,char at10,char dt10,st10;int ha,int lf,int pr;while (!fin.eof()fin>>nm>>ty>>lg>>dr>>at>>dt>>st>>ha>>lf>>pr;AddDrama(nm,ty,lg,dr,at,dt,st,ha,lf,pr);/bus=head;/while( bus->next !=NULL )bus=bus->next;/bus->CurSeats=cs;return 0;主界面类(大部分功能算法都在主界面类中实现)主界面的初始化BOOL CTTMSSDlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu item to system menu./ IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically / when the application's main window is not a dialog SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization here ifstream fin("config.ini"); 打开配置文件 dramalist.LoadDramaListFromFile("剧目信息.txt");剧目信息列表初始化m_listdrama.InsertColumn(0,"剧目名称",LVCFMT_RIGHT,76);m_listdrama.InsertColumn(1,"类型",LVCFMT_CENTER,90);m_listdrama.InsertColumn(2,"时长",LVCFMT_CENTER,90);m_listdrama.InsertColumn(3,"导演",LVCFMT_CENTER,70);m_listdrama.InsertColumn(4,"主演",LVCFMT_CENTER,90);m_listdrama.InsertColumn(5,"日期",LVCFMT_CENTER,124);m_listdrama.InsertColumn(6,"时间",LVCFMT_CENTER,124);m_listdrama.InsertColumn(7,"演出厅",LVCFMT_CENTER,124);m_listdrama.InsertColumn(8,"剩余票数",LVCFMT_CENTER,124);m_listdrama.InsertColumn(9,"票价",LVCFMT_CENTER,124);ListView_SetExtendedListViewStyle(m_listdrama.m_hWnd, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);flushdrama();return TRUE; / return TRUE unless you set the focus to a control 点击查询按钮后执行的函数(查询功能的实现)void CTTMSSDlg:OnButton1()/ TODO: Add your control notification handler code here int nRetCode=dlg.DoModal(); /打开查询窗口if (nRetCode=IDOK) /添加点击查询窗口的确定后的代码在这儿!CResultDlg rdlg;CString temp_name;temp_name=dlg.m_name;if (temp_name.IsEmpty() return;if ( dramalist.GetIdOfDrama(temp_name) = -1) MessageBox("您所要查询的 剧目不存在!请检查剧目名称”,”系统提示");return;dlg.m_name=temp_name;rdlg.m_keyword=dlg.m_name;rdlg.DoModal();点击交易按钮后执行的函数void CTTMSSDlg:OnButtonExc()/ TODO: Add your control notification handler code here CExchangeDlg dlg;int nRetCode1=dlg.DoModal();if(nRetCode1=IDOK)switch(dlg.m_choice)case 0:if(IDOK=MessageBox("确定要买这张票吗?","系统提示",MB_OKCANCEL ) intOKORNOT=dramalist.ShouPiao(dlg.m_name,dlg.m_date,dlg.m_time,atoi(LPCSTR)dlg.m_hall); if(OKORNOT=0)MessageBox("买票成功!"广系统提示"); dramalist.SaveDramaListToFile('剧目信息.txt"); flushdrama();if(OKORNOT=-1)MessageBox("该场次已经没有票了,请购买其他场次!","系统提示break; case 1: if(IDOK=MessageBox("确定要退这张票吗?","系统提示",MB_OKCANCEL ) dramalist.TuiPiao(dlg.m_name,dlg.m_date,dlg.m_time,atoi(LPCSTR)dlg.m_hall); MessageBox("退票成功!","系统提示"); dramalist.SaveDramaListToFile('剧目信息.txt"); break; 点击设置按钮后执行的函数 void CTTMSSDlg:OnButtonSet() / TODO: Add your control notification handler code here CSetDlg dlg; int OkOrNot; dlg.m_answer=0;int nRetCode1=dlg.DoModal(); if (nRetCode1=IDOK) switch(dlg.m_answer)/添加还是删除的判断 case 0: int left; if(atoi(LPCSTR)dlg.m_hall)=1)left=80; if(atoi(LPCSTR)dlg.m_hall)=2)left=48; if(atoi(LPCSTR)dlg.m_hall)=3)left=24; OkOrNot=dramalist.AddDrama(dlg.m_name,dlg.m_type,dlg.m_long,dlg.m_dire,dlg.m_act,dl g.m_date,dlg.m_starttime,atoi(LPCSTR)dlg.m_hall),left,atoi(LPCSTR)dlg.m_price); if (OkOrNot = -1) MessageBox("已存在该剧目,请填入其他剧目。"," 系统提示");if (OkOrNot = 0) MessageBox("添加成功!","系统提示"); break; case 1: OkOrNot=dramalist.DeleteDrama(dlg.m_name,dlg.m_date,dlg.m_starttime,atoi(LPCSTR)dlg .m_hall);if (OkOrNot = 0) MessageBox("删除成功!"厂系统提示");else MessageBox("该剧目不存在,请检查剧目信息!","系统提示"); break;/the end of switch(sz1dialog.m_answer)dramalist.SaveDramaListToFile("剧目信息.txt");/保存剧目信息flushdrama();二. 开发背景随着人民生活水平的提高,居民文化生活也日趋丰富。戏剧作为一种相对高雅的艺术形 式受到越来越多高学历背景、高收入人群的欢迎,成为他们日常休闲和访亲会友的一种常见 的娱乐方式。在北京,像国家大剧院、保利剧院、梅兰芳大剧院等高档次的剧院经常因为一 部好剧而整场爆满。对于大大小小的剧院来说,一款功能完善,系统稳定的票务软件可以使 日常的票务管理和查询工作更加方便、准确和快捷。本系统具有基本的票务设置、信息储存、买票、买票以及票务查询等功能,系统运行稳 定,可以大大提高剧院管理系统的工作效率。本剧院票务管理与查询系统采用微软公司的 Visual C+ 6.0作为主要的开发工具。三. 软件使用说明1.进入主界面后,主界面的列表中将显示全部存储的剧目信息,双击列表中的某一项将出现 该剧目的详细信息,并有买票和退票按钮。右边为操作选项。醺巨幕各昔理与查询亲统应剧目列表剧目名称时长导演 主演 日期新暗恋桃花源 新白殖子传奇 马可波罗 做骨贤妻 新暗恋桃花源BWWWB lBBJi土 台灰舌舌台 莽部舞120张阳180刘易阳180 汉密尔.170Alicia120张阳磊瞬顿chM黄诵巴za黄2011-0 2011-7 2011-E 2011-0 2011-7查询交易票务设置帮助退出rrr2.查询功能1)点击主界面右侧的查询按钮,出现查询对话框,输入要查询的剧目名称 查询剧目信息请输入剧目名称剧目名称:|新暗恋桃花源I确定 返回2)点击右侧的确定按钮,出现查询结果界面,列出全部该剧的信息,双击某一项仍然可以显示详细信息并可以买票或退票。进行买票或者退票。四. 设计说明1)功能结构图2)数据字典属性名储存代码类型剧目名称m_nameCString导演m_direCString主演m_actCString类型m_typeCString时长m_longCString日期m_dateCString开始时间m_starttimeCString演出厅m_hallCString剩余票数m_leftCString票价m_priceCString五. 需求分析通过对剧院票务系统的分析,发现剧院票务系统需要完成以下几个方面的任务1)查询剧目信息:包括剧目名称、类型、时长、导演、主演、日期、开始时间、演出厅、 剩余票数、票价等的查询。2)买票和售票:实现买票和退票的功能,剩余票数会根据命令的不同进行相应的调整。3)票务设置:可以增加或删除剧目信息。