当前位置:文档之家› 票务管理方案计划系统程序设计

票务管理方案计划系统程序设计

程序设计报告(2014/2015学年第一学期)题目:票务管理系统专业理工科强化班组长学号姓名组员学号姓名指导教师指导单位计算机学院软件教学中心日期 2014 年 10月 23日现票务管理系统一课题内容和要求(1)录入班次信息(信息用文件保存number.dat),可随时增加新车次数据(2)浏览班次信息,可显示出所有车次当前状况(显示车辆是否发出的提示信息)。

(3)查询路线:可按班次号、终点站查询售票情况。

(4)根据发车时间给出顺序的发车时间表,存入文件保存(sort.dat)。

(5)售票和退票功能当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新余票数量。

退票时,输入退票的班次,当本车次发出前半小时才可以退票,自动更新已售票人数。

(6)改签功能改签时,输入改签目标班次,退原来的票,功能实现见上。

2、扩展功能要求(1)角色区分:以上的功能(1)只有管理员凭密码才能操作;其余所有的功能管理员和普通访客均可操作。

(2)管理员提供密码找回服务。

(3)每人限购买一张。

二、需求分析票管理系统的功能框架图如图1、2所示。

( 1 )提供一个入口,针对用户和管理员,可分别选择登录方式并进行操作。

