C++实验6 对象数组

实验六 对象数组

1 实验目的

(1)学习如何使用数组名作为函数的参数,通过传数组的方式,在被调用
函数中访问主调函数中的多个对象的方法。
(2)学习如何在类中内嵌对象数组成员变量。
(3)学习对象数组的初始化。 2 实验内容

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

(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)模拟乘客到旅行社报名,自由行乘客到售票处买票,以及旅行社统一
到售票处团购票的过程。

3 2.题目要求

(1)创建新的工程项目 HolidayTravel;
(2)主程序对应的源文件名为 main.cpp,里面包含 main()函数。
(3)乘客名字的合法命名规则是“乘客 A”,……,“乘客 Z”;“乘客 a”,……,
“乘客 z”;“乘客 0”,……,“乘客 9”。最多可以自动生成 62 位乘客。
(4)编写程序并测试
可以自由定义类的成员,可以自由扩展程序,只要实现题目要求即可。
(5)程序执行完毕后,命令行窗口显示的结果可能是:
我是乘客 A,选择自由出行,国内长途,携带 2 件行李,行李编号是 A01、 A02,买票需付 100 元。 我是乘客 B,报名旅行社,选择国内短途,携带 3 件行李,行李编号是 B01、 B02、B03,买票需付 10 元。 我是乘客 C,报名旅行社,选择国际游,携带 3 件行李,行李编号是 C01、 C02、C03,买票需付 500 元,行李托运费 100 元。
……
……
旅行社开始报名。
旅行社共计安排了 5 个旅行团,共计××人报名。
出行的目的地分别是:…,…,…,…,…;每个旅行团的人数分别
是:…,…,…,…,…;每个旅行团需要支付的票价是:…,…,…,…,…。
售票处开始售票。
售票结束,营业额统计信息如下:
国内短途自由行:……元,乘客姓名:………………
国内长途自由行:……元,乘客姓名:………………
国际游自由行: ……元,乘客姓名:………………
国内短途团购: ……元,乘客姓名:………………
国内长途团购: ……元;乘客姓名:………………
国际游团购: ……元;乘客姓名:………………

提示:采用下面的方法产生随机数,并根据随机数的不同,生成不同类型的乘客(出行的目的地、携带的行李、个人自由行,或跟随旅行社出游)。

#include <ctime> // For time()
#include <cstdlib> // For srand() and rand()
const int MAX_TYPE = ***;
srand(static_cast<unsigned> (time(NULL))); // 初始化随机数发生器
int number = rand();
int remainder = number % MAX_TYPE;

源代码

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

class Luggage;
class Passenger;
class Team;
class TicketOffice;
class Ticket;

enum TravelType {Single, Team};
enum Destination { DomesticShort, DomesticLong, International};

class Luggage {
public:
	Luggage(string code = "") : code(code) { }

	void setLuggageCode(string code) {
		this->code = code;
	}

	string getLuggageCode() {
		return code;
	}

private:
	string code;
};

class Passenger {
public:
	Passenger() { }

	Passenger(int travelTypeRand, int destinationRand, int luggageNumberRand) {
		string letter = "";
		if (count < 26) {
			letter += count + 'A'; // static_cast<char>(count + 'A');
		} else if (count < 52)
			letter += static_cast<char>(count - 26 + 'a') ;
		else if (count < 62)
			letter += static_cast<char>(count - 52 + '0');

		name = "乘客" + letter;
		travelType = static_cast<TravelType>(travelTypeRand % 2);
		destination = static_cast<Destination>(destinationRand % 3);
		luggageNum = luggageNumberRand % 4;

		for (int i = 0; i < luggageNum; i++) {
			char suffix = i + '1';
			luggages[i].setLuggageCode(letter + '0' + suffix);
		}

		count++;
	}

	Passenger(string name, TravelType travelType, Luggage luggages[], int luggageNum)
		: name(name), travelType(travelType), luggageNum(luggageNum) {
		for (int i = 0; i < luggageNum; i++)
			this->luggages[i] = luggages[i];

		count++;
	}

	void buyTicket(TicketOffice &office);
	Destination getDestination() { return destination; }

	TravelType getTravelType() { return travelType; }

	string getName() { return name; }

	int getLuggageNum() { return luggageNum; }

	Ticket * getTicket() { return ticket; }

	void setTicket(Ticket *ticket) { this->ticket = ticket; }

	void showInfo() {
		cout << "我是" << name << "," << TRAVEL_TYPE_TEXT[travelType];
		cout << "," << DESTINATION_TEXT[destination];
		cout << ",携带" << luggageNum << "件行李";

		if (luggageNum > 0) {
			cout << ",行李编号是";
			for (int i = 0; i < luggageNum; i++)
				cout << luggages[i].getLuggageCode() << "、";
			cout << "\b\b";
		}

		cout << ",买票需付" << FARE_TEXT[destination] << "。";

		if (destination == International && luggageNum > 2) {
			cout << "\b\b,行李托运费" << 100 * (luggageNum - 2) << "元。";
		}

		cout << endl;
	}

private:
	string getDestinationText() {
		return DESTINATION_TEXT[destination];
	}

