火车票订票系统
此为第一次课程设计,和大家分享,对我来说,是这开始也是结束:开始走上不归路,结束不属于自己的:
直接上代码:说明见注释:
/*火车订票系统*/
/*头文件*/
#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;
}