22级数据结构大作业地铁订票系统c++

内容需求:

2级数据结构大作业地铁订票系统c++"

 参考图中郑州地铁一号线部分线路图设计一个地铁订票系统。

【问题描述】 订票管理系统应实现地铁站的插入、删除、修改、查询、排序以及票价查询等工作,请设计一个计算 机系统,实现上述功能。

【基本要求】

(1)使用合适的数据结构存储地铁站数据并将示意图中的数据存入你选择的数据结构中。

(2)由于地铁还在不断扩建,请实现地铁站的更新、删除与插入功能。

(3)用户购票时只需输入上车站与下车站,由系统自动计算出票价(两站之内 2 元,三到四站 3 元, 以此类推)。

(4)输出用户票价的同时输出用户经过的地铁站。

(5)使用合适的查找算法,依据用户的输入实现地铁站点查询功能。

(6)记录每个地铁站的人流量总数,在管理员查询时,使用至少 3 种排序算法按照人流量从大到小的 顺序列出站点名称

【选做内容】

(1)使用另一种数据结构实现题目中描述的功能。

(2)输出一个任意地铁站到其余所有站点的票价速查表。

(3)假设地铁 5 分钟经过一个站点,请使用合适的数据结构存储用户的购票信息,使得地铁管理人员 可以查询当前时刻任意两个站点的乘客总人数。

(4)任何你想实现的有趣的功能(请说明这样做的理由并对源代码进行详细注释)。

效果展示:

2级数据结构大作业地铁订票系统c++"

上面1到4均为面向用户其余面向管理员

话不多说上代码:

1.头文件:

#include
#include
#include
#include
#include
#include
using namespace std;

主函数层面:

int main()
{
	list important;
	fundationStation(important);
	string goveror="1234567";
	int flag=1;	
	while(flag)
	{
		ofstream document;
		document.open("document.txt",ios::out);//将数据同步到本地文件夹; 
		document<<"站点代号 "<<"站点名称 \t"<<"已售票数 "<<"将接待人数"<<endl;
		for(list::iterator dit=important.begin();dit!=important.end();dit++)
		{
			document<<(*dit).stationNumber<<"\t"<<setw(20)<<left<<(*dit).stationName<<setw(5)<<right<<(*dit).saleTicket<<setw(10)<<right<<(*dit).comers<<endl;		
		}
		document.close();
		showmenu();
		cout<<"请输入您的选择:"<>youranswer;
			if(youranswer>=0&&youranswer<=11)//检查是否输入正确 
			{
				break;
			}
			else
			{
				cout<<"请正确输入"<<endl;
			}
		} 
		switch (youranswer) 
		{
			case 1://购票 
				buyTicket(important);
				system("pause");
				system("cls"); 
				break;
			case 2://站点查询 
				findStation(important); 
				system("pause");
				system("cls"); 
				break;
			case 3:
				findPrice(important);
				system("pause");
				system("cls");
				break;
			case 4:
				listStation(important);
				system("pause");
				system("cls");
		        break;
		    case 5:
		    	{
		    		cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						string name;
						int position;
						cout<<"请输入新建地铁名称:"<>name;
						cout<<"将在何处新建站点"<<endl;
						cout<<"例如:在1,2间建立就输入2"<<endl;
						cout<<"在第一站之前就输入1"<<endl;
						cout<<"在最后一站之后就输入最后一站+1"<>position;
						createStation(name,position,important); 
					} 
					else
					{
						cout<<"密码错误:<"; 
					}
					system("psuse");
					system("cls");
				}
				break;
			case 6:
				{
					cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						string name;
						cout<<"请输入修改地铁名称:"<>name;
						modifyStation(name,important);
					}
					else
					{
						cout<<"密码错误:<"<<endl; 
					}
					system("psuse");
					system("cls");
				}
				break;
			case 7:
				{
					cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						string sname;
						cout<<"请输入想删除的站点"<>sname;
						deleteStation(sname,important); 
					}
					else
					{
						cout<<"密码错误:<"<<endl;
					}						
				} 
				break;
			case 8:
				{	
				    cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						list list2;
						list2.assign(important.begin(),important.end());
						bubble(list2);
					}
					else
					{
						cout<<"密码错误:<"<<endl;
					}
					system("pause");
					system("cls");
				}
				break;
			case 9:
				{	cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						list list3;
						list3.assign(important.begin(),important.end());
						directlyinsert(list3);
					}
					else
					{
						cout<<"密码错误:<"<<endl;
					}
					system("pause");
					system("cls");
				}
				break;
			case 10:
				{
					cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						list list4;
						list4.assign(important.begin(),important.end());
						kuaisu(list4);
					}
					else
					{
						cout<<"密码错误:<"<<endl;
					}
					system("pause");
					system("cls");
				}
				break;
			case 11:
				{
					cout<<"请输入管理员密码:"<>mima;
					if(goveror==mima)
					{
						cout<"<<endl;
						string newkey;
						cout<<"请输入新密码:"<>newkey;
						goveror=newkey;
						cout<<"修改成功"<<endl; 
					}
					else
					{
						cout<<"密码错误"<<endl;
					
					}
						system("pause");
						system("cls"); 
				}
				break;
			case 0:
				{
					cout<<"欢迎下次使用"<<endl;
					return 0;
					break; 
				}
			default:
				break;
		}
	}
		
}

