当前位置:文档之家› 火车票管理系统课程设计报告.docx

火车票管理系统课程设计报告.docx

程序设计报告( 2014 / 2015 学年第一学期)题目:火车票管理系统专业通信工程学生姓名班级学号指导教师指导单位计算机学院计算机软件教学中心日期火车票务管理系统一、课题内容和要求(一)课题内容该系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。

所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。

通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。

(二)课题要求(1)火车票数据由多条记录组成,其信息包括:车次,发车时间,起点站,终点站,行车时间,额定载量,已售票人数等。

(2)数据保存形式:所有火车票数据要以文本或二进制文件保存。

(3)需要实现的功能1)新增火车票数据记录。

2)查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。

3)删除火车票数据记录(先查找,再删除。

若查找出多条记录,则进一步提示用户选择记录的车次,再删除)。

4)对火车票排序(可按车次、发车时间、起点站、终点站等排序。

)。

5)显示当前所有火车票信息列表。

6)售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。

7)退票(售票的逆处理,过程与售票类似)。

8)保存火车票数据到文件中。

9)从文件中读入火车票数据。

(4)界面功能要求:1)采用友好的字符界面,实现一个功能控制菜单。

2)每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。

需求分析一、功能分析图二、录入班次信息:依次输入班次、起点站和终点站等信息同时保存在文件中,并可以随时增加新的班次信息。

三、浏览班次信息:输出保存在文件中的全部班次信息,并区分当前的车次是否已发出,如发出则标记“此车已发出”。

四、按班次号查询路线:以输入的班次号为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”五、按起点站查询路线:输入的起点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”六、按终点站查询路线:输入的终点站为依据进行查找,找到匹配项则输出该项完整的班次信息;未找到则显示“未找到该车次信息!”七、排列发车时间表:按照发车时间从早到晚的顺序逐条显示车次信息。

八、售票功能:依次输入“售票数目”和“班次号”可出售未发出的班次的车票。

九、退票功能:依次输入“退票数目”和“班次号”可退距发车时间大于半小时的班次的车票。

三、概要设计(1)类:#include<iostream.h>#include<fstream.h>#include<string.h>#include <time.h>class Ticket{char no[20];char name_b[20];char name_e[20];int hour;int minute;int tra_time;int eding;int yupiao;public:void shoupiao(fstream&f);void tuipiao(fstream&f);void searchbynumber(fstream&f);void searchbybeginplace(fstream&f);void searchbyendplace(fstream&f);void luru(fstream&f);void liulan(fstream&f);void paixu(fstream&f);friend ostream&operator<<(ostream&out,const Ticket&t);//定义重载输出运算符的友元函数bool findno(char n[])//用于判断输入的字符串是否与查找区域中的某个字符串一致{if(strcmp(no,n)==0)return true;elsereturn false;}bool findname_b(char n[]) {if(strcmp(name_b,n)==0)return true;elsereturn false;}bool findname_e(char n[]){if(strcmp(name_e,n)==0)return true;elsereturn false;}};(2)主要函数流程图:1、录入班次信息函数:用户根据提示信息逐项输入班次信息各项数据, 利用read()函数把要录入的信息写入文件。

如图1图1 图2 2、浏览班次信息显示所有的班次信息,并标记已发出的车次, 如图23、按班次号查询路线根据用户输入的班次号查找匹配项的班次信息。

4、按起点站查询路线根据用户输入的起点站查找匹配项的班次信息。

5、按终点站查询路线根据用户输入的终点站查找匹配项的班次信息。

