首页 > 其他分享 >对象数组HolidayTravel

对象数组HolidayTravel

时间:2022-08-30 21:24:37浏览次数:63  
标签:passenger destination name 对象 乘客 旅行团 int HolidayTravel 数组

根据题目要求编写模拟的程序

(1) 五一小假期,许多人选择外出旅游。每位乘客(Passenger)最多可以携带 3 件行李( Luggage)。并且乘客可以选择个人自由行;或者参加旅行社(TravelAgency)组织的旅行团。
(2)自由行的目的地、旅行团的目的地都相同,都是 3 个,分别是国内短途(DomesticShort)、国内长途(DomesticLong)和国际游(International)。 用枚举类型表示。
(3) 旅行社总共安排了 5 个旅行团(Team), 旅行团的目的地类型不限。每个团最多允许 6 位游客报名。超过 6 位,就不再加入新的游客了。
(4)自由行的乘客需要到售票处(TicketOffice)亲自买票(Ticket);参加旅行团的乘客,由旅行团到售票处团购。国内短途票 10 元/位,国内长途 100 元/位,国际票 500 元/位。购买国际票时,每位乘客可以免费托运 2 件行李。超过 2 件,每件行李多收 100 元托运费。
(5) 模拟乘客到旅行社报名,自由行乘客到售票处买票,以及旅行社统一到售票处团购票的过程。

题目要求

(1)创建新的工程项目 HolidayTravel;
(2)主程序对应的源文件名为 main.cpp,里面包含 main()函数。
(3)乘客名字的合法命名规则是“乘客 A”,……,“乘客 Z”;“乘客 a”,……,“乘客 z”;“乘客 0”,……,“乘客 9”。最多可以自动生成 62 位乘客。

编写程序并测试

可以自由定义类的成员,可以自由扩展程序,只要实现题目要求即可。
程序执行完毕后,命令行窗口显示的结果可能是:
我是乘客 A, 选择自由出行,国内长途,携带 2 件行李,行李编号是 A01、A02,买票需付 100 元。
我是乘客 B,报名旅行社,国内短途,携带 3 件行李,行李编号是 B01、B02、B03,买票需付 10 元。
我是乘客 C,报名旅行社,国际游,携带 3 件行李,行李编号是 C01、C02、C03,买票需付 500 元,行李托运费 100 元。

旅行社开始报名。
旅行社共计安排了 5 个旅行团, 共计××人报名。
出行的目的地分别是:…,…,…,…,…;每个旅行团的人数分别是:…,…,…,…,…;每个旅行团需要支付的票价是:…,…,…,…,…。

售票处开始售票。
售票结束,营业额统计信息如下:
国内短途自由行:……元,乘客姓名:………………
国内长途自由行:……元,乘客姓名:………………
国际游自由行: ……元,乘客姓名:………………
国内短途团购: ……元,乘客姓名:………………
国内长途团购: ……元;乘客姓名:………………
国际游团购: ……元;乘客姓名:………………

程序实现

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <set>
#include <string>
using namespace std;

const int MAX_PASSENGER = 62;
const int MAX_DESTINATION = 3;
const int MAX_TRVALWAY = 2;
const int MAX_LUGGAGE = 4;
const int MAX_TEAM = 5;

enum Destination {
	DomesticShort, // 国内短途
	DomesticLong,  // 国内长途
	International  // 国际游
};

enum TravalWay {
	single,  // 自由行
	team     // 报团
};

// 行李
class Luggage {
public:
	Luggage() {};
	void setLuggage(int total) { // 设置行李总数
		this->total = total;
	}
	int getLuggage() { // 得到行李总数
		return this->total;
	}
	~Luggage() {};

private:
	int total; // 行李总数
};

