请用C++帮我实现以下代码题目描述:地铁是当今城市较为流行的一种铁路运输的形式,地铁能避免城市地面拥挤,充分利用空间,具有运量大、准时、正点率较其他公交高、速度快等优点。请设计一个简易的地铁自动售票机系统。 功能需求: (1) 设计一个地铁路线类Router,包含路线编号,途中的各个站点。 (2) 设计一个地图类Map,可以显示所有可以乘坐的地铁站名,以及线路信息。 (3) 根据用户输入的起点和终点和人次信息,可以自动计算应付金额;根据用户输入的金额,计算找零信息;
时间: 2024-03-19 10:44:43 浏览: 12
好的,让我们逐步来实现这个地铁自动售票机系统。
首先,我们需要定义路线类 `Router`。每个路线有自己的编号和途中的各个站点,我们可以定义一个包含这两个属性的结构体 `Route`,然后以向量 `vector` 的形式存储多个 `Route`,表示一个完整的路线。代码如下:
```cpp
#include <string>
#include <vector>
using namespace std;
struct Route {
int id; // 路线编号
vector<string> stations; // 途中的所有站点
};
class Router {
public:
Router(); // 构造函数
void addRoute(Route route); // 添加一条路线
void displayRoutes(); // 显示所有路线
private:
vector<Route> routes; // 所有的路线
};
Router::Router() {}
void Router::addRoute(Route route) {
routes.push_back(route);
}
void Router::displayRoutes() {
for (int i = 0; i < routes.size(); i++) {
printf("Route %d: ", routes[i].id);
for (int j = 0; j < routes[i].stations.size(); j++) {
printf("%s ", routes[i].stations[j].c_str());
}
printf("\n");
}
}
```
接着,我们需要定义地图类 `Map`。地图类需要显示所有可以乘坐的地铁站名,以及线路信息。我们可以在 `Map` 类中定义两个向量,分别存储所有站点和所有路线,然后实现显示函数。代码如下:
```cpp
class Map {
public:
Map(); // 构造函数
void addStation(string station); // 添加一个站点
void addRoute(Route route); // 添加一条路线
void displayStations(); // 显示所有站点
void displayRoutes(); // 显示所有路线
private:
vector<string> stations; // 所有站点
vector<Route> routes; // 所有路线
};
Map::Map() {}
void Map::addStation(string station) {
stations.push_back(station);
}
void Map::addRoute(Route route) {
routes.push_back(route);
}
void Map::displayStations() {
printf("All stations:\n");
for (int i = 0; i < stations.size(); i++) {
printf("%s ", stations[i].c_str());
}
printf("\n");
}
void Map::displayRoutes() {
printf("All routes:\n");
for (int i = 0; i < routes.size(); i++) {
printf("Route %d: ", routes[i].id);
for (int j = 0; j < routes[i].stations.size(); j++) {
printf("%s ", routes[i].stations[j].c_str());
}
printf("\n");
}
}
```
现在我们已经完成了地铁路线和地图的定义,接下来我们需要实现自动售票机的计算功能。我们可以定义一个 `TicketMachine` 类,其中包含起点、终点、人次和金额等属性,并实现计算应付金额和找零的函数。代码如下:
```cpp
class TicketMachine {
public:
TicketMachine(Map* map); // 构造函数
void setStartStation(string startStation); // 设置起点站
void setEndStation(string endStation); // 设置终点站
void setNumOfPersons(int numOfPersons); // 设置人数
int calculatePrice(); // 计算应付金额
int calculateChange(int money); // 计算找零
private:
Map* map; // 地图
string startStation; // 起点站
string endStation; // 终点站
int numOfPersons; // 人数
int pricePerPerson = 2; // 每人每站的票价(假设为 2 元)
};
TicketMachine::TicketMachine(Map* map) {
this->map = map;
}
void TicketMachine::setStartStation(string startStation) {
this->startStation = startStation;
}
void TicketMachine::setEndStation(string endStation) {
this->endStation = endStation;
}
void TicketMachine::setNumOfPersons(int numOfPersons) {
this->numOfPersons = numOfPersons;
}
int TicketMachine::calculatePrice() {
// 找到起点站和终点站所在的路线
int startRouteIndex = -1;
int endRouteIndex = -1;
for (int i = 0; i < map->routes.size(); i++) {
vector<string> stations = map->routes[i].stations;
if (find(stations.begin(), stations.end(), startStation) != stations.end()) {
startRouteIndex = i;
}
if (find(stations.begin(), stations.end(), endStation) != stations.end()) {
endRouteIndex = i;
}
}
if (startRouteIndex == -1 || endRouteIndex == -1) {
printf("Error: invalid start station or end station.\n");
return -1;
}
// 计算距离和票价
int distance = abs(startRouteIndex - endRouteIndex);
int price = distance * numOfPersons * pricePerPerson;
return price;
}
int TicketMachine::calculateChange(int money) {
int price = calculatePrice();
if (price == -1) {
return -1;
}
int change = money - price;
if (change < 0) {
printf("Error: not enough money.\n");
return -1;
}
return change;
}
```
最后,我们可以在 `main` 函数中进行测试。首先创建地图和路线,然后显示所有站点和路线。接着创建自动售票机对象,设置起点站、终点站和人数,计算应付金额和找零。代码如下:
```cpp
int main() {
Map map;
map.addStation("A");
map.addStation("B");
map.addStation("C");
map.addStation("D");
map.addStation("E");
map.addStation("F");
map.addRoute({1, {"A", "B", "C", "D"}});
map.addRoute({2, {"B", "E", "F", "D"}});
map.displayStations();
map.displayRoutes();
TicketMachine ticketMachine(&map);
ticketMachine.setStartStation("A");
ticketMachine.setEndStation("F");
ticketMachine.setNumOfPersons(3);
int price = ticketMachine.calculatePrice();
printf("Price: %d\n", price);
int change = ticketMachine.calculateChange(20);
printf("Change: %d\n", change);
return 0;
}
```
这样,我们就完成了地铁自动售票机系统的设计和实现。