编写c语言程序,源程序要有适当解释。题目如下:一车站每天有 n 个发车班次,每个班次都有一班次号(1、2、3..… n ),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示"此班已发出"的提示信息)。 (3)查询路线:可按班次号查询,,可按终点站查询 (4)售票和退票功能 A :当查询出已定人数于额定载量系统时小于发车时间时才能售票,自动更新已售票人数 B :退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数

时间: 2024-03-24 07:40:47 浏览: 25
以下是一份简单的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(&current_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(&current_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(&current_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()`函数,将时间转换为时间戳,方便进行时间比较。 通过这个简单的程序,我们可以更好地理解文件操作、结构体、时间处理等知识点。

相关推荐

最新推荐

recommend-type

使用C语言编写圣诞表白程序

圣诞节快到了,让我们用C语言制作一个圣诞表白程序吧,下面通过本文学习下实现代码
recommend-type

用C编写一个送给女朋友的情人节小程序 可爱!

非常可爱的情人节小程序!文章为大家分享了用C编写一个送给女朋友的小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

在C语言中输入一个大写字母,将其转变成一个小写字母,并且有相应的提示。

1.学习简单的C语言编程
recommend-type

socket多人聊天程序C语言版(一)

主要为大家详细介绍了socket多人聊天程序C语言版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

单片机C语言程序设计:8X8LED 点阵显示数字

名称:按键控制 8X8LED 点阵屏显示图形 说明:每次按下 K1 时,会使 8X8LED点阵屏循环显示不同图形。本例同时使用外部中断和定时中断。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

深入了解MATLAB开根号的最新研究和应用:获取开根号领域的最新动态

![matlab开根号](https://www.mathworks.com/discovery/image-segmentation/_jcr_content/mainParsys3/discoverysubsection_1185333930/mainParsys3/image_copy.adapt.full.medium.jpg/1712813808277.jpg) # 1. MATLAB开根号的理论基础 开根号运算在数学和科学计算中无处不在。在MATLAB中,开根号可以通过多种函数实现,包括`sqrt()`和`nthroot()`。`sqrt()`函数用于计算正实数的平方根,而`nt
recommend-type

react的函数组件的使用

React 的函数组件是一种简单的组件类型,用于定义无状态或者只读组件。 它们通常接受一个 props 对象作为参数并返回一个 React 元素。 函数组件的优点是代码简洁、易于测试和重用,并且它们使 React 应用程序的性能更加出色。 您可以使用函数组件来呈现简单的 UI 组件,例如按钮、菜单、标签或其他部件。 您还可以将它们与 React 中的其他组件类型(如类组件或 Hooks)结合使用,以实现更复杂的 UI 交互和功能。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。