实验六 对象数组
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;
}