汽车站车票管理

2024-06-02 21:32
文章标签 管理 车票 汽车站

本文主要是介绍汽车站车票管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

#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]);}
}

这篇关于汽车站车票管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025137

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应