您的位置:首页 > 其它

火车票订票系统

2016-03-29 15:56 281 查看
此为第一次课程设计,和大家分享,对我来说,是这开始也是结束:开始走上不归路,结束不属于自己的:

直接上代码:说明见注释:

/*火车订票系统*/
/*头文件*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
#include<process.h>
#include<conio.h>
#include<iomanip.h>
#include<malloc.h>
#include<time.h>

#define SIZE 10                 /*定义SIZE为十辆车次信息*/
#define A 5                     /*定义A为每辆车次经过的主要大站*/

/*乘客信息结构体*/
typedef struct man
{
char name[20];              /*姓名*/
char phone_num[20];         /*电话号码*/
char  idcard[20];           /*身份证号码*/
int	 booknums;              /*订票数量*/
char book_num[50];          /*订单号*/
struct man *next;           /*指向下一乘客结点*/
}man,*pman,*manlinklist;        /*乘客信息链表*/
manlinklist z;                  /*定义全局变量*/

/*剩余火车票信息信息结构体*/
typedef struct tickets
{
int discount;                 /*打折*/
int box_num;                  /*车厢号*/
int seat_num;                 /*座位号*/
struct tickets *next;         /*指向下一张车票结点*/
}ticket,*pticket,*ticketlinklist; /*剩余车票信息链表*/
ticketlinklist g;                 /*定义全局变量*/

/*火车站点结构体*/
typedef struct station
{
int sta_num;                   /*站次*/
char staname[20];              /*站名*/
char arrivetime[20];           /*到站时间*/
char takeofftime[20];          /*开车时间*/
char time[30];                 /*从起点到次中间站的时间*/
}station1;

/*火车信息结构体*/
struct train
{
char train_num[50];            /*车次编号*/
char start[20];                /*出发站*/
char start_time[10];           /*出发时间*/
char end[20];                  /*到达站*/
char end_time[10];             /*到达时间*/
char mainstation[100];         /*经过主要大站*/
char boxs[60];                 /*车厢数*/
char seats[100];               /*每节车厢座位数*/
char price[20];                /*票价*/
station1 station2[100];        /*嵌套站点结构体数组*/
}train[SIZE];                      /*定义全局结构体数组(顺序表),包含SIZE个车次信息*/

/*订票人注册信息结构体*/
typedef struct registers
{
char username[20];            /*用户名*/
char password[20];            /*密码*/
struct registers *next;       /*指向下一个订票人注册信息的结点*/
}lregisters,*pregisters,*linklistregisters;
linklistregisters F;              /*定义全局变量*/

/*各类函数声明*/
//******************************************************************
//******************************************************************
void prints();                        /*菜单打印*/
int Initicket(ticketlinklist *h);     /*初始化剩余车票信息链表*/
int Initman();                        /*初始化乘客信息链表*/
int Initregisters(linklistregisters *head);/*初始化订票人注册信息链表*/
void registers();                     /*注册*/
void check();                         /*用户验证*/
char Continue();                      /*询问是否继续函数*/
bool Check(char pas[6]);              /*密码验证函数*/
void InsertMessaage();                /*班次信息录入*/
void ShowMessage();                   /*查看列车信息函数*/
void SearchByNumber();                /*按车次编号查找*/
void SearchBystart();                 /*按起点站查找*/
void SearchByend();                   /*按终点站查找*/
void SearchMenu();                    /*车票信息查询*/
void findfree();                      /*查询剩余票信息*/
void times();                         /*调用时间函数*/
void Booking();                       /*订票*/
void Deleteticket();                  /*退票*/
//******************************************************************
//******************************************************************

/*初始化剩余车票信息链表*/
int Initicket(ticketlinklist *h)
{

*h=(ticketlinklist)malloc(sizeof(ticket)); /*生成头结点*/
if(!h)
{
printf("初始化化错误\n");              /*生成不成功,提示错误*/
return 0;
}
(*h)->next=NULL;                           /*让头结点指针域为空*/
g=(*h);                                    /*将头结点付给g*/
return 1;
}

