厦门地铁票务管理系统 C语言实现
厦门地铁票务管理系统 C语言实现
该系统旨在为厦门地铁乘客提供便捷的票务查询服务,主要功能包括:
-
系统功能
- 新线路/新站点相关信息(线路编号、途径站点信息等)录入。
- 列车时刻信息(线路编号、日期、起点、终点、发车时间、到达时间)录入。
- 根据用户输入线路信息查询线路详细信息。
- 根据用户输入起终点信息查询票价信息。
- 根据用户输入起终点信息查询应乘坐地铁线路信息及途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等。
- 列车时刻信息查询(按线路编号、起点、终点、终点和日期等查询)。
- 按起点/终点统计每日的车次数。
-
系统主界面应有以下功能选项
- 录入新线路、站点信息
- 查询票价
- 查询线路及站点信息
- 统计列车时刻及车次信息
- 退出
数据结构设计
为了实现上述功能,需要设计以下数据结构:
-
线路信息结构体(Route)
- 包含线路编号、途径站点信息等。
-
列车时刻表结构体(TrainSchedule)
- 包含线路编号、日期、起点、终点、发车时间、到达时间。
-
票价信息结构体(TicketPrice)
- 包含起点、终点和票价信息。
-
地铁线路信息结构体(SubwayRoute)
- 包含起点、终点、途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等。
功能实现方法
在程序中,可以使用以下方法实现功能需求:
-
新线路/新站点相关信息录入
- 通过读取用户输入的线路编号和途径站点信息,创建 Route 结构体并保存到文件中。
-
列车时刻信息录入
- 通过读取用户输入的线路编号、日期、起点、终点、发车时间和到达时间,创建 TrainSchedule 结构体并保存到文件中。
-
查询线路详细信息
- 通过读取用户输入的线路编号,从文件中查找对应的 Route 结构体并输出相关信息。
-
查询票价信息
- 通过读取用户输入的起点和终点信息,从文件中查找对应的 TicketPrice 结构体并输出票价信息。
-
查询应乘坐地铁线路信息及途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等
- 通过读取用户输入的起点和终点信息,从文件中查找对应的 SubwayRoute 结构体并输出相关信息。
-
列车时刻信息查询
- 根据用户输入的查询条件(线路编号、起点、终点、日期等),从文件中查找对应的 TrainSchedule 结构体并输出相关信息。
-
按起点/终点统计每日的车次数
- 通过读取文件中所有 TrainSchedule 结构体的信息,统计每日起点/终点的车次数并输出。
文件存储方案
对于文件存储数据,可以使用文本文件或二进制文件进行存储。具体实现方法可以参考下面的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义数据结构
typedef struct {
char routeNo[20]; // 线路编号
char station[20][20]; // 途径站点信息
int stationCount; // 站点数量
} Route;
typedef struct {
char routeNo[20]; // 线路编号
char date[20]; // 日期
char startStation[20]; // 起点站
char endStation[20]; // 终点站
char startTime[20]; // 发车时间
char endTime[20]; // 到达时间
} TrainSchedule;
typedef struct {
char startStation[20]; // 起点站
char endStation[20]; // 终点站
int ticketPrice; // 票价
} TicketPrice;
typedef struct {
char startStation[20]; // 起点站
char endStation[20]; // 终点站
char routeNo[20]; // 地铁线路编号
char stations[20][20]; // 途径站点信息
int stationCount; // 站点数量
char startTime[20]; // 发车时间
char endTime[20]; // 到达时间
int stationNum; // 乘坐的站数
char transferInfo[20]; // 换乘信息
} SubwayRoute;
// 文件操作函数
void writeRouteToFile(Route route) {
FILE *fp = fopen("route.dat", "ab");
fwrite(&route, sizeof(Route), 1, fp);
fclose(fp);
}
void writeTrainScheduleToFile(TrainSchedule schedule) {
FILE *fp = fopen("train_schedule.dat", "ab");
fwrite(&schedule, sizeof(TrainSchedule), 1, fp);
fclose(fp);
}
void writeTicketPriceToFile(TicketPrice price) {
FILE *fp = fopen("ticket_price.dat", "ab");
fwrite(&price, sizeof(TicketPrice), 1, fp);
fclose(fp);
}
void writeSubwayRouteToFile(SubwayRoute route) {
FILE *fp = fopen("subway_route.dat", "ab");
fwrite(&route, sizeof(SubwayRoute), 1, fp);
fclose(fp);
}
void readRouteFromFile(char routeNo[20]) {
FILE *fp = fopen("route.dat", "rb");
Route route;
while (fread(&route, sizeof(Route), 1, fp)) {
if (strcmp(route.routeNo, routeNo) == 0) {
printf("线路编号:%s\n", route.routeNo);
printf("途径站点:");
for (int i = 0; i < route.stationCount; i++) {
printf("%s ", route.station[i]);
}
printf("\n");
}
}
fclose(fp);
}
void readTicketPriceFromFile(char startStation[20], char endStation[20]) {
FILE *fp = fopen("ticket_price.dat", "rb");
TicketPrice price;
while (fread(&price, sizeof(TicketPrice), 1, fp)) {
if (strcmp(price.startStation, startStation) == 0 && strcmp(price.endStation, endStation) == 0) {
printf("%s站到%s站的票价为:%d元\n", price.startStation, price.endStation, price.ticketPrice);
}
}
fclose(fp);
}
void readSubwayRouteFromFile(char startStation[20], char endStation[20]) {
FILE *fp = fopen("subway_route.dat", "rb");
SubwayRoute route;
while (fread(&route, sizeof(SubwayRoute), 1, fp)) {
if (strcmp(route.startStation, startStation) == 0 && strcmp(route.endStation, endStation) == 0) {
printf("从%s站到%s站的地铁线路:%s\n", route.startStation, route.endStation, route.routeNo);
printf("途径站点:");
for (int i = 0; i < route.stationCount; i++) {
printf("%s ", route.stations[i]);
}
printf("\n");
printf("发车时间:%s,到达时间:%s,乘坐站数:%d,换乘信息:%s\n", route.startTime, route.endTime, route.stationNum, route.transferInfo);
}
}
fclose(fp);
}
void readTrainScheduleFromFile(char routeNo[20], char startStation[20], char endStation[20], char date[20]) {
FILE *fp = fopen("train_schedule.dat", "rb");
TrainSchedule schedule;
int count = 0;
while (fread(&schedule, sizeof(TrainSchedule), 1, fp)) {
if (strcmp(schedule.routeNo, routeNo) == 0 && strcmp(schedule.startStation, startStation) == 0
&& strcmp(schedule.endStation, endStation) == 0 && strcmp(schedule.date, date) == 0) {
printf("车次:%d\n", ++count);
printf("线路编号:%s,日期:%s\n", schedule.routeNo, schedule.date);
printf("起点:%s,终点:%s\n", schedule.startStation, schedule.endStation);
printf("发车时间:%s,到达时间:%s\n", schedule.startTime, schedule.endTime);
}
}
fclose(fp);
}
void statisticTrainSchedule(char station[20], char date[20]) {
FILE *fp = fopen("train_schedule.dat", "rb");
TrainSchedule schedule;
int count = 0;
while (fread(&schedule, sizeof(TrainSchedule), 1, fp)) {
if (strcmp(schedule.startStation, station) == 0 && strcmp(schedule.date, date) == 0) {
count++;
}
}
printf("%s站每日车次数:%d\n", station, count);
fclose(fp);
}
// 主函数
int main() {
int choice;
do {
printf("\n");
printf("1. 录入新线路、站点信息\n");
printf("2. 查询票价\n");
printf("3. 查询线路及站点信息\n");
printf("4. 统计列车时刻及车次信息\n");
printf("5. 退出\n");
printf("请选择功能:");
scanf("%d", &choice);
switch (choice) {
case 1: {
// 录入新线路、站点信息
Route route;
printf("请输入线路编号:");
scanf("%s", route.routeNo);
printf("请输入途径站点(以空格分隔):");
char stationName[20];
route.stationCount = 0;
while (scanf("%s", stationName)) {
strcpy(route.station[route.stationCount++], stationName);
if (getchar() == '\n') {
break;
}
}
writeRouteToFile(route);
break;
}
case 2: {
// 查询票价
char startStation[20], endStation[20];
printf("请输入起点站:");
scanf("%s", startStation);
printf("请输入终点站:");
scanf("%s", endStation);
readTicketPriceFromFile(startStation, endStation);
break;
}
case 3: {
// 查询线路及站点信息
char routeNo[20];
printf("请输入线路编号:");
scanf("%s", routeNo);
readRouteFromFile(routeNo);
break;
}
case 4: {
// 统计列车时刻及车次信息
int subChoice;
do {
printf("\n");
printf("1. 按线路编号查询列车时刻信息\n");
printf("2. 按起点/终点/日期查询列车时刻信息\n");
printf("3. 按起点统计每日车次数\n");
printf("4. 按终点统计每日车次数\n");
printf("5. 返回上一级菜单\n");
printf("请选择功能:");
scanf("%d", &subChoice);
switch (subChoice) {
case 1: {
// 按线路编号查询列车时刻信息
char routeNo[20];
printf("请输入线路编号:");
scanf("%s", routeNo);
readTrainScheduleFromFile(routeNo, "", "", "");
break;
}
case 2: {
// 按起点/终点/日期查询列车时刻信息
char routeNo[20], startStation[20], endStation[20], date[20];
printf("请输入线路编号(可不填):");
scanf("%s", routeNo);
printf("请输入起点站(可不填):");
scanf("%s", startStation);
printf("请输入终点站(可不填):");
scanf("%s", endStation);
printf("请输入日期(可不填):");
scanf("%s", date);
readTrainScheduleFromFile(routeNo, startStation, endStation, date);
break;
}
case 3: {
// 按起点统计每日车次数
char station[20], date[20];
printf("请输入站点名称:");
scanf("%s", station);
printf("请输入日期:");
scanf("%s", date);
statisticTrainSchedule(station, date);
break;
}
case 4: {
// 按终点统计每日车次数
char station[20], date[20];
printf("请输入站点名称:");
scanf("%s", station);
printf("请输入日期:");
scanf("%s", date);
statisticTrainSchedule(station, date);
break;
}
case 5: {
// 返回上一级菜单
break;
}
default: {
printf("无效选择,请重新输入\n");
break;
}
}
} while (subChoice != 5);
break;
}
case 5: {
// 退出
break;
}
default: {
printf("无效选择,请重新输入\n");
break;
}
}
} while (choice != 5);
return 0;
}
该示例代码仅供参考,实际开发中需要根据具体需求进行修改和完善。
原文地址: https://www.cveoy.top/t/topic/oKUu 著作权归作者所有。请勿转载和采集!