地铁订票系统(数据结构课设)

1.数据库大作业设计目的与要求

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

图一
在这里插入图片描述

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

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

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

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

以此类推)。

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

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

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

2.输入与输出要求

要求用户输入需要的服务,输入地铁站入站口与出站口,如果想要享受管理员服务就得输入管理员密码才能继续操作。要求用户输入自己所需要的服务之后,自动进行下一栏操作,在用户购票完毕之后自动打出用户的行驶路线及其所需要的票价。如果是管理员的话,就要用三种不同的排序方法来输出每个站点的人流量。

3.思路以及数据结构与算法描述

​ 由于要实现插入和删除功能,那么我所选择的是一个链表结构体,然后在这个链表结构上面进行操作。首先搭建具体的架构,也就是不同的功能模块,然后在把功能模块一个一个的去实现,而且还实现了模块之间的可拆卸。模块与模块之间互不影响。数据结构主要是链表,此外还有类,结构体模块。而算法主要有直接插入排序算法,折半插入排序算法,冒泡排序算法,遍历算法。

使用了stl标准模板库

(算法这一块我做的不是太好,由于刚入门数据结构时候做的,一些无法直接实现的功能我走了弯路,仅供大家参考学习)

说明

凡标题前面带 * 号的即为可拆卸模块,拆卸掉之后不影响程序的正常运行,只不过少了相应功能。

4.源码分析

1.头文件包含

#include<iostream>
#include<string>
#include<list>
#include<stdlib.h>
#include<iomanip>
#include<fstream> 
using namespace std;

主函数入口

case11 对于与菜单中的选项11,功能为修改管理员密码,我把它嵌入到主函数里面了。

//主函数入口
int main() {
	list<station> important;
	fundationStation(important);
	string goveror="1234567";
	int flag=1;
	while(flag)
	{
		ofstream document;//把数据记录到本地文件 
		document.open("document.txt",ios::out);
		document<<"站点代号  "<<"站点名称 \t "<<"已售票数  "<<"将接待人数"<<endl;
		for(list<station>::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<<"请输入您的选择:"<<endl;
		int yourawnser;
		while(1) {
		cin>>yourawnser;
		if(yourawnser>=0&&yourawnser<=11) {
			break;
		} else {
			cout<<"请正确输入:"<<endl;
		}
			}
		switch(yourawnser) {
			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<<"请输入管理员密码:"<<endl;
			string mima;
			cin>>mima;
			if(mima==goveror)
			{
				cout<<"密码正确!"<<endl;
				string name;
				int position;
				cout<<"输入新建地铁站名称:"<<endl;
				cin>>name;
				cout<<"将在何处新建站点:"<<endl;
				cout<<"例:在1,2站点之间新建站点请输入2\t"<<endl;
				cout<<"在1站之前新建站点请输入1\t"<<endl;
				cout<<"在最后一站(例如5)之后新建站点请输入最后一站序号加一(例如6)"<<endl;
				cin>>position;
				createStation(name,position,important);//创建地铁站
			}
			else{
				cout<<"密码错误!"<<endl;
			}
			system("pause");
			system("cls");	
			}
			break;
			case 6: { //修改地铁站(面向管理员) 
			cout<<"请输入管理员密码:"<<endl;
			string mima;
			cin>>mima;
			if(mima==goveror)
			{
				cout<<"密码正确!"<<endl;
				string name;
				cout<<"输入想要修改的地铁站的名称 :"<<endl;
				cin>>name;
				modifyStation(name,important);
			}
			else{
				cout<<"密码错误!"<<endl;
			}
			system("pause");
			system("cls");
			}
			break;
			case 7: { //删除地铁站(面向管理员)
			cout<<"请输入管理员密码:"<<endl;
			string mima;
			cin>>mima;
			if(mima==goveror)
			{
				cout<<"密码正确!"<<endl;
				string sname;
				cout<<"输入你要删除的站点名称:"<<endl;
				cin>>sname;
				deleteStation(sname,important);
			}
			else{
				cout<<"密码错误!"<<endl;
			}
			system("pause");
			system("cls");
			}
			break;
			case 8:
				{
					cout<<"请输入管理员密码:"<<endl;
					string mima;
					cin>>mima;
					if(mima==goveror)
					{
						cout<<"密码正确!"<<endl;
						list<station> list2;
						list2.assign(important.begin(),important.end()); 
						 maopao(list2);
						
					}
					else{
						cout<<"密码错误!"<<endl;
					} 
					system("pause");
					system("cls");
				}
				break;
			case 9:
				{
					cout<<"请输入管理员密码:"<<endl;
					string mima;
					cin>>mima;
					if(mima==goveror)
					{
						cout<<"密码正确!"<<endl;
						list<station> list3;
						list3.assign(important.begin(),important.end()); 
						directlyinsert(list3);
					}
						else{
						cout<<"密码错误!"<<endl;
					} 
					system("pause");
					system("cls");
				}
				break;
				case 10:
					{
						cout<<"请输入管理员密码:"<<endl;
						string mima;
						cin>>mima;
						if(mima==goveror)
					{
						cout<<"密码正确!"<<endl;
						list<station> list4;
						list4.assign(important.begin(),important.end()); 
						kuaipai(list4);
					}
					else{
					cout<<"密码错误!"<<endl;
					} 
					system("pause");
					system("cls");
					}
					break;
					case 11:
					{
						cout<<"请输入管理员密码:"<<endl;
						string mima;
						cin>>mima;
							if(mima==goveror)
						{
						cout<<"密码正确!"<<endl;
						string wmy;
						cout<<"请输入新密码:"<<endl;
						cin>>wmy;
						goveror=wmy;
//						string goveror="1234567";
					 	} 
					 	else{
						cout<<"密码错误!"<<endl;
						} 
						system("pause");
						system("cls");
					 }
					 break;
			case 0:
				cout<<"欢迎下次使用!"<<endl;
				return 0;
				break;
			default:
				break;
		}
	}
}

