⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ticketbook.cpp

📁 近日做C++课程设计时写的一个民航订票系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "iostream.h"
#include "fstream.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"

#include "DataType.h"
#include "user.h"
#include "ObjArray.h"
#include "Flight.h"
#include "Passenger.h"
#include "User.h"

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-----------------------------------+
	|下面是一些菜单字符串常量			|
	+-----------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

char *MainMenu[] = { "1. 订票\n",
					 "2. 退票\n",
					 "3. 查询\n",
					 "4. 航班管理\n",
					 "5. 用户管理\n",
					 "6. 用户注销\n",
					 "7. 退出系统\n"
};		//主菜单

char *QueryMenu[] = { "1. 航班查询\n",
					  "2. 客户查询\n",
					  "3. 返回主菜单\n"
};

char *FlightManageMenu[] = { "1. 修改航班信息\n",
							 "2. 新增航班\n",
							 "3. 取消航班\n",
							 "4. 返回主菜单\n"
};

char *UserManageMenu[] = { "1. 修改用户信息\n",
						   "2. 添加用户\n",
						   "3. 删除用户\n",
						   "4. 返回主菜单\n"
};

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-----------------------------------+
	|下面是一些函数原型声明				|
	+-----------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

bool Login(CUser &);
void ManageFlight(CUser);
void ManageUser(CUser);
void Query(CUser);
void ReadData();
void StoreData();
void Book();
void Cancel();
void QueryFlight();
void QueryPsg();
void ModifyFlight();
void AddFlight();
void DelFlight();
void ModifyUser(CUser LoginUser);
void AddUser();
void DelUser();

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		+--------------------------------+
		|这是三个分别存储三个类的对象的	 |
		|链表							 |
		+--------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

CObjArray FlightList(FLIGHT);	//航班列表
CObjArray PsgList(PASSENGER);		//客户列表
CObjArray UserList(USER);	//用户列表