// 票
class Ticket {
public:
	Ticket() : ticketFare(0), checkFare(0) {};
	int getTicketFare(Destination destination) { // 根据目的地得到票价
		switch (destination) {
		case 0:
			this->ticketFare = 10;
			break;
		case 1:
			this->ticketFare = 100;
			break;
		case 2:
			this->ticketFare = 500;
			break;
		default:
			break;
		}
		return this->ticketFare;
	}
	int getCheckFare(Destination destination, int luggages) { // 得到托运费用
		if (destination == International && luggages == 3) {
			this->checkFare = 100;
		}
		return this->checkFare;
	}
	~Ticket() {};

private:
	int ticketFare; // 目的地的票价
	int checkFare;  // 托运费用
};

// 乘客
class Passenger {
public:
	Passenger() {};

	// 设置乘客信息
	void setPassenger(int number, int destination, int travelway, int luggage, int teamnum) { 
		if (number < 26) {
			this->name = 'A' + number;
		} else if (number < 52) {
			this->name = 'a' + number - 26;
		} else {
			this->name = '0' + number - 52;
		}
		this->travelway=TravalWay(travelway);
		if (this->travelway == team) {
			this->teamnum = teamnum;
		}
		this->destination = Destination(destination);
		this->luggages.setLuggage(luggage);
	}
	~Passenger() {};

	string getName() { // 得到乘客的姓名
		return this->name;
	}

	string getFullName() { // 得到乘客的完整姓名
		string prefix = "乘客";
		return prefix + this->name;
	}

	void setDestination(Destination destination) { // 根据乘客是否报团设置乘客的出行目的地
		this->destination = destination;
	}

	Destination getDestination() { // 得到乘客的出行目的地
		return this->destination;
	}

	void setTravelWay(TravalWay travelway) { // 设置乘客的出行方式
		this->travelway = travelway;
	}

	TravalWay getTravelWay() { // 得到乘客的出行方式
		return this->travelway;
	}

	void printTravelWay() { // 打印乘客的出行方式
		if (this->travelway == single) {
			cout << "选择自由出行";
		} else {
			cout << "报名旅行社";
		}
	}

	void printDestination() { // 打印乘客的目的地
		if (this->destination == DomesticShort) {
			cout << "国内短途";
		} else if (this->destination == DomesticLong) {
			cout << "国内长途";
		} else {
			cout << "国际游";
		}
	}

	int getTicket() { // 得到乘客的票价
		return this->tickets.getTicketFare(this->destination);
	}

	int getCheck() { // 得到乘客的托运费用
		return this->tickets.getCheckFare(this->destination, this->luggages.getLuggage());
	}

	int getLuggages() { // 得到乘客的行李数量
		return this->luggages.getLuggage();
	}

	void showInfo(Passenger passenger) { // 打印乘客信息
		cout << "我是" << passenger.getFullName() << ",";
		passenger.printTravelWay();
		cout << ",";
		passenger.printDestination();
		cout << ",携带" << passenger.getLuggages() << "件行李";
		if (passenger.getLuggages() != 0) {
			cout << ",行李编号是";
			for (int i = 0; i < passenger.getLuggages(); i++) {
				cout << passenger.getName() << "0" << i + 1;
				if (i < passenger.getLuggages() - 1) {
					cout << "、";
				}
			}
		}
		cout << ",买票需付" << passenger.getTicket() << "元";
		if (passenger.getCheck() != 0) {
			cout << ",行李托运费" << passenger.getCheck() << "元。" << endl;
		} else {
			cout << "。" << endl;
		}
	}
	int getTeam() { // 得到乘客的团队序号
		return this->teamnum;
	}
private:
	string name;            // 乘客的姓名
	Destination destination;// 乘客的目的地
	TravalWay travelway;    // 乘客的出行方式
	Luggage luggages;       // 乘客的行李
	Ticket tickets;         // 乘客的票
	int teamnum = -1;       // 乘客的团队序号
};

