资源描述
C语言程序设计课程实践
火车时刻表
学号姓名1:
学号姓名2:
完成日期: 年 月(5号宋体)
1. 题目描述
火车时刻表
包含车次、始发站、终点站、发车时间、到达时间、车种、票价。
功能:
建立列车时刻表
车次的调配:新增加车次;对原有车次的调整。
查询:显示整个列车时刻表,要求:按始发站排序,始发站相同按终点站排序。
查询某个车次;查询由某个始发站始发的列车;查询由A出发到B的所有车次。
统计:统计各车种的数量。
该程序应该具有下列功能:
(1) 通过键盘输入某次列车的始发站、终点站、发车时间、到达时间、车种、票价;
(2)通过键盘能够对原有的车次进行调整,新增加车次,进行车次的调配;
(3)能够显示整个列车时刻表,并按始发站排序,若始发站相同按终点站排序;
(4) 给定某个车次,能够显示该车次的始发站、终点站、发车时间、到达时间、车种、票价的信息;
(5) 给定某个车次,能够查询由某个始发站始发的列车;查询由A出发到B的所有车次;
(6) 提供统计各车种的数量的功能。
2. 题目要求
(1) 按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;
(2) 列车信息应该包含:车次、始发站、终点站、发车时间、到达时间、车种、票价;
(3) 为各项操作功能设计一个菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
(4) 作业完成情况应该存储在文件中。
3. 主要函数和变量描述
函数名
功能描述
参数和返回值的意义
Read
建立列车时刻表
读取列车时刻表
参数(STRU_TRAIN * pRet,
STRU_TRAIN * pItem)链表头指针;
参数(int nRead) 待录入列车时刻表;
无返回值
变量名
数据类型
主要功能
隶属函数
pRet
pItem
STRU_TRAIN *
结构体指针变量
Read
nRead
int
录入列车时刻表数据
Read
函数名
功能描述
参数和返回值的意义
Save
保存列车时刻表
参数(STRU_TRAIN * pHead, const char * filename)链表头指针;
无返回值
变量名
数据类型
主要功能
隶属函数
phead
char
定义名称
全局变量
函数名
功能描述
参数和返回值的意义
fopen
打开一个名为filename的文件
参数(STRU_TRAIN * pHead, const char * filename)链表头指针;
无返回值
变量名
数据类型
主要功能
隶属函数
phead
char
定义名称
全局变量
函数名
功能描述
参数和返回值的意义
freeTrain
释放链表
参数(STRU_TRAIN * pHead)链表头指针;
无返回值
变量名
数据类型
主要功能
隶属函数
pNext
STRU_TRAIN *
结构体指针变量
freeTrain
函数名
功能描述
参数和返回值的意义
Add
新增加车次
参数(STRU_TRAIN * pHead)链表头指针
变量名
数据类型
主要功能
隶属函数
pItem
STRU_TRAIN *
结构体指针变量
add
nRead
int
存放新增加的列车时刻表数据
add
函数名
功能描述
参数和返回值的意义
Show
显示列车时刻表
参数(STRU_TRAIN * pHead)链表头指针;
无返回值
变量名
数据类型
主要功能
隶属函数
phead
char
定义名称
全局变量
4. 主要模块的算法描述(至少给出两个子功能流程);
5. 程序的源代码清单
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define 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]; /*车种*/
int 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)
{
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,
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);
}
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->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_TRAIN * 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 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 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)
{
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的所有车次
//统计各车种的数量
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;
}
展开阅读全文