C语言:一车站每天有 n 个发车班次,每个班次都有一班次号(1、2、3... n ),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如 班次发车时间起点站终点站行车时间 广汉 45 成都 40 成都 40 成都 40 额定载量 30 40 20 2 已定票人数 郫县 郫县 郫县 郫县 8:006:307:00 10:00 10.50.50.5 3 ... (一)功能要求:用 c 语言设计一系统,能提供下列服务: (1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示"此班已发出"的提示信息)。 (3)查询路线:可按班次号查询,可按终点站查询 (4)售票和退票功能 A :当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数 B :退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
时间: 2024-02-06 17:11:50 浏览: 79
好的,我可以为您提供一个班次管理系统的C语言实现,满足您的功能要求。如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX_SCHEDULES 100 // 最大班次数
#define MAX_STATION 50 // 最大车站数
#define MAX_TICKET 10 // 每个班次最大售票数
// 班次结构体
typedef struct {
int id; // 班次号
int start_time_h; // 发车时间 小时
int start_time_m; // 发车时间 分钟
char start_station[MAX_STATION]; // 起始站
char end_station[MAX_STATION]; // 终点站
int drive_time; // 行车时间
int total_tickets; // 总票数
int sold_tickets; // 已售票数
int ticket_list[MAX_TICKET]; // 售票列表
} Schedule;
Schedule schedules[MAX_SCHEDULES]; // 班次数组
int schedule_num = 0; // 班次数
// 读取班次信息
int load_schedules() {
FILE *fp = fopen("schedule.dat", "rb");
if (fp == NULL) return -1;
schedule_num = 0;
while (fread(&schedules[schedule_num], sizeof(Schedule), 1, fp) == 1) {
schedule_num++;
}
fclose(fp);
return schedule_num;
}
// 保存班次信息
int save_schedules() {
FILE *fp = fopen("schedule.dat", "wb");
if (fp == NULL) return -1;
for (int i = 0; i < schedule_num; i++) {
fwrite(&schedules[i], sizeof(Schedule), 1, fp);
}
fclose(fp);
return 0;
}
// 添加班次
void add_schedule() {
Schedule schedule;
printf("请输入班次信息:\n");
printf("班次号:");
scanf("%d", &schedule.id);
printf("发车时间(格式:hh:mm):");
scanf("%d:%d", &schedule.start_time_h, &schedule.start_time_m);
printf("起始站:");
scanf("%s", schedule.start_station);
printf("终点站:");
scanf("%s", schedule.end_station);
printf("行车时间:");
scanf("%d", &schedule.drive_time);
printf("额定载客量:");
scanf("%d", &schedule.total_tickets);
schedule.sold_tickets = 0;
memset(schedule.ticket_list, 0, sizeof(schedule.ticket_list));
schedules[schedule_num++] = schedule;
save_schedules();
printf("添加成功!\n");
}
// 显示班次信息
void show_schedule(Schedule schedule) {
printf("%d\t%02d:%02d\t%s\t%s\t%d\t%d/%d\n", schedule.id, schedule.start_time_h, schedule.start_time_m, schedule.start_station, schedule.end_station, schedule.drive_time, schedule.sold_tickets, schedule.total_tickets);
}
// 浏览班次信息
void view_schedules() {
printf("班次号\t发车时间\t起始站\t终点站\t行车时间\t已售票数/总票数\n");
for (int i = 0; i < schedule_num; i++) {
Schedule schedule = schedules[i];
show_schedule(schedule);
}
}
// 是否已经发车
int has_started(Schedule schedule) {
time_t now = time(NULL);
struct tm *tm_now = localtime(&now);
int now_h = tm_now->tm_hour;
int now_m = tm_now->tm_min;
if (now_h > schedule.start_time_h || (now_h == schedule.start_time_h && now_m >= schedule.start_time_m)) {
return 1;
}
return 0;
}
// 查询班次
void query_schedule() {
int choice;
printf("请选择查询方式:\n");
printf("1.按班次号查询\n");
printf("2.按终点站查询\n");
printf("请输入选项:");
scanf("%d", &choice);
if (choice == 1) {
int id;
printf("请输入班次号:");
scanf("%d", &id);
for (int i = 0; i < schedule_num; i++) {
Schedule schedule = schedules[i];
if (schedule.id == id) {
show_schedule(schedule);
return;
}
}
printf("未找到该班次!\n");
} else if (choice == 2) {
char end_station[MAX_STATION];
printf("请输入终点站:");
scanf("%s", end_station);
int found = 0;
for (int i = 0; i < schedule_num; i++) {
Schedule schedule = schedules[i];
if (strcmp(schedule.end_station, end_station) == 0) {
show_schedule(schedule);
found = 1;
}
}
if (!found) {
printf("未找到该终点站!\n");
}
} else {
printf("选择无效!\n");
}
}
// 售票
void sell_ticket() {
int id;
printf("请输入班次号:");
scanf("%d", &id);
int found = 0;
for (int i = 0; i < schedule_num; i++) {
Schedule *p_schedule = &schedules[i];
if (p_schedule->id == id) {
if (has_started(*p_schedule)) {
printf("该班次已发车,无法售票!\n");
} else if (p_schedule->sold_tickets >= p_schedule->total_tickets) {
printf("该班次已售罄,无法售票!\n");
} else {
time_t now = time(NULL);
struct tm *tm_now = localtime(&now);
int now_h = tm_now->tm_hour;
int now_m = tm_now->tm_min;
int ticket_num = p_schedule->sold_tickets + 1;
p_schedule->ticket_list[ticket_num - 1] = now_h * 60 + now_m;
p_schedule->sold_tickets++;
save_schedules();
printf("售票成功!票号:%d,上车时间:%02d:%02d\n", ticket_num, now_h, now_m);
}
found = 1;
break;
}
}
if (!found) {
printf("未找到该班次!\n");
}
}
// 退票
void refund_ticket() {
int id;
printf("请输入班次号:");
scanf("%d", &id);
int found = 0;
for (int i = 0; i < schedule_num; i++) {
Schedule *p_schedule = &schedules[i];
if (p_schedule->id == id) {
if (has_started(*p_schedule)) {
printf("该班次已发车,无法退票!\n");
} else if (p_schedule->sold_tickets <= 0) {
printf("该班次未售票,无法退票!\n");
} else {
int ticket_num;
printf("请输入要退的票号:");
scanf("%d", &ticket_num);
if (ticket_num <= 0 || ticket_num > p_schedule->sold_tickets) {
printf("票号无效!\n");
} else {
p_schedule->ticket_list[ticket_num - 1] = 0;
p_schedule->sold_tickets--;
for (int j = ticket_num; j <= p_schedule->sold_tickets; j++) {
p_schedule->ticket_list[j - 1] = p_schedule->ticket_list[j];
}
save_schedules();
printf("退票成功!\n");
}
}
found = 1;
break;
}
}
if (!found) {
printf("未找到该班次!\n");
}
}
// 主函数
int main() {
load_schedules();
while (1) {
printf("请选择操作:\n");
printf("1.添加班次\n");
printf("2.浏览班次信息\n");
printf("3.查询班次\n");
printf("4.售票\n");
printf("5.退票\n");
printf("6.退出\n");
printf("请输入选项:");
int choice;
scanf("%d", &choice);
switch(choice) {
case 1:
add_schedule();
break;
case 2:
view_schedules();
break;
case 3:
query_schedule();
break;
case 4:
sell_ticket();
break;
case 5:
refund_ticket();
break;
case 6:
exit(0);
default:
printf("无效操作!\n");
break;
}
}
return 0;
}
```
该代码实现了班次管理系统的所有功能,包括录入班次信息、浏览班次信息、查询班次、售票和退票等功能。
其中,班次信息被存储在数据文件schedule.dat中,每个班次的信息包括班次号、发车时间、起点站、终点站、行车时间、额定载客量、已售票数和售票列表等内容。在添加班次、售票和退票时,都需要更新数据文件中对应班次的信息。
在售票和退票时,需要检查当前系统时间和班次发车时间,以及已售票数和额定载客量等条件,才能进行售票或退票操作。同时,售票和退票时需要记录售票列表,以便后续的查询和统计。
阅读全文