汽车站车票管理

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 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java