( 2 )通过数据库文件对车票信息与提示信息进行管理、储存、输入和输出;图1功能框架图图2功能框架图三、概要设计1 主要的类内变量的定义和函数的声明:class chepiao{public:string CC,QD,ZD; //车票类的数据成员车次,起点站,终点站int FCSJh,FCSJm,XCSJ,EDZL,YPSL;//车票类的数据成员发车时间(小时)、(分钟)、行车时间、额定载量、余票数量chepiao* left; //链表的指针chepiao(string A,int AA,int AA2,string AAA,string AAAA,int AAAAA,int AAAAAA,int AAAAAAA){CC=A;FCSJh=AA;FCSJm=AA2;QD=AAA;ZD=AAAA;XCSJ=AAAAA;EDZL=AAAAAA;YP SL=AAAAAAA;left=NULL;}chepiao(){left=NULL;}};函数:void Output(); //输出number.dat内容void Output2(); //输出sort.dat内容void Write(chepiao *start); //把内存中的车票信息写入number.datvoid Write2(chepiao *start); //把内存中的车票信息写入sort.datvoid Find(chepiao *start); //按目的地和车次查询车票信息void Sort(chepiao *start); //按发车时间排序车票信息void Buy(chepiao *start); //购票操作void Buy2(chepiao *start); //改签中的购票操作void Refund(chepiao *start); //退票操作void Refund2(chepiao *start); //改签中退票操作void Delete(chepiao *start); //释放内存中车票所占空间void Show1(); //输出欢迎的选择界面void Show2(); //输出用户的选择界面void Shout(); //防“熊孩子”设定void Getpassword(); //读入文件中的密码void Resetpassword(); //将修改的密码重新读入文件储存bool Check(); //是否买过票检查void Setnumber(); //记录买过票的身份证号码string innumber; //记录身份证号bool mp=false; //判断是否能购买string password; //临时储存读入的密码和修改的新密码int sj; //当前的小时数*60+分钟数,用于时间比较int sj2; //车票的发车时间的小时数*60+分钟数,用于时间比较bool gq=false; //用于传递改签过程中第一步购票是否成功的信息string name="admin"; //默认的管理员账号string Q1="中国江苏找南邮"; //默认的管理员密保问题2 主要函数流程图四、源程序代码//车票类.h#include <iostream>#include <string>using namespace std;int sum=0;class chepiao{public:string CC,QD,ZD; //车票类的数据成员车次,起点站,终点站int FCSJh,FCSJm,XCSJ,EDZL,YPSL;//车票类的数据成员发车时间(小时)、(分钟)、行车时间、额定载量、余票数量chepiao* left; //链表的指针chepiao(string A,int AA,int AA2,string AAA,string AAAA,int AAAAA,int AAAAAA,int AAAAAAA){CC=A;FCSJh=AA;FCSJm=AA2;QD=AAA;ZD=AAAA;XCSJ=AAAAA;EDZL=AAAAAA;YPSL=AAAAA AA;left=NULL;}chepiao(){left=NULL;}};#include "车票类.h"#include <fstream>#include <time.h>using namespace std;void Output(); //输出number.dat内容void Output2(); //输出sort.dat内容void Write(chepiao *start) ; //把内存中的车票信息写入number.datvoid Write2(chepiao *start); //把内存中的车票信息写入sort.datvoid Find(chepiao *start); //按目的地和车次查询车票信息void Sort(chepiao *start); //按发车时间排序车票信息void Buy(chepiao *start); //购票操作void Buy2(chepiao *start) ; //改签中的购票操作void Refund(chepiao *start); //退票操作void Refund2(chepiao *start); //改签中退票操作void Delete(chepiao *start); //释放内存中车票所占空间void Show1(); //输出欢迎的选择界面void Show2(); //输出用户的选择界面void Shout(); //防“熊孩子”设定void Getpassword(); //读入文件中的密码void Resetpassword(); //将修改的密码重新读入文件储存bool Check(); //是否买过票检查void Setnumber(); //记录买过票的身份证号码string innumber; //记录身份证号bool mp=false; //判断是否能购买string password; //临时储存读入的密码和修改的新密码int sj; //当前的小时数*60+分钟数,用于时间比较int sj2; //车票的发车时间的小时数*60+分钟数,用于时间比较bool gq=false; //用于传递改签过程中第一步购票是否成功的信息string name="admin"; //默认的管理员账号string Q1="中国江苏找南邮";//默认的管理员密保问题int main(){Getpassword();int ways;//登陆方式Show1();cin>>ways;if(ways==1){string inname; //键盘输入的管理员账号string inpassword; //用于键盘输入管理员密码string inQ1; //用于键盘输入管理员密保问题char bbb='N'; //用于键盘输入是否使用密保问题int aaa=1; //用于循环,每三次密码错误,提示一次是否使用密保问题bool judge=false; //用于判断是否输入正确cout<<"请输入管理员账号:";cin>>inname;if (inname==name)judge=true;else{while(!judge){cout<<"输入错误,请重新输出管理员账号:";cin>>inname;if (inname==name)judge=true;}}judge=false;cout<<"请输入管理员密码:";cin>>inpassword;if (inpassword==password)judge=true;else{while(!judge){if(aaa%3==0){cout<<"是否使用密保问题重置密码?(Y/N)";cin>>bbb;if(bbb=='Y'||bbb=='y'){cout<<"编程技术哪家牛?"<<endl;cin>>inQ1;if(inQ1==Q1){cout<<"回答正确!请输入新密码"<<endl;cin>>password;Resetpassword();cout<<"请牢记密码"<<endl;break;}else{cout<<"密保问题验证失败。

"<<endl;}}}cout<<"密码错误,请重新输入管理员密码:";cin>>inpassword;aaa++;}}//*****************************分割线**********************************//*****************************分割线**********************************ofstream fout("number.dat",ios::out|ios_base::app);//定义输出数据流,以输出方式打开,打开位于文件尾if(!fout){cerr<<"open error!"<<endl;exit(1);}//*****************************分割线**********************************//*****************************分割线**********************************string a,b,c; //用于储存即将输入的车票的车次、起点和重点int d1,d2,e,f,g; //用于储存即将输入的发车时间小时、分钟、行车时间、额定载量、余票数量cout<<"请输入需要增加的车票数"<<endl;int x,i; //用于循环判断是否输入完毕cin>>i;cout<<"请逐个输入车票的如下信息"<<endl;cout<<"车次发车时间(小时)发车时间(分钟)起点站终点站行车时间额定载量余票数量"<<endl;for(x=0;x<i;x++){cin>>a>>d1>>d2>>b;cin>>c>>e>>f>>g;fout<<a;fout<<" ";fout<<d1;fout<<" ";fout<<d2;fout<<" ";fout<<b;fout<<" ";fout<<c;fout<<" ";fout<<e;fout<<" ";fout<<f;fout<<" ";fout<<g;fout<<" ";}cout<<"录入成功"<<endl;//*****************************分割线**********************************//*****************************分割线********************************** fout.close();//关闭文件return 0;}else if(ways==2){chepiao cp;//车票类链表的第一个空链对象,仅为了方便操作,无实际意义chepiao* start=&cp;//用于储存链表头chepiao* p=start;//用于对链表进行操作//*****************************分割线**********************************//*****************************分割线********************************** struct tm *newtime;//时间类对象time_t long_time;time( &long_time ); //Get time as long integernewtime = localtime( &long_time );int h = newtime->tm_hour;//得到当前时间的小时int m = newtime->tm_min;//得到当前时间的分钟sj=60*h+m;//*****************************分割线********************************** //*****************************分割线********************************** ifstream infile("number.dat",ios::out);//定义输入数据流,以输入方式打开if(!infile){cerr<<"open error!"<<endl;exit(1);}chepiao *q=start;//用于对链表进行操作int num=1;//用于记录这是读入的第N个数据,用于判断数据类型string y;//用于记录第一个读入的车次for(;;num++){if(num%8==1)if(!(infile>>y))break;else{q->left=new chepiao [1];sum++;q=q->left;q->CC=y;}switch(num%8){case 2:infile>>q->FCSJh;break;case 3:infile>>q->FCSJm;break;case 4:infile>>q->QD;break;case 5:infile>>q->ZD;break;case 6:infile>>q->XCSJ;break;case 7:infile>>q->EDZL;break;case 0:infile>>q->YPSL;break;}}infile.close();//关闭文件//*****************************分割线********************************** //*****************************分割线********************************** int yh;//用于读入用户需要的操作的序号while(1){Show2();cin>>yh;switch (yh){case 1:Output();break;case 2:Find(start);break;case 3:;Sort(start);Write2(start);Output2();break;case 4:if(Check()){Buy(start);}if(mp){Setnumber();}Write(start);break;case 5:Refund(start);Write(start);break;case 6:Buy2(start);if(gq){Refund2(start);}Write(start);gq=false;break;case 7:break;default:Shout();system("pause");return 0;}if(yh==7){Delete(start);break;}}return 0;}else{Shout();system("pause");}return 0;}//*****************************分割线**********************************//*****************************分割线**********************************void Write(chepiao *start){chepiao *p=start->left; //用于对链表进行操作ofstream fout("number.dat",ios::out|ios::trunc); //定义输出数据流,清空并打开if(!fout){cerr<<"open error!"<<endl;exit(1);}while(p!=NULL){fout<<p->CC<<" "<<p->FCSJh<<" "<<p->FCSJm<<" "<<p->QD<<" "<<p->ZD<<" "<<p->XCSJ<<" "<<p->EDZL<<" "<<p->YPSL<<endl;p=p->left;}fout.close();//关闭文件}//*****************************分割线**********************************//*****************************分割线**********************************void Write2(chepiao *start) //本函数内各变量作用同前{chepiao *p=start->left;ofstream fout("sort.dat",ios::out|ios::trunc);//定义输入数据流,清空并打开if(!fout){cerr<<"open error!"<<endl;exit(1);}while(p!=NULL){fout<<p->CC<<" "<<p->FCSJh<<" "<<p->FCSJm<<" "<<p->QD<<" "<<p->ZD<<" "<<p->XCSJ<<" "<<p->EDZL<<" "<<p->YPSL<<endl;p=p->left;}fout.close();//关闭文件}//*****************************分割线**********************************//*****************************分割线**********************************void Sort(chepiao *start){chepiao* L; //用于链表排序的交换步骤chepiao* M; //用于chepiao* N; //用于int i,j; //用于排序L=start;M=start->left;N=M->left;for(i=0;i<sum-2;i++){for(j=0;j<sum-1-i;j++){if(((M->FCSJh*60)+M->FCSJm)>((N->FCSJh*60)+N->FCSJm)){if(N->left!=NULL){L->left=N;M->left=N->left;N->left=M;L=N;M=L->left;N=M->left;}else{L->left=N;N->left=M;M->left=NULL;continue;}}else{if(N->left!=NULL){L=M;M=L->left;N=M->left;}else{continue;}}}L=start;M=L->left;N=M->left;}}//*****************************分割线**********************************//*****************************分割线**********************************void Output(){int j=1,a,b; //j用于记录输出的是第几个数据,用于判断类型;a,b为时间的小时数和分钟数string temp; //用于逐个读出数据ifstream infile("number.dat",ios::out); //定义输入数据流,以输入方式打开if(!infile){cerr<<"open error!"<<endl;exit(1);}while(1){if(j%8!=2)if(!(infile>>temp))break;if(j%8==2){infile>>a;infile>>b;j++;cout<<a<<":";if(b<10)cout<<"0";cout<<b<<" ";if(a*60+b<sj)cout<<"(此车已发出)"<<" ";elsecout<<"(此车未发出)"<<" ";}elsecout<<temp<<" ";//输出显示if(j%8==0)cout<<endl;j++;}infile.close(); //关闭文件}//*****************************分割线********************************** //*****************************分割线********************************** void Find(chepiao *start){chepiao *o;//用于对车票链表操作bool c=false;//用于记录是否找到相应车次string Cc;//用于输入需要寻找的车次或终点站cout<<"请输入车次或终点站:"<<endl;cin>>Cc;o=start;o=o->left;while(o){if(o->CC==Cc||o->ZD==Cc){cout<<o->CC<<" "<<o->FCSJh<<":";if(o->FCSJm<10)cout<<"0";cout<<o->FCSJm;if((o->FCSJh*60+o->FCSJm)<sj)cout<<"(此车已发出)"<<" ";elsecout<<"(此车未发出)"<<" ";cout<<o->QD<<" "<<o->ZD<<" "<<o->XCSJ<<" "<<o->EDZL<<" "<<o->YPSL<<endl;c=true;}o=o->left;}if(!c)cout<<"未找到目标车次或终点站。

相关主题