• 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)

    *这是一份非官方、未本地化的翻译文本,仅供参考。

    这是一份易于普通人阅读与理解的许可证文本(并非法律性质的授权条款的替代内容)。

    你可以自由地:

    分享 – 在任何媒介或格式下再分发、传播本创作。

    只要遵守下述条款规定,授权人将不能撤回你使用本创作的自由。

    唯须遵循以下条款:

    署名 – 你必须以给予姓名标注,并提供本许可证的链接。同时你需要声明公开的创作是否经过修改。你可以采用恰当的形式将相关信息表述出来,但不得以任何形式暗示授权人已正式认可了你以及你的使用行为。

    非商业性 – 你不得将本创作运用于商业目的。

    禁止演绎 – 如果你对本创作进行了重混、转换、依据本创作进行再创作等行为,你不得再次公开散布经过修改的创作。

    不得增加额外限制 – 你不能增设任何法律限制或是技术限制,来限制他人进行本许可证已经允许的行为。

    声明:

    当你使用本创作中属于公众领域的元素,或当法律有额外或限制条款允许你的使用行为时,则你不需要遵守本授权协议。

    不提供保证。本授权协议并不能完全提供你预期需要的所有许可,例如:公共形象权,隐私权,著作人身权等其他权利,这些权利的法律限制可能会限制你使用本创作。

  • 相关阅读:
    GO学习-(17) Go语言基础之反射
    Go语言基础之time包
    Go语言标准库log介绍
    GO学习-(16) Go语言基础之文件操作
    GO学习-(15) Go语言基础之包
    GO学习-(14) Go语言基础之接口
    五种开源API网关实现组件对比
    Spring Junit4 Test
    Java泛型
    SQL 基本(Head First)
  • 原文地址:https://www.cnblogs.com/plzplz/p/16302626.html
Copyright © 2020-2023  润新知