/*初始化乘客信息链表*/
int Initman()
{
manlinklist h;
h=(manlinklist)malloc(sizeof(man));         /*生成头结点*/
if(!h)
{
printf("初始化化错误\n");               /*生成不成功,提示错误*/
return 0;
}
(h)->next=NULL;                             /*让头结点指针域为空*/
z=(h);                                      /*将头结点付给z*/
return 1;
}

/*初始化订票人注册信息链表*/
int Initregisters(linklistregisters *head)
{
*head=(linklistregisters)malloc(sizeof(lregisters));/*生成头结点*/
if(!head)
{
printf("初始化化错误\n");              /*生成不成功,提示错误*/
return 0;
}
(*head)->next=NULL;                        /*让头结点指针域为空*/
F=(*head);
return 1;
}

/*注册*/
void registers()
{
pregisters p1,p2;
char name[20];
char word[20];
char words[20];
char a;
linklistregisters head;
Initregisters(&head);
printf("\n订票需要注册,是否进行注册(y/n)?\n");
scanf("%s",&a);
if(a=='y'||a=='Y')
{
printf("\n***************************************\n");
printf("**************注册提示:****************\n");
printf("      用户名由字母、数字、下划线组成   \n");
printf("          密码为标准位数字组成         \n");
printf("***************************************\n");
printf("开始注册:\n");
printf("创建用户名:\n");
scanf("%s",name);
printf("输入密码:\n");
scanf("%s",word);
printf("请再次输入密码:\n");
scanf("%s",words);
if(strcmp(word,words)==0)
{
p1=(pregisters)malloc(sizeof(lregisters));
strcpy(p1->username,name);
strcpy(p1->password,word);
p1->next=head->next;
head->next=p1;
printf("\n注册完成,下面是你的注册信息:\n");
p2=head->next;
printf("\n您的用户名为%s\n",p2->username);
printf("\n您的用户密码为%s\n",p2->password);
printf("\n请妥善保管!\n");
}
else
{
printf("对不起,两次输入不相同,请重新输入!\n");
prints();
}
}
else
{
printf("对不起,不注册无法完成订票!\n");
printf("请重新注册:\n");
prints();
}
}

/*用户验证*/
void check()
{
pregisters p1,p2;
char names[20];
char pass[20];
getchar();
getchar();
system("cls");
printf("时间:\n");
times();
printf("\n按任意键进入订票系统\n");
getchar();
printf("\n用户登录:\n");
printf("\n请输入用户名:");
scanf("%s",names);
printf("\n请输入密码:");
scanf("%s",pass);
p1=F;
p2=p1->next;
if(strcmp(p2->username,names)==0&&strcmp(p2->password,pass)==0)
{
printf("验证成功!\n");
printf("开始订票!\n");
getchar();
getchar();
}
else
{
printf("对不起,输入密码或用户名不正确,请重新输入\n");
getchar();
getchar();
check();
}
}

/*调用时间函数*/
void times()
{
time_t ltime;
time(<ime);
printf("%s",ctime(<ime));                 /*输出当前系统时间*/
}

/*本系统安全密码验证函数*/
bool Check(char pas[6])
{
FILE *fp;
char ch;
char a[7]={" "};                            /*输入密码为六个字符*/
int i=0;
if((fp=fopen("mima.txt","r"))==NULL)        /*密码录入在文件mima.txt中*/
{
printf("对不起,打开文件失败!\n");      /*从文件中读取密码*/
exit(0);
}
ch=fgetc(fp);                               /*从fp所指的文件中取得一个字符*/
while(ch!=EOF&&i<6)                         /*EOF为文件结束标志*/
{
a[i]=ch;
ch=fgetc(fp);
i++;
}
a[6]='\0';                                   /*字符串以\0结束*/
if(!strcmp(pas,a))                           /*输入六位字符,和文件中的字符匹配*/
{
return true;                             /*匹配上返回true*/
}
else
{
printf("对不起,密码错误!\n");
return false;                            /*否则返回false*/
}
fclose(fp);                                  /*结束关闭文件*/
}

/*询问是否继续函数*/
char Continue()                                  /*回答是 则进行下一步 不是则返回上一步*/
{
char answer;
while(1)
{
printf("\n\t 您是否想继续(Y/N)?");
scanf("%s",&answer);
system("cls");
if(answer=='y'||answer=='Y')
return 'y';
else if(answer=='n'||answer=='N')
return 'n';
else
printf("\n\t输入有误,请重新输入!");
}
}

/*班次信息录入*/
void InsertMessaage()
{
FILE *fp;
int i;
int j;
if((fp=fopen("train.dat","wb"))==NULL)
{
printf("打开文件失败\n");
return;
}
printf("请输入火车信息:\n");
for(i=0;i<SIZE;i++)
{
printf("车次编号   出发站   出发时间   到达站   到达时间   车厢数   座位数   票价\n");
scanf("%s %s %s %s %s %s %s %s",train[i].train_num,train[i].start,train[i].start_time,train[i].end,train[i].end_time,train[i].boxs,train[i].seats,train[i].price);
printf("录入站点信息:\n");
printf("站次   站名   到达时间    开车时间    运行时间 \n");
for(j=0;j<A;j++)
{
scanf("%d %s %s %s %s",&train[i].station2[j].sta_num,train[i].station2[j].staname,train[i].station2[j].arrivetime,train[i].station2[j].takeofftime,train[i].station2[j].time);
}
if(fwrite(&train[i],sizeof(struct train),1,fp)!=1)
{
printf("录入出错\n");
}
}
fclose(fp);
printf("录入完毕,按任意键退出!\n");
getchar();
getchar();
}

/*查看列车信息函数*/
void ShowMessage()
{
FILE *fp;
int i;
int j;
if((fp=fopen("train.dat","rb"))==NULL)
{
printf("打开文件失败\n");
exit(0);
}
printf("各列车信息:\n");
for(i=0;i<SIZE;i++)
{
printf("\n*****************************************************************************************\n");
printf("\n车次编号   出发站   出发时间   到达站   到达时间    车厢数   座位数     票价\n");
fread(&train[i],sizeof(struct train),1,fp);
printf("\n  %-9s %-9s %-9s %-9s  %-9s   %-9s%-9s%-9s\n",train[i].train_num,train[i].start,train[i].start_time,train[i].end,train[i].end_time,train[i].boxs,train[i].seats,train[i].price);
printf("\n本车次经过主要大站信息:\n");
printf("站次   站名   到达时间    开车时间    运行时间 \n");
for(j=0;j<A;j++)
{
printf(" %d     %s    %s      %s         %s\n",train[i].station2[j].sta_num,train[i].station2[j].staname,train[i].station2[j].arrivetime,train[i].station2[j].takeofftime,train[i].station2[j].time);
}
}
printf("\n*****************************************************************************************\n");
fclose(fp);
Continue();
}

/*按车次编号查找*/
void SearchByNumber()
{
char Number[50];
char c;
int i;
int	j;
printf("\n\t输入车次编号:");
scanf("%s",&Number);
printf("\n\t查询结果:\n");
for(i=0;i<SIZE;i++)
{
if(strcmp(train[i].train_num,Number)==0)  /*匹配车次*/
{
printf("\n*****************************************************************************************\n");
printf("\n车次编号   出发站   出发时间   到达站   到达时间    车厢数   座位数     票价\n");
printf("\n  %-9s %-9s %-9s %-9s  %-9s   %-9s%-9s%-9s\n",train[i].train_num,train[i].start,train[i].start_time,train[i].end,train[i].end_time,train[i].boxs,train[i].seats,train[i].price);
printf("\n本车次经过主要大站信息:\n");
printf("站次   站名   到达时间    开车时间    运行时间 \n");
for(j=0;j<A;j++)
{
printf(" %d     %s    %s      %s         %s\n",train[i].station2[j].sta_num,train[i].station2[j].staname,train[i].station2[j].arrivetime,train[i].station2[j].takeofftime,train[i].station2[j].time);
}
}
}
printf("\n****************************************************************************************\n");
if(Continue()=='y')
{
printf("\n是否查看此列车车票详细信息(N/Y):\n");
scanf("%s",&c);
if(c=='y'||c=='Y')
findfree();                         /*查看本车次车票情况*/
else return;
}
Continue();
}