	string getTravelTypeText() {
		return TRAVEL_TYPE_TEXT[travelType];
	}

	static const int MAX_LUGGAGE_NUM = 4;
	static int count;

	static const string TRAVEL_TYPE_TEXT[2];
	static const string DESTINATION_TEXT[3];
	static const string FARE_TEXT[3];
	static const int FARE[3];

	Luggage luggages[MAX_LUGGAGE_NUM];
	string name;
	TravelType travelType;
	Destination destination;
	int luggageNum;
	Ticket *ticket;
};

int Passenger::count = 0;
const string Passenger::TRAVEL_TYPE_TEXT[2] = { "选择自由出行", "报名旅行社" };
const string Passenger::DESTINATION_TEXT[3] = { "国内短途", "国内长途", "国际旅游" };
const string Passenger::FARE_TEXT[3] = { "1O元", "100元", "500元" };
const int Passenger::FARE[3] = { 10, 100, 500 };

class TravelTeam {
public:
	TravelTeam(int destinationRand = 0) : count(0), teamFare(0) {
		destination = static_cast<Destination>(destinationRand % 3);
	}

	Destination getDestination() { return destination; }

	int getCount() { return count; }

	void setDestination(int destinationRand) {
		destination = static_cast<Destination>(destinationRand % 3);
	}

	bool addMember(Passenger &passenger) {
		if (count < MAX_PASSENGER_NUM) {
			passengers[count] = passenger;
			count++;
			return true;
		}
		else
			return false;
	}

	Passenger & getMember(int index) {
		return passengers[index];
	}

	bool isFull() { return count >= MAX_PASSENGER_NUM; }

	int getTeamFare() { return teamFare; }

	void setTeamFare(int teamFare) { this->teamFare = teamFare; }

private:
	static const int MAX_PASSENGER_NUM = 6;
	Destination destination;
	Passenger passengers[MAX_PASSENGER_NUM];
	int count;
	int teamFare;
};

class Ticket {
public:
	void setTicket(Destination destination, double fare) {
		this->destination = destination;
		this->fare = fare;
	}

private:
	Destination destination;
	double fare;
};

class TravelAgency {
public:
	TravelAgency(TravelTeam teams[], int size);
	bool registerMember(Passenger &passenger);
	void buyTicket(TicketOffice &office);
	void showInfo();

private:
	static const string DESTINATION_TYPE_TEXT[3];

	int teamNum;
	TravelTeam *teams;
};

const string TravelAgency::DESTINATION_TYPE_TEXT[3] = { "国内短途", "国内长途", "国际旅游" };

TravelAgency::TravelAgency(TravelTeam teams[], int size) {
	teamNum = size;
	this->teams = teams;
}

bool TravelAgency::registerMember(Passenger &passenger) {
	bool isSuccessful = false;

	for (int i = 0; i < teamNum; i++) {
		if (passenger.getDestination() == teams[i].getDestination()) {
			if (!teams[i].isFull()) {
				teams[i].addMember(passenger);
				isSuccessful = true;
				break;
			}
			else
				continue;
		}
	}

	return isSuccessful;
}

void TravelAgency::showInfo() {
	int totalNum = 0;
	for (int i = 0; i < teamNum; i++) {
		totalNum += teams[i].getCount();
	}

	cout << "旅行社共计安排了5个旅行团,共计" << totalNum << "人报名。" << endl;
	cout << "出行的目的地分别是:";
	for (int i = 0; i < teamNum; i++) {
		cout << DESTINATION_TYPE_TEXT[teams[i].getDestination()] << ",";
	}
	cout << "\b\b;" << endl << "每个旅行团的人数分别是:";
	for (int i = 0; i < teamNum; i++) {
		cout << teams[i].getCount() << ",";
	}
	cout << "\b\b;" << endl << "每个旅行团需要支付的票价是:";
	for (int i = 0; i < teamNum; i++) {
		cout << teams[i].getTeamFare() << ",";
	}
	cout << "\b\b。" << endl;
}

class TicketOffice {
public:
	TicketOffice(int ticketNum) : ticketNum(ticketNum), count(0), totalIncome(0) {
		tickets = new Ticket[ticketNum];
	}

	~TicketOffice() {
		delete[] tickets;
	}

	void personalCharge(Passenger &passenger, int fare);
	int teamCharge(TravelTeam &team);
	void showInfo();

private:

	Ticket *tickets;
	int ticketNum;
	int count;
	double totalIncome;

	double personalIncome[3];
	double teamIncome[3];

