根据题目要求编写模拟的程序
(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