1、C语言程序设计课程实践 火车时刻表 学号姓名1: 学号姓名2: 完成日期: 年 月(5号宋体) 1. 题目描述 火车时刻表 包含车次、始发站、终点站、发车时间、到达时间、车种、票价。 功能: 建立列车时刻表 车次的调配:新增加车次;对原有车次的调整。 查询:显示整个列车时刻表,要求:按始发站排序,始发站相同按终点站排序。 查询某个车次;查询由某个始发站始发的列车;查询由A出发到B的所有车次。 统计:统计各车种的数量。 该程序应该具有下列功能: (1) 通
2、过键盘输入某次列车的始发站、终点站、发车时间、到达时间、车种、票价; (2)通过键盘能够对原有的车次进行调整,新增加车次,进行车次的调配; (3)能够显示整个列车时刻表,并按始发站排序,若始发站相同按终点站排序; (4) 给定某个车次,能够显示该车次的始发站、终点站、发车时间、到达时间、车种、票价的信息; (5) 给定某个车次,能够查询由某个始发站始发的列车;查询由A出发到B的所有车次; (6) 提供统计各车种的数量的功能。 2. 题目要求 (1) 按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序; (2) 列车信息应该包含:车次、始发站、终点站、发车时间
3、到达时间、车种、票价; (3) 为各项操作功能设计一个菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。 (4) 作业完成情况应该存储在文件中。 3. 主要函数和变量描述 函数名 功能描述 参数和返回值的意义 Read 建立列车时刻表 读取列车时刻表 参数(STRU_TRAIN * pRet, STRU_TRAIN * pItem)链表头指针; 参数(int nRead) 待录入列车时刻表; 无返回值 变量名 数据类型 主要功能 隶属函数 pRet pItem STRU_TRAIN * 结构体指针变量
4、 Read nRead int 录入列车时刻表数据 Read 函数名 功能描述 参数和返回值的意义 Save 保存列车时刻表 参数(STRU_TRAIN * pHead, const char * filename)链表头指针; 无返回值 变量名 数据类型 主要功能 隶属函数 phead char 定义名称 全局变量 函数名 功能描述 参数和返回值的意义 fopen 打开一个名为filename的文件 参数(STRU_TRAIN * pHead, const char * filename)链表头指针; 无返回值
5、 变量名 数据类型 主要功能 隶属函数 phead char 定义名称 全局变量 函数名 功能描述 参数和返回值的意义 freeTrain 释放链表 参数(STRU_TRAIN * pHead)链表头指针; 无返回值 变量名 数据类型 主要功能 隶属函数 pNext STRU_TRAIN * 结构体指针变量 freeTrain 函数名 功能描述 参数和返回值的意义 Add 新增加车次 参数(STRU_TRAIN * pHead)链表头指针 变量名 数据类型 主要功能 隶属函数 pItem STRU_T
6、RAIN *
结构体指针变量
add
nRead
int
存放新增加的列车时刻表数据
add
函数名
功能描述
参数和返回值的意义
Show
显示列车时刻表
参数(STRU_TRAIN * pHead)链表头指针;
无返回值
变量名
数据类型
主要功能
隶属函数
phead
char
定义名称
全局变量
4. 主要模块的算法描述(至少给出两个子功能流程);
5. 程序的源代码清单
#include
7、MAX_STRING 80 /*定义本程序中字符串最大长度*/ typedef struct STRU_TRAIN { char trainId[MAX_STRING]; /*车次*/ char beginStation[MAX_STRING]; /*始发站*/ char endStation[MAX_STRING]; /*终点站*/ char beginTime[MAX_STRING]; /* 发车时间*/ char endTime[MAX_STRING]; /*到达时间*/ char trainType[MAX_STRING]; /*车种*/ i
8、nt price; /* 票价*/ struct STRU_TRAIN * pNext; /*链表指针*/ }STRU_TRAIN; STRU_TRAIN * read(STRU_TRAIN * pHead, const char * filename) { STRU_TRAIN * pRet = pHead; STRU_TRAIN * pItem = NULL; int nRead = 0; /*一行有7个数据*/ FILE * fp = fopen(filename, "rb"); if (fp != NULL) {
9、 while(1) { pItem = (STRU_TRAIN*)malloc(sizeof(STRU_TRAIN)); //存放一条记录 memset(pItem, 0, sizeof(STRU_TRAIN)); nRead = fscanf(fp, "%s %s %s %s %s %s %d ", pItem->trainId, pItem->beginStation, pItem->endStation, pItem->beginTime, pItem->endTime,
10、 pItem->trainType, &pItem->price); if(nRead != 7) /*读到文件结尾了,退出*/ { free(pItem); break; } //建立链表 if(pHead == NULL) { pHead = pItem; pRet = pHead; } else { pHead->pNext = pItem; pHead = pItem; } } fclose(fp); }
11、 fp = NULL; return pRet; } //保存列车时刻表 int save(STRU_TRAIN * pHead, const char * filename) { FILE * fp = fopen(filename, "wb"); if (fp != NULL) { while(pHead != NULL) { fprintf(fp, "%s %s %s %s %s %s %d ", pHead->trainId, pHead->beginStation, pHead-
12、>endStation, pHead->beginTime, pHead->endTime, pHead->trainType, pHead->price); pHead = pHead->pNext; } fclose(fp); /*关闭fp指向的文件句柄,防止句柄泄露*/ } return 0; } //释放链表(防止内存泄漏) void freeTrain(STRU_TRAIN * pHead) { while(pHead != NULL) { STRU_TRA
13、IN * pNext = pHead->pNext; free(pHead); pHead = pNext; } } //新增加车次 STRU_TRAIN* add(STRU_TRAIN * pHead) { STRU_TRAIN* pItem = (STRU_TRAIN*)malloc(sizeof(STRU_TRAIN)); /*存放一条记录*/ int nRead = 0; memset(pItem, 0, sizeof(STRU_TRAIN)); printf("Input trained beginStation endStation
14、 beginTime endTime trainType price \n"); nRead = scanf("%s %s %s %s %s %s %d", pItem->trainId, pItem->beginStation, pItem->endStation, pItem->beginTime, pItem->endTime, pItem->trainType, &pItem->price); if (nRead != 7) { printf("Input information
15、error, form: trained beginStation endStation beginTime endTime trainType price \n"); free(pItem); return pHead; /*输入格式有错*/ } pItem->pNext = pHead; /*在链表头上添加一条记录*/ return pItem; } //删除车次 //对原有车次的调整 //显示整个列车时刻表 void show(STRU_TRAIN * pHead) { while(pHead != NULL) {
16、 fprintf(stdout, "%s %s %s %s %s %s %d\n", pHead->trainId, pHead->beginStation, pHead->endStation, pHead->beginTime, pHead->endTime, pHead->trainType, pHead->price); pHead = pHead->pNext; } } //查询某个车次 //查询由某个始发站始发的列车 //查询由A出发到B的所有车
17、次 //统计各车种的数量 int main() { STRU_TRAIN * pTrain = NULL; pTrain = read(pTrain, "a.dat"); /*读取现有火车时刻表*/ show(pTrain); /*显示出来*/ pTrain = add(pTrain); /*手工添加一条记录*/ show(pTrain); /*显示出来*/ save(pTrain, "a.dat"); /*保存到文件*/ freeTrain(pTrain); /*释放内存*/ return 0; }






