1.开发背景
火车票订票系统主要满足了用户对火车票信息的查询和订购需求,同时可以对火车车次信息和订票信息进行保存。
如何实现菜单的选择功能
如何将新输入的信息添加到存放火车票信息的链表中
如何输出满足条件的信息
如何将信息保存到指定的磁盘文件中
2.需求分析
火车订票系统为用户提供预定火车票服务,将火车车次详细信息进行显示,保存;同时提供火车的剩余票数,以供用户查询,决定是否预订;当预定成功后,提供保存用户订票信息的功能。
3.系统设计
3.1系统目标
显示火车车次信息及可供订票数
对输入车次或要到达的城市提供查询
输入要到达城市的车次信息,确定是否订票
可对输入的火车车次信息进行修改
显示火车车票信息
对火车车票信息及订票人的信息进行保存
3.2系统功能结构
3.3系统操作
在主界面上输入“1”,进入输入火车票信息界面,输入火车的车次,起点,终点,出发时间,到达时间,票价和可以订购的票数。
在界面上输入“2”,可以查询火车票信息。查询方法:一是按照车次查询;二是按照想要到达的地方查询。
在界面上输入3,进入订票界面,按照提示输入想要到达的城市,会自动显示出终点站为输入城市的信息,根据提示决定是否订票,以及输入用户的个人信息。
在界面上输入4,进入修改界面,根据提示输入要修改的内容。
在界面上输入5,显示所有的火车票信息。
在界面输入6,进入保存界面,将输入火车票信息及订票人的信息存储在指定的磁盘文件中。
4.预处理模块
4.1预处理模块概述
为了提高程序的可读性,在预处理模块中做了充足的准备工作。在该模块中宏定义了输入、输出语句中的字符串,也使用了自定义结构体类型封装了其中存在的不同类型的零散数据。预处理模块使整个程序的结构简洁清晰,更容易理解。
4.2预处理模块实现
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>
#define HEADER1 "----------------------BOOK TICKET-----------------------\n"
#define HEADER2 "| number | start city | reach city | take off time | receivetime | price | ticketnumber |\n"
#define HEADER3 "|----------|------------|------------|---------------|-------------|-------|--------------|\n"
#define FORMAT "| %-10s | %-10s | %-10s | %-10s | %-10s | %5d | %5d |\n"
#define DATA p->data.num,p->data.startcity,p->data.reachcity,p->data.takeofftime,p->data.receivetime,p->data.price,p->data.ticketnum
/*定义存储火车票信息的结构体*/
struct train
{
char num[10]; /*序列号*/
char startcity[10]; /*出发城市*/
char reachcity[10]; /*目的城市*/
char takeofftime[10]; /*发车时间*/
char receivetime[10]; /*到达时间*/
int price; /*票价*/
int ticketnum; /*票数*/
};
/*订票人信息*/
struct man
{
char num[10]; /*ID*/
char name[10]; /*姓名*/
int bookNum; /*订票数*/
};
/*定义火车票信息链表的节点结构*/
typedef struct node
{
struct train data; /*声明train结构体类型的变量*/
struct node*next;
}Node,*Link;
/*订票人链表的节点结构*/
typedef struct Man
{
struct man data;
struct Man *next;
}book,*bookLink;
typedef声明了新的类型名Node为node结构体类型,Link为node指针类型,同样也声明了book为Man结构体类型,bookLink为Man结构体的指针类型。
5.主函数设计
5.1主函数概述
在火车订票系统中main()函数中调用menu()函数实现了功能选择菜单的显示
main()函数同时完成了选择菜单的选择功能,即输入菜单中的提示数字,完成相应的功能
5.2技术分析
在main()函数中打开文件是为了将火车票信息和订票人信息保存到该文件,因此需先判断文件中是否有内容。
fopen()函数以读写的方式打开一个二进制文件,如果能够成功打开文件,则测试文件流是否到结尾,即文件中是否有数据。若文件中没有任何数据,则关闭文件;若文件中有数据,则构造链表,读取该磁盘文件中的数据。
保存火车票信息的train.txt文件
保存订票人信息的man.txt文件
5.3主函数实现
在显示功能选择菜单的函数menu()中主要使用了puts()函数在控制台上输出文字或特殊字符。
main()函数主要应用switch多分支选择结构来实现对菜单中的功能进行调用。
6.输入模块设计
6.1输入模块概述
对火车车次,始发站,终点站,始发时间,到站时间,票价及所剩票数等信息进行输入及保存
为避免添加的车次重复,采用比较函数判断车次是否已经存在,若不存在,则将插入的信息根据提示输入,并插入链表中。
strcmp()比较函数的作用是比较字符串1和字符串2,即对两个字