编写c语言程序,源程序要有适当解释。题目如下:一车站每天有 n 个发车班次,每个班次都有一班次号(1、2、3..… n ),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示"此班已发出"的提示信息)。 (3)查询路线:可按班次号查询,,可按终点站查询 (4)售票和退票功能 A :当查询出已定人数于额定载量系统时小于发车时间时才能售票,自动更新已售票人数 B :退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
时间: 2024-03-24 16:40:47 浏览: 115
以下是一份简单的C语言程序,实现了题目中所要求的功能。程序中使用了文件来保存班次信息,并通过结构体来表示每个班次的信息。同时,程序中还包含了班次信息的录入、浏览、查询、售票和退票等功能模块。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NUM 100 // 最大班次数
// 班次信息结构体
typedef struct {
int id; // 班次号
char start[20]; // 起始站
char end[20]; // 终点站
char time[10]; // 发车时间
int duration; // 行车时间
int capacity; // 额定载客量
int sold; // 已售票人数
} Schedule;
// 全局变量
Schedule schedules[MAX_NUM]; // 班次信息数组
int num = 0; // 班次数
// 函数声明
void loadSchedules();
void saveSchedules();
void addSchedule();
void viewSchedules();
void querySchedule();
void sellTicket();
void refundTicket();
int main() {
int choice;
loadSchedules(); // 加载班次信息
while (1) {
printf("1. 录入班次信息\n");
printf("2. 浏览班次信息\n");
printf("3. 查询班次信息\n");
printf("4. 售票\n");
printf("5. 退票\n");
printf("6. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1: addSchedule(); break;
case 2: viewSchedules(); break;
case 3: querySchedule(); break;
case 4: sellTicket(); break;
case 5: refundTicket(); break;
case 6: saveSchedules(); exit(0);
default: printf("无效操作,请重新选择!\n");
}
}
return 0;
}
// 加载班次信息
void loadSchedules() {
FILE *fp = fopen("schedules.txt", "r");
if (fp) {
fread(&num, sizeof(int), 1, fp);
fread(schedules, sizeof(Schedule), num, fp);
fclose(fp);
}
}
// 保存班次信息
void saveSchedules() {
FILE *fp = fopen("schedules.txt", "w");
if (fp) {
fwrite(&num, sizeof(int), 1, fp);
fwrite(schedules, sizeof(Schedule), num, fp);
fclose(fp);
}
}
// 录入班次信息
void addSchedule() {
if (num >= MAX_NUM) {
printf("班次数已达到上限,无法添加!\n");
return;
}
Schedule schedule;
printf("请输入班次号:");
scanf("%d", &schedule.id);
printf("请输入起始站:");
scanf("%s", schedule.start);
printf("请输入终点站:");
scanf("%s", schedule.end);
printf("请输入发车时间:");
scanf("%s", schedule.time);
printf("请输入行车时间(分钟):");
scanf("%d", &schedule.duration);
printf("请输入额定载客量:");
scanf("%d", &schedule.capacity);
schedule.sold = 0; // 初始已售票人数为0
schedules[num++] = schedule;
printf("班次信息添加成功!\n");
}
// 浏览班次信息
void viewSchedules() {
printf("班次号\t起始站\t终点站\t发车时间\t行车时间\t额定载客量\t已售票人数\t状态\n");
time_t current_time = time(NULL);
struct tm *current_tm = localtime(¤t_time);
for (int i = 0; i < num; i++) {
printf("%d\t%s\t%s\t%s\t%d\t%d\t%d\t",
schedules[i].id, schedules[i].start, schedules[i].end, schedules[i].time,
schedules[i].duration, schedules[i].capacity, schedules[i].sold);
struct tm schedule_tm = *current_tm;
sscanf(schedules[i].time, "%d:%d", &schedule_tm.tm_hour, &schedule_tm.tm_min);
time_t schedule_time = mktime(&schedule_tm);
if (current_time >= schedule_time) {
printf("已发出\n");
} else {
printf("未发出\n");
}
}
}
// 查询班次信息
void querySchedule() {
int choice;
printf("1. 按班次号查询\n");
printf("2. 按终点站查询\n");
printf("请选择查询方式:");
scanf("%d", &choice);
if (choice == 1) {
int id;
printf("请输入班次号:");
scanf("%d", &id);
for (int i = 0; i < num; i++) {
if (schedules[i].id == id) {
printf("班次号\t起始站\t终点站\t发车时间\t行车时间\t额定载客量\t已售票人数\n");
printf("%d\t%s\t%s\t%s\t%d\t%d\t%d\n",
schedules[i].id, schedules[i].start, schedules[i].end, schedules[i].time,
schedules[i].duration, schedules[i].capacity, schedules[i].sold);
return;
}
}
printf("未找到对应班次信息!\n");
} else if (choice == 2) {
char end[20];
printf("请输入终点站:");
scanf("%s", end);
printf("班次号\t起始站\t终点站\t发车时间\t行车时间\t额定载客量\t已售票人数\n");
for (int i = 0; i < num; i++) {
if (strcmp(schedules[i].end, end) == 0) {
printf("%d\t%s\t%s\t%s\t%d\t%d\t%d\n",
schedules[i].id, schedules[i].start, schedules[i].end, schedules[i].time,
schedules[i].duration, schedules[i].capacity, schedules[i].sold);
}
}
} else {
printf("无效操作,请重新选择!\n");
}
}
// 售票
void sellTicket() {
int id;
printf("请输入班次号:");
scanf("%d", &id);
for (int i = 0; i < num; i++) {
if (schedules[i].id == id) {
time_t current_time = time(NULL);
struct tm *current_tm = localtime(¤t_time);
struct tm schedule_tm = *current_tm;
sscanf(schedules[i].time, "%d:%d", &schedule_tm.tm_hour, &schedule_tm.tm_min);
time_t schedule_time = mktime(&schedule_tm);
if (current_time < schedule_time) {
if (schedules[i].sold < schedules[i].capacity) {
schedules[i].sold++;
printf("售票成功!\n");
} else {
printf("该班次已售罄,无法购票!\n");
}
} else {
printf("该班次已发出,无法购票!\n");
}
return;
}
}
printf("未找到对应班次信息!\n");
}
// 退票
void refundTicket() {
int id;
printf("请输入班次号:");
scanf("%d", &id);
for (int i = 0; i < num; i++) {
if (schedules[i].id == id) {
time_t current_time = time(NULL);
struct tm *current_tm = localtime(¤t_time);
struct tm schedule_tm = *current_tm;
sscanf(schedules[i].time, "%d:%d", &schedule_tm.tm_hour, &schedule_tm.tm_min);
time_t schedule_time = mktime(&schedule_tm);
if (current_time < schedule_time) {
if (schedules[i].sold > 0) {
schedules[i].sold--;
printf("退票成功!\n");
} else {
printf("该班次无已售票,无法退票!\n");
}
} else {
printf("该班次已发出,无法退票!\n");
}
return;
}
}
printf("未找到对应班次信息!\n");
}
```
程序中,班次信息保存在`schedules.txt`文件中,每次程序启动时会自动加载这个文件中的班次信息。同时,每次操作完毕后,程序会自动将班次信息保存回文件中。
程序中使用了`time.h`头文件,来获取当前系统时间,并判断班次是否已经发出。程序中还使用了`mktime()`函数,将时间转换为时间戳,方便进行时间比较。
通过这个简单的程序,我们可以更好地理解文件操作、结构体、时间处理等知识点。
阅读全文