// 售票处
class TicketOffice {
public:
	TicketOffice() {};
	// 卖票。计算总票价(包括行李托运费用),string拼接乘客姓名列表。
	void sellTickets(Passenger* passenger, int number) { 
		set<int> flag;
		while (number--) {
			if (passenger->getDestination() == DomesticShort && passenger->getTravelWay() == single) {
				this->money[0] += 10;
				this->name[0] += passenger->getFullName();
				this->name[0].append(", ");
				flag.insert(flag.begin(), 0);
			} else if (passenger->getDestination() == DomesticLong && passenger->getTravelWay() == single) {
				this->money[1] += 100;
				this->name[1] += passenger->getFullName();
				this->name[1].append(", ");
				flag.insert(flag.begin(), 1);
			} else if (passenger->getDestination() == International && passenger->getTravelWay() == single) {
				this->money[2] += 500;
				if (passenger->getLuggages() == 3) {
					this->money[2] += 100;
				}
				this->name[2] += passenger->getFullName();
				this->name[2].append(", ");
				flag.insert(flag.begin(), 2);
			} else if (passenger->getDestination() == DomesticShort && passenger->getTravelWay() == team) {
				this->money[3] += 10;
				this->name[3] += passenger->getFullName();
				this->name[3].append(", ");
				flag.insert(flag.begin(), 3);
			} else if (passenger->getDestination() == DomesticLong && passenger->getTravelWay() == team) {
				this->money[4] += 100;
				this->name[4] += passenger->getFullName();
				this->name[4].append(", ");
				flag.insert(flag.begin(), 4);
			} else {
				this->money[5] += 500;
				if (passenger->getLuggages() == 3) {
					this->money[5] += 100;
				}
				this->name[5] += passenger->getFullName();
				this->name[5].append(", ");
				flag.insert(flag.begin(), 5);
			}
			passenger++;
		}
		set<int>::iterator it;
		for (it = flag.begin(); it != flag.end(); it++) {
			this->name[*it].pop_back();
			this->name[*it].pop_back();
		}
	}
	// 打印售票处信息
	void showInfo() {
		cout << "售票处开始售票。" << endl;
		cout << "售票结束,营业额统计信息如下:" << endl;
		cout << "国内短途自由行:" << this->money[0] << "元,乘客姓名:" << name[0] << "。" << endl;
		cout << "国内长途自由行:" << this->money[1] << "元,乘客姓名:" << name[1] << "。" << endl;
		cout << "国际游自由行:" << this->money[2] << "元,乘客姓名:" << name[2] << "。" << endl;
		cout << "国内短途团购:" << this->money[3] << "元,乘客姓名:" << name[3] << "。" << endl;
		cout << "国内长途团购:" << this->money[4] << "元,乘客姓名:" << name[4] << "。" << endl;
		cout << "国际游团购:" << this->money[5] << "元,乘客姓名:" << name[5] << "。" << endl;
	}
	~TicketOffice() {};

private:
	int money[6] = { 0 }; // 6种情况的总营业额
	string name[6];       // 6种情况的乘客姓名列表
};

// 旅行团
class Team {
public:
	Team() {};
	void setTeam(int destination) { // 设置旅行团的目的地
		this->destination = Destination(destination);
	}
	/* 
	报团。传入参数为Passenger指针和团队序号,如果旅行社未满员且乘客出行方式为报团,则将
	乘客目的地设为和旅行团一致,如果旅行团已满员,则将乘客出行方式设置为自由行。              
	*/
	void teamUp(Passenger* passenger, int teamnum) { 
		if (this->getNumber() == 6) {
			passenger->setTravelWay(single);
		}
		if (teamnum == passenger->getTeam() && passenger->getTravelWay() == team) {
			this->passengers[this->getNumber()] = *passenger;
			passenger->setDestination(this->destination);
			this->cost += passenger->getTicket() + passenger->getCheck();
			this->number++;
		}
	}
	Destination getDestination() { // 得到旅行团的目的地
		return this->destination;
	}
	void printDestination() { // 打印旅行团的目的地
		if (this->destination == DomesticShort) {
			cout << "国内短途";
		} else if (this->destination == DomesticLong) {
			cout << "国内长途";
		} else {
			cout << "国际游";
		}
	}
	int getNumber() { // 得到旅行团的总人数
		return this->number;
	}
	int getCost() { // 得到旅行团的总票价(包括行李托运费用)

		return this->cost;
	}
	~Team() {};

private:
	Destination destination; // 旅行团目的地
	Passenger passengers[6]; // 报名旅行团的乘客
	int number = 0;          // 旅行团总人数
	int cost = 0;            // 旅行团总票价(包括行李托运费用)
};

