首页 > 精品范文库 > 5号文库
火车票管理系统
编辑:星月相依 识别码:14-337597 5号文库 发布时间: 2023-04-07 03:23:53 来源:网络

火车票管理系统一、课题内容和要求

改系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。

二、需求分析

功能框架图:(见图2-1)

火车票管理系统

录入

查找

删除

排序

售票

退票

保存

图2-1。

1.新增火车票数据记录:预先建立一个txt文档,存入数据,然后在程序中读取文档。

2.查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。

3.删除火车票数据记录(先查找,再删除。若查找出多条记录,则进一步提示用户选择记录的车次,再删除)。

4.对火车票排序(可按车次、发车时间、起点站、终点站等排序。)。

5.显示当前所有火车票信息列表。

6.售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。

7.退票(售票的逆处理,过程与售票类似)。

8.保存火车票数据到文件中。

9.从文件中读入火车票数据。

三、概要设计

1)主要结构体:

struct

time

{

int

hour;

int

minutes;

};

struct

ticket

{

char

SerialNumber[10];

struct

time

SetOut;

char

DeparturePoint[MAX];

char

TerminalPoint[MAX];

float

LastTime;

int

FixNumber;

int

FixedNumber;

}train[N];

2)主要函数流程图:

l

载入函数:用于从文本中载入信息。(见图3-1)

打开文本

能否打开

读入数据

是否结束

结束

开始

开始

读入车次

是否符合输出信息

结束

图3-2

图3-1

l

查找函数:利用输入的车次或站点进行顺序查找并将找到的信息输出。(见图3-2)

l

删除函数:先查找出要删除的信息再删除。(见图3-3)

无法订票

人数加一

是否超载

图3-4

结束

开始

读入车次

是否误点

图3-3

是否符合读入车次

开始

记录下标i

i=i+1,i++

i<车次总数-1

结束

l

售票退票函数:先判断该车是否已发车,若未发车且人未满则订票成功,否则无法订票退票。(见图3-4)

l

备份文件函数:将文件内容存储到用户给定的地址中(见图3—5)

图3-5

l

排序函数(见图3-6)

图3-6

四、源程序代码

#include

#include

#include

#include

#include

#include

const

int

MAX=20;

const

int

N=50;

const

int

MAXFILENAME=100;

enum

{FALSE,TRUE};

struct

time

{

int

hour;

int

minutes;

};

struct

ticket

{

char

SerialNumber[10];

struct

time

SetOut;

char

DeparturePoint[MAX];

char

TerminalPoint[MAX];

float

LastTime;

int

FixNumber;

int

FixedNumber;

}train[N];

int

RecordNumber;

int

FLAG=FALSE;

/**********************************************/

int

ShowMessage(void);

//载入原始数据

void

mainmenu(void);

//主菜单

void

InsertMessage(void);

//录入班次信息

void

SearchMenu(void);

//查询路线子菜单

void

SearchByNumber(void);

//按班次号查询

void

SearchByAddress(void);

//按终点站查询

void

cancle(void);//删除数据

void

selection(ticket

*pa,int

n);//排序

void

TicketManagement(void);

//车票售出与退回

void

TicketOrder(void);

//售票

void

TicketDelete(void);

//退票

void

exit(void);

//退出该系统

void

SaveRecord(ticket

x);

//储存信息到文件中

/********************************************/

int

main(void)

{

do{

mainmenu();

}while(FLAG==FALSE);

return

0;

}

void

mainmenu(void)

{

system(“mode

con:

cols=140

lines=130“);

char

functionNumber;

printf(“

火车票管理系统\n\n“);

printf(“============================================================================\n“);

printf(“

1.录入班次信息\t\n“);

printf(“

2.显示所有车票信息列表\t\n“);

printf(“

3.查询火车票数据\t\n“);

printf(“

4.删除火车票数据记录\t\n“);

printf(“

5.按行车时间排序\t\n“);

printf(“

6.售票与退票系统\t\n“);

printf(“

7.退出该系统\t\n“);

printf(“============================================================================\n“);

printf(“请选择你所需要的功能:“);

scanf(“%c“,&functionNumber);

switch(functionNumber)

{

case

'1':

{

InsertMessage();

printf(“\n按任意键回主菜单......\n“);

getchar();

getchar();

}

break;

case

'2':

{

RecordNumber=ShowMessage();

printf(“\n按任意键回主菜单......\n“);

getchar();

getchar();

}

break;

case

'3':

{

SearchMenu();

printf(“\n按任意键回主菜单......\n“);

getchar();

getchar();

}

break;

case

'4':

{

cancle();

printf(“\n按任意键回主菜单......\n“);

getchar();

getchar();

}

break;

case

'5':

{

selection(train,RecordNumber);

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

int

i;

for(i=0;i

{

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

printf(“\n按任意键回主菜单......\n“);

getchar();

getchar();

}

break;

case

'6':

{

TicketManagement();

getchar();

getchar();

}

break;

case

'7':

{

int

i;

FLAG=TRUE;

for(i=0;i

{

SaveRecord(*(train+i));

}

exit();

}

break;

default:

{

printf(“输入错误,请确保你的输入为1--7.\n“);

printf(“按任意键回主菜单......\n“);

getchar();

getchar();

}

}//switch

ends

FLAG=FALSE;

}

void

InsertMessage(void)

{

FILE

*fp;

char

filename[MAXFILENAME];

int

i;

printf(“请输入文件名或者文件路径名:“);

scanf(“%s“,filename);

if((fp=fopen(filename,“r“))==NULL)

{

printf(“文件%s不可读,请确认文件%s存在或者文件路径正确.\n\n“,filename,filename);

mainmenu();

}

for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++)

{

fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes);

fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber);

}

RecordNumber=i;

/*******************************输出更新后的订票记录************************************************************/

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

for(i=0;i

{

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

fclose(fp);

}

int

ShowMessage(void)

{

int

i;

FILE

*fp;

if((fp=fopen(“add.txt“,“r“))==NULL)

{

printf(“读取数据失败,请检查文件add.txt是否存在.\n“);

exit(-1);

}

for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++)

{

fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes);

fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber);

}