/*按起点站查找*/
void SearchBystart()
{
char starts[20];
int i;
int j;
printf("\n\t输入起点站:\n");
scanf("%s",&starts);
printf("\n\t查询结果:\n");
for(i=0;i<SIZE;i++)
{
if(strcmp(train[i].start,starts)==0)  /*匹配起点*/
{
printf("\n*****************************************************************************************\n");
printf("\n车次编号   出发站   出发时间   到达站   到达时间    车厢数   座位数     票价\n");
printf("\n  %-9s %-9s %-9s %-9s  %-9s   %-9s%-9s%-9s\n",train[i].train_num,train[i].start,train[i].start_time,train[i].end,train[i].end_time,train[i].boxs,train[i].seats,train[i].price);
printf("\n本车次经过主要大站信息:\n");
printf("站次   站名   到达时间    开车时间    运行时间 \n");
for(j=0;j<A;j++)
{
printf(" %d     %s    %s      %s         %s\n",train[i].station2[j].sta_num,train[i].station2[j].staname,train[i].station2[j].arrivetime,train[i].station2[j].takeofftime,train[i].station2[j].time);
}
}
}
printf("\n****************************************************************************************\n");
Continue();
}

/*按终点站查找*/
void SearchByend()
{
char ends[20];
int i;
int j;
printf("\n\t输入终点站:\n");
scanf("%s",&ends);
printf("\n\t查询结果:\n");
for(i=0;i<SIZE;i++)
{
if(strcmp(train[i].end,ends)==0)   /*匹配终点*/
{
printf("\n*****************************************************************************************\n");
printf("\n车次编号   出发站   出发时间   到达站   到达时间    车厢数   座位数     票价\n");
printf("\n  %-9s %-9s %-9s %-9s  %-9s   %-9s%-9s%-9s\n",train[i].train_num,train[i].start,train[i].start_time,train[i].end,train[i].end_time,train[i].boxs,train[i].seats,train[i].price);
printf("\n本车次经过主要大站信息:\n");
printf("站次   站名   到达时间    开车时间    运行时间 \n");
for(j=0;j<A;j++)
{
printf(" %d     %s    %s      %s         %s\n",train[i].station2[j].sta_num,train[i].station2[j].staname,train[i].station2[j].arrivetime,train[i].station2[j].takeofftime,train[i].station2[j].time);
}
}
}
printf("\n****************************************************************************************\n");
Continue();                            /*询问是否继续*/
}

/*查询剩余票信息*/
void findfree()
{
ticketlinklist h;                      /*定义头结点*/
Initicket(&h);                         /*初始化车票信息链表*/
pticket q,p;
int i,j;
int m=0;
int n=1;
for(i=1;i<=10;i++)
for(j=1;j<=20;j++)
{
p=(pticket)malloc(sizeof(ticket)); /*生成新结点*/
p->box_num=i;                      /*车厢号*/
p->discount=85;                   /*折扣*/
p->seat_num=j;                     /*座位号*/
p->next=h->next;                   /*头插法插入结点*/
h->next=p;
}
q=h->next;                             /*遍历剩余车票信息链表*/
while(q)
{
m++;
printf("车厢号   座位号    折扣(%)  ");
printf("%d        %d        %d\t\t",q->box_num,q->seat_num,q->discount);
q=q->next;
if(m%2==0)
printf("\n");
}
printf("\n******************剩余票数:%d\n",m); /*遍历加计数器显示剩余票数*/
}