void main()
{
	
	ReadData();
	cout<<"用户帮助:\n";
	cout<<"******************************\n\n";
	cout<<"进入系统需要先登录,文件中已有一个帐户,名: admin , 密码: nuaa\n";
	cout<<"或者删除文件 \"User,dat\" ,再次登录系统会提示你新建一个用户\n";
	cout<<"文件中已有一航班信息, 航班号: CZ14,可以用来做些测试\n\n";
	cout<<"*******************************\n";
	cout<<"按任意键进入系统...\n"<<flush;
	getch();
	system("cls");
	CUser LoginUser;
	int Sel = 0, state;
	while(!Login(LoginUser))
	{
		cout<<"\n用户名或密码错误,请重新登陆!\n"<<flush;
		system("pause");
		system("cls");
	}
	cout<<"您好 "<<LoginUser.GetUserID()<<",您已登陆!\n"<<flush;
	system("pause");
	system("cls");
	while(Sel!= 7)
	{
		cout<<LoginUser.GetUserID()<<" 您现在主菜单:\n";
		cout<<"----------------------------------------------\n\n";
		for(int i=0;i<7;i++)
			cout<<"\t\t*\t"<<MainMenu[i];
		cout<<"\n---------------------------------------------\n";
		cout<<"输入选择( 1 ~ 7):\t";
		cin>>Sel;
		state=cin.rdstate();
    	if(state)
		{
    		char error[81];
    		cin.clear();
    		cin.getline(error,80);
    		Sel=8;
		}
		switch(Sel)
		{
		case 1:
			Book();
			system("pause");
			system("cls");
			break;
		case 2:
			Cancel();
			system("pause");
			system("cls");
			break;
		case 3:
			system("cls");
			Query(LoginUser);
			break;
		case 4:
			system("cls");
			ManageFlight(LoginUser);
			break;
		case 5:
			system("cls");
			ManageUser(LoginUser);
			break;
		case 6:
			system("cls");
			while(!Login(LoginUser))
			{
				cout<<"用户名或密码错误,请重新登陆!\n"<<flush;
				system("pause");
				system("cls");
			}
			break;
		case 7:
			StoreData();
	//		system("cls");
			cout<<"\n数据已保存至文件, 按任意键退出系统!\n"<<flush;
			getch();
			return;
			break;
		default:
			;
		}
		cout<<flush;
		system("cls");
	}
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		+--------------------------------+
		|这是负责登陆的函数, 登陆失败	 |
		|返回false						 |
		+--------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

bool Login(CUser &login)
{
	char userID[20];
	char password[20];
	CBaseObj *user;
	Object *p = NULL;	
	cout<<"\n\n\t欢迎进入民航订票系统\n登陆界面:\n";
	cout<<"--------------------------------------\n\n";
	cout<<"\t*\t输入用户名:  ";
	cin>>userID;
	cout<<"\t*\t输入  密码:  "<<flush;
	for(int i = 0;i < 20; i++)
	{
		password[i] = getch();
		if(password[i] == '\r')
		{	
			password[i] = '\0';
			break;
		}
		cout<<"*"<<flush;
	}
	if(p = UserList.Find(userID))
	{
		user = p->objPoint;
		if(strcmp(password, ((CUser *)user)->GetPassword()) == 0)
		{
			cout<<"\n\n--------------------------------------\n";
			login = *((CUser *)user);
			return true;
		}
	}
	cout<<"\n\n--------------------------------------\n";
	return false;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-----------------------------+
	|以下这些函数很简单,不用注释 |
	+-----------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


void ManageFlight(CUser LoginUser)
{
	int Sel = 0, state;
	while(Sel!= 4)
	{
		cout<<LoginUser.GetUserID()<<" 您现在航班管理菜单:\n";
		cout<<"----------------------------------------------\n\n";
		for(int i=0;i<4;i++)
			cout<<"\t\t*\t"<<FlightManageMenu[i];
		cout<<"\n---------------------------------------------\n";
		cout<<"输入选择( 1 ~ 4):\t";
		cin>>Sel;
		state=cin.rdstate();
		if(state)
		{
    		char error[81];
    		cin.clear();
    		cin.getline(error,80);
    		Sel=8;
		}
		switch(Sel)
		{
		case 1:
			ModifyFlight();
			break;
		case 2:
			AddFlight();
			break;
		case 3:
			DelFlight();
			break;
		case 4:
			break;
		default:
			;
		}
		system("pause");
		cout<<flush;
		system("cls");
	}
}

void ManageUser(CUser LoginUser)
{
	int Sel = 0, state;
	while(Sel!= 4)
	{
		cout<<LoginUser.GetUserID()<<" 您现在用户管理菜单:\n";
		cout<<"----------------------------------------------\n\n";
		for(int i=0;i<4;i++)
			cout<<"\t\t*\t"<<UserManageMenu[i];
		cout<<"\n---------------------------------------------\n";
		cout<<"输入选择( 1 ~ 4):\t";
		cin>>Sel;
		state=cin.rdstate();
		if(state)
		{
    		char error[81];
    		cin.clear();
    		cin.getline(error,80);
    		Sel=8;
		}
		switch(Sel)
		{
		case 1:
			ModifyUser(LoginUser);
			break;
		case 2:
			if(LoginUser.GetPopedom() == 0)
				AddUser();
			else
				cout<<LoginUser.GetUserID()<<" 您不是超级用户,不能添加用户!\n";
			break;
		case 3:
			if(LoginUser.GetPopedom() == 0)
				DelUser();
			else
				cout<<LoginUser.GetUserID()<<" 您不是超级用户,不能删除用户!\n";
			break;
		case 4:
			break;
		default:
			;
		}
		system("pause");
		cout<<flush;
		system("cls");
	}
}

void Query(CUser LoginUser)
{
	int Sel = 0, state;
	while(Sel!= 3)
	{
		cout<<LoginUser.GetUserID()<<" 您现在查询菜单:\n";
		cout<<"----------------------------------------------\n\n";
		for(int i=0;i<3;i++)
			cout<<"\t\t*\t"<<QueryMenu[i];
		cout<<"\n---------------------------------------------\n";
		cout<<"输入选择( 1 ~ 3):\t";
		cin>>Sel;
		state=cin.rdstate();
		if(state)
		{
    		char error[81];
    		cin.clear();
    		cin.getline(error,80);
    		Sel=8;
		}
		switch(Sel)
		{
		case 1:
			QueryFlight();
			break;
		case 2:
			QueryPsg();
			break;
		case 3:
			break;
		default:
			;
		}
		system("pause");
		cout<<flush;
		system("cls");
	}
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-------------------------------------+
	|此函数负责从三个二进制文件中读取数据 |
	|分别放到三个链表中					  |
	+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void ReadData()
{
	fstream inFile;
	CFlight *flight;
	CPassenger *psg;
	CUser *user;
	int count;
	PASS *ps;
	PASS *from, *to;
	inFile.open("Flight.dat", ios::in|ios::binary|ios::nocreate);
	if(!inFile.fail())
	{
		flight = new CFlight();
		inFile.read((char *)flight, sizeof(CFlight));
		flight->InitPass();
		from = flight->GetPass().nextStation;
		to = from->nextStation;
		inFile.read((char *)&count, sizeof(int));
		while(!inFile.eof())
		{
			for(int i = 0;i < count;i++)
			{
				ps = new PASS;
				inFile.read((char *)ps, sizeof(PASS));
				from->nextStation = ps;
				ps->nextStation = to;
				from = ps;
			}
			FlightList.AddSort(flight);
			flight = new CFlight;
			inFile.read((char *)flight, sizeof(CFlight));
			flight->InitPass();
			from = flight->GetPass().nextStation;
			to = from->nextStation;
			inFile.read((char *)&count, sizeof(int));
		}
		inFile.close();
	}
	inFile.clear();
	
	inFile.open("Passenger.dat", ios::in|ios::binary|ios::nocreate);
	if(!inFile.fail())
	{
		psg = new CPassenger;
		inFile.read((char *)psg, sizeof(CPassenger));
		while(!inFile.eof())
		{
			PsgList.AddSort(psg);
			psg = new CPassenger;
			inFile.read((char *)psg, sizeof(CPassenger));
		}
		
	}
	inFile.close();
	inFile.clear();
	inFile.open("User.dat", ios::in|ios::binary|ios::nocreate);
	if(!inFile.fail())
	{
		user = new CUser;
		inFile.read((char *)user, sizeof(CUser));
		while(!inFile.eof())
		{
			UserList.AddSort(user);
			user = new CUser;
			inFile.read((char *)user, sizeof(CUser));
		}
		inFile.close();
	}
	else
	{
		user = new CUser;
		char userID[20];
		char password[20];
		cout<<"\n\n\t本系统首次使用,请先建一个超级用户!\n";
		cout<<"-------------------------------------\n";
		cout<<"\t请输入用户名:";
		cin>>userID;
		user->SetUserID(userID);
		cout<<"\t请输入密码:"<<flush;
		for(int i = 0;i < 20; i++)
		{
			password[i] = getch();
			if(password[i] == '\r')
			{	
				password[i] = '\0';
				break;
			}
			cout<<"*"<<flush;
		}
		user->SetPassword(password);
		cout<<endl;
		user->SetPopedom(0);	//预置为超级用户
		UserList.AddSort(user);
		cout<<"\n-------------------------------------\n";
		cout<<"\n\t创建用户成功,按任意键进入本系统!\n"<<flush;
		getch();
		system("cls");
	}

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-------------------------------------+
	|此函数负责向四个二进制文件中写入数据 |
	|其中之一来存放途径港信息			  |					  |
	+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void StoreData()
{
	fstream outFile;
	outFile.open("Flight.dat", ios::out|ios::binary);
	if(!outFile.fail())
	{
		Object *p;
		CFlight *flight;
		p = FlightList.GetHead().nextObj;
		while(p)
		{
			flight = (CFlight *)(p->objPoint);
			outFile.write((char *)flight, sizeof(CFlight));
			int count = flight->GetPsCount();
			outFile.write((char *)&count, sizeof(int));
			//这里做了一些修改,留待测试是否可行
			//这段代码是想文件写入航班的途径港信息
			PASS *q = flight->GetPass().nextStation;
			q = q->nextStation;
			while(q->nextStation)
			{
				outFile.write((char *)q, sizeof(PASS));
				q = q->nextStation;
			}
			p = p->nextObj;
		}
	}
	outFile.close();
	outFile.clear();

	outFile.open("Passenger.dat", ios::out|ios::binary);
	if(!outFile.fail())
	{
		Object *p;
		p = PsgList.GetHead().nextObj;
		while(p)
		{
			outFile.write((char *)((CPassenger *)p->objPoint), sizeof(CPassenger));
			p = p->nextObj;
		}
	}
	outFile.close();
	outFile.clear();

	outFile.open("User.dat", ios::out|ios::binary);
	if(!outFile.fail())
	{
		Object *p;
		p = UserList.GetHead().nextObj;
		while(p)
		{
			outFile.write((char *)((CUser *)p->objPoint), sizeof(CUser));
			p = p->nextObj;
		}
	}
	outFile.close();

}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-------------------------------------+
	|此函数负责向客户的订票,要求输入航班号|
	|然后要求输入客户姓名,身份证号		  |	
	|并且自动读取系统时间,作为订票时间	  |
	+-------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


void Book()
{
	CPassenger *psg;
	psg = new CPassenger;
	char name[20];			//姓名
	char identityCard[19];	//身份证号
	tm bookTime;			//订票时间
	char fltNo[10];			//航班号
	CBaseObj *flight;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -