一交通公司,班车系统的数据包括如下两部分:
①班车信息:班交及车号、最大载客数、起点、开车时间、终地点、到达终点站时间,单价;
② 乘客信息:车次及车号、身份证号码、姓名、性别、出生年月、座位号。
乘客订票的主要方式是:乘客提供起点、时间、终点、订票数等订票要求,根据事先保存的班数据决定乘客能否订票?只有全部满足了乘客的订票要求并且所订班次有足够的未订座位之后才能完成订票处理,并且修改该班次的未订座位数(每个班的未订座位数的初始值就是该班次的最大载客数);否则,订票失败,并且给出不能订票的原因。
/*********班车查询系统**********/
#include<iostream>
#include<time.h>#include<stdio.h>
#include<string.h> #include <stdlib.h>
#include<windows.h> #include<iomanip>
#include <fstream>
using namespace std;
#define uchar unsigned char
#define uint unsigned int
void choose(); void welcome(); void pas_booking();
void sta_increase(); void pas_change(); void start_search();
void ticket_increase(); void ticket_decrease(); void sta_scan();
void pas_search(); void code_search(); void pas_write_file(int j);
void end_search(); void time_search(); void quit();
void car_write_file(int i);
int car_read_file();
int pas_read_file();
void display_car(int i);
bool time_compare(int i);
char temp,i,x,j;
int m,y,num,k;
const int MAX=20;
const int N=1000;
struct time//日期时间
{
int hour;
int min;
};
struct date//日期
{
int year;
int month;
int day;
};
struct bus//班车信息
{
char bus_code[4]; //班车车号
int max_num; //最大车载容量
int ticket_num; //剩余票数
char starting[20]; //起点
struct time start_time; //开车时间
char destination[20]; //终点
float route_time; //行程时间
int price; //票价
}bus[MAX],BUS[MAX];
struct passager//旅客信息
{
char bus_code[4]; //班车车号
char ID_num[20]; //旅客身份证号
char name[20]; //旅客姓名
char sex[4]; //旅客性别
struct date birthday;//旅客出生日期
int seat_num; //订票数
}passager[N],p1;
int main()
{ system("Color 30");
welcome();
return 0;
}
void welcome()//主菜单界面
{
system("cls");
cout<<endl;
cout<<"****************************欢迎使用班车查询系统******************************"<<endl;
cout<<endl;
cout<<" 输入: 1 旅客班次订票 "<<endl;
cout<<" 2 旅客班次查询 "<<endl;
cout<<" 3 旅客增减车票 "<<endl;
cout<<" 4 车站添加班次 "<<endl;
cout<<" 5 车站班次浏览 "<<endl;
cout<<" 6 退出订票系统 "<<endl;
cout<<endl;
cout<<"********************************************************************************"<<endl;
cout<<endl;
choose();
}
void choose()//功能选择
{
cin>>temp;
switch(temp)
{
case '1':
system("cls");
pas_booking();
case '2':
pas_search();
case '3':
pas_change();
case '4':
sta_increase();
case '5':
sta_scan();
case '6':
quit();
exit(1);
default:
cout<<"对不起!您输入有误"<<endl;
choose();
}
}
void sta_increase()//添加班车
{
system("cls");
char t,a;
m=car_read_file();
cout<<"添加班车?(是则输入‘Y’,输入其他则返回)"<<endl;
cout<<"请输入:";
cin>>t;
while(t=='Y')
{
for(i=0;t=='Y';i++)
{
cout<<"按照提示输入班车信息:"<<endl;
cout<<"输入您需要添加的班次:";
cin>>BUS[i].bus_code;
for(k=0;k<m;k++)
{
if(strcmp(bus[k].bus_code,BUS[i].bus_code)==0)
{
cout<<"班次车号已存在!请重新输入:";
cin>>BUS[i].bus_code;
}
}
cout<<"输入该班次的最大载客量:";
cin>>BUS[i].max_num;
BUS[i].ticket_num=BUS[i].max_num;
cout<<"输入班次的时,分";
cin>>BUS[i].start_time.hour;
cin>>BUS[i].start_time.min;
cout<<"输入起点:";
cin>>BUS[i].starting;
cout<<"输入终点:";
cin>>BUS[i].destination;
cout<<"输入行程时间:";
cin>>BUS[i].route_time;
cout<<"请输入班次票价:";
cin>>BUS[i].price;
cout<<"确定要保存?—保存:Y/y。输入其他不保存==";
cin>>a;
if(a=='Y'||a=='y')
{
ofstream writefile;
writefile.open("班次信息.txt",ios::app);
writefile<<BUS[i].bus_code<<" "<<BUS[i].max_num<<" "<<BUS[i].ticket_num<<" ";
writefile<<BUS[i].start_time.hour<<" "<<BUS[i].start_time.min<<" "<<BUS[i].starting<<" ";
writefile<<BUS[i].destination<<" "<<BUS[i].route_time<<" "<<BUS[i].price<<endl;
writefile.close();
}
else
{i--;}
cout<<"是否继续添加班次?—是:输入“Y”。输入其他返回主菜单==";
cin>>t;
system("cls");
}
}
system("cls");
welcome();
}
void pas_search()//班车查询
{
system("cls");
cout<<"<1>起点查询;<2>次号查询;<3>终点查询;<4>时间查询;输入其他返回主菜单"<<endl;
cout<<"请输入:";
cin>>temp;
switch(temp)
{
case '1':
start_search();
case '2':
code_search();
case '3':
end_search();
case '4':
time_search();
default:
system("cls");
welcome();
}
}
void code_search()//按班次号查询子函数
{
system("cls");
char code[4];
bool flag=0;
m=car_read_file();
cout<<"输入您所要查询的班次号:";
cin>>code;
for(i=0;i<m;i++)
{
if(strcmp(code,bus[i].bus_code)==0)
{ flag=1;
cout<<"班次号 "<<"发车时间 "<<"起点站 "<<"终点站 "<<"行程时间(分)"<<"最大载客量 "<<"剩余票数 "<<"票价"<<endl;
display_car(i);
cout<<endl;
}
}
if(flag==0)
{
cout<<"对不起,您所查询的班次不存在"<<endl;
}
cout<<"是否继续查询?是:输入“Y”;输入其他则不查询:";
cin>>x;
if(x=='Y')
{
pas_search();
}
pas_booking();
}
void start_search()//按起点地址查询子函数
{
system("cls");
char start[20];
bool flag=0;
m=car_read_file();
cout<<"输入您所要查询的起点地址:";
cin>>start;
for(i=0;i<m;i++)
{
if(strcmp(start,bus[i].starting)==0)
{
flag=1;
cout<<"班次号 "<<"发车时间 "<<"起点站 "<<"终点站 "<<"行程时间(分)"<<"最大载客量 "<<"剩余票数 "<<"票价"<<endl;
display_car(i);
cout<<endl;
}
}
if(flag==0)
{
cout<<"对不起,您所查询的班次不存在"<<endl;
}
cout<<"是否继续查询?是:输入“Y”;输入其他则不查询:";
cin>>x;
if(x=='Y')
{
pas_search();
}
pas_booking();
}
void end_search()//按终点地址查询子函数
{
system("cls");
char end[20];
bool flag=0;
m=car_read_file();
cout<<"输入您所要查询的终点地址:";
cin>>end;
for(i=0;i<m;i++)
{
if(strcmp(end,bus[i].destination)==0)
{
flag=1;
cout<<"班次号 "<<"发车时间 "<<"起点站 "<<"终点站 "<<"行程时间(分)"<<"最大载客量 "<<"剩余票数 "<<"票价"<<endl;
display_car(i);
cout<<endl;
}
}
if(flag==0)
{
cout<<"对不起,您所查询的班次不存在"<<endl;
}
cout<<"是否继续查询?是:输入“Y”;输入其他则不查询:";
cin>>x;
if(x=='Y')
{
pas_search();
}
pas_booking();
}
void time_search()//按时间查询子函数
{
system("cls");
int hour1;
int min1;
bool flag=0;
m=car_read_file();
cout<<"输入您所要查询班次的时间(时,分):";
cin>>hour1>>min1;
for(i=0;i<m;i++)
{
if((hour1==bus[i].start_time.hour)&&(min1==bus[i].start_time.min))
{
flag=1;
cout<<"班次号 "<<"发车时间 "<<"起点站 "<<"终点站 "<<"行程时间(分)"<<"最大载客量 "<<"剩余票数 "<<"票价"<<endl;
display_car(i);
cout<<endl;
}
}
if(flag==0)
{
cout<<"对不起,您所查询的班次不存在"<<endl;
}
cout<<"是否继续查询?是:输入“Y”;输入其他则不查询:";
cin>>x;
if(x=='Y')
{
pas_search();
}
pas_booking();
}
void pas_booking()//订票子函数
{
cout<<"进入订票功能?(是则输入“Y”,输入其他返回主菜单):";
cin>>x;
while(x=='Y')
{
char start[20],end[20];
struct time starttime;
int num;
bool flag=0;
m=car_read_file();
cout<<"按照要求输入订票信息:"<<endl;
cout<<"请输入所订车票的起点站:";
cin>>start;
cout<<"请输入终点站:";
cin>>end;
cout<<"请输入开车时间(时,分):";
cin>>starttime.hour;
cin>>starttime.min;
cout<<"请输入所需订购的票数:";
cin>>num;
for(i=0;i<m;i++)
{
if((strcmp(start,bus[i].starting)==0)&&(strcmp(end,bus[i].destination)==0))
{
if((starttime.hour==bus[i].start_time.hour)&&(starttime.min==bus[i].start_time.min))
{
if(num<=bus[i].ticket_num)
{
flag=1;
char n;
if(!time_compare(i))
{
system("cls");
cout<<"抱歉,该车已发出,无法订票!"<<endl;
Sleep(2000);
system("cls");
pas_booking();
}
cout<<"恭喜你,存在您所要购买的车票,是否进行订票?是:输入“Y”,输出其他则不订票:";
cin>>n;
if(n=='Y')
{
system("cls");
cout<<"请按照要求输入您的个人信息:"<<endl;
cout<<"请输入您的身份证号:";
cin>>p1.ID_num;
cout<<"请输入您的姓名:";
cin>>p1.name;
cout<<"请输入您的性别:";
cin>>p1.sex;
cout<<"请输入您的出生日期(年,月,日):";
cin>>p1.birthday.year>>p1.birthday.month>>p1.birthday.day;
p1.seat_num=num;
cout<<"确定订票?(是则输入“Y”,输入其他则不订票):"<<endl;
cin>>n;
if(n=='Y')
{
strcpy(p1.bus_code,bus[i].bus_code);
int money;
bus[i].ticket_num-=num;
money=p1.seat_num*bus[i].price;
ofstream writefile1;
writefile1.open("乘客信息.txt",ios::app);
writefile1<<p1.bus_code<<" "<<p1.ID_num<<" "<<p1.name<<" "<<p1.sex<<" "<<p1.birthday.year<<" "<<p1.birthday.month<<" "<<p1.birthday.day<<" "<<p1.seat_num<<endl;
writefile1.close();
cout<<"您的订票成功!"<<endl;
cout<<"车票信息:"<<endl;
cout<<"班次号 开车时间 购票数(张) 单价(元) 总计(元)"<<endl;
cout<<p1.bus_code<<"\t "<<starttime.hour<<":"<<starttime.min<<"\t\t"<<p1.seat_num<<"\t "<<bus[i].price<<"\t "<<money<<endl;
cout<<"温馨提示:请乘客提前5分钟上车!"<<endl<<endl;
for(i=0;i<m;i++)
{
car_write_file(i);
}
}
}
}
}
}
}
if(flag==0)
{
cout<<"对不起,没有符合您要求的车票!您可以通过查询功能了解车站班车信息。"<<endl;
}
cout<<"确定需要继续订票?(确定则输入“Y”,输入其他退出订票):";
cin>>x;
system("cls");
}
welcome();
}
void pas_change()//旅客增减车票子函数
{
system("cls");
cout<<"是否需要改变已订车票的数量?(是:输入“Y”;输入其他则返回主菜单):";
cin>>x;
bool flag=0;
while(x=='Y')
{
char ID[20],code1[4];
m=pas_read_file();
y=car_read_file();
cout<<"请输入您购票时所用的身份证号码:";
cin>>ID;
cout<<"请输入您的班车车号:";
cin>>code1;
for(int k=0;k<m;k++)
{
if((strcmp(ID,passager[k].ID_num)==0)&&(strcmp(code1,passager[k].bus_code)==0))
{
flag=1;
cout<<"请确认您的个人信息?"<<endl;
cout<<"班车号\t身份证号\t 姓名\t性别 出生日期\t订票数量"<<endl;
cout<<passager[k].bus_code<<"\t"<<passager[k].ID_num<<"\t"<<passager[k].name<<" "<<passager[k].sex<<"\t"<<passager[k].birthday.year<<"/";
cout<<passager[k].birthday.month<<'/'<<passager[k].birthday.day<<"\t"<<passager[k].seat_num;
for(i=0;strcmp(bus[i].bus_code,passager[k].bus_code)!=0;i++);
if(!time_compare(i))
{
if(bus[i].max_num>(bus[i].max_num-bus[i].ticket_num)*10)
{
cout<<"(班车已取消)";
}
else
{
cout<<"(班车已发出)";
}
Sleep(3000);
pas_change();
}
cout<<endl<<"请输入您所要的操作!"<<endl;
cout<<"<1>增加订票量;<2>减少订票量;(输入其他返回主菜单):";
cin>>temp;
switch(temp)
{
case '1':
ticket_increase();
case '2':
ticket_decrease();
default:
system("cls");
welcome();
}
}
}
if(flag==0)
{
cout<<"找不到您所订的票,请确认您的省份证号码!"<<endl;
}
cout<<"是否需要继续修改票数?是:“Y”,输入其他返回主菜单:";
cin>>x;
system("cls");
}
system("cls");
welcome();
}
void ticket_increase()//增加车票
{
int num;
cout<<endl<<"输入您所增加的车票量:";
cin>>num;
while(num>bus[i].ticket_num)
{
cout<<"您输入的数量多于本车所剩票数!请重新输入!"<<endl;
cin>>num;
}
cout<<"确定增加票?(是则输入“Y”;输入其他则取消退票):";
cin>>x;
while(x=='Y')
{
passager[k].seat_num+=num;
bus[i].ticket_num-=num;
for(i=0;i<m;i++)
{
pas_write_file(i);
}
for(i=0;i<y;i++)
{
car_write_file(i);
}
cout<<"增加车票成功!"<<endl;
cout<<"等待3秒钟返回主菜单。。。";
Sleep(3000);
}
system("cls");
pas_change();
}
void ticket_decrease()//减少车票
{
int num;
cout<<endl<<"输入您所要退的车票量:";
cin>>num;
while(num>passager[k].seat_num)
{
cout<<"您输入的数量多于您所订的票数!请重新输入!"<<endl;
cin>>num;
}
cout<<"确定要退票?是:输入“Y”;输入其他则取消退票:";
cin>>x;
if(x=='Y')
{
passager[k].seat_num-=num;
bus[i].ticket_num+=num;
if(passager[k].seat_num==0)
{
for(int n=1;n<=m-k;n++)
{
passager[k+n-1]=passager[k+n];
}
m--;
}
for(i=0;i<m;i++)
{
pas_write_file(i);
}
for(i=0;i<y;i++)
{
car_write_file(i);
}
cout<<"退票成功!"<<endl;
}
system("cls");
pas_change();
}
void sta_scan()//浏览班次信息
{
system("cls");
y=pas_read_file();
m=car_read_file();
cout<<"班次号 "<<"发车时间 "<<"起点站 "<<"终点站\t "<<"行程时间(分)"<<"最大载客量 "<<"剩余票数 "<<"票价"<<endl;
for(i=0;i<m;i++)
{
display_car(i);
}
cout<<endl;
cout<<"输入任意数退出:";
cin>>x;
system("cls");
welcome();
}
void display_car(int i)//显示班车信息
{
cout<<bus[i].bus_code<<"\t"<<bus[i].start_time.hour<<":"<<bus[i].start_time.min<<"\t";
cout<<bus[i].starting<<"\t"<<bus[i].destination<<" "<<bus[i].route_time<<"\t ";
cout<<bus[i].max_num<<"\t "<<bus[i].ticket_num<<"\t "<<bus[i].price;
if(!time_compare(i))
{
if(bus[i].max_num>(bus[i].max_num-bus[i].ticket_num)*10)
{
cout<<"(班次取消)"<<endl;
}
else
cout<<" (已发车)"<<endl;
}
else
cout<<endl;
}
bool time_compare(int i)//与系统时间比较,返回0表示时间已经过去
{
time_t ti;
struct tm *now;
ti=time(NULL);
now=localtime(&ti);
if((now->tm_hour==bus[i].start_time.hour&&now->tm_min>=bus[i].start_time.min)||(now->tm_hour>bus[i].start_time.hour))
{
return 0;
}
return 1;
}
void car_write_file(int i)//将班次信息写入txt文件中
{
ofstream writefile;
if(i==0)
writefile.open("班次信息.txt",ios::out);
else
writefile.open("班次信息.txt",ios::app);
writefile<<bus[i].bus_code<<" "<<bus[i].max_num<<" "<<bus[i].ticket_num<<" ";
writefile<<bus[i].start_time.hour<<" "<<bus[i].start_time.min<<" "<<bus[i].starting<<" ";
writefile<<bus[i].destination<<" "<<bus[i].route_time<<" "<<bus[i].price<<endl;
writefile.close();
}
int car_read_file()//将班车信息从文件中读出来
{
int i1;
ifstream readfile;
readfile.open("班次信息.txt",ios::in);
for(i1=0;!readfile.eof();i1++)
{
readfile>>bus[i1].bus_code>>bus[i1].max_num>>bus[i1].ticket_num>>bus[i1].start_time.hour;
readfile>>bus[i1].start_time.min>>bus[i1].starting>>bus[i1].destination>>bus[i1].route_time;
readfile>>bus[i1].price;
}
readfile.close();
return i1-1;
}
int pas_read_file()//将乘客信息从文件中读出来
{
int i1;
ifstream readfile;
readfile.open("乘客信息.txt",ios::in);
for(i1=0;!readfile.eof();i1++)
{
readfile>>passager[i1].bus_code>>passager[i1].ID_num>>passager[i1].name>>passager[i1].sex>>passager[i1].birthday.year>>passager[i1].birthday.month;
readfile>>passager[i1].birthday.day>>passager[i1].seat_num;
}
readfile.close();
return i1-1;
}
void pas_write_file(int j)
{
ofstream writefile1;
if(j==0)
writefile1.open("乘客信息.txt",ios::out);
else
writefile1.open("乘客信息.txt",ios::app);
writefile1<<passager[j].bus_code<<" "<<passager[j].ID_num<<" "<<passager[j].name<<" "<<passager[j].sex<<" "<<passager[j].birthday.year<<" "<<passager[j].birthday.month<<" "<<passager[j].birthday.day<<" "<<passager[j].seat_num<<endl;
writefile1.close();
}
void quit()//退出函数
{
system("cls");
cout<<endl;
cout<<" (# ̄▽ ̄#)~~ "<<endl;
cout<<" **********感谢您的使用!**********"<<endl;
Sleep(4500);
system("cls");
}