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)

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

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

你可以自由地:

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

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

唯须遵循以下条款:

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

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

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

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

声明:

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

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

原文链接: https://www.cnblogs.com/plzplz/p/16302626.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++课程设计——汽车站车票管理

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/189186

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午2:44
下一篇 2023年2月12日 下午2:44

相关推荐