2.这一块是实现的一个基点,建立一个地铁站类

class station {
	public:
//		station(){}
		station(int xuhao,string ditieming,int shoupiaoshu,int people) {
			this->saleTicket=shoupiaoshu;
			this->stationNumber=xuhao;
			this->stationName=ditieming;
			this->comers=people;
		}
		bool operator==(const station& m)const {
			if(this->saleTicket==m.saleTicket&&this->stationName==m.stationName&&this->stationNumber==m.stationNumber&&this->comers==m.comers) {
				return true;
			}
			return false;
		}
	public:
		int stationNumber;//地铁序号
		string stationName;//地铁名
		int saleTicket;//卖出票数
		int comers;


};

3.服务列表,各个功能的入口,主要是cout输出;

void showMenu() {
	cout<<"-------------------------------\t"<<endl;
	cout<<"------欢迎使用地铁购票系统-----\t"<<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;
	cout<<"-------------------------------\t"<<endl;
}

4.先前已存在基站(图一中的基站),在此基础上新增基站或者减少基站。

void fundationStation(list<station>& 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);
}

*5.购票功能实现–对于菜单中的选项1

void buyTicket(list<station>& v1) {
string first,last;
cout<<"请输入起始站点:";
cin>>first;
cout<<"请输入终点站:";
cin>>last;
list<station>::iterator firsts;
list<station>::iterator lasts;
int flag1=1,flag2=1;
for(list<station>::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<station>::iterator love=firsts;love!=lasts;love++)
		{
			cout<<(*love).stationName<<"->";
		}
		cout<<(*lasts).stationName<<endl;
		(*firsts).saleTicket+=1;
		(*lasts).comers+=1;
		if((*lasts).stationNumber-(*firsts).stationNumber<=1)
		{
			cout<<"您的票价为"<<"¥"<<2<<endl;
			cout<<"欢迎下次使用!"<<endl;
		}
		else{
			cout<<"您的票价为"<<"¥"<<(*lasts).stationNumber-(*firsts).stationNumber+1<<endl;
				cout<<"欢迎下次使用!"<<endl;
		} 
	}
	else{
		cout<<"您的行程路线为:"<<endl;
		for(list<station>::iterator loves=firsts;loves!=lasts;loves--)
		{
			cout<<(*loves).stationName<<"->";
		}
		cout<<(*lasts).stationName<<endl;
		(*firsts).saleTicket+=1;
		(*lasts).comers+=1;
		if((*firsts).stationNumber-(*lasts).stationNumber<=1)
		{
			cout<<"您的票价为"<<"¥"<<2<<endl;
				cout<<"欢迎下次使用!"<<endl;
		}
		else{
			cout<<"您的票价为"<<"¥"<<(*firsts).stationNumber-(*lasts).stationNumber+1<<endl;
				cout<<"欢迎下次使用!"<<endl;
		} 
	}
}
else{
	cout<<"你输入的起始站点或终止站点不存在!"<<endl;
}
}