6、排列发车时间表利用冒泡法按照发车时间的升序排列车次信息 7、售票用户输入指定的班次和售票数目进行售票 如图3 8、退票用户输入指定的班次和售票数目进行售票, 如图4#include<iostream.h>#include<fstream.h>#include<string.h>#include <time.h>class Ticket{char no[20];char name_b[20];char name_e[20];int hour;int minute;int tra_time;int eding;int yupiao;public:void shoupiao(fstream&f);void tuipiao(fstream&f);void searchbynumber(fstream&f);void searchbybeginplace(fstream&f);void searchbyendplace(fstream&f);void luru(fstream&f);void zengjia(fstream&f);void xiugai(fstream&f);void liulan(fstream&f);void paixu(fstream&f);friend ostream&operator<<(ostream&out,constTicket&t);//定义重载输出运算符的友元函数bool findno(char n[])//用于判断输入的字符串是否与查找区域中的某个字符串一致{if(strcmp(no,n)==0)return true;elsereturn false;}bool findname_b(char n[]){if(strcmp(name_b,n)==0)return true;elsereturn false;}bool findname_e(char n[]){if(strcmp(name_e,n)==0)return true;elsereturn false;}};ostream&operator<<(ostream&out,const Ticket&t)//打印车次表格{if(t.minute>=10){out<<t.no<<" "<<t.hour<<" : "<<t.minute<<""<<_b<<" "<<_e<<" "<<t.tra_time<<" "<<t.eding<<" "<<t.yupiao<<endl;}else{ out<<t.no<<" "<<t.hour<<" :"<<"0"<<t.minute<<" "<<_b<<" "<<_e<<" "<<t.tra_time<<" "<<t.eding<<" "<<t.yupiao<<endl;}return out;}void Ticket::liulan(fstream&f){int i=0;struct tm *local;long t;time(&t);local = localtime(&t);cout<<"车次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载量"<<" "<<"余票数量"<<endl;f.seekg(0,ios::end);int b=f.tellg();f.seekg(0,ios::beg);int a=f.tellg();int c=(b-a)/sizeof(Ticket);//获得文件内包含的班次信息总数Ticket*T=new Ticket[c];while(!f.eof())f.read((char*)&T[i++],sizeof(Ticket));for(int j=0;j<c;j++){if((local->tm_hour>T[j].hour)||(T[j].hour==local->t m_hour)&&(local->tm_min >T[j].minute)){cout<<T[j]<<" "<<"此车已发出!"<<endl;}else{cout<<T[j]<<endl;}}}void Ticket::shoupiao(fstream&f){const int NUM=sizeof(Ticket);int n;long t;char m[20];Ticket T;struct tm *local;cout<<"请输入售票的数目:"<<endl;cin>>n;cout<<"请输入售票的班次:"<<endl;cin>>m;time(&t);local = localtime(&t);f.seekg(0,ios::beg);//从文件头开始bool fd=false;while(!f.eof()&&!fd){f.read((char*)&T,NUM);if(fd=T.findno(m))//判断是否找到匹配班次{if(T.yupiao)//判断余票数量是否大于零{if((local->tm_hour<T.hour)||(T.hour==local->tm_hour )&&(local->tm_min <T.minute)){T.yupiao-=n;f.seekg(-1*NUM,ios::cur);//从当前位置向前移动(-1*sizeof(Ticket))个字节f.write((char*)&T,NUM);cout<<"已售出"<<n<<"张该车次的车票!"<<endl;}elsecout<<"该车次已发出!"<<endl;}elsecout<<"票已售完!"<<endl;}}if(!fd)cout<<"未找到该车次信息!"<<endl;}void Ticket::tuipiao(fstream&f){const int NUM=sizeof(Ticket);int n;long t;char m[20];Ticket T;struct tm *local;cout<<"请输入退票的数目:"<<endl;cin>>n;cout<<"请输入退票的班次:"<<endl;cin>>m;time(&t);local = localtime(&t);f.seekg(0,ios::beg);//把文件指针移到文件头bool fd=false;while(!f.eof()&&!fd)//未找到匹配的车次号以及未搜索完所有数据前继续循环{f.read((char*)&T,NUM);if(fd=T.findno(m)){if((T.hour)*60+T.minute-(local->tm_hour)*60-(local->tm_min)>30){T.yupiao+=n;f.seekg(-1*NUM,ios::cur);//从当前位置向前移动(-1*sizeof(Ticket))个字节f.write((char*)&T,NUM);//更新退票后的班次信息cout<<"已退"<<n<<"张该车次的车票!"<<endl;}elsecout<<"退票失败!"<<endl;}}if(!fd)cout<<"未找到该车次信息!"<<endl;}void Ticket::paixu(fstream&f){int i=0;f.seekg(0,ios::end);int b=f.tellg();f.seekg(0,ios::beg);//把文件指针移到文件头int a=f.tellg();int num=(b-a)/sizeof(Ticket);//得到文件内班次信息总数numTicket*t=new Ticket[num+1];Ticket*T=new Ticket[num+1];for(i=0;i<num;i++){f.read((char*)&t[i],sizeof(Ticket));}for(i=0;i<num-1;i++){if(((t+i)->hour>(t+i+1)->hour)||(((t+i)->hour==(t+i +1)->hour)&&((t+i)->minute>(t+i+1)->minute))){strcpy(T->no,(t+i)->no);strcpy(T->name_b,(t+i)->name_b);strcpy(T->name_e,(t+i)->name_e);T->hour=(t+i)->hour;T->minute=(t+i)->minute;T->tra_time=(t+i)->tra_time;T->eding=(t+i)->eding;T->yupiao=(t+i)->yupiao;strcpy((t+i)->no,(t+i+1)->no);strcpy((t+i)->name_b,(t+i+1)->name_b);strcpy((t+i)->name_e,(t+i+1)->name_e);(t+i)->minute=(t+i+1)->minute;(t+i)->tra_time=(t+i+1)->tra_time;(t+i)->eding=(t+i+1)->eding;(t+i)->yupiao=(t+i+1)->yupiao;strcpy((t+i+1)->no,T->no);strcpy((t+i+1)->name_b,T->name_b);strcpy((t+i+1)->name_e,T->name_e);(t+i+1)->minute=T->minute;(t+i+1)->tra_time=T->tra_time;(t+i+1)->eding=T->eding;(t+i+1)->yupiao=T->yupiao;}//利用冒泡法将发车时间相对早的班次信息往文件头移}cout<<" 发车时间表: "<<endl;for(i=0;i<num;i++)cout<<t[i]<<endl;fstream fil;fil.open("d:\\sort.dat",ios::in|ios::out|ios::binar y);//创建并打开二进制文件"sort.dat"for(i=0;i<num;i++)fil.write((char*)&t[i],sizeof(Ticket));fil.close();}void Ticket::searchbynumber(fstream&f){char n[10];Ticket t;cout<<"请输入你要查找的班次号:"<<endl;cin>>n;f.seekg(0,ios::beg);bool fd=false;while(!f.eof()&&!fd){f.read((char*)&t,sizeof(Ticket));if(fd=t.findno(n)){cout<<"车次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载量"<<" "<<"余票数量"<<endl;cout<<t;}}if(!fd)cout<<"未找到该车次信息!该车次不存在或已发出!"<<endl;}void Ticket::searchbybeginplace(fstream&f){char n[10];Ticket t;cout<<"请输入你要查找的班次的起点站:"<<endl;cin>>n;f.seekg(0,ios::beg);bool fd=false;while(!f.eof()&&!fd){f.read((char*)&t,sizeof(Ticket));if(fd=t.findname_b(n)){cout<<"车次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载量"<<" "<<"余票数量"<<endl;cout<<t;}}if(!fd)cout<<"未找到该车次信息!该车次不存在或已发出!"<<endl;}void Ticket::searchbyendplace(fstream&f)char n[10];Ticket t;cout<<"请输入你要查找的班次的终点站:"<<endl;cin>>n;f.seekg(0,ios::beg);bool fd=false;while(!f.eof()&&!fd){f.read((char*)&t,sizeof(Ticket));if(fd=t.findname_e(n)){cout<<"车次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载量"<<" "<<"余票数量"<<endl;cout<<t;}}if(!fd)cout<<"未找到该车次信息!该车次不存在或已发出!"<<endl;void Ticket::luru(fstream&f){int num;int i;cout<<"请输入你要录入的班次信息数量:"<<endl;cin>>num;Ticket*t=new Ticket[num];cout<<"请依次输入"<<endl<<"车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 "<<endl;for(i=0;i<num;i++){cin>>t[i].no;cin>>t[i].hour;cin>>t[i].minute;cin>>t[i].name_b;cin>>t[i].name_e;cin>>t[i].tra_time;cin>>t[i].eding;cin>>t[i].yupiao;}f.seekg(0,ios::end);//文件指针指向文件尾for(i=0;i<num;i++)f.write((char*)&t[i],sizeof(Ticket));}void Ticket::zengjia(fstream&f){int num;int i;cout<<"请输入你要增加的班次信息数量:"<<endl;cin>>num;Ticket*t=new Ticket[num];cout<<"请依次输入"<<endl<<"车次、发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 "<<endl;for(i=0;i<num;i++){cin>>t[i].no;cin>>t[i].hour;cin>>t[i].minute;cin>>t[i].name_b;cin>>t[i].name_e;cin>>t[i].tra_time;cin>>t[i].eding;cin>>t[i].yupiao;}f.seekg(0,ios::end);//文件指针指向文件尾for(i=0;i<num;i++)f.write((char*)&t[i],sizeof(Ticket));}void Ticket::xiugai(fstream&f){char n[10];Ticket t;cout<<"请输入你要修改的班次:"<<endl;cin>>n;f.seekg(0,ios::beg);bool fd=false;while(!f.eof()&&!fd){f.read((char*)&t,sizeof(Ticket));if(fd=t.findno(n)){cout<<"请依次输入"<<endl<<"发车时间(时)、发车时间(分)、起点站、终点站、行车时间、额定票数和余票数量 "<<endl;cin>>t.no;cin>>t.hour;cin>>t.minute;cin>>_b;cin>>_e;cin>>t.tra_time;cin>>t.eding;cin>>t.yupiao;}}f.seekg(0,ios::end);//文件指针指向文件尾f.write((char*)&t,sizeof(Ticket));}void menu()//菜单函数{cout<<"******************************菜单********************************"<<endl;cout<<" 1:录入车次信息"<<endl;cout<<" 2:浏览车次信息"<<endl;cout<<" 3:根据车次号查询路线"<<endl;cout<<" 4:根据起点站查询路线"<<endl;cout<<" 5:根据终点站查询路线"<<endl;cout<<" 6:排列发车时间表"<<endl;cout<<" 7:售票"<<endl;cout<<" 8:退票"<<endl;cout<<" 9:增加车次"<<endl;cout<<" 10:修改车次"<<endl;cout<<" 0:退出菜单"<<endl;cout<<"请选择您需要操作的选项:"<<endl;}void main(){int x;Ticket T;fstream file;cout<<"*********************欢迎您使用票务管理系统!**********************"<<endl;menu();while(x){cin>>x;file.open("d:\\schedule.dat",ios::in|ios::out|ios:: binary);//创建并打开二进制文件schedule.datswitch(x){case 1:T.luru(file);break;case 2:T.liulan(file);break;case 3:T.searchbynumber(file);break;case 4:T.searchbybeginplace(file);break;case 5:T.searchbyendplace(file);break;case 6:T.paixu(file);break;case 7:T.shoupiao(file);break;case 8:T.tuipiao(file);break;case 9:T.zengjia(file);break;case 10:T.xiugai(file);break;case 0:break;}cout<<"操作已完成,请继续!"<<endl;file.close();//关闭二进制文件schedule.dat}cout<<"************************欢迎您下次使用!****************************"<<endl;}五、测试数据及其结果分析1、录入班次信息输入:1输出:请输入你要录入的班次信息数量:输入:4输出:请依次输入车次、起点站、终点站、发车时间(时)、发车时间(分)、行车时间、额定票数和余票数量输入:G111 南京扬州 8 0 20 100 30G222 南京北京 10 30 21 120 35G333 南京上海 11 0 22 140 50G444 南京广州 9 30 22 160 40输出:操作已完成,请继续!2、浏览班次信息输入:2输出:G111 南京扬州 8 0 20 100 30G222 南京北京 10 30 21 120 35G333 南京上海 11 0 22 140 50G444 南京广州 9 30 22 160 40操作已完成,请继续!3、根据车次号查询路线输入:3输出:请输入你要查找的班次号:输入:G111输出:G111 南京扬州 8 0 20 100 30 操作已完成,请继续!4、根据起点站查询路线输入:4输出:请输入你要查找的班次的起点站:输入:南京输出:G111 南京扬州 8 0 20 100 30G222 南京北京 10 30 21 120 35G333 南京上海 11 0 22 140 50G444 南京广州 9 30 22 160 405、根据终点站查询路线输入:5输出:请输入你要查找的班次的终点站:输入:上海输出:G333 南京上海 11 0 22 140 50 操作已完成,请继续!6、排列发车时间表输入:6输出:G111 南京扬州 8 0 20 100 30G444 南京广州 9 30 22 160 40G222 南京北京 10 30 21 120 35G333 南京上海 11 0 22 140 50操作已完成,请继续!7、售票输入:7输出:请输入售票的数目:输入:1输出:请输入售票的班次:输入:G333输出:已售出1张该车次的车票!8、退票输入:8输出:请输入退票的数目:输入:1输出:请输入退票的班次:输入:G444输出:已退1张该车次的车票!操作已完成,请继续!9、退出菜单输入:0输出:************************欢迎您下次使用!****************************结果分析:(1)按照车次号、起点站或终点站查询班次时,如输入的车次信息不在数据库里或该车次已发出,则显示“未找到该车次信息!该车次不存在或已发出!”(2)售票的班次如已发出,则显示“该车次已发出!”如无余票则提示“票已售完”。

相关主题