/*订票*/
void Booking()
{
char answer[8];                         /*输入车次编号*/
char names[20];                         /*输入姓名*/
char numbers[20];                       /*输入电话号码*/
char id[20];                            /*输入身份证号*/
char b,l,e;
int i,c,j=0;
int amount;                             /*订票数量*/
int boxs;                               /*车厢号*/
int seats;                              /*座位号*/
manlinklist h;                          /*定义头结点*/
pman p,q;
pticket m,n,x;
h=z;
printf("时间:\n");
times();
printf("\n*********************欢迎订票**********************\n");
printf("输入订票数量:\n");
scanf("%d",&amount);
printf("请输入车次编号:\n");
scanf("%s",answer);
for(i=0;i<amount;i++)
{
printf("输入姓名:\n");
scanf("%s",names);
printf("输入电话:\n");
scanf("%s",numbers);
printf("输入身份证号:\n");
scanf("%s",id);
printf("输入你喜欢的车厢号:\n");
scanf("%d",&boxs);
printf("输入你喜欢的座位号:\n");
scanf("%d",&seats);
p=(pman)malloc(sizeof(man));           /*生成新结点*/
if(!p)
{
exit(0);
}
strcpy(p->name,names);                      /*将订票人员信息写入结点*/
strcpy(p->phone_num,numbers);
strcpy(p->idcard,id);
p->booknums=amount;
strcpy(p->book_num,numbers);
p->next=h->next;                        /*插入结点*/
h->next=p;
}
printf("订票成功,祝你乘坐愉快!\n\n");
printf("请按任意键继续....\n");
getchar();
getchar();
system("cls");
printf("是否打印车票(Y/N)?");
scanf("%s",&b);
printf("车票信息如下:\n");
printf("时间:");
times();
if(b=='y'||b=='Y')
q=h->next;      /*遍历乘客信息链表*/

printf("\n********************************************************************\n");
printf("  车厢号   座位号                          \n");
printf("\n    %d       %d                                 \n",boxs,seats);
printf("姓名     电话       身份证号         订单号 \n");
printf("\n%s     %s         %s              %s     \n",q->name,q->phone_num,q->idcard,q->book_num);
q=q->next;

for(c=0;c<SIZE;c++)
{
if(strcmp(train[c].train_num,answer)==0)   /*匹配车次*/
{
printf("\n车次编号   出发站   出发时间   到达站   到达时间    \n");
printf("\n  %-9s %-9s %-9s %-9s  %-9s   \n",train[c].train_num,train[c].start,train[c].start_time,train[c].end,train[c].end_time);
printf("\n需要支付 %-9s元\n",train[c].price);
}
}
printf("**********************************************************************\n\n");

//*********************************************************************
//在剩余车票信息中删除乘客所定的座位号车厢号 且剩余票数减一
//*********************************************************************
m=g;
while(m->next)
{
if((m->next->box_num==boxs)&&(m->next->seat_num==seats))/*匹配订购的车厢号座位号*/
{
n=m->next;                                          /*匹配成功删除结点*/
m->next=n->next;
free(n);
break;
}
else
m=m->next;
}
printf("是否显示剩余车票信息(Y/N):\n");
scanf("%s",&l);
if(l=='y'||l=='Y')
{
x=g->next;                                              /*遍历剩余车票信息链表*/
while(x)
{
j++;
printf("车厢号   座位号    折扣(%)  ");
printf("%d        %d        %d\t\t",x->box_num,x->seat_num,x->discount);
x=x->next;
if(j%2==0)
printf("\n");
}
printf("\n******************剩余票数:%d\n",j);          /*遍历加计数器的剩余票数*/
}
printf("是否继续订票(Y/N):\n");
scanf("%s",&e);
{
if(e=='Y'||e=='y')
{
Booking();                        /*继续订票,调用订票函数本身*/
}
else
{
printf("按任意键返回主菜单!\n");
getchar();
getchar();
prints();
}
}
}