*6.站点查询功能实现–对于菜单中的选项2

void findStation(list<station>& v1) {
int flag=1;
string smname;
cout<<"输入你要查询的地铁站点名称:"<<endl;
cin>>smname;
for(list<station>::iterator mit=v1.begin();mit!=v1.end();mit++)
{
	if((*mit).stationName==smname)
	{
		cout<<"站点号码"<<(*mit).stationNumber<<" 站点名称:"<<(*mit).stationName<<" 已售票数:"<<(*mit).saleTicket<<" 将接待人数:"<<(*mit).comers<<endl; 
		flag=0;
	}
}
if(flag==0)
{
	cout<<"查询完成!"<<endl;
}
else{
	cout<<"抱歉!没有找到你想要的站点!"<<endl;
}
}

*7.票价查询功能实现—对于菜单中的选项3

void findPrice(list<station>& v1) {
string first,last;
cout<<"请输入起始站点:";
cin>>first;
cout<<"请输入终点站:";
cin>>last;
list<station>::iterator firsts;
list<station>::iterator lasts;
int flag1=1,flag2=1;
for(list<station>::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<=1)
		{
			cout<<"您的票价为"<<"¥"<<2<<endl;
		}
		else{
			cout<<"您的票价为"<<"¥"<<(*lasts).stationNumber-(*firsts).stationNumber+1<<endl;
		} 
	}
	else{
		(*firsts).saleTicket+=1;
		(*lasts).comers+=1;
		if((*firsts).stationNumber-(*lasts).stationNumber<=1)
		{
			cout<<"您的票价为"<<"¥"<<2<<endl;
		}
		else{
			cout<<"您的票价为"<<"¥"<<(*firsts).stationNumber-(*lasts).stationNumber+1<<endl;
		} 
	}
}
else{
	cout<<"你输入的起始站点或终止站点不存在!"<<endl;
}
}

8.站点排序与重构,此功能不展示在功能页面,是被其他功能调用,主要是在站点修改(增加,删除)时候被调用,进行站点顺序的调整,比如在两个站点之间新增站点。–对于菜单中选项4