3.选择菜单

void showmenu()//选择菜单; 
	{
		cout<<"------------------------"<<endl;
		cout<<"----欢迎使用郑州地铁----"<<endl;
		cout<<"1.购票"<<endl;
		cout<<"2.站点查询"<<endl;
		cout<<"3.票价查询"<<endl;
		cout<<"4.站点排序"<<endl;
		cout<<"5.新建站点"<<endl;
		cout<<"6.修改站点"<<endl;
		cout<<"7.删除站点"<<endl;
		cout<<"8.冒泡查看人流量"<<endl;
		cout<<"9.直接插入排序"<<endl;
		cout<<"10.折半插入排序"<<endl;
		cout<<"11.更改管理员密码"<<endl;
		cout<<"0.退出"<<endl;
		cout<<"------------------------"<<endl;
	}

4.定义一个类包含地铁站信息

class station //定义一个类包含地铁站的信息; 
	{
		public:
			station(){}
			station(int xubao,string ditieming,int shoupiaoshu,int people)
			{
				this->saleTicket=shoupiaoshu;//售票
				this->stationNumber=xubao;//
				this->stationName=ditieming;//地铁名 
				this->comers=people;
			}
			bool operator==(const station& m)const{
				if(this->saleTicket==m.saleTicket&&this->stationNumber==m.stationNumber&&this->stationName==m.stationName&&this->comers==m.comers)
				{
					return true;
				}
				return false;
			}
		public:
			int stationNumber;//地铁序号 	
			string stationName;//地铁名
			int saleTicket;//卖出票数
			int comers; 
	};

5.建站及初始信息:

void  fundationStation(list& important)
	{
		station no1(1,"郑州火车站",0,0);
		station no2(2,"二七广场",0,0);
		station no3(3,"人民路",0,0);
		station no4(4,"紫荆山",0,0);
		station no5(5,"燕庄",0,0);
		important.push_back(no1);//从尾部插入到列表中 
		important.push_back(no2);
		important.push_back(no3);
		important.push_back(no4);
		important.push_back(no5); 
	}

6.买票对应 菜单选项1

