需求描述:
火车票订票系统以用户预定火车票的一系列流程为主线,将火车票车次详细信息进行显示、保存,同时提供火车的剩余票数,以供用户查询决定是否预订,当预订成功后,提供保存用户的订票信息的功能。由于订票系统面向的人群主要分为两类:管理员和普通用户。他们对于该购票系统的需求不同,使用方法也不同,由此应该分成两个对象分别设计不同界面和用途该系统详细周到的操作流程满足了用户的需求,也提高了铁路工作人员的工作效率。
火车售票系统介绍:该系统分为管理员和用户两个角色:
管理员的功能包含:
1、录入火车票信息
2、显示火车票信息
3、查询火车票信息
4、修改火车票信息
用户(顾客)的功能包含:
1、火车票区间查询
2、查询已购票信息
该C语言程序主要用到了以下数据结构的知识点:
-
结构体(struct):
- 用于定义火车票信息的结构体
train_infor
,简称train
。 - 结构体包括火车车次、始发地、终点站、发车时间、到达时间、票价等信息。
- 用于定义火车票信息的结构体
-
数组:
- 使用一维数组
train info[10000]
保存所有的车次信息。 - 使用二维数组
train users[100][100]
保存每个用户的购票信息。
- 使用一维数组
-
字符串:
- 结构体中包含字符数组(如
number
,start
,end
)用于存储车次、始发地、终点站。 - 使用
strcmp
函数进行字符串比较,用于查询和修改车次信息。
- 结构体中包含字符数组(如
-
多维数组:
train users[100][100]
是一个二维数组,用于记录用户的购票信息,其中users[no]
表示用户no
的购票记录,users[no][vcs[no]]
用于表示用户no
的第vcs[no]
张车票。
-
循环结构:
- 使用
for
循环录入、显示和查询车次信息。 - 使用
while
循环处理用户和管理员的选择输入,确保可以多次进行操作。
- 使用
-
条件结构:
- 使用
if-else
判断条件,确保操作的正确性,例如判断是否有车次信息、用户是否有购票记录等。 - 使用
switch-case
处理菜单选择,便于管理不同操作。
- 使用
-
函数:
- 该程序定义了多个函数来实现不同功能,如录入火车票信息 (
Traininfo
)、显示火车票信息 (showtrain
)、查询火车票信息 (searchtrain
)、修改火车票信息 (Modify
)、购票 (bookticket
)、区间查询 (look_up
)、保存用户购票信息 (SaveTraininfo
)、管理员界面 (admin
)、用户界面 (user
) 。
- 该程序定义了多个函数来实现不同功能,如录入火车票信息 (
运行效果截图:
管理员登录后录入车票信息:
管理员查询已添加的车票信息:
管理员单次查询车次:
管理员修改车次信息(中间都用英文状态下的空格):
用户登录查询或实现订票:
用户端查询车票:
用户端购票:
课设 源代码访问地址https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10
结构体定义:
//火车票信息模块 (以结构体实现)
typedef struct train_infor
{
char number[10];//火车车次
char start[20];//始发地
char end[20];//终点站
int year1,month1,day1,h1,m1;//始发时间
int year2,month2,day2,h2,m2;//到站时间
int price;//票价
}train;
int cnum=0;//记录总共列车信息的数量
train info[10000];//以结构体类型的数组用来保存所有的车次信息;
train users[100][100];//二维数组用来保存用户信息,每一行可以用来表示一个用户的购票信息
int vcs[100]={0};//记录每一个用户自己账户的票数,初始为0
主函数:
int main()
{
printf("提示:整个输入过程请严格按照格式,标点均为英文状态下输入!\n");
printf("-------------请选择身份-------------\n");
printf("| 1、管 理 员 | 2、用 户 |\n");
printf("| 0、结束程序 |\n");
printf("------------------------------------\n");
//输入1表示进入管理员界面,2进入用户界面
int choose1;
while(~scanf("%d",&choose1))//记录选择的序号,多组测试
{
if(choose1==0)
break;
switch (choose1)
{
case 1:
admin();
break;
case 2:
user();
break;
default :
printf("请选择有效操作对应编号哦!\n");
break;
}
printf("-------------请选择身份-------------\n");
printf("| 1、管 理 员 | 2、用 户 |\n");
printf("| 0、结束程序 |\n");
printf("------------------------------------\n");
}
return 0;
}
用户函数:
//用户界面
void user()
{
int no;
printf("请输入你的用户编码:");
scanf("%d",&no);//记录用户编码用来对应的保存其购票信息
user_menu();
int choose3;
while(~scanf("%d",&choose3))//记录用户选择的操作;
{
switch(choose3)
{
case 1:
look_up(no);
break;
case 2:
SaveTraininfo(no);
break;
case 0:
return ;//输入0直接退出整个函数
default :
printf("请选择有效操作对应编号哦!\n");
break ;
}
录入火车票信息:
//录入火车票信息(即添加模块)
void Traininfo()
{
int sum,i;
printf("请输入要录入的列车信息条数:");
scanf("%d",&sum);
printf("请依次输入火车车次 始发地 终点站 始发时间(年/月/日 时:分) 到站时间(年/月/日 时:分) 票价 ;\n");
printf("每输入一项数据后以空格结束,进行下一数据录入\n");
for(i=cnum;i<cnum+sum;i++)/*录入信息从cnum开始录入信息,避免管理员先进行插入或添加、删除等操作后再来录入数据,
发生覆盖;同时这样可以多次循环进行录入操作(在之前的信息下继续添加)*/
{
scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d %d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2,&info[i].price);
}
printf("录入成功!\n");
cnum+=sum;
return ;
}
修改火车票信息:
//修改火车票信息
void Modify()
{
int i;
printf("请输入要修改的车次:");
char ch[10];//记录要修改的车次
scanf("%s",ch);
//和查询车票一样先找到该列车所在的位置,然后对其进行修改
for(i=0;i<cnum;i++)
{
if(strcmp(ch,info[i].number)==0)//比较所有的列车信息一直到和输入的车次相同则找到并输出,字符串的比较要是用strcmp()函数;如果相等则为0
{
printf("该列车原信息:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\t\t票价\n");
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\t%d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2,info[i].price);
printf("请输入新的数据:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\t\t票价\n");
scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d %d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2,&info[i].price);
printf("修改成功!\n");
return ;//修改后直接结束无需再进行
}
}
printf("无此列车信息!\n");//如果找到前面就结束则不会运行到此处;所以运行到此处只能是没有找到;
return ;
}
用户订票函数:
//用户订票模块
void bookticket(int no)
{
int i;
printf("请输入你要购票的车次:\n");
char che[10];
scanf("%s",che);
for(i=0;i<cnum;i++)
{
if(strcmp(che,info[i].number)==0)
{
users[no][vcs[no]]=info[i];
vcs[no]++;//该用户的购票数加一;
printf("购票成功!\n");
return ;
}
}
printf("无此列车信息!\n");
return ;