	string personalPassengerNames[3];
	string teamPassengerNames[3];

	static const string DESTINATION_TYPE_TEXT[3];
	static const int FARE[3];
};

const string TicketOffice::DESTINATION_TYPE_TEXT[3] = { "国内短途", "国内长途", "国际旅游" };
const int TicketOffice::FARE[3] = { 10, 100, 500 };

void Passenger::buyTicket(TicketOffice &office) {
	if (travelType == Single) {
		int fare = FARE[destination];
		if (destination == International && luggageNum > 2) {
			fare += 100 * (luggageNum - 2);
		}
		office.personalCharge(*this, fare);

	}
}

void TravelAgency::buyTicket(TicketOffice &office) {
	for (int i = 0; i < teamNum; i++) {
		//int teamFare = FARE[teams[i].getDestination()] * teams[i].getCount();///////////////
		int teamFare = office.teamCharge(teams[i]);
		teams[i].setTeamFare(teamFare);
	}
}

void TicketOffice::personalCharge(Passenger &passenger, int fare) {
	Destination destination = passenger.getDestination();
	TravelType travelType = passenger.getTravelType();

	if (travelType == Single) {
		totalIncome += fare;

		personalIncome[destination] += fare;
		personalPassengerNames[destination] += passenger.getName() + ",";

		tickets[count].setTicket(destination, fare);	// 为售票处的第count张票指定目的地、票价等信息
		passenger.setTicket(&tickets[count]);			// 把售票处的第count张票绑定到当前的乘客上

		count++;
	}
}

int TicketOffice::teamCharge(TravelTeam &team) {
	Destination destination = team.getDestination();
	int baseFare = FARE[destination];

	int teamBaseFare = baseFare * team.getCount();
	int teamFare = teamBaseFare;
	teamIncome[destination] += teamBaseFare;
	totalIncome += teamBaseFare;

	for (int i = 0; i < team.getCount(); i++) {
		Passenger &passenger = team.getMember(i);
		int luggageFee = 0;

		teamPassengerNames[destination] += passenger.getName() + ",";
		if (destination == International && passenger.getLuggageNum() > 2) {
			luggageFee = 100 * (passenger.getLuggageNum() - 2);
			teamFare += luggageFee;
			teamIncome[destination] += luggageFee;
			totalIncome += luggageFee;
		}

		tickets[count].setTicket(destination, baseFare + luggageFee);
		passenger.setTicket(&tickets[count]);

		count++;
	}
	return teamFare;
}

void TicketOffice::showInfo() {
	for (int i = 0; i < 3; i++) {
		cout << DESTINATION_TYPE_TEXT[i] << "自由行:" << setw(4) << personalIncome[i] << "元,乘客姓名:" << personalPassengerNames[i] << endl;
	}
	for (int i = 0; i < 3; i++) {
		cout << DESTINATION_TYPE_TEXT[i] << "团购:  " << setw(4) << teamIncome[i] << "元,乘客姓名:" << teamPassengerNames[i] << endl;
	}
	cout << "收入总计:" << totalIncome << "元。" << endl;
}

int main(int argc, char *argv[]) {
	const int MAX_PASSENGER_NUM = 62;
	const int MAX_TEAM_NUM = 5;

	srand(static_cast<unsigned>(time(NULL)));       // 初始化随机数发生器
	int passengerNum = rand() % MAX_PASSENGER_NUM;
	cout << passengerNum << endl;

	Passenger **passengers = new Passenger*[passengerNum];
	for (int i = 0; i < passengerNum; i++) {
		int travelTypeRand = rand();
		int destinationRand = rand();
		int luggageNumberRand = rand();

		passengers[i] = new Passenger(travelTypeRand, destinationRand, luggageNumberRand);
		passengers[i]->showInfo();
	}

	cout << endl << "旅行社开始报名。" << endl;

	TravelTeam teams[MAX_TEAM_NUM];
	for (int i = 0; i < MAX_TEAM_NUM; i++) {
		teams[i].setDestination(rand());
	}
	TravelAgency agency(teams, MAX_TEAM_NUM);

	for (int i = 0; i < passengerNum; i++) {
		if(passengers[i]->getTravelType() == Team)
			agency.registerMember(*passengers[i]);
	}
	agency.showInfo();

	cout << endl << "售票处开始售票。" << endl;

	TicketOffice office(MAX_PASSENGER_NUM);

	for (int i = 0; i < passengerNum; i++)
		passengers[i]->buyTicket(office);

	agency.buyTicket(office);

	cout << "售票结束,营业额统计信息如下:" << endl;
	office.showInfo();

	for (int i = 0; i < passengerNum; i++)
		delete passengers[i];
	delete[] passengers;

	return 0;
}
发布了172 篇原创文章 · 获赞 81 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43074474/article/details/104683550