C++ 写公交车管理系统 问题描述:设计一个公交车管理系统,公交车需设置不同的类型,每个线路的公交车会经过多个不同的车站,车站、公交车可设计成不同的类,给出某个公交车可以显示它所经过所有站点。 基本功能: (1)公交车要设置不同的类型,如电车、油车等;(2)公交车信息包括:车牌号,类型,线路号,座位数,长度,宽度,高度,油耗等; (3)公交车信息要保存在文件中; (4)系统可以实现对公交车和车站信息的添加,修改,删除,查找等功能; (5)系统界面应该尽量友好,方便使用。
时间: 2023-07-28 14:09:43 浏览: 108
下面是一个简单的公交车管理系统,包括车站和公交车的类定义以及主函数的实现。你可以根据需求进行修改和补充。
```
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 车站类
class Station {
private:
string name; // 车站名称
public:
Station(string n) : name(n) {}
string getName() const { return name; }
};
// 公交车类
class Bus {
private:
string plateNum; // 车牌号
string type; // 车辆类型
int routeNum; // 线路号
int seatNum; // 座位数
double length; // 长度
double width; // 宽度
double height; // 高度
double fuelConsumption; // 油耗
vector<Station*> stations; // 经过车站
public:
Bus(string pn, string t, int rn, int sn, double l, double w, double h, double fc)
: plateNum(pn), type(t), routeNum(rn), seatNum(sn), length(l), width(w), height(h), fuelConsumption(fc) {}
string getPlateNum() const { return plateNum; }
string getType() const { return type; }
int getRouteNum() const { return routeNum; }
int getSeatNum() const { return seatNum; }
double getLength() const { return length; }
double getWidth() const { return width; }
double getHeight() const { return height; }
double getFuelConsumption() const { return fuelConsumption; }
void addStation(Station* s) { stations.push_back(s); }
void showStations() const {
cout << "经过车站:";
for (auto s : stations) {
cout << s->getName() << " ";
}
cout << endl;
}
};
// 公交车管理系统类
class BusManagementSystem {
private:
vector<Bus*> buses; // 所有公交车
vector<Station*> stations; // 所有车站
string filename; // 存储文件名
public:
BusManagementSystem(string fn) : filename(fn) {}
void load() {
ifstream fin(filename);
if (!fin.is_open()) {
cout << "无法打开文件 " << filename << "!" << endl;
return;
}
buses.clear();
stations.clear();
int num;
fin >> num;
for (int i = 0; i < num; ++i) {
string pn, t;
int rn, sn;
double l, w, h, fc;
fin >> pn >> t >> rn >> sn >> l >> w >> h >> fc;
Bus* bus = new Bus(pn, t, rn, sn, l, w, h, fc);
buses.push_back(bus);
int n;
fin >> n;
for (int j = 0; j < n; ++j) {
string name;
fin >> name;
Station* station = findStation(name);
if (station == nullptr) {
station = new Station(name);
stations.push_back(station);
}
bus->addStation(station);
}
}
fin.close();
cout << "读取成功!" << endl;
}
void save() const {
ofstream fout(filename);
if (!fout.is_open()) {
cout << "无法打开文件 " << filename << "!" << endl;
return;
}
fout << buses.size() << endl;
for (auto bus : buses) {
fout << bus->getPlateNum() << " " << bus->getType() << " "
<< bus->getRouteNum() << " " << bus->getSeatNum() << " "
<< bus->getLength() << " " << bus->getWidth() << " "
<< bus->getHeight() << " " << bus->getFuelConsumption() << endl;
fout << bus->stations.size() << endl;
for (auto station : bus->stations) {
fout << station->getName() << endl;
}
}
fout.close();
cout << "保存成功!" << endl;
}
void addBus() {
string pn, t;
int rn, sn;
double l, w, h, fc;
cout << "请输入车牌号:";
cin >> pn;
cout << "请输入车辆类型:";
cin >> t;
cout << "请输入线路号:";
cin >> rn;
cout << "请输入座位数:";
cin >> sn;
cout << "请输入长度:";
cin >> l;
cout << "请输入宽度:";
cin >> w;
cout << "请输入高度:";
cin >> h;
cout << "请输入油耗:";
cin >> fc;
Bus* bus = new Bus(pn, t, rn, sn, l, w, h, fc);
buses.push_back(bus);
cout << "添加成功!" << endl;
}
void addStation() {
string name;
cout << "请输入车站名称:";
cin >> name;
Station* station = findStation(name);
if (station != nullptr) {
cout << "车站已存在!" << endl;
return;
}
station = new Station(name);
stations.push_back(station);
cout << "添加成功!" << endl;
}
void modifyBus() {
string pn;
cout << "请输入要修改的车牌号:";
cin >> pn;
Bus* bus = findBus(pn);
if (bus == nullptr) {
cout << "未找到该车辆!" << endl;
return;
}
int choice;
while (true) {
cout << "请选择要修改的信息(输入数字):" << endl;
cout << "1. 车牌号 2. 车辆类型 3. 线路号 4. 座位数 5. 长度 6. 宽度 7. 高度 8. 油耗 9. 经过车站 10. 返回" << endl;
cin >> choice;
switch (choice) {
case 1:
cout << "请输入新的车牌号:";
cin >> pn;
bus->plateNum = pn;
cout << "修改成功!" << endl;
break;
case 2:
cout << "请输入新的车辆类型:";
cin >> bus->type;
cout << "修改成功!" << endl;
break;
case 3:
cout << "请输入新的线路号:";
cin >> bus->routeNum;
cout << "修改成功!" << endl;
break;
case 4:
cout << "请输入新的座位数:";
cin >> bus->seatNum;
cout << "修改成功!" << endl;
break;
case 5:
cout << "请输入新的长度:";
cin >> bus->length;
cout << "修改成功!" << endl;
break;
case 6:
cout << "请输入新的宽度:";
cin >> bus->width;
cout << "修改成功!" << endl;
break;
case 7:
cout << "请输入新的高度:";
cin >> bus->height;
cout << "修改成功!" << endl;
break;
case 8:
cout << "请输入新的油耗:";
cin >> bus->fuelConsumption;
cout << "修改成功!" << endl;
break;
case 9:
bus->stations.clear();
int n;
cout << "请输入经过车站个数:";
cin >> n;
for (int i = 0; i < n; ++i) {
string name;
cout << "请输入第 " << i + 1 << " 个车站名称:";
cin >> name;
Station* station = findStation(name);
if (station == nullptr) {
station = new Station(name);
stations.push_back(station);
}
bus->addStation(station);
}
cout << "修改成功!" << endl;
break;
case 10:
return;
default:
cout << "输入错误,请重新输入!" << endl;
break;
}
}
}
void deleteBus() {
string pn;
cout << "请输入要删除的车牌号:";
cin >> pn;
for (auto it = buses.begin(); it != buses.end(); ++it) {
if ((*it)->getPlateNum() == pn) {
buses.erase(it);
cout << "删除成功!" << endl;
return;
}
}
cout << "未找到该车辆!" << endl;
}
void deleteStation() {
string name;
cout << "请输入要删除的车站名称:";
cin >> name;
for (auto it = stations.begin(); it != stations.end(); ++it) {
if ((*it)->getName() == name) {
stations.erase(it);
// 从所有公交车的经过车站中删除该车站
for (auto bus : buses) {
auto it2 = find(bus->stations.begin(), bus->stations.end(), *it);
if (it2 != bus->stations.end()) {
bus->stations.erase(it2);
}
}
cout << "删除成功!" << endl;
return;
}
}
cout << "未找到该车站!" << endl;
}
void searchBus() const {
string pn;
cout << "请输入要查找的车牌号:";
cin >> pn;
Bus* bus = findBus(pn);
if (bus == nullptr) {
cout << "未找到该车辆!" << endl;
return;
}
cout << "车牌号:" << bus->getPlateNum() << endl;
cout << "车辆类型:" << bus->getType() << endl;
cout << "线路号:" << bus->getRouteNum() << endl;
cout << "座位数:" << bus->getSeatNum() << endl;
cout << "长度:" << bus->getLength() << endl;
cout << "宽度:" << bus->getWidth() << endl;
cout << "高度:" << bus->getHeight() << endl;
cout << "油耗:" << bus->getFuelConsumption() << endl;
bus->showStations();
}
void searchStation() const {
string name;
cout << "请输入要查找的车站名称:";
cin >> name;
Station* station = findStation(name);
if (station == nullptr) {
cout << "未找到该车站!" << endl;
return;
}
cout << "车站名称:" << station->getName() << endl;
cout << "经过线路:";
for (auto bus : buses) {
auto it = find(bus->stations.begin(), bus->stations.end(), station);
if (it != bus->stations.end()) {
cout << bus->getRouteNum() << " ";
}
}
cout << endl;
}
void showAllBuses() const {
cout << "所有公交车信息如下:" << endl;
for (auto bus : buses) {
cout << "车牌号:" << bus->getPlateNum() << endl;
cout << "车辆类型:" << bus->getType() << endl;
cout << "线路号:" << bus->getRouteNum() << endl;
cout << "座位数:" << bus->getSeatNum() << endl;
cout << "长度:" << bus->getLength() << endl;
cout << "宽度:" << bus->getWidth() << endl;
cout << "高度:" << bus->getHeight() << endl;
cout << "油耗:" << bus->getFuelConsumption() << endl;
bus->showStations();
}
}
void showAllStations() const {
cout << "所有车站信息如下:" << endl;
for (auto station : stations) {
cout << "车站名称:" << station->getName() << endl;
cout << "经过线路:";
for (auto bus : buses) {
auto it = find(bus->stations.begin(), bus->stations.end(), station);
if (it != bus->stations.end()) {
cout << bus->getRouteNum() << " ";
}
}
cout << endl;
}
}
void showMenu() const {
cout << "请选择要进行的操作(输入数字):" << endl;
cout << "1. 读取数据 2. 保存数据 3. 添加车辆 4. 添加车站 5. 修改车辆信息 6. 删除车辆 7. 删除车站 8. 查找车辆 9. 查找车站 10. 显示所有车辆 11. 显示所有车站 12. 退出" << endl;
}
void run() {
while (true) {
showMenu();
int choice;
cin >> choice;
switch (choice) {
case 1:
load();
break;
case 2:
save();
break;
case 3:
addBus();
break;
case 4:
addStation();
break;
case 5:
modifyBus();
break;
case 6:
deleteBus();
break;
case 7:
deleteStation();
break;
case 8:
searchBus();
break;
case 9:
searchStation();
break;
case 10:
showAllBuses();
break;
case 11:
showAllStations();
break;
case 12:
return;
default:
cout << "输入错误,请重新输入!" << endl;
break;
}
}
}
private:
Bus* findBus(string pn) const {
for (auto bus : buses) {
if (bus->getPlateNum() == pn) {
return bus;
}
}
return nullptr;
}
Station* findStation(string name) const {
for (auto station : stations) {
if (station->getName() == name) {
return station;
}
}
return nullptr;
}
};
int main() {
BusManagementSystem system("data.txt");
system.run();
return 0;
}
```
在这个实现中,公交车和车站分别使用了类来进行描述,并通过向量保存了所有的公交车和车站。公交车类包含了车牌号、车辆类型、线路号、座位数、长度、宽度、高度、油耗以及经过车站信息等属性,可以对这些属性进行添加、修改、删除等操作。车站类只包含了车站名称,并且没有提供修改和删除操作,因为车站只能通过添加新的车站来实现删除和修改操作。
公交车管理系统类负责管理所有的公交车和车站,并且提供了读取和保存数据、添加、修改和删除公交车和车站、查找公交车和车站、显示所有公交车和车站等功能。可以通过菜单选择要进行的操作。在读取和保存数据时,使用了文件流来实现。