// 旅行社
class TravelAgency {
public:
	TravelAgency() : totalnumber(0) {};
	void initDes() { // 设置每个旅行团的目的地
		for (int i = 0; i < 5; i++) {
			this->teams[i].setTeam(rand() % MAX_DESTINATION); 
		}
	}
	/*
	报名。传入参数为Passenger指针和总人数,调用Team成员函数报团。
	*/
	void signUp(Passenger* passenger, int number) { 
		while (number--) {
			for (int i = 0; i < 5; i++) {
				if (passenger == nullptr) {
					break;
				}
				this->teams[i].teamUp(passenger, i);
			}
			passenger++;
		}
		for (int i = 0; i < 5; i++) {
			this->totalnumber += this->teams[i].getNumber();
		}
	}
	void showInfo() { // 打印旅行团信息
		cout << "旅行社开始报名。" << endl;
		cout << "旅行社共计安排了5个旅行团,共计" << this->totalnumber << "人报名。" << endl;
		cout << "出行的目的地分别是:";
		for (int i = 0; i < 5; i++) {
			this->teams[i].printDestination();
			if (i < 4) {
				cout << ",";
			}
		}
		cout << ";每个旅行团的人数分别是:";
		for (int i = 0; i < 5; i++) {
			cout << this->teams[i].getNumber();
			if (i < 4) {
				cout << ",";
			}
		}
		cout << ";每个旅行团需要支付的票价是:";
		for (int i = 0; i < 5; i++) {
			cout << this->teams[i].getCost() << "元";
			if (i < 4) {
				cout << ",";
			}
		}
		cout << endl;
	}
	~TravelAgency() {};

private:
	Team teams[5];       // 5个旅行团
	int totalnumber = 0; // 5个旅行团的总人数
};

int main() {
	srand(static_cast<unsigned>(time(NULL))); 
	int number;
	while (true) {
		cout << "Please enter the number of passagers; range from 1 to 62: " << endl;
		cin >> number;
		if (number >= 1 && number <= 62) {
			break;
		}
	}
	/*
	Passenger数组。乘客名字的合法命名规则是“乘客 A”,……,“乘客 Z”;“乘客 a”,……,
	“乘客 z”;“乘客 0”,……,“乘客 9”。最多可以自动生成 62 位乘客。
	*/
	Passenger passengers[MAX_PASSENGER];
	Passenger* pt = passengers;	// Passenger指针 
	/*
	产生随机数,并根据随机数的不同,生成不同类型的乘客(姓名、出行目的地、
	携带行李件数、出行方式、如果组团产生团队编号)。
	*/
	for (int i = 0; i < number; i++) {
		int order = rand() % MAX_PASSENGER;
		int destination = rand() % MAX_DESTINATION;
		int travelway = rand() % MAX_TRVALWAY;
		int luggage = rand() % MAX_LUGGAGE;
		int teamnum = rand() % MAX_TEAM;
		passengers[i].setPassenger(order, destination, travelway, luggage, teamnum);
	}
	TravelAgency travelagency;
	travelagency.initDes();
	travelagency.signUp(pt, number);
	for (int i = 0; i < number; i++) {
		passengers[i].showInfo(passengers[i]);
	}
	cout << endl;
	travelagency.showInfo();
	cout << endl;
	pt = passengers;
	TicketOffice ticketoffice;
	ticketoffice.sellTickets(pt, number);
	ticketoffice.showInfo();
	return 0;
}

标签:passenger,destination,name,对象,乘客,旅行团,int,HolidayTravel,数组
From: https://www.cnblogs.com/catting123/p/16640837.html

相关文章