基本功能
- 线路信息输入
- 用户能够输入地铁线路编号和站点信息。
- 例如,第一行输入 “9 35” 表示地铁9号线共有35个站点,站点编号从1至35。第二行输入35个站点名称“songjiangnanzhan zuibaichi songjiangtiyuzhongxin songjiangxincheng songjiangdaxuecheng ……”。说明:这里输入的是拼音,可以考虑输入中文,这样更直观。
- 换乘站信息输入
- 用户能够输入换乘站信息。
- 例如,输入 “3 5 9 16” 表示地铁3号线的第5站与地铁9号线的第16站之间可以进行换乘。也可输入“3 yishanlu 9 yishanlu”,表示地铁3号线的yishanlu与9号线的yishanlu之间可以换乘。
- 线路信息修改
- 系统应支持以下修改操作:
- 扩充线路长度:例如,将9号线的站点数量从35增加到40。
- 缩短线路长度:例如,将9号线的站点数量从35减少到30。
- 删除换乘站:允许用户删除指定线路间的换乘关系,例如删除9号线和3号线的yishanlu站的换乘。
- 封闭线路区间:例如,封闭9号线的第16站至第18站,使得这三站无法出入或进行换乘。
- 恢复线路区间:例如,恢复9号线的第16站
- 线路查询功能
- 输入线路号查询:例如,输入9,可以输出9号线的站点以及换乘信息。 - 路线查询功能
- 以上线路信息中,每两站之间距离均为1,所有换乘距离均为0。用户可以查询从某一站点到另一站点的最短路线。系统将输出以下结果之一:
- 无需换乘则输出路线和起止站点。例如,输入“songjiangdaxuecheng shijidadao”,则输出“乘坐9号线 songjiangdaxuecheng上车, shijidadao下车”
- 换乘路线所有必要的换乘站点和线路。例如,输入“songjiangdaxuecheng zhongshangongyuan”,则输出“9号线 songjiangdaxuecheng上, yishanlu下\n3号线yishanlu上,zhongshangongyuan下”以及“9号线 songjiangdaxuecheng上, yishanlu下\n4号线yishanlu上,zhongshangongyuan下”
- 不可到达,如果站点暂时封闭或者不存在等情况则不可到达。
- 如果多条路线均最短,则都输出。如上例,3号和4号线都可以到达zhongshangongyuan,因此输出了两条路线。
- 用户界面
- 系统应提供一个简洁直观的菜单,使用户能够轻松输入、修改和查询地铁线路信息。
源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STATIONS 100
#define MAX_LINES 10
#define MAX_NAME_LENGTH 50
typedef struct {
int line_number;
int station_count;
char stations[MAX_STATIONS][MAX_NAME_LENGTH];
} Line;
typedef struct {
int line1;
int station1;
int line2;
int station2;
} Transfer;
Line lines[MAX_LINES];
Transfer transfers[MAX_STATIONS];
int line_count = 0;
int transfer_count = 0;
void input_line_info() {
printf("请输入地铁线路编号和站点信息(例如:9 35):");
scanf("%d %d", &lines[line_count].line_number, &lines[line_count].station_count);
getchar(); // 吃掉换行符
printf("请输入站点名称(例如:songjiangnanzhan zuibaichi ...):");
for (int i = 0; i < lines[line_count].station_count; i++) {
scanf("%s", lines[line_count].stations[i]);
}
line_count++;
}
void input_transfer_info() {
printf("请输入换乘站信息(例如:3 5 9 16 或 3 yishanlu 9 yishanlu):");
char input[100];
getchar(); // 吃掉换行符
fgets(input, sizeof(input), stdin);
if (sscanf(input, "%d %d %d %d", &transfers[transfer_count].line1, &transfers[transfer_count].station1, &transfers[transfer_count].line2, &transfers[transfer_count].station2) == 4) {
transfer_count++;
} else {
int line1, line2;
char station1[MAX_NAME_LENGTH], station2[MAX_NAME_LENGTH];
sscanf(input, "%d %s %d %s", &line1, station1, &line2, station2);
for (int i = 0; i < line_count; i++) {
if (lines[i].line_number == line1) {
for (int j = 0; j < lines[i].station_count; j++) {
if (strcmp(lines[i].stations[j], station1) == 0) {
transfers[transfer_count].line1 = line1;
transfers[transfer_count].station1 = j;
}
}
}
if (lines[i].line_number == line2) {
for (int j = 0; j < lines[i].station_count; j++) {
if (strcmp(lines[i].stations[j], station2) == 0) {
transfers[transfer_count].line2 = line2;
transfers[transfer_count].station2 = j;
}
}
}
}
transfer_count++;
}
}
void modify_line_info() {
int choice;
printf("请选择修改操作:\n1. 扩充线路长度\n2. 缩短线路长度\n3. 删除换乘站\n4. 封闭线路区间\n5. 恢复线路区间\n");
scanf("%d", &choice);
switch (choice) {
case 1:
// 扩充线路长度
break;
case 2:
// 缩短线路长度
break;
case 3:
// 删除换乘站
break;
case 4:
// 封闭线路区间
break;
case 5:
// 恢复线路区间
break;
default:
printf("无效选择\n");
}
}
void query_line_info() {
int line_number;
printf("请输入线路号查询:");
scanf("%d", &line_number);
for (int i = 0; i < line_count; i++) {
if (lines[i].line_number == line_number) {
printf("线路 %d 的站点信息:\n", line_number);
for (int j = 0; j < lines[i].station_count; j++) {
printf("%s ", lines[i].stations[j]);
}
printf("\n");
return;
}
}
printf("未找到线路 %d 的信息\n", line_number);
}
void query_route() {
char start[MAX_NAME_LENGTH], end[MAX_NAME_LENGTH];
printf("请输入起始站点和目的站点:");
scanf("%s %s", start, end);
// 实现路线查询功能
}
void display_menu() {
printf("地铁线路管理系统\n");
printf("1. 线路信息输入\n");
printf("2. 换乘站信息输入\n");
printf("3. 线路信息修改\n");
printf("4. 线路查询功能\n");
printf("5. 路线查询功能\n");
printf("0. 退出\n");
printf("请选择操作:");
}
int main() {
int choice;
while (1) {
display_menu();
scanf("%d", &choice);
switch (choice) {
case 1:
input_line_info();
break;
case 2:
input_transfer_info();
break;
case 3:
modify_line_info();
break;
case 4:
query_line_info();
break;
case 5:
query_route();
break;
case 0:
printf("退出系统\n");
return 0;
default:
printf("无效选择\n");
}
}
return 0;
}