2022年车站票务管理系统程序设计报告 .pdf
-程序设计报告(2012 /2013 学年 第 一 学期)题目:车站票务管理系统专业学生姓名班级学号指导教师指导单位计算机系统与网络教学中心日期 2012.11.02 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 30 页 -评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:年月日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 30 页 -车站票务管理系统一、课题内容和要求【问题描述】一车站每天有 n 个发车班次,每个班次都有一班次号(1、2、3,n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量,票价,如:班次发车时间起点站终点站行车时间额定载量已定票人数余票票价1 8:00 南京苏州 2 45 30 15 100 2 6:30 南京扬州 1.5 40 40 0 56 3 7:00 南京镇江 1 40 20 20 32,该系统要求完成车票管理系统,能对车站的发车班次进行查询、实现买票、退票功能。通过此课题,熟练掌握数组、文件、结构体、指针的各种操作,以及一些算法思想的应用。【功能要求】(1)用户需要输入口令进入车站票务管理系统;(2)录入汽车班次信息(信息用文件保存),可不定时地增加班次数据;(3)浏览班次信息,可显示出所有班次当前状态(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息);(4)查询路线:可按班次号查询,可按终点站查询;(5)售票和退票功能当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数。退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数;(6)界面友好,输入信息符合逻辑如额定载量不为负数等。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 30 页 -二、需求分析售票系统要求存储当天各个车次售票情况,所以程序需要定义结构体变量存储售票情况。系统的整体功能通过记录当天各个车次了解售票情况。编程时采取模块化设计思想,设计主函数,通过主函数中的switch分支选择调用各子函数以实现该系统的各种功能。然后设计相应的子函数来执行系统的各种功能,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。1、经过对程序设计题目的分析可知,整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是密码验证、班次的增加和修改、查询班次信息、卖票函数、退票函数。1)密码验证:要求验证密码正确时才能进入系统。2)班次的增加修改:要求能够申请空间增加班次并修改班次的信息。3)查询班次:要求能够通过班次,终点站,始发站等信息查询到班次的全部信息。4)买票:要求买票量不能超出余票量,同时车开出后不再售票。5)退票:要求退票量不能超出额定票量。2、增强了程序的实用性,使系统用户界面友好、功能明确、操作方便,应采取直接在界面上输出可供用户选择的菜单。据此应该能够很好的完成要求三、概要设计(1)类:#include#include#include#include class Ticket char no9;/车次char name_b10;/起点站char name_a10;/终点站Time time_o;/发车时间int time;/行车时间名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 30 页 -int price;/车票价格int load;/额定数量int remainder;/余票数量public:void sell(fstream&f);/售票功能void back(fstream&f);/退票功能void searchbynumber(fstream&f);/按车次查询void searchbybeginplace(fstream&f);/按起点站查询void searchbyendplace(fstream&f);/按终点站查询void insert(fstream&f);/录入车次信息void disp(fstream&f);/浏览班次void order(fstream&f);/时间表排序friend ostream&operator(ostream&out,const Ticket&t);/定义重载输出运算符的友元函数bool findno(char n)/用于判断输入的字符串是否与查找区域中的某个字符串一致 if(strcmp(no,n)=0)return true;else return false;bool findname_b(char n)if(strcmp(name_b,n)=0)return true;else return false;bool findname_e(char n)if(strcmp(name_e,n)=0)return true;else return false;(2)主要函数流程图:浏览班次信息:显示所有的班次信息,并标记已发出的车次。按班次号查询路线:根据用户输入的班次号查找匹配项的班次信息。按起点站查询路线:根据用户输入的起点站查找匹配项的班次信息。按终点站查询路线:根据用户输入的终点站查找匹配项的班次信息。排列发车时间表:利用冒泡法按照发车时间的升序排列车次信息名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 30 页 -售票:用户输入指定的班次和售票数目进行售票退票:用户输入指定的班次和售票数目进行售票开始开始打开文件打开文件输入售票数目输入退票数目输入班次号是否输入班次号车是否已发出?余 票数 目是 否为零票已售完否是售票此车已发出结束是否找到?是是否找到?否未 找 到 该车次信息是否未 找 到 该车次信息!退票结束名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 30 页 -四、源程序代码#include#include#include#include#include#include#include#include class Time;class Ticket;void CreatFile(char*);void ChangNo(Ticket*p,int*number);void AddNo(Ticket*p,int*number);void NewNo(Ticket*p,int*number);void ShowTrain(Ticket*p,int*number);int FindTrain(Ticket*p,int*number,int*,int*);int FindNoTrain(Ticket*p,int*,int*,int*);int FindaTrain(Ticket*p,int*,int*,int*);void ShowTimeTrain(Ticket*p,int*number);void SellReturnTicket(Ticket*p,int*number,int i,int j);void SellTicket(Ticket*p,int*number,int i,int j);void ReturnTicket(Ticket*p,int*number,int i,int j);void checkpassword();/定义时间类class Time private:int hour;int minute;public:Time(int h=0,int m=0)hour=h;minute=m;void SetTime()/设置时间 int i=0;cout请输入发车时间(小时):hour;cout 请输入发车时间(分钟):minute;do 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 30 页 -if(i!=0)cout 输入错误,请重新输入!endl;cout 请输入发车时间(小时):hour;cout 请输入发车时间(分钟):minute;i+;while(hour24|hour60|minute0);/判断时间是否符合逻辑 void PrintTime()/显示时间 if(minute=0)coutsetw(8)hour:00;else coutsetw(8)hour:setw(2)minute;int GetHour()/获得时 return hour;int GetMinute()/获得分钟 return minute;void ChangTime(int h,int m)/修改时间 hour=h;minute=m;/定义车次类class Ticket private:char no9;/车次char name_b10;/起点站char name_a10;/终点站Time time_o;/发车时间int load;/额定载量int reminder;/余票数量int time;/行车时间名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 30 页 -int price;/车票价格public:Ticket(char*No,int h,int m,char*Name_b,char*Name_a,int t,int Load,int Reminder,int Price):time_o(h,m)strcpy(no,No);strcpy(name_b,Name_b);strcpy(name_a,Name_a);time=t;load=Load;reminder=Reminder;price=Price;Ticket()void SetTicket()/设置票务 cout 请输入车次:no;time_o.SetTime();cout 请输入起点站:name_b;cout 请输入终点站:name_a;cout 请输入行车时间:time;int i=0;do if(i!=0)cout 行车时间必须为正数!请重新输入行车时间:time;i+;while(time0);/行车时间必须为正数 cout 请输入额定售票量:load;int i=0;do if(i!=0)cout 额定售票必须为正数!请重新输入额定售票:load;i+;while(load=0);/额定售票必须为正数 cout 请输入余票数量:reminder;int i=0;do if(i!=0)if(reminder0)cout 余票数量必须少于载定数量!请重新输入余票数量:endl;cout 目前载定数量为:loadreminder;else cout 余票数量必须为正数!请重新输入余票数量:reminder;i+;while(reminderload);/余票必须为正数并且余票不能大于载定数量 cout 请输入车票价格:price;int i=0;do if(i!=0)cout 车票价格必须为正数!请重新输入车票价格:price;i+;while(price=0);/车票价格必须为正数 void ChangTicket(Ticket ticket)/修改车次信息 strcpy(no,ticket.GetNo();strcpy(name_b,ticket.GetName_b();名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 30 页 -strcpy(name_a,ticket.GetName_a();time=ticket.Gettime();load=ticket.GetLoad();reminder=ticket.GetReminder();price=ticket.GetPrice();time_o.ChangTime(ticket.time_o).GetHour(),(ticket.time_o).GetMinute();void PrintTicket()/显示车次信息 cout setw(4)no;time_o.PrintTime();coutsetw(6)name_b setw(8)name_a setw(8)time setw(8)load setw(8)reminder setw(8)price endl;cout|*|*|*|*|*|*|*|*|endl;friend void AddReminder(Ticket&,int n);/定义添加余票数为类的友元函数friend void MinReminder(Ticket&,int n);/定义减少余票数为类的友元函数char*GetNo()/获得车次 return no;char*GetName_b()/获得起始站 return name_b;char*GetName_a()/获得终点站 return name_a;int Gettime()/获得时间 return time;int GetLoad()/获得额定售票量 return load;int GetReminder()/获得余票数 return reminder;int GetTimeHour()/获得小时名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 30 页 -return time_o.GetHour();int GetTimeMinute()/获得分钟数 return time_o.GetMinute();int GetPrice()/获得价格 return price;void MinReminder(Ticket&t,int n)/定义减少余票数 t.reminder=t.reminder-n;void AddReminder(Ticket&t,int n)/定义添加余票数 t.reminder=t.reminder+n;int count=0;/定义全局变量用来统计指针数组的长度int main()coutendlendl;cout*endlendl;cout#请输入密码#endlendl;cout*endlendl;checkpassword();/密码验证模块CreatFile(车票信息.dat);/ofstream outf(车票信息.dat);/第一次以后使用CreatFile(sort.dat);/ofstream outf(sort.dat);/第一次以后使用int choice;int flag=1;int i,j;int number100;/用来存每个指针中元素的个数Ticket*p100;/定义指针数组coutendlendl;cout*endlendl;cout#欢迎使用车站票务管理系统#endlendl;cout*endlendl;coutendl;while(flag)/菜单控制 名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 30 页 -cout*菜单选择*endlendl;cout*1.修改车次信息*endl;cout*2.浏览车次信息*endl;cout*3.票务查询*endl;cout*4.显示时间表*endl;cout*5.售票退票*endl;cout*6.退出系统*endlendl;cout*endlendlendl;cout 请选择您要进行的业务:choice;if(cin.fail()/如果输入不匹配,fail()会返回真 cinchoice;cout 非法选择,请重新输入:endl;cin.clear();/清除 fail 状态cin.ignore();/清除缓冲区continue;else break;switch(choice)case 1:system(cls);coutendlendlendl;ChangNo(p,number);break;case 2:system(cls);coutendlendlendl;ShowTrain(p,number);break;case 3:system(cls);名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 30 页 -coutendlendlendl;FindTrain(p,number,&i,&j);break;case 4:system(cls);coutendlendlendl;ShowTimeTrain(p,number);break;case 5:system(cls);coutendlendlendl;SellReturnTicket(p,number,i,j);break;case 6:flag=0;system(cls);coutendlendlendl;cout*endlendl;cout#感谢您的使用,再见!#endlendl;cout*endlendl;break;default:cout 输入错误,请重新输入:endlendl;return 0;/函数功能:文件创建函数void CreatFile(char*s)ofstream outf(s);if(!outf)coutCannot open the filenendl;return;outf 车次发车时间起点站终点站行车时间额定载量余票数量n;/向文件中输入表头outf.close();名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 30 页 -/函数功能:更新车次函数void ChangNo(Ticket*p,int*number)int flag=1,choice;/菜单控制while(flag)cout*菜单选择*endlendl;cout*1.新增车次信息*endl;cout*2.修改车次信息*endl;cout*3.退出更新系统*endl;cout*4.返回主菜单*endlendl;cout*endlendl;cout 请输入您的选择:choice;if(cin.fail()/如果输入不匹配,fail()会返回真 cinchoice;cout 输入错误,请重新输入:endl;cin.clear();/清除 fail 状态cin.ignore();/清除缓冲区continue;else flag=0;break;switch(choice)case 1:AddNo(p,number);break;case 2:NewNo(p,number);break;case 3:flag=0;system(cls);coutendlendlendl;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 30 页 -break;case 4:flag=0;system(cls);coutendlendlendl;break;default:cout 输入错误,请重新输入:endlendl;return;/函数功能:增加车次void AddNo(Ticket*p,int*number)int n,i,j;coutn;/输入此次增加车次的数量pcount=(Ticket*)malloc(n*sizeof(Ticket);/为此次增加分配内存if(pcount=NULL)coutNo enough memory!n;exit(0);else numbercount=n;/记录每个指针中元素的个数for(i=1;i=n;i+)cout 输入第 i 个车次 SetTicket();/输入增加车次coutendl;/显示此次的票务信息cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|endl;for(i=0;i=count;i+)for(j=0;jPrintTicket();coutendl;名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 30 页 -coutendl;count+;/记录指针数组中元素的个数/函数功能:修改车次void NewNo(Ticket*p,int*number)int i,j,flag=1;char No20;cout 请输入要修改的车号:No;/输入需要修改的车次for(i=0;icount&flag;i+)/查找需要修改的车次 for(j=0;jGetNo(),No)=0)flag=0;break;if(flag=0)i-;coutPlease enter the new train:ChangTicket(ticket);/修改/显示此次的票务信息cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|endl;for(i=0;i=count;i+)for(j=0;jPrintTicket();coutendl;ofstream outf(车票信息.txt,ios:app);/向文件中写入新内容outfGetNo()GetTimeHour():GetTimeMinute()GetName_b()GetName_a()Gettime()GetLoad()GetReminder()n;名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 30 页 -/函数功能:显示票务信息void ShowTrain(Ticket*p,int*number)int i,j;struct tm*local;long t;time(&t);local=localtime(&t);cout|-此时时间tm_hour:tm_min-|endl;/显示此时时间/判断车是否开出cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|endl;for(i=0;icount;i+)for(j=0;jPrintTicket();coutGetTimeHour()tm_hour)cout 此车已发出 GetTimeHour()=local-tm_hour)if(pi+j)-GetTimeMinute()tm_min)cout 此车已发出 endl;else cout 此车未发出 endl;else cout 此车未发出 endl;/函数功能:查询票务int FindTrain(Ticket*p,int*number,int*i,int*j)名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 30 页 -int flag=1,choice,f;while(flag)/显示菜单 cout*菜单选择*endlendl;cout*1.按班次查询*endl;cout*2.按终点站查询*endl;cout*3.退出查询系统*endl;cout*4.返回主菜单*endlendl;cout*endlendlendl;cout 请输入您的选择:choice;if(cin.fail()/如果输入不匹配,fail()会返回真 cinchoice;cout 输入错误,请重新输入:endl;cin.clear();/清除 fail 状态cin.ignore();/清除缓冲区continue;else break;switch(choice)case 1:f=FindNoTrain(p,number,i,j);break;case 2:f=FindaTrain(p,number,i,j);break;case 3:flag=0;system(cls);coutendlendlendl;return f;break;case 4:flag=0;system(cls);coutendlendlendl;名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 30 页 -break;default:cout 请输入正确的数字!endl;return f;/函数功能:按车次查询int FindNoTrain(Ticket*p,int*number,int*i,int*j)int flag=1;char No20;cout 请输入需要查询的车次:No;/输入需要查询的车次/车次查询,并显示查询结果for(*i)=0;(*i)count&flag;(*i)+)for(*j)=0;(*j)GetNo(),No)=0)cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|PrintTicket();coutendl;flag=0;break;if(flag=0)else system(cls);coutendlendlendl;cout 没有找到该车次!n;return flag;/函数功能:按终点站查询名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 30 页 -int FindaTrain(Ticket*p,int*number,int*i,int*j)int flag=1;char Name_a20;cout 请输入您要查询的终点站:Name_a;/输入需要查询的终点站/查询并显示查询结果for(*i)=0;(*i)count&flag;(*i)+)for(*j)=0;(*j)GetName_a(),Name_a)=0)cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|PrintTicket();coutendl;flag=0;break;if(flag=0)else cout 没有找到该车次!n;return flag;/函数功能:显示时间表void ShowTimeTrain(Ticket*p,int*number)int i,j,k;int cow=0,total=0;Ticket temp;for(i=0;icount;i+)/统计总共对象 total=total+numberi;/创建一个新的对象数组并把原有车次信息存入该数组中Ticket*q=(Ticket*)malloc(total*sizeof(Ticket);名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 30 页 -for(i=0;icount;i+)for(j=0;jnumberi;j+)qcow=*(pi+j);cow+;/按时间进行排序for(i=0;itotal-1;i+)k=i;for(j=i+1;jtotal;j+)if(qj.GetTimeHour()qi.GetTimeHour()k=j;else if(qj.GetTimeHour()=qi.GetTimeHour()if(qj.GetTimeMinute()qi.GetTimeMinute()k=j;if(k!=i)temp=qk;qk=qi;qi=temp;/显示排序后的结果cout*当前车票信息*|endl;cout|车次|发车时间|起点站|终点站|行车时间|额定载量|余票数量|车票价格|endl;cout|*|endl;for(i=0;itotal;i+)qi.PrintTicket();coutendl;ofstream outf(sort.date,ios:app);outfGetNo()GetTimeHour():GetTimeMinute()GetName_b()GetName_a()Gettime()GetLoad()GetReminder()n;名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 30 页 -/函数功能:售票,退票void SellReturnTicket(Ticket*p,int*number,int i,int j)void SellReturnTicket(Ticket*p,int*number,int i,int j)int flag=1,choice;while(flag)/菜单显示 cout*菜单选择*endlendl;cout*1.售票*endl;cout*2.退票*endl;cout*3.退出售票系统*endl;cout*4.返回主菜单*endlendl;cout*endlendlendl;cout 请输入您的选择:choice;if(cin.fail()/如果输入不匹配,fail()会返回真 cinchoice;cout 输入错误,请重新输入:endl;cin.clear();/清除 fail 状态cin.ignore();/清除缓冲区continue;else break;switch(choice)case 1:system(cls);coutendlendlendl;SellTicket(p,number,i,j);break;case 2:system(cls);coutendlendlendl;ReturnTicket(p,number,i,j);break;名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 30 页 -case 3:system(cls);coutendlendlendl;coutendlendlendl;break;case 4:flag=0;system(cls);coutendlendlendl;break;default:cout 请输入正确的数字!endl;/函数功能:售票void SellTicket(Ticket*p,int*number,int i,int j)int n,f;f=FindTrain(p,number,&i,&j);/寻找所要购买的车次信息/若存在,输入购买数并进行判断、售票if(f=0)cout 请输入您想购买的车票张数:n;int i=0;do if(i!=0)cout 车票数必须为正数,请重新输入:n;i+;while(n(pi-1+j)-GetReminder()cout 没有余票,请查询其他车次!endl;else cout 购票成功 PrintTicket();/显示所要退的车次信息coutGetTimeHour();minute=(pi-1+j)-GetTimeMinute();if(minute=30)minute=minute-30;else hour=hour-1;minute=minute+30;/判断是否发出从而判断是否可以退票if(hourtm_hour)flag=1;else if(hour=local-tm_hour)if(minutetm_min)flag=1;else flag=0;else flag=0;if(flag)cout 无法退票!endl;else cout 请输入退票张数!:n;int i=0;do if(i!=0)名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 30 页 -cout 车票数必须为正数,请重新输入:n;i+;while(n0);cout 退票成功!endl;AddReminder(*(pi-1+j),n);void checkpassword()char ch4;char ch14;ch10=1,ch11=2,ch12=3,ch13=4;for(int i=0;i=3;i+)chi=getch();putch(*);if(ch0=ch10&ch1=ch11&ch2=ch12&ch3=ch13)coutendlendlendlendlendlendlendlendlendlendlendlendlendlendlendlendl;cout 密码正确,进入系统endl;return;else coutendl;cout 密码错误,请重新输入endl;coutendl;checkpassword();名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 30 页 -五、测试数据及其结果分析名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 30 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 28 页,共 30 页 -六、调试过程中的问题1、调用 while(!f.eof()f.read(char*)&Ti+,sizeof(Ticket);浏览班次信息后,文件 中 的 班 次 信 息 的 最 后 一 条 会 被 读 两 次,所 以 把 班 次 信 息 显 示 在 屏 幕 时 利 用f.seekg(0,ios:end);int b=f.tellg();f.seekg(0,ios:beg);int a=f.tellg();int c=(b-a)/sizeof(Ticket);获得文件内包含的班次信息总数c,调用for(int j=0;jc;j+)使班次信息个数得到准确提取后再输出。2、售票后 注意用f.seekg(-1*NUM,ios:cur)把文件 指针从 当前位 置向前 移动(-1*sizeof(Ticket)个字节以修改售票前的班次信息,否则会使文件最后一条记录丢失,而售票前的班次信息也会被保存。3、在主函数中的swicth()循环函数外层加上一个while()循环可连续多次对菜单进行操作,从而提高了运行效率。4、头文件中注意包含 ,否则无法定义重载运算符的友元函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 29 页,共 30 页 -七、程序设计总结由本次的程序设计,我最大的认识就是自己的C语言学习的不够好,存在许多的知识漏洞,由于题目需求,整个编程还运用到了大量的C+语言,对从没有接触过C+的我来说就更显得非常吃力,于是我不仅要在网上搜索C+的各种用法,更要很快的把它们运用到这个复杂的程序里面,不得不承认,这次编程网络对我的帮助巨大。通过这近一星期的奋斗,我确确实实收获颇多,编程的能力有了很大提高。我知道了原来一个主函数里面可以包含那么多功能函数,甚至整个几十行的主函数都在调用前面编的函数,让我在函数的编写和调用技巧方面有飞般的进步。我本来对文件方面掌握不怎么样,但偏偏这个程序对文件这里要求较高,于是我有慢慢研究文件,现在对文件也有了深一步的了解。虽然只有几天时间,但我却喜欢上了这种自己动手完成难题的学习方式,我觉得这并不比老师讲课我能吸取到的知识少,希望以后能有更多像这样的锻炼机会。名师资料总结-精品资料欢迎下载-名师精心整理-第 30 页,共 30 页 -