//
void listStation(list<station>& v1){
	cout<<"站点代号\t"<<"站点名称\t"<<"已售票数\t"<<"将接待人数"<<endl;
	for(list<station>::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<station>& v1) {
	int i=1;
	for(list<station>::iterator it = v1.begin(); it!=v1.end(); it++,i++) {
		(*it).stationNumber=i;
	}
}

*9.新建地铁站–对于菜单中的选项5

//插入地铁站
void insertStation(station& s,int a,list<station>& v1) { //插入哪个位置
	int flag=1;
	for(list<station>::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<station>& v1) {
	station s(0,name,0,0);
	insertStation(s,a,v1);
	cout<<"建站成功!"<<endl;
}

*10.修改地铁站–对于菜单中的选项6

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

*11.删除地铁站–对于菜单中的选项7

void deleteStation(string ssname,list<station>& v1) {
	int flag=1;
	for(list<station>::iterator it = v1.begin(); it!=v1.end(); it++) {
		if((*it).stationName==ssname) {
			v1.remove(*it);
			flag=0;
			cout<<"删除完成"<<endl;
			break;
		}
	}
	if(flag==0) {
		int i=1;
		for(list<station>::iterator it = v1.begin(); it!=v1.end(); it++,i++) {
			(*it).stationNumber=i;
		}
	} else{
		cout<<"输入的站点不存在!"<<endl;
	}
}

12.基础功能,调整维护站点顺序

//交换 
 void myswap(list<station>::iterator& p1,list<station>::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).stationName = ditieming;
	(*p2).comers = renshu;
}

*13.关于排序算法(冒泡,直插,折半插入)仅供参考–对于菜单中的选项8/9/10

//8.冒泡排序
void maopao(list<station>& v1)
{
	for(list<station>::iterator myi=v1.begin();myi!=v1.end();myi++)
	{

		for(list<station>::iterator myl=v1.begin();myl!=myi;myl++)
		{
			if((*myi).saleTicket>(*myl).saleTicket)
			{
				myswap(myi,myl);
			}
		}
	} 
	listStation(v1);
 } 
 //9.直接插入排序
 void directlyinsert(list<station>&v1)
{
 struct my{
 		int stationNumber;//地铁序号
		string stationName;//地铁名
		int saleTicket;//卖出票数
		int comers;
	 }mystruct[100];
	 int m=0;
	 int n=0;
	 for(list<station>::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;i<n;i++)
	{
		if(mystruct[i].saleTicket>mystruct[i-1].saleTicket)
		{
			tmp.stationNumber=mystruct[i].stationNumber;
	 		tmp.stationName=mystruct[i].stationName;
	 		tmp.saleTicket=mystruct[i].saleTicket;
	 		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].stationNumber=tmp.stationNumber;
	 		mystruct[j+1].stationName=tmp.stationName;
	 		mystruct[j+1].saleTicket=tmp.saleTicket;
	 		mystruct[j+1].comers=tmp.comers;
		}	
	}
	cout<<"站点代号\t"<<"站点名称\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;
	}
}

//10.折半插入排序
void kuaipai(list<station>&v1)
{
	struct my{
 		int stationNumber;//地铁序号
		string stationName;//地铁名
		int saleTicket;//卖出票数
		int comers;
	 }mystruct[100];
	 int m=0;
	 int n=0;
	 for(list<station>::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;i<n;i++)
	 {
	 	if(mystruct[i].saleTicket>mystruct[i-1].saleTicket)
	 	{
	 		tmp.stationNumber=mystruct[i].stationNumber;
	 		tmp.stationName=mystruct[i].stationName;
	 		tmp.saleTicket=mystruct[i].saleTicket;
	 		tmp.comers=mystruct[i].comers;
	 		low=0;high=i-1;
			 while(low<=high)
			 {
			 	mid=(low+high)/2;
			 	if(tmp.saleTicket>mystruct[mid].saleTicket)
			 	{
			 		high=mid-1;
				 }
				 else{
				 	low=mid+1;
				 }
			  } 
			  for(j=i-1;j>=high+1;j--)
			  mystruct[j+1]=mystruct[j];
			  mystruct[high+1].stationNumber=tmp.stationNumber;
	 		  mystruct[high+1].stationName=tmp.stationName;
	 		  mystruct[high+1].saleTicket=tmp.saleTicket;
	 		  mystruct[high+1].comers=tmp.comers;
		 }
	 }
		cout<<"站点代号\t"<<"站点名称\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;
	} 
} 

仅供参考学习,欢迎批评指正

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