#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int MAX_SCHEDULES = 30; // 最大班次数 (3天×10班)
const int MAX_SEATS = 50; // 每班最大座位数
// 旅客信息
struct Passenger {
string name; // 姓名
string id; // 身份证号
int seat; // 座位号
};
// 班次信息
struct Schedule {
string date; // 日期 (today/tomorrow/aftertomorrow)
string scheduleId; // 班次号
string time; // 发车时间
string city; // 终点城市
int totalSeats; // 总座位数
Passenger passengers[MAX_SEATS]; // 旅客信息
int passengerCount = 0; // 当前旅客数
};
// 售票系统
class TicketSystem {
private:
Schedule schedules[MAX_SCHEDULES]; // 所有班次
int scheduleCount = 0; // 当前班次数
public:
// 初始化系统
void initialize() {
string days[] = {"today", "tomorrow", "aftertomorrow"};
string times[] = {"08:00", "10:00", "13:00", "15:00"};
string cities[] = {"北京", "上海", "广州", "深圳", "武汉", "成都", "西安", "杭州", "南京", "重庆"};
for (int d = 0; d < 3; d++) {
for (int i = 0; i < 10; i++) {
Schedule s;
s.date = days[d];
s.scheduleId = to_string(i + 1) + days[d].substr(0, 1);
s.time = times[i % 4];
s.city = cities[i];
s.totalSeats = 40;
schedules[scheduleCount++] = s;
}
}
}
// 查找班次索引
int findSchedule(string date, string id) {
for (int i = 0; i < scheduleCount; i++) {
if (schedules[i].date == date && schedules[i].scheduleId == id) {
return i;
}
}
return -1;
}
// 售票
void sellTicket() {
string date, id, name, passengerId;
cout << "输入日期(today/tomorrow/aftertomorrow): ";
cin >> date;
cout << "输入班次号: ";
cin >> id;
cout << "输入旅客姓名: ";
cin >> name;
cout << "输入身份证号: ";
cin >> passengerId;
int idx = findSchedule(date, id);
if (idx == -1) {
cout << "未找到该班次!\n";
return;
}
Schedule& s = schedules[idx];
if (s.passengerCount >= s.totalSeats) {
cout << "该班次已满座!\n";
return;
}
// 分配座位号(最小可用)
bool seats[MAX_SEATS + 1] = {false};
for (int i = 0; i < s.passengerCount; i++) {
seats[s.passengers[i].seat] = true;
}
int seatNumber = 1;
while (seatNumber <= s.totalSeats && seats[seatNumber]) {
seatNumber++;
}
if (seatNumber > s.totalSeats) {
cout << "座位分配错误!\n";
return;
}
Passenger p = {name, passengerId, seatNumber};
s.passengers[s.passengerCount++] = p;
cout << "售票成功! 座位号: " << seatNumber << endl;
}
// 退票
void refundTicket() {
string date, id, passengerId;
cout << "输入日期(today/tomorrow/aftertomorrow): ";
cin >> date;
cout << "输入班次号: ";
cin >> id;
cout << "输入身份证号: ";
cin >> passengerId;
int idx = findSchedule(date, id);
if (idx == -1) {
cout << "未找到该班次!\n";
return;
}
Schedule& s = schedules[idx];
for (int i = 0; i < s.passengerCount; i++) {
if (s.passengers[i].id == passengerId) {
// 删除旅客:用最后一个元素覆盖并减少计数
s.passengers[i] = s.passengers[s.passengerCount - 1];
s.passengerCount--;
cout << "退票成功!\n";
return;
}
}
cout << "未找到该旅客!\n";
}
// 查询余票
void checkAvailability() {
string date, id;
cout << "输入日期(today/tomorrow/aftertomorrow): ";
cin >> date;
cout << "输入班次号: ";
cin >> id;
int idx = findSchedule(date, id);
if (idx == -1) {
cout << "未找到该班次!\n";
return;
}
Schedule& s = schedules[idx];
int available = s.totalSeats - s.passengerCount;
cout << "余票数量: " << available << endl;
// 显示空座位
bool seats[MAX_SEATS + 1] = {false};
for (int i = 0; i < s.passengerCount; i++) {
seats[s.passengers[i].seat] = true;
}
cout << "空座位号: ";
for (int i = 1; i <= s.totalSeats; i++) {
if (!seats[i]) cout << i << " ";
}
cout << endl;
}
// 显示旅客登记表
void showPassengerList() {
string date, id;
cout << "输入日期(today/tomorrow/aftertomorrow): ";
cin >> date;
cout << "输入班次号: ";
cin >> id;
int idx = findSchedule(date, id);
if (idx == -1) {
cout << "未找到该班次!\n";
return;
}
Schedule& s = schedules[idx];
cout << "\n班次 " << s.scheduleId << " 旅客登记表 ("
<< s.date << " " << s.time << " 开往" << s.city << ")\n";
cout << "================================================\n";
cout << "座位号\t姓名\t身份证号\n";
cout << "------------------------------------------------\n";
for (int i = 0; i < s.passengerCount; i++) {
cout << s.passengers[i].seat << "\t"
<< s.passengers[i].name << "\t"
<< s.passengers[i].id << endl;
}
cout << "================================================\n";
}
// 系统推进到下一天
void advanceDay() {
// 将明天和后天的班次日期提前
for (int i = 0; i < scheduleCount; i++) {
if (schedules[i].date == "tomorrow") schedules[i].date = "today";
else if (schedules[i].date == "aftertomorrow") schedules[i].date = "tomorrow";
}
// 为后天添加新班次(简单的重复使用)
for (int i = 0; i < 10; i++) {
if (scheduleCount >= MAX_SCHEDULES) break;
// 查找明天的班次作为模板
for (int j = 0; j < scheduleCount; j++) {
if (schedules[j].date == "tomorrow") {
Schedule newSchedule = schedules[j];
newSchedule.date = "aftertomorrow";
newSchedule.passengerCount = 0;
schedules[scheduleCount++] = newSchedule;
break;
}
}
}
cout << "系统已推进到下一天!\n";
}
};
int main() {
TicketSystem system;
system.initialize(); // 初始化班次
while (true) {
cout << "\n===== 汽车客运售票系统 =====\n";
cout << "1. 售票\n";
cout << "2. 退票\n";
cout << "3. 查询余票\n";
cout << "4. 显示旅客登记表\n";
cout << "5. 系统推进到下一天\n";
cout << "0. 退出\n";
cout << "请选择操作: ";
int choice;
cin >> choice;
switch (choice) {
case 1: system.sellTicket(); break;
case 2: system.refundTicket(); break;
case 3: system.checkAvailability(); break;
case 4: system.showPassengerList(); break;
case 5: system.advanceDay(); break;
case 0: cout << "感谢使用,再见!\n"; return 0;
default: cout << "无效选择\n";
}
}
}
此代码的问题描述与功能要求
最新发布