/*退票*/
void Deleteticket()
{
pman p,q;
char s;
char l;
char id[20];             /*身份证号*/
int boxs;
int seats;
int t=0;
char e;
pticket m,n,f;
printf("时间:\n");
times();
printf("开始退票:\n");
printf("请输入订票id:\n");
scanf("%s",id);
printf("输入订票的车厢号:\n");
scanf("%d",&boxs);
printf("输入订票的座位号:\n");
scanf("%d",&seats);
p=z;
while(p)
{
if(strcmp(p->next->idcard,id)==0) /*匹配成功并显示订票信息*/
{
printf("您的订票记录如下:\n");
printf("*********************************************************\n");
printf("*姓名     电话       身份证号         订单号 \n");
printf("*%s   %s         %s               %s     \n",p->next->name,p->next->phone_num,p->next->idcard,p->next->book_num);
printf("*********************************************************\n\n");
break;
}
else
{
p=p->next;
}
}
printf("您确定要退票吗(Y/N)?");
scanf("%s",&s);
if(s=='y'||s=='Y')
{
q=p->next;                /*删除订票乘客信息*/
p->next=q->next;
free(q);
printf("退票成功,感谢使用!\n");
}
//***************************************************************
//在剩余车票信息中插入退票信息 并且 剩余车票数加一
//***************************************************************
m=g;
printf("是否显示剩余车票信息:\n");
scanf("%s",&l);
if(l=='y'||l=='Y')
{
n=(pticket)malloc(sizeof(ticket));   /*生成新结点*/
if(!n)
{
exit(0);
}
n->box_num=boxs;     /*将退票信息写入结点数据域*/
n->discount=80;
n->seat_num=seats;
n->next=m->next;
m->next=n;
}
f=g->next;                       /*遍历剩余车票信息链表*/
while(f)
{
t++;
printf("车厢号   座位号    折扣(%)  ");
printf("%d        %d        %d\t\t",f->box_num,f->seat_num,f->discount);
f=f->next;
if(t%2==0)
printf("\n");
}
printf("\n******************剩余票数:%d\n",t);/*遍历加计数器*/
printf("是否继续退票(Y/N):\n");
if(e=='Y'||e=='y')
{
Deleteticket();                        /*继续退票,调用退票函数本身*/
}
else
{
printf("按任意键返回主菜单!\n");
getchar();
getchar();
prints();
}
}

/*车票信息查询*/
void SearchMenu()
{
system("cls");                         /*清空屏幕*/
system("color 1f");                    /*屏幕颜色*/
char c;
system("mode con: cols=150 lines=170");/*屏幕显示的大小*/
printf("时间:");
times();                               /*调用时间*/
while(1)
{
printf("\n*******************************查询菜单*************************************\n");
printf("\n============================================================================\n");
printf("\n*****************************1.车次信息整体预览*****************************\n");
printf("\n              ***************2.按班次号查询*************                    \n");
printf("\n                      *******3.按起点站查询*******                          \n");
printf("\n              ***************4.按终点站查询*************                    \n");
printf("\n*****************************5.返回主菜单***********************************\n");
printf("\n============================================================================\n");
printf("请选择查询方式(1-5):");
scanf("%s",&c);
switch(c)
{
case'1':ShowMessage();break;
case'2':SearchByNumber();break;
case'3':SearchBystart();break;
case'4':SearchByend();break;
case'5':return;
}
}
}

/*菜单打印*/
void prints()
{
printf("时间:\n");
times();                                       /*调用时间*/
char c;
do
{
printf("   ┏━━━━━━━━━━━━━━━━━━━┓\n");
printf("   ┃            火车票订票系统            ┃\t\n");
printf("   ┃            1.班次信息录入            ┃\t\n");
printf("   ┃            2.车票信息查询菜单        ┃\t\n");
printf("   ┃            3.办理火车票订票          ┃\t\n");
printf("   ┃            4.办理火车票退票          ┃\t\n");
printf("   ┃            5.退出本系统              ┃\t\n");
printf("   ┗━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n请确保你选择的范围(1-5):");
scanf("%s",&c);
switch(c)
{
case'1':
{
//InsertMessaage();   /*班次信息录入*/

}break;
case'2':
{
Initman();
SearchMenu();       /*查询*/

}break;
case'3':
{
registers();
check();
Booking();          /*订票*/
getchar();
}break;
case'4':
{
Deleteticket();     /*退票*/
}break;
case'5':
{
printf("***********************************感谢你的使用!********************************\n");
}exit(0);              /*退出程序*/
default:break;
}
}while(1);
}

/*主函数*/
int main()
{
system("cls");
system("color 2f");                            /*窗口颜色*/
system("mode con: cols=100 lines=50");         /*窗口大小*/
printf("\n**********************************\n");
printf("\t2015年物联网课程设计\n");
printf("\t设计者:李宁\n");
printf("***********************************\n");
char pas[6];
printf("输入密码:\n");
scanf("%s",pas);
if(Check(pas))                                 /*密码验证*/
{
prints();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: