C++课程设计——汽车站车票管理
C++课程设计——汽车站车票管理
最近考试没时间分块讲解,等到结束后有时间了再细讲。
同时为了保护我的作业,代码已处理(如一些不重要的函数已经删除
部分代码参考
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;//已售票数
};
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 GenerateLogFileName(char *filename) //根据当天日期生成日志名(如2019-9-19.log),该函数无需做任何改动
{
filename[0] = '\0';
struct tm *local; //时间结构体
time_t t; //把当前时间给t
t=time(NULL); //NULL在stdio.h中定义为0
local = 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;
}
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;
}
else
{
cout<<"**************************车次信息**********************************"<<endl;
cout<<"车次\t发车时间 起点\t终点\t行车时间 票价\t载客量\t售出\t是否发车"<<endl;
ShowBusInfo(timetables,n,i);
}
cout<<endl;
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<<"**************************车次信息**********************************"<<endl;
cout<<"车次\t发车时间 起点\t终点\t行车时间 票价\t载客量\t售出\t是否发车"<<endl;
ShowBusInfo(timetables,n,i);
cout<<endl;
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<<"**************************车次信息**********************************"<<endl;
cout<<"车次\t发车时间 起点\t终点\t行车时间 票价\t载客量\t售出\t是否发车"<<endl;
ShowBusInfo(timetables,n,i);
cout<<endl;
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; //把当前时间给t
t=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 ShowBusInfo(Timetable *timetables,int n, int idx) //显示timetables数组中第idx(下标)车次信息,并显示该车是否停止服务
{
cout<<timetables[idx].no<<"\t";
cout<<timetables[idx].hour<<":";
if(timetables[idx].minute==0)cout<<timetables[idx].minute<<"0\t ";
else cout<<timetables[idx].minute<<"\t ";
cout<<timetables[idx].Starting_station<<"\t";
cout<<timetables[idx].Last_station<<"\t";
cout<<timetables[idx].time<<"\t ";
cout<<timetables[idx].fare<<"\t";
cout<<timetables[idx].max_number<<"\t";
cout<<timetables[idx].sold_number<<"\t";
if(StopSerive(timetables,n,timetables[idx].no)==1)
{
cout<<"已发车";
}else {
cout<<"未发车";
}
}
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;
}
cout<<"**************************车次信息**********************************"<<endl;
cout<<"车次\t发车时间 起点\t终点\t行车时间 票价\t载客量\t售出\t是否发车"<<endl;
for(i=0;i<k;i++)
{
ShowBusInfo(timetables,n,b[i]);
cout<<endl;
}
}
}
作者:plzplz 2022年5月23日 18点44分
本代码采用 CC-BY-NC-ND 协议进行授权。
署名-非商业性使用-禁止演绎 (BY-NC-ND):
使用者可以对本创作进行转载,但不得对本创作进行修改,亦不得依据本创作进行再创作,不得将本创作运用于商业用途。这是最严格的协议文本。
署名-非商业性使用-禁止演绎 4.0 国际版 (CC BY-NC-ND 4.0)
*这是一份非官方、未本地化的翻译文本,仅供参考。
这是一份易于普通人阅读与理解的许可证文本(并非法律性质的授权条款的替代内容)。
你可以自由地:
分享 – 在任何媒介或格式下再分发、传播本创作。
只要遵守下述条款规定,授权人将不能撤回你使用本创作的自由。
唯须遵循以下条款:
署名 – 你必须以给予姓名标注,并提供本许可证的链接。同时你需要声明公开的创作是否经过修改。你可以采用恰当的形式将相关信息表述出来,但不得以任何形式暗示授权人已正式认可了你以及你的使用行为。
非商业性 – 你不得将本创作运用于商业目的。
禁止演绎 – 如果你对本创作进行了重混、转换、依据本创作进行再创作等行为,你不得再次公开散布经过修改的创作。
不得增加额外限制 – 你不能增设任何法律限制或是技术限制,来限制他人进行本许可证已经允许的行为。
声明:
当你使用本创作中属于公众领域的元素,或当法律有额外或限制条款允许你的使用行为时,则你不需要遵守本授权协议。
不提供保证。本授权协议并不能完全提供你预期需要的所有许可,例如:公共形象权,隐私权,著作人身权等其他权利,这些权利的法律限制可能会限制你使用本创作。