火车票订票系统
此为第一次课程设计,和大家分享,对我来说,是这开始也是结束:开始走上不归路,结束不属于自己的:
直接上代码:说明见注释:
/*火车订票系统*/ /*头文件*/ #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; }
版权声明:本文为melons原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。