#include <bits/stdc++.h>
using namespace std;
const int MAX_num_AIM = 3;
const int MAX_num_TRAVELWAY = 2;
const int MAX_num_LUGGAGENUMBER = 3;
const int MAX_num_PASSENGER = 62;
enum Aim {DomesticShort, DomesticLong, International};
enum TravelWay {Free, Agency};
class Luggage{
public:
void nameself(string name,int luggageNumber);
int number;
string name[3];
};
class Passenger{
public:
Passenger(string name,int luggageNumber, TravelWay travelWay, Aim aim);
void Introduce();
string name;
Luggage luggage;
TravelWay travelWay;
Aim aim;
int money;
int carryMoney;
};
string passengername[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"};
int ticket(int luggageNumber, Aim aim);
class Team{
public:
Aim aim;
string name;
int number;
int money;
};
class TravelAgency{
public:
void regist(Passenger &passenger);
Team team[5];
int number;
void introduce(void);
};
TravelAgency travelAgency;
class TicketOffice{
public:
void regist(Passenger &passenger);
void regist(TravelAgency &travelAgency);
void introduce(void);
int money[6];
string name[6];
};
TicketOffice ticketOffice;
int main(){
ios::sync_with_stdio(false);
srand(static_cast<unsigned> (time(NULL)));
int passengerNumber = rand() % MAX_num_PASSENGER;
for (int i = 0; i < passengerNumber; i++){
Passenger passenger(passengername[i], 1 + rand() % MAX_num_LUGGAGENUMBER, (TravelWay) (rand() % MAX_num_TRAVELWAY), (Aim) (rand() % MAX_num_AIM));
travelAgency.regist(passenger);
ticketOffice.regist(passenger);
}
ticketOffice.regist(travelAgency);
travelAgency.introduce();
ticketOffice.introduce();
cout << endl;
return 0;
}
Passenger::Passenger(string name,int luggageNumber, TravelWay travelWay, Aim aim){
this->name = name;
this->luggage.number = luggageNumber;
this->luggage.nameself(name, luggageNumber);
this->travelWay = travelWay;
this->aim = aim;
this->money = ticket(luggageNumber, aim);
if (aim == International && this->luggage.number > 2) this->carryMoney = 100;
else this->carryMoney = 0;
Introduce();
}
void Passenger::Introduce(){
cout << " 我是乘客 " << name << ",";
if (travelWay == Free) cout << "选择自由出行";
else cout << "报名旅行社";
cout << ",";
if (aim == DomesticShort) cout << "选择国内短途";
if (aim == DomesticLong) cout << "选择国内长途";
if (aim == International) cout << "选择国际游";
cout << ",携带" << this->luggage.number << "件行李,行李编号是 ";
for (int i = 0; i < this->luggage.number; i++){
if (i != 0) cout << "、";
cout << this->luggage.name[i];
}
cout << ",买票需付" << money << "元";
if (carryMoney) cout << ",行李托运费100元";
cout << "。" << endl;
}
void TravelAgency::regist(Passenger &passenger){
if (passenger.travelWay != Agency) return;
for (int i = 0; i < 5; i++){
if (travelAgency.team[i].number == 0){
travelAgency.team[i].name += passenger.name;
travelAgency.number++;
travelAgency.team[i].number++;
travelAgency.team[i].aim = passenger.aim;
travelAgency.team[i].money += passenger.money + passenger.carryMoney;
break;
}
else if (travelAgency.team[i].aim == passenger.aim && travelAgency.team[i].number < 6){
travelAgency.team[i].name = travelAgency.team[i].name + "," + passenger.name;
travelAgency.number++;
travelAgency.team[i].money += passenger.money + passenger.carryMoney;
travelAgency.team[i].number++;
break;
}
}
}
int ticket(int luggageNumber, Aim aim){
int money = 0;
if (aim == DomesticShort) money += 10;
if (aim == DomesticLong) money += 100;
if (aim == International) money += 500;
return money;
}
void Luggage::nameself(string name,int luggageNumber){
char str[2];
for (int i = 0; i < luggageNumber; i++){
sprintf(str, "%d", i + 1);
this->name[i] = name + "0" + str;
}
}
void TravelAgency::introduce(void){
cout << " 旅行社开始报名。" << endl << " 旅行社共计安排了5个旅行团,共计" << number << "人报名。" << endl << "出行的目的地分别是:";
for (int i = 0; i < 5; i++){
switch (team[i].aim){
case DomesticShort:
if (team[i].number != 0) cout << "国内短途";
else {
int temp = rand() % 3;
switch (temp) {
case 0: cout << "国内短途"; break;
case 1: cout << "国内长途"; break;
case 2: cout << "国际游"; break;
}
}
break;
case DomesticLong: cout << "国内长途"; break;
case International: cout << "国际游"; break;
}
if (i < 4) cout << ",";
else cout << ";";
}
cout << "每个旅行团的人数分别是:";
for (int i = 0; i < 5; i++) {
cout << team[i].number;
if (i < 4) cout << ",";
else cout << ";";
}
cout << "每个旅行团需要支付的票价是:";
for (int i = 0; i < 5; i++) {
cout << team[i].money;
if (i < 4) cout << ",";
else cout << "。" << endl;
}
}
void init(int &num) {
cout << ticketOffice.money[num];
cout << "元,乘客姓名:";
cout << ticketOffice.name[num++];
}
void TicketOffice::introduce(void){
int num = 0;
cout << " 售票处开始售票。" << endl << " 售票结束,营业额统计信息如下:";
cout << endl << " 国内短途自由行:"; init(num);
cout << endl << " 国内长途自由行:"; init(num);
cout << endl << " 国际游自由行: "; init(num);
cout << endl << " 国内短途团购: "; init(num);
cout << endl << " 国内长途团购: "; init(num);
cout << endl << " 国际游团购: "; init(num);
}
void TicketOffice::regist(Passenger &passenger){
if (passenger.travelWay != Free) return;
int num = passenger.aim;
if (money[num] != 0) name[num] += ",";
name[num] += passenger.name;
money[num] += passenger.money + passenger.carryMoney;
}
void TicketOffice::regist(TravelAgency &travelAgency){
for (int i = 0, num; i < 5; i++){
if (travelAgency.team[i].number == 0) continue;
num = 3 + travelAgency.team[i].aim;
if (money[num] != 0) name[num] += ",";
name[num] += travelAgency.team[i].name;
money[num] += travelAgency.team[i].money;
}
}
// //
// \ //
// \ //
// ##DDDDDDDDDDDDDDDDDDDDDD##
// ## DDDDDDDDDDDDDDDDDDDD ## ________ ___ ___ ___ ________ ___ ___ ___
// ## hh hh ## | __ | | | | __ | | |
// ## hh // \ hh ## | /_ \ \ | /_ \
// ## hh // \ hh ## __ \ \ \ __ \ \
// ## hh hh ## | \ \ \____ \ | \ \ \____
// ## hh wwww hh ## \_______\ \__\ \_______\ \__\ \_______\ \__\ \_______\ \__
// ## hh hh ## |_______| |__| |_______| |__| |_______| |__| |_______| |__|
// ## MMMMMMMMMMMMMMMMMMMM ##
// ##MMMMMMMMMMMMMMMMMMMMMM##
// / /