void buyTicket(list&v1)
	{
		string first,last;
		cout<>first;
		cout<>last;
		list::iterator firsts;
		list::iterator lasts;
		int flag1,flag2;
		for(list::iterator myarr=v1.begin();myarr!=v1.end();myarr++)
		{
			if((*myarr).stationName==first)
			{
				firsts=myarr;
				flag1=0;
			} 
			if((*myarr).stationName==last)
			{
				lasts=myarr;
				flag2=0;
			}
		}
		if(flag1==0&&flag2==0)
		{
			if((*firsts).stationNumber==(*lasts).stationNumber)
			{
				cout<<"您目前所处的即是站点"<<endl; 
			}
			else if((*firsts).stationNumber<(*lasts).stationNumber)
			{
				cout<<"您的行程路线为:"<<endl;
				for(list:: iterator luxian=firsts;luxian!=lasts;luxian++){
					cout<<(*luxian).stationName<";
				} 
				cout<<(*lasts).stationName<<endl;
				(*firsts).saleTicket+=1;
				(*lasts).comers+=1;
				if((*lasts).stationNumber-(*firsts).stationNumber<=2)
				{
					cout<<"您的票价为"<<2<<"元"<<endl;
					cout<<"欢迎下次使用"<<endl; 
				}
				else
				{
					  if(((*lasts).stationNumber-(*firsts).stationNumber)%2==0){
								cout<<"您的票价为"<<(*lasts).stationNumber-(*firsts).stationNumber-1<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
								else
								{
									cout<<"您的票价为"<<(*lasts).stationNumber-(*firsts).stationNumber<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
				}
			}
			else
			{
					for(list:: iterator luxian=firsts;luxian!=lasts;luxian--)
					{
						cout<<(*luxian).stationName<";
					} 
					cout<<(*lasts).stationName<<endl;
					(*firsts).saleTicket+=1;
					(*lasts).comers+=1;
				if((*firsts).stationNumber-(*lasts).stationNumber<=2)
					{
						cout<<"您的票价为"<<2<<"元"<<endl;
						cout<<"欢迎下次使用"<<endl; 
					}
				else
					{
					if(((*firsts).stationNumber-(*lasts).stationNumber)%2==0){
								cout<<"您的票价为"<<(*firsts).stationNumber-(*lasts).stationNumber-1<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
								else
								{
									cout<<"您的票价为"<<(*firsts).stationNumber-(*lasts).stationNumber<<"元"<<endl;
								    cout<<"欢迎下次使用"<<endl; 
								}
					}
			}
		}
		else
		{
			cout<<"您输入的站点不存在!"<<endl; 
		}
	}

7.查询站点对应菜单选项2

	void findStation(list&v1)
	{
		int flag1;
		string smname;
		cout<<"请输入你要查询的站点:"<>smname;
		for(list::iterator chaxun=v1.begin();chaxun!=v1.end();chaxun++)
		{
			if((*chaxun).stationName==smname)
			{
				cout<<"站点号码:"<<(*chaxun).stationNumber<<endl;
				flag1=0; 
			}
		} 
		if(flag1==0)
		{
			cout<<"查询完成 :)"<<endl;
		}
		else
		{
			cout<<"抱歉,您输入的站点未查询成功!"<<endl; 
		}
	}

8.查询票价对应菜单选项3

	void findPrice(list&v1)
	{
		string first,last;
				cout<>first;
				cout<>last;
				list::iterator firsts;
				list::iterator lasts;
				int flag1=1,flag2=1;
				for(list::iterator myarr=v1.begin();myarr!=v1.end();myarr++)
				{
					if((*myarr).stationName==first)
					{
						firsts=myarr;
						flag1=0;
					} 
					if((*myarr).stationName==last)
					{
						lasts=myarr;
						flag2=0;
					}
				}
				if(flag1==0&&flag2==0)
				{
					if((*firsts).stationNumber==(*lasts).stationNumber)
					{
						cout<<"您目前所处的即是站点"<<endl; 
					}
					else if((*firsts).stationNumber<(*lasts).stationNumber)
					{
						(*firsts).saleTicket+=1;
						(*lasts).comers+=1;
						if((*lasts).stationNumber-(*firsts).stationNumber<=2)
						{
							cout<<"您的票价为"<<2<<"元"<<endl;
							cout<<"欢迎下次使用"<<endl; 
						}
						else
						{
							    if(((*lasts).stationNumber-(*firsts).stationNumber)%2==0){
								cout<<"您的票价为"<<(*lasts).stationNumber-(*firsts).stationNumber-1<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
								else
								{
									cout<<"您的票价为"<<(*lasts).stationNumber-(*firsts).stationNumber<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
						}
					}
					else
					{
							(*firsts).saleTicket+=1;
							(*lasts).comers+=1;
						if((*firsts).stationNumber-(*lasts).stationNumber<=2)
							{
								cout<<"您的票价为"<<2<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
							}
						else
							{
							if(((*firsts).stationNumber-(*lasts).stationNumber)%2==0){
								cout<<"您的票价为"<<(*firsts).stationNumber-(*lasts).stationNumber-1<<"元"<<endl;
								cout<<"欢迎下次使用"<<endl; 
								}
								else
								{
									cout<<"您的票价为"<<(*firsts).stationNumber-(*lasts).stationNumber<<"元"<<endl;
								    cout<<"欢迎下次使用"<<endl; 
								}
							}
					}
				}
				else
				{
					cout<<"您输入的站点不存在!"<<endl; 
				}
		
	} 

9.插入部分需要的代码

	void listStation(list&v1)
	{
		cout<<"站台代号\t"<<"站台名称\t"<<"已售票数\t"<<"将接待人数"<<endl;
			for(list::iterator dit=v1.begin();dit!=v1.end();dit++)
		{
			cout<<(*dit).stationNumber<<"\t\t"<<setw(12)<<left<<(*dit).stationName<<"\t"<<right<<(*dit).saleTicket<<"\t\t"<<(*dit).comers<<endl;		
		}
	}
	void sortStation(list&v1)
	{
		int i=1;
		for(list::iterator it=v1.begin();it!=v1.end();it++,i++)
		{
			(*it).stationNumber=i;
		}
	}
	void insertStation(station& s,int a,list&v1)
	{
		int flag=1;
		for(list::iterator it=v1.begin();it!=v1.end();it++)
		{
			if((*it).stationNumber==a)
			{
				v1.insert(it,s);
				flag=0;
			}
		}
		if(flag==1)
		{
			v1.push_back(s);
		}
		sortStation(v1);
	}
void createStation(string& name,int a,list& v1)
	{
		station s(0,name,0,0);
		insertStation(s,a,v1);
		cout<<"建站成功!"; 
	}

10.修改站点

	void modifyStation(string name,list&v1)
	{
		int flag=1;
		for(list::iterator it=v1.begin();it!=v1.end();it++)
		{
			if((*it).stationName==name)
			{
				string mname;
				cout<<"站点名称修改为:"<>mname;
				(*it).stationName=mname;
				cout<<"修改成功!";
				flag=0; 
			}
			
		}
		if(flag==1)
		{
			cout<<"没有找到你想要修改的站点:<"<<endl;
		}
	}

11.删除站点

void deleteStation(string ssname,list&v1)
	{
		int flag=1;
		for(list::iterator it=v1.begin();it!=v1.end();it++)
		{
			if((*it).stationName==ssname)
			{
				v1.remove(*it);
				flag=0;
				cout<"<<endl;
				break;
			}
			
		}
		if(flag==1)
		{
			cout<<"没有找到你想要删除的站点:<"<<endl;
		}
		else if(flag==0)
		{
			int i=1;
			for(list::iterator it=v1.begin();it!=v1.end();it++,i++)
			{
				(*it).stationNumber=i;	
			}	
		} //更新站点标号 
	}

8.9.10实现的代码

void myswap(list::iterator& p1,list::iterator& p2)
		{
			int shoupiaoshu=(*p1).saleTicket;
			int xuhao=(*p1).stationNumber;
			string ditieming=(*p1).stationName;
			int renshu=(*p1).comers;
			
			(*p1).saleTicket=(*p2).saleTicket;
			(*p1).stationNumber=(*p2).stationNumber;
			(*p1).stationName=(*p2).stationName;
			(*p1).comers=(*p2).comers;
			
			(*p2).saleTicket=shoupiaoshu;
			(*p2).stationNumber=xuhao;
			(*p2).comers=renshu;
			(*p2).stationName=ditieming;
			
			
		}
	void bubble(list&v1)//有待改进 
	{
			
		for(list::iterator myi=v1.begin();myi!=v1.end();myi++)
		{
			for(list::iterator myl=v1.begin();myl!=v1.end();myl++)
			{
				if((*myi).saleTicket>(*myl).saleTicket)
				{
					myswap(myi,myl);
				}	
			}
		}
		listStation(v1);
	}
	
	void directlyinsert(list&v1)
	{
		struct my{
			int stationNumber;
			int saleTicket;
			string stationName;
			int comers;
		}mystruct[100];
		int m=0;
		int n=0;
		for(list::iterator mi=v1.begin();mi!=v1.end();mi++,m++){
			mystruct[m].stationNumber=(*mi).stationNumber;
			mystruct[m].stationName=(*mi).stationName;
			mystruct[m].saleTicket=(*mi).saleTicket;
			mystruct[m].comers=(*mi).comers;
			n++;
		}
		int i,j;
		my tmp;
		for(i=1;imystruct[i-1].saleTicket)
			{
				tmp.stationNumber=mystruct[i].stationNumber;
				tmp.saleTicket=mystruct[i].saleTicket;
				tmp.stationName=mystruct[i].stationName;
				tmp.comers=mystruct[i].comers;
				j=i-1;
				do{
					mystruct[j+1]=mystruct[j];
					j--;
				}while(j>=0&&mystruct[j].saleTicket<tmp.saleTicket);
				mystruct[j+1].stationName=tmp.stationName;
				mystruct[j+1].comers=tmp.comers;
				mystruct[j+1].saleTicket=tmp.saleTicket;
				mystruct[j+1].stationNumber=tmp.stationNumber;
			}
		}
		cout<<"站点代号\t "<<"站点名称 \t"<<"已售票数 "<<"将接待人数"<<endl;
		for(int i=0;i<n;i++){
			cout<<mystruct[i].stationNumber<<"\t\t"<<setw(12)<<left<<mystruct[i].stationName<<"\t"<<right<<mystruct[i].saleTicket<<"\t\t"<<mystruct[i].comers<<endl;
		}
	}
	void kuaisu(list&v1)//折半插入 
	{
		struct my{
					int stationNumber;
					int saleTicket;
					string stationName;
					int comers;
				}mystruct[100];
				int m=0;
				int n=0;
				for(list::iterator mi=v1.begin();mi!=v1.end();mi++,m++){
					mystruct[m].stationNumber=(*mi).stationNumber;
					mystruct[m].stationName=(*mi).stationName;
					mystruct[m].saleTicket=(*mi).saleTicket;
					mystruct[m].comers=(*mi).comers;
					n++;
				}
		int i,j,low,high,mid;
		my tmp;
		for(i=1;imystruct[i-1].saleTicket)
					{
						tmp.stationNumber=mystruct[i].stationNumber;
						tmp.saleTicket=mystruct[i].saleTicket;
						tmp.stationName=mystruct[i].stationName;
						tmp.comers=mystruct[i].comers;
					    low=0,high=i-1;
					    while(lowmystruct[mid].saleTicket)
							{
								high=mid-1;
							}
							else
							{
								low=mid+1;	
							}
						}
						for( j=i-1;j>=high;j--){
							mystruct[j+1]=mystruct[j];
							mystruct[high+1].stationNumber=tmp.stationNumber;
							mystruct[high+1].comers=tmp.comers;
							mystruct[high+1].saleTicket=tmp.saleTicket;
							mystruct[high+1].stationName=tmp.stationName;
						}
					}
				}
				cout<<"站点代号\t "<<"站点名称 \t"<<"已售票数 "<<"将接待人数"<<endl;
						for(int i=0;i<n;i++){
							cout<<mystruct[i].stationNumber<<"\t\t"<<setw(12)<<left<<mystruct[i].stationName<<"\t"<<right<<mystruct[i].saleTicket<<"\t\t"<<mystruct[i].comers<<endl;
						}
	}

注意默认初始密码为1234567,输入11时可进行修改。

已完结,点个赞支持一下b。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/80538745f4.html