本文主要是介绍汽车站车票管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cmath>
#include <conio.h>
#include <ctime>
#include <cstring>
using namespace std;struct Timetable //车辆车次信息结构
{char no[10];//班次int hour;//发车时间(时)int minute;//发车时间(分)char Starting_station[10];//始发站char Last_station[10];//终点站float time;//行车时间int fare;int max_number;//最大载客数int sold_number;//已售票数
}; void Signin(); //管理员用户登录,用于验证密码。要求将输入的字符串中的全部字符转换为'*',将密码隐藏
void GenerateLogFileName(char *LogFileName); //根据当前日期生成日志文件名
int InitializaionPassageMode(Timetable *timetables,char *LogFileName,char *filename);//从当天日志文件LogFileName中读数据到timetables,若该是否存在,则将filename中的内容读至timetables中(注意要将sold_number成员置为0)并将timetables中的信息写入LogFileName;
int AddBus(Timetable *timetables,int n); //增加车次。输入车次号,如果存在该车次应该重新输入
int find(Timetable *timetables,int n,char *no); // 按车次号查找车次信息
int find(Timetable *timetables,int n,char *Last_station,int *b); //按终点站查找车次信息
int DelBus(Timetable *timetables,int n); //删除车次
int AdminWindowSelect(); //管理员界面,该函数已经完全给出
int MainWindowSelect(); //主窗口界面,该函数已经完全给出
int PassagerWindowSelect(); //旅客界面,该函数已经完全给出
void TicketDelete(Timetable *timetables,int n); //退票
void TicketOrder(Timetable *timetables,int n); //买票
int StopSerive(Timetable *timetables,int n,char *no); //判断车次的发车时间判断是否停止售票或退票服务
void ShowTimetable(Timetable *timetables,int n); //显示汽车站中所有车次信息,并按发车时间进行升序排序
void ShowBusInfo(Timetable *timetables,int n, int idx); //显示timetables中第idx(下标)个元素的信息
int ReadFromFile(Timetable *timetables,char *filename); //从filename中读数据到数组timetables中,正确读取返回文件中包含车次的数目,否则返回-1
void int2str(int n,char *str); //将整数转换为字符串
void GenerateLogFileName(char *filename); // 根据当天日期生成日志名(如2019-9-19.log)的文件
int WritetoFile(Timetable *timetables,int n,char *filename);//将数组timetables中的数据写入到filename中。正确写入返回非-1的数
void Query(Timetable *timetables,int n); //查询操作,要求可以按车次和终点站分别进行查询
void AdminMode(Timetable *timetables,char *filename);
void SortbyTime(Timetable *timetables,int n); //将timetables中的元素按发车时间进行升序排序
void PassagerMode(Timetable *timetables,char *filename);
int Quit(); //是否退出系统int main() // 主函数,请保留该函数,且无需做任何改动
{ int UserChoice;Timetable timetables[100]; while(1){ switch(UserChoice = MainWindowSelect()){case 1: AdminMode(timetables,"bus.txt");break; //管理员模式case 2: PassagerMode(timetables,"bus.txt");break; //顾客模式 case 3: if (Quit()!=1)continue; //退出} if (UserChoice==3) break;}return 0;
}void AdminMode(Timetable *timetables,char *filename) // 管理员模式,请保留该函数且无需做任何改动
{int n;Signin();n=ReadFromFile(timetables,"bus.txt");while(1){ int AdminChoice = AdminWindowSelect();switch(AdminChoice){case 1: n = AddBus(timetables,n) ;WritetoFile(timetables,n,filename); system("pause");break; //增加车次信息,并及时写到文件中case 2: ShowTimetable(timetables, n);system("pause");break; //浏览时刻表case 3: Query(timetables,n);system("pause");break; //车辆信息查询 case 4: n = DelBus(timetables, n);system("pause");WritetoFile(timetables,n,filename); break;//注销车次,并及时写到文件中case 5: WritetoFile(timetables,n,filename); return ;//返回上级菜单,并将信息保存回bus.txt文件} }
}void PassagerMode(Timetable *timetables,char *filename) // 旅客模式,该函数无需做任何改动
{char LogFileName[200]; int n;GenerateLogFileName(LogFileName);//根据当前日期生成日志文件名n = InitializaionPassageMode(timetables,LogFileName,filename); //从日志文件中读取当天车次信息至数组中,若该日志文件不存在,则从filename文件中读取,并将filename的内容复制到日志文件中。int PassagerChoice;while(1){ switch(PassagerChoice= PassagerWindowSelect()){case 1:Query(timetables,n);system("pause");break;//车辆信息查询case 2:TicketOrder(timetables, n);WritetoFile(timetables,n,LogFileName); system("pause");break;//购买车票,并更改文件信息case 3:TicketDelete(timetables, n); WritetoFile(timetables,n,LogFileName); system("pause");break;//退回车票,并更改文件信息case 4:WritetoFile(timetables,n,LogFileName); system("pause"); return ;//返回上级菜单}}
} void int2str(int n,char *str) //将整数转换为字符串
{ int i=0,j;char c;while(n){str[i++] = n%10 + '0'; n=n/10;}str[i] = '\0';j = i-1; i = 0;for (;i<j;i++,j--){ c=str[i]; str[i] = str[j]; str[j] = c; }
}void GenerateLogFileName(char *filename) //根据当天日期生成日志名(如2019-9-19.log),该函数无需做任何改动
{filename[0] = '\0';struct tm *local; //时间结构体 time_t t; //把当前时间给tt=time(NULL); //NULL在stdio.h中定义为0local = localtime(&t); //获取当前系统时间 char year[5],month[3],day[3]; //将年月日分别转换成字符串型int2str(int(1900+local->tm_year),year);int2str(1+local->tm_mon,month);int2str(local->tm_mday,day);strcat(filename,year); //生成日志文件名strcat(filename,"-");strcat(filename,month);strcat(filename,"-");strcat(filename,day);strcat(filename,".log");return ;
}int InitializaionPassageMode(Timetable *timetables,char *LogFileName,char *filename) //从当天日志文件LogFileName中读数据到timetables,若该是否存在,则将filename中的内容读至timetables中(注意要将sold_number成员置为0)并将timetables中的信息写入LogFileName
{int n=0;ifstream fp(LogFileName);bool flag=fp.good();fp.close(); if(flag==false){n = ReadFromFile(timetables,filename);WritetoFile(timetables,n,LogFileName);}else{n = ReadFromFile(timetables,LogFileName);}return n;
}int Quit() //询问是否要退出整个系统(y/n),输入’y’或’Y’时返回1,否则返回0
{cin.sync(); // 用于清理cin输入流内的内容,请保留该语句,并在其后编写你们的代码char a;cout<<"是否要退出整个系统?(y/n)"<<endl;cin>>a;if(a=='y')return 1;else return 0;
}int MainWindowSelect() //主菜单界面,请保留该函数
{int num;system("cls");cout<<"\n\t*******************欢迎使用车票管理系统*********************\n";cout<<"\t\t\t\t请选择您的登录方式:\n";cout<<"\t\t\t\t1.管理员登录\n";cout<<"\t\t\t\t2.普通登录\n";cout<<"\t\t\t\t3.退出\n";cout<<"\t************************************************************\n";cin>>num; while(num<=0 || num>3){cout<<"非法输入,请输入需要运行的命令编号\n";cin>>num;}return num;
}int AdminWindowSelect() //管理员菜单界面,请保留该函数
{system("cls");int num;cout<<"\n\t********************管理员菜单***********************\n";cout<<"\t\t\t\t1、增加车次信息\n\t\t\t\t2、时刻表浏览\n\t\t\t\t3、车辆信息查询\n\t\t\t\t4、注销车次\n\t\t\t\t5、返回\n";cout<<"\t\t\t 请输入需要运行的命令编号\n";cout<<"\t************************************************************\n"; cin.sync();cin>>num;while(num<=0 || num>6){ cout<<"非法输入,请输入需要运行的命令编号\n";cin>>num;};return num;
}int PassagerWindowSelect() //普通用户登录菜单,请保留该函数
{system("cls");cout<<"\n\t****************顾客登录菜单**********************\n";cout<<"\t\t\t\t1、车辆信息查询\n\t\t\t\t2、购买车票\n\t\t\t\t3、退回车票\n\t\t\t\t4、返回\n";cout<<"\t\t\t 请输入需要运行的命令编号\n";cout<<"\t************************************************************\n";int num;cin>>num;while(num>4 || num<1){ cout<<"非法输入,请输入需要运行的命令编号:\n";cin>>num; }return num;
}void Signin() //管理员用户登录,用于验证密码。要求将输入的字符串中的全部字符转换为'*',将密码隐藏
{ int i=0;string s;char code[20];system("cls");do{cout<<"请输入账号:";cin>>s;cout<<"请输入密码:";while(1){code[i] = getch();if(code[i]==13){break;}else {cout<<"*";i++;}}code[i]='\0';if(s=="admin" && !strcmp(code,"123")){return;}cout<<endl<<"账号或密码错误!"<<endl;i=0;}while(1);
}int AddBus(Timetable *timetables,int n) //添加车次信息,详见处理函数的原型和实现说明
{ int i;system("cls");do{cout<<"请输入班次:";cin>>timetables[n].no;for(i=0;i<n;i++){if(!strcmp(timetables[n].no,timetables[i].no)){cout<<"该车次已经存在"<<endl;break;}}if(i==n)break;}while(1);cout<<"请输入发车时间(h m):";cin>>timetables[n].hour>>timetables[n].minute;cout<<"请输入始发站:";cin>>timetables[n].Starting_station;cout<<"请输入终点站:";cin>>timetables[n].Last_station;cout<<"请输入行车时间:";cin>>timetables[n].time;cout<<"请输入最大载客数:";cin>>timetables[n].max_number;cout<<"请输入票价:";cin>>timetables[n].fare;timetables[n].sold_number=0;cout<<"添加成功!"<<endl;return n+1;
}int DelBus(Timetable *timetables,int n) //删除车次信息,详见处理函数的原型和实现说明
{ int i;char no[20];system("cls");cout<<"请输入要删除的车次:";cin>>no;i = find(timetables,n,no);if(i==-1){cout<<"无该车次信息!"<<endl;return n;}cout<<"是否删除?(Y/N):";cin>>no;if(!strcmp("Y",no)||!strcmp("y",no)){for(;i<n-1;i++){timetables[i]=timetables[i+1];}cout<<"删除成功!"<<endl;return n-1;}cout<<"已经取消删除!"<<endl;return n;
}void TicketDelete(Timetable *timetables,int n) //退票,详见处理函数的原型和实现说明
{ int i,k;char no[20];system("cls");cout<<"请输入要退票的车次:";cin>>no;i = find(timetables,n,no);if(i==-1){cout<<"无该车次信息!"<<endl;return ;}if(StopSerive(timetables,n,no)==1 || timetables[i].sold_number==0){cout<<"不可购票!"<<endl;}else{cout<<"请输入要退票的数量:";cin>>k;if(k<=timetables[i].sold_number){timetables[i].sold_number-=k;cout<<"退票成功!"<<endl;}else{cout<<"退票数量不对!"<<endl;}}
}void TicketOrder(Timetable *timetables,int n) //售票,详见处理函数的原型和实现说明
{ int i,k;char no[20];system("cls");cout<<"请输入要购买的车次:";cin>>no;i = find(timetables,n,no);if(i==-1){cout<<"无该车次信息!"<<endl;return ;}if(StopSerive(timetables,n,no)==1 || timetables[i].max_number-timetables[i].sold_number<=0){cout<<"不可购票!"<<endl;}else{cout<<"请输入要购买的数量:";cin>>k;if(k+timetables[i].sold_number<=timetables[i].max_number){timetables[i].sold_number+=k;cout<<"购票成功!"<<endl;}else{cout<<"余票不足!"<<endl;}}
}int find(Timetable *timetables,int n,char *no) //按车次进行查询,若找到,则返回该车次所在数组中的下标;否则返回-1
{int i;for(i=0;i<n;i++){if(!strcmp(timetables[i].no,no)){return i;}}return -1;
}int find(Timetable *timetables,int n,char *Last_station,int *b) //按终点站查找,若找到,则在b中记录终点站为Last_station的所有车次在数组中对应的下标,并返回该汽车站终点站为Last_station的车次数;否则返回-1
{int i,k=0;for(i=0;i<n;i++){if(!strcmp(timetables[i].Last_station,Last_station)){b[k++]=i;}}return k;
}int StopSerive(Timetable *timetables,int n,char *no) //判断该车次是否停止服务,0:继续服务,1:停止服务,请保留该函数
{struct tm *local; //时间结构体 time_t t; //把当前时间给tt=time(NULL); local = localtime(&t); //获取当前系统时间 int i = find(timetables,n,no);if ((local->tm_hour*60 + local->tm_min) + 10 < (timetables[i].hour*60+timetables[i].minute)) return 0; return 1;
}void SortbyTime(Timetable *timetables,int n) //将timetables中的元素按发车时间进行升序排序
{int i,j,t1,t2;Timetable temp;for(i=0;i<n;i++){t1=timetables[i].hour*100+timetables[i].minute;for(j=i+1;j<n;j++){t2=timetables[j].hour*100+timetables[j].minute;if(t1>t2){temp=timetables[i];timetables[i]=timetables[j];timetables[j]=temp;}}}
}void ShowTimetable(Timetable *timetables,int n) //显示该车站中的所有车次信息,并显示该车是否停止服务
{int i;system("cls");cout<<"车次 发车时间 起点 终点 行车时间 载客量 售出 服务状态"<<endl;for(i=0;i<n;i++){ShowBusInfo(timetables,n,i);cout<<endl;}
}void ShowBusInfo(Timetable *timetables,int n, int idx) //显示timetables数组中第idx(下标)车次信息,并显示该车是否停止服务
{ cout<<timetables[idx].no<<" ";cout<<timetables[idx].hour<<":";cout<<timetables[idx].minute<<" ";cout<<timetables[idx].Starting_station<<" ";cout<<timetables[idx].Last_station<<" ";cout<<timetables[idx].time<<" ";cout<<timetables[idx].max_number<<" ";cout<<timetables[idx].sold_number<<" ";if(StopSerive(timetables,n,timetables[idx].no)==1){cout<<"停止服务 ";}else {cout<<"正在运行 ";}
}int ReadFromFile(Timetable *timetables,char *filename) //从filename中读数据到数组timetables中,正确读取返回文件中包含车次的数目,否则返回-1
{int i=0;ifstream fp(filename);if(fp.is_open()==false)return 0;fp>>timetables[i].no>>timetables[i].hour>>timetables[i].minute>>timetables[i].Starting_station>>timetables[i].Last_station>>timetables[i].time>>timetables[i].fare>>timetables[i].max_number>>timetables[i].sold_number;while(!fp.eof()){i++;fp>>timetables[i].no>>timetables[i].hour>>timetables[i].minute>>timetables[i].Starting_station>>timetables[i].Last_station>>timetables[i].time>>timetables[i].fare>>timetables[i].max_number>>timetables[i].sold_number;}fp.close();return i;
}int WritetoFile(Timetable *timetables,int n,char *filename) //将数组timetables中的数据写入到filename中。正确写入返回非-1的数
{int i;ofstream fp(filename);if(fp.is_open()==false)return -1;for(i=0;i<n;i++){fp<<timetables[i].no<<" ";fp<<timetables[i].hour<<" ";fp<<timetables[i].minute<<" ";fp<<timetables[i].Starting_station<<" ";fp<<timetables[i].Last_station<<" ";fp<<timetables[i].time<<" ";fp<<timetables[i].fare<<" ";fp<<timetables[i].max_number<<" ";fp<<timetables[i].sold_number<<endl;}fp.close();return 1;
}void Query(Timetable *timetables,int n) //能够分别按车次或终点站查询车次,查到则显示车次信息,否则给出提示。
{int choice;int i,k,b[100];char no[20];system("cls"); cout<<"1:按车次查询"<<endl;cout<<"2:按终点站查询"<<endl;cout<<"请输入选择:";cin>>choice;if(choice==1){cout<<"请输入要查询的车次:";cin>>no;k=find(timetables,n,no);if(k==-1){cout<<"无该车次信息!"<<endl;return;}ShowBusInfo(timetables,n,k);}if(choice==2){cout<<"请输入要查询的终点站:";cin>>no;SortbyTime(timetables,n);k=find(timetables,n,no,b);if(k==0){cout<<"无该终点站信息!"<<endl;return;}for(i=0;i<k;i++)ShowBusInfo(timetables,n,b[i]);}
}
这篇关于汽车站车票管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!