int

count=i;

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

for(i=0;i

{

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\t“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

printf(“\n“);

}

return

count;

}

void

SearchMenu(void)

{

system(“mode

con:

cols=140

lines=130“);

char

functionNumber;

printf(“

查询子菜单\n“);

printf(“============================================================================\n“);

printf(“

1.按班次号查询\t\n“);

printf(“

2.按终点站查询\t\n“);

printf(“

3.返回主菜单\t\n“);

printf(“============================================================================\n“);

printf(“请选择你所需要的功能:“);

scanf(“%*c%c“,&functionNumber);

switch(functionNumber)

{

case

'1':SearchByNumber();break;

case

'2':SearchByAddress();break;

case

'3':

getchar();

mainmenu();

break;

default:

printf(“输入错误,请确保你的输入为1--3.\n“);

printf(“按任意键回查询子菜单......\n“);

getchar();

getchar();

SearchMenu();

}

}

void

SearchByNumber(void)

{

int

i;

char

Number[MAX];

printf(“请输入班次号:“);

scanf(“%s“,&Number);

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

for(i=0;i

{

//对比终点站记录,找到并输出

if((strcmp(Number,train[i].SerialNumber))==0)

{

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

}

}

void

SearchByAddress(void)

{

int

i;

char

Address[MAX];

printf(“请输入终点站的名称:“);

scanf(“%s“,&Address);

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

for(i=0;i

{

//对比终点站记录,找到并输出

if((strcmp(Address,train[i].TerminalPoint))==0)

{

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

}

}

void

cancle(void)

{

SearchMenu();

int

i,j;

char

m[MAX];

printf(“请输入要删除的班次:“);

scanf(“%s“,&m);

for(i=0;i

{

if(i==RecordNumber)

{

printf(“对不起,没有这趟车\n“);

}

}

for(j=i;j

{

train[j]=train[j+1];

}

printf(“删除成功\n“);

}

void

selection(ticket

*pa,int

n)

{

int

i,k,index;

struct

ticket

temp;

for(k=0;k

{

index=k;

for(i=k+1;i

if(pa[i].LastTime

index=i;

if(index!=k)

{

temp=pa[index];

pa[index]=pa[k];

pa[k]=temp;

}

}

}

void

TicketManagement(void)

{

char

functionNumber;

system(“mode

con:

cols=140

lines=130“);

printf(“

订票与退票菜单\n“);

printf(“============================================================================\n“);

printf(“

1.订票\t\n“);

printf(“

2.退票\t\n“);

printf(“

3.返回主菜单.\n“);

printf(“============================================================================\n“);

printf(“选择你需要的功能:“);

scanf(“%*c%c“,&functionNumber);

switch(functionNumber)

{

case

'1':

{

TicketOrder();

//getchar();

//getchar();

}

break;

case

'2':TicketDelete();break;

case

'3':

{

getchar();

mainmenu();

}

break;

default:

{

printf(“输入错误,请确保你的输入为1--3.\n“);

printf(“按任意键回主菜单......\n“);

getchar();

getchar();

mainmenu();

}

}

}

void

TicketOrder(void)

{

SearchMenu();

int

i,j;

char

a[MAX];

printf(“请输入要订购的车票的班次:“);

scanf(“%s“,&a);

printf(“请输入要订购的车票的张数:“);

scanf(“%d“,&j);

for(i=0;i

{

if((strcmp(a,train[i].SerialNumber))==0)

{

if(train[i].FixedNumber

{

(train[i].FixedNumber)+=j;

printf(“你的订票成功,请按时上车,谢谢使用!\n“);

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

else

printf(“对不起,票已卖完\n“);

}

}

}

void

TicketDelete(void)

{

SearchMenu();

int

i,j;

char

b[MAX];

printf(“请输入要退购的车票的班次:“);

scanf(“%s“,&b);

printf(“请输入要退购的车票的张数:“);

scanf(“%d“,&j);

for(i=0;i

{

if((strcmp(b,train[i].SerialNumber))==0)

{

if(train[i].FixedNumber>=1)

{

train[i].FixedNumber-=j;

printf(“退订车票成功,谢谢使用!\n“);

printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“);

printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes);

printf(“%s\t%s\t\t%.1f\t

%d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber);

}

else

printf(“对不起,今天的这趟车的票尚未卖出,无法完成退票!\n“);

}

}

}

void

exit(void)

{

printf(“\n\n*********************谢谢使用本系统,欢迎下次继续使用***********************\n“);

exit(0);

}

void

SaveRecord(ticket

x)

{

FILE

*fp;

if((fp=fopen(“add.txt“,“a“))==NULL)

{

printf(“打开文件%s失败\n“,“add.txt“);

exit(-1);

}

fprintf(fp,“\n%s\t%d\t%d\t\t“,x.SerialNumber,x.SetOut.hour,x.SetOut.minutes);

fprintf(fp,“%s\t%s\t\t%.1f\t

%d\t\t%d“,x.DeparturePoint,x.TerminalPoint,x.LastTime,x.FixNumber,x.FixedNumber);

}

五、测试数据及其结果分析

显示的主菜单界面:

火车票管理系统

============================================================================

1.录入班次信息

2.显示所有车票信息列表

3.查询火车票数据

4.删除火车票数据记录

5.按行车时间排序

6.售票与退票系统

7.退出该系统

============================================================================

请选择你所需要的功能:

1)录入班次信息

输入:1

输出:请输入文件名或者文件路径名:

输入:D:\\1.txt

输出:

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

200

k1234

10:20

上海

苏州

2.0

200

t2222

12:40

长沙

上海

9.0

250

k2323

13:50

扬州

南京

1.5

200

k1122

9:20

广州

南京

20.0

300

170

按任意键回主菜单......2)显示所有车票信息列表

输入:2

输出:

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

200

k1234

10:20

上海

苏州

2.0

200

t2222

12:40

长沙

上海

9.0

250

k2323

13:50

扬州

南京

1.5

200

k1122

9:20

广州

南京

20.0

300

170

按任意键回主菜单......3)查询火车票记录

输入:3

输出:

查询子菜单

============================================================================

1.按班次号查询

2.按终点站查询

3.返回主菜单

============================================================================

请选择你所需要的功能:

输入:1

输出:请输入班次号:

输入:k1111

输出:

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

200

按任意键回主菜单......输入:2

输出:请输入终点站的名称:

输入:上海

输出:

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

200

t2222

12:40

长沙

上海

9.0

250

按任意键回主菜单......4)删除火车票数据

输入:4

输出:查询子菜单

============================================================================

1.按班次号查询

2.按终点站查询

3.返回主菜单

============================================================================

请选择你所需要的功能:

(查找过程同上)

输出:请输入要删除的班次:

输入:t2222

输出:删除成功

按任意键回主菜单......5)按行车时间排序:

输入:5

输出:

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k2323

13:50

扬州

南京

1.5

200

k1234

10:20

上海

苏州

2.0

200

k1111

8:30

南京

上海

4.0

300

200

t2222

12:40

长沙

上海

9.0

250

k1122

9:20

广州

南京

20.0

300

170

按任意键回主菜单......6)售票

输入:6

输出:

订票与退票菜单

===================================================

1.订票

2.退票

3.返回主菜单

==================================================

选择你需要的功能:

输入:1

输出:

查询子菜单

========================================================================

1.按班次号查询

2.按终点站查询

3.返回主菜单

=========================================================================

请选择你所需要的功能:

(查询过程同上)

输出:请输入需要订购的车票班次

输入:k1111

输出:请输入要订购的车票张数

输入:10

输出:

您的订票成功,请按时上车,谢谢使用!

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

210

7)退票

输入:6

输出:

订票与退票菜单

===================================================

1.订票

2.退票

3.返回主菜单

==================================================

选择你需要的功能:

输入:2

输出:

查询子菜单

========================================================================

1.按班次号查询

2.按终点站查询

3.返回主菜单

=========================================================================

请选择你所需要的功能:

(查询过程同上)

输出:请输入需要退购的车票班次

输入:k1111

输出:请输入要订购的车票张数

输入:5

退订车票成功,谢谢使用!

班次

发车时间

起点

终点

行车时间(小时)

额定载量

已定票人数

k1111

8:30

南京

上海

4.0

300

195

8)退出

输入:7

输出:****************谢谢使用本系统,欢迎下次继续使用****************

结果分析:(1).若输入数字不在1——7之间,则会提示错误。

(2).当输入列车班次信息不正确时,将不会得到结果。

(3).文件录入不正确时,将不会得到任何结果。

六、调试过程中的问题

1)文件存储方式不正确:应先定义一个文件存储函数,在其它函数中调用,方便有效。

2)删除时若遇到没有的班次则程序出错。应在不存在输入的列车班次时,输出不存在的提示

3)保存后在下次运行时出错问题:在保存信息时,应在每个信息之间加一空格来保存,否则在文件下次使用时读取就会没有分界点。

4)订票退票只能一次一张。应在用户输入列车班次后让用户输入需要订购的张数。

5)结构指针定义错误,ticket前不应加struct。

火车票管理系统
TOP