实例介绍
3.退票
【实例截图】
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <iostream> #define MAXSIZE 5 /*定义航线数量,可修改*/ typedef struct wat_ros /*单链队列存储等候替补的客户信息*/ { char name[10]; /*姓名*/ int req_amt; /*订票量*/ struct wat_ros *next; }qnode, *qptr; typedef struct pqueue /*等候替补的客户名单*/ { qptr front; /*等候替补客户名单域的队头指针*/ qptr rear; /*等候替补客户名单域的队尾指针*/ }linkqueue; typedef struct ord_ros /*乘员名单*/ { char name[10]; /*客户姓名*/ int ord_amt; /*订票量*/ int grade; /*舱位等级*/ struct ord_ros *next; }linklist; struct airline { char ter_name[10]; /*抵达城市*/ char air_num[10]; /*航班号*/ char time[10]; /*飞机时间*/ char pri[7]; /*票价*/ int tkt_amt; /*乘员定额*/ int tkt_sur; /*余票量*/ linklist *order; /*乘员名单域,指向乘员名单链表的头指针*/ linkqueue wait; /*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/ }lineinfo; struct airline *start; void display(struct airline *info) /*打印每条航线的基本信息*/ { printf("%8s\t%3s\t%s\t\t%4s\t%3d\t%10d\n", info->ter_name, info->air_num, info->time, info->pri, info->tkt_amt, info->tkt_sur); } void list() /*打印全部航线信息*/ { struct airline *info; int i = 0; info = start; printf("终点站名\t航班号\t飞行时间\t票价\t乘员定额\t余票量\n"); while (i<MAXSIZE) { display(info); /*调用display函数来输出*/ info ; i ; } printf("\n\n"); } void search() /*根据客户提出的终点站名输出航线信息*/ { struct airline *info, *find(); char name[10]; /*要抵达的城市名称*/ int i = 0; info = start; printf("请输入要抵达城市的名称:"); scanf("%s", name); while (i<MAXSIZE) { if (!strcmp(name, info->ter_name)) /*有该站名strcmp则返回,if(!0)即break*/ { break; } info ; i ; } if (i >= MAXSIZE) /*没有匹配的航线*/ { printf("对不起,没有这条航线!\n"); } else { printf("终点站名\t航班号\t飞行时间\t票价\t乘员定额\t余票量\n"); display(info); /*调用display函数输出航线信息*/ } } struct airline *find() /*根据系统提出的航班号查询并以指针形式返回*/ { struct airline *info; char number[10]; /*查询的航班号*/ int i = 0; info = start; printf("请输入航班号:"); scanf("%s", number); while (i<MAXSIZE) { if (!strcmp(number, info->air_num)) /*有匹配航班*/ { return info; } info ; i ; } /*无匹配航班*/ printf("对不起,没有这条航线!\n"); return NULL; } void prtlink() /*打印订票乘员名单域的客户名单信息*/ { linklist *p; struct airline *info; info = find(); p = info->order; if (p != NULL) /*按顺序输出客户信息链表*/ { printf("客户姓名 订票数额 舱位等级\n"); while (p) { printf("%s\t\t%d\t%d\n", p->name, p->ord_amt, p->grade); p = p->next; } } else /*没有人订这个航班*/ printf("该航线没有客户信息!\n"); } linklist *insertlink(linklist *head, int amount, char name[], int grade) /*增加订票乘员名单域的客户信息*/ { linklist *p1, *new1; p1 = head; new1 = (linklist*)malloc(sizeof(linklist)); if (!new1) /*存储空间不足*/ { printf("\nOut of memory!!\n"); return NULL; } strcpy(new1->name, name); new1->ord_amt = amount; new1->grade = grade; new1->next = NULL; if (head == NULL) /*若原订票客户信息为空*/ { head = new1; new1->next = NULL; } else { head = new1; } new1->next = p1; return head; } linkqueue appendqueue(linkqueue q, char name[], int amount) /*增加排队等候的客户名单域*/ { qptr new1; new1 = (qptr)malloc(sizeof(qnode)); strcpy(new1->name, name); new1->req_amt = amount; new1->next = NULL; if (q.front == NULL) /*若原排队等候客户名单域为空*/ { q.front = new1; } else { q.rear->next = new1; } q.rear = new1; return q; } void order() /*办理订票业务*/ { struct airline *info; int amount, grade; /*订票数量,舱位等级*/ char name[10]; /*要订的航班号*/ info = start; if (!(info = find())) /*根据客户提供的航班号进行查询,如为空,退出该模块*/ { return; } printf("请输入您需要的票数:"); scanf("%d", &amount); if (amount>info->tkt_amt) /*若客户订票额超过乘员定票总额,退出*/ { printf("\n对不起,您输入票数已经超过乘员定额!"); return; } if (amount <= info->tkt_sur) /*若客户订票额末超过余票量,订票成功并等记信息*/ { int i; printf("请输入您的姓名:"); scanf("%s", name); printf("请输入您需要的舱位等级(1,2或3):"); scanf("%d", &grade); info->order = insertlink(info->order, amount, name, grade); /*在订票乘员名单域中添加客户信息*/ for (i = 0; i < amount; i ) /*依次输出该订票客户的座位号*/ { printf("%s的座位号是:%d\n", name, info->tkt_amt - info->tkt_sur i 1); } info->tkt_sur -= amount; /*该航线的余票量应减掉该客户的订票量*/ printf("\n祝您乘坐愉快!\n"); } else /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/ { char r; printf("\n没有这么多票了,您需要排队等候吗?(Y/N)"); r = getch(); printf("%c", r); if (r == 'Y' || r == 'y') { printf("\n请输入您的姓名:"); scanf("%s", name); info->wait = appendqueue(info->wait, name, amount); /*在排队等候乘员名单域中添加客户信息*/ printf("\n注册排队成功!\n"); } else { printf("\n欢迎您再次订购!\n"); } } } void return_tkt() /*退票模块*/ { struct airline *info; qnode *t, *back, *f, *r; int grade; linklist *p1, *p2, *head; char cusname[10]; if (!(info = find())) /*调用查询函数,根据客户提供的航线进行搜索*/ { return; } head = info->order; p1 = head; printf("请输入你的姓名:"); scanf("%s", cusname); while (p1 != NULL) /*根据客户提供的姓名到订票客户名单域进行查询*/ { if (!strcmp(cusname, p1->name)) { break; } p2 = p1; p1 = p1->next; } if (p1 == NULL) /*若未找到,退出本模块*/ { printf("对不起,您没有订过票!\n"); return; } else /*若信息查询成功,删除订票客户名单域中的信息*/ { if (p1 == head) { head = p1->next; } else { p2->next = p1->next; } info->tkt_sur = p1->ord_amt; grade = p1->grade; printf("%s退票成功!\n", p1->name); free(p1); } info->order = head; /*重新将航线名单域指向订票单链表的头指针*/ f = (info->wait).front; /*f指向排队等候名单队列的头结点*/ r = (info->wait).rear; /*r指向排队等候名单队列的尾结点*/ t = f; /*t为当前满足条件的排队候补名单域*/ while (t) { if (info->tkt_sur >= info->wait.front->req_amt) /*若满足条件者为头结点*/ { int i; info->wait.front = t->next; printf("%s订票成功!\n", t->name); for (i = 0; i<t->req_amt; i ) /*输出座位号*/ { printf("%s的座位号是:%d\n", t->name, (info->tkt_sur) - i); } info->tkt_sur -= t->req_amt; info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/ free(t); break; } back = t; t = t->next; if ((info->tkt_sur) >= (t->req_amt) && t != NULL)/*若满足条件者不为头结点*/ { int i; back->next = t->next; printf("%s订票成功!\n", t->name); for (i = 0; i<t->req_amt; i ) /*输出座位号*/ { printf("<%s>'s seat number is:%d\n", t->name, (info->tkt_sur) - i); } info->tkt_sur -= t->req_amt; info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/ free(t); break; } if (f == r) { break; } } } int menu_select() /*菜单界面*/ { int c; char s[20]; printf("\t订票系统\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("1.查看航线信息\n"); printf("2.查看已订票客户信息\n"); printf("3.查询航线\n"); printf("4.办理订票业务\n"); printf("5.办理退票业务\n"); printf("6.退出系统\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~\n"); do { printf("请选择(1-6):"); scanf("%s", s); c = atoi(s); } while (c<1 || c>6); return c; } int main() { struct airline air[MAXSIZE] = /*初始化航线信息*/ { { "beijing","1","1200","860",30,30 }, { "shanghai","2","1000","770",20,20 }, { "london","3","1330","960",10,10 }, { "harbin","4","1700","760",50,50 }, { "dalian","5","1400","550",40,40 } }; start = air; for (;;) /*无限循环(除非用户选择.退出)*/ { system("cls"); /*清空屏幕*/ switch (menu_select()) { case 1:list(); /*打印全部航线信息*/ break; case 2:prtlink(); /*浏览已订票客户信息*/ break; case 3:search(); /*查询航线*/ break; case 4:order(); /*订票*/ break; case 5:return_tkt(); /*退票*/ break; case 6:printf("\n感谢您的使用,再见!\n"); /*退出系统*/ exit(0); /*正常退出程序*/ } printf("\n任意键继续...\n"); getch(); /*任意键继续*/ return 0; } }
标签: 航空机票订票系统
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论