• 航空订票管理系统


      1 #include <stdio.h>
      2 #include<conio.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #define MAXSIZE 3 /*定义航线量的最大值*/
      6 
      7 typedef struct wat_ros
      8 {
      9     char name[10];/*姓名*/
     10     int req_amt;/*订票量*/
     11     struct wat_ros *next;
     12 }qnode, *qptr;
     13 
     14 typedef struct pqueue
     15 {
     16     qptr front;/*等候替补客户名单域的头指针*/
     17     qptr rear;/*等候替补客户名单域的属指针*/
     18 }linkqueue;
     19 
     20 typedef struct ord_ros
     21 {
     22     char name[10];/*客户姓名*/
     23     int ord_amt;/*订票量*/
     24     int grade;/*舱位等级*/
     25     struct ord_ros *next;
     26 }linklist;
     27 
     28 struct airline
     29 {
     30     char ter_name[10];/*终点站名 */
     31     char air_num[10];/*航班号*/
     32     char plane_num[10];/*飞机号*/
     33     char day[7];/*飞行周日(星期几)*/
     34     int tkt_amt;/*乘员定额*/
     35     int tkt_sur;/*余票量*/
     36     linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
     37     linkqueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
     38 }lineinfo;
     39 struct airline *start;
     40 
     41 void display(struct airline *info)
     42 /*打印每条航线的基本信息*/
     43 {
     44     printf("%8s	%3s	%s	%4s		%3d	%10d
    ", info->ter_name, info->air_num, info->plane_num, info->day, info->tkt_amt, info->tkt_sur);
     45 }
     46 
     47 void list()/*打印全部航线信息*/
     48 {
     49     struct airline *info;
     50     int i = 0;
     51     info = start;
     52     printf("终点站名	航班号	飞机号	飞行周日	乘员定额	余票量
    ");
     53     while (i<MAXSIZE){
     54         display(info);
     55         info++;
     56         i++;
     57     }
     58     printf("
    
    ");
     59 }
     60 
     61 
     62 void search()
     63 /*根据客户提出的终点站名输出航线信息*/
     64 {
     65     struct airline *info, *find();
     66     char name[10];
     67     int i = 0;
     68     info = start;
     69     printf("请输入终点站名:");
     70     scanf("%s", name);
     71     while (i<MAXSIZE) {
     72         if (!strcmp(name, info->ter_name)) break;
     73         info++;
     74         i++;
     75     }
     76     if (i >= MAXSIZE)
     77         printf("对不起,该航线未找到!
    ");
     78     else{
     79         printf("终点站名	航班号	飞机号	飞行周日	乘员定额	余票量
    ");
     80         display(info);
     81     }
     82 }
     83 
     84 struct airline *find()
     85     /*根据系统提出的航班号查询并以指针形式返回*/
     86 {
     87     struct airline *info;
     88     char number[10];
     89     int i = 0;
     90     info = start;
     91     printf("请输入航班号:");
     92     scanf("%s", number);
     93     while (i<MAXSIZE) {
     94         if (!strcmp(number, info->air_num)) return info;
     95         info++;
     96         i++;
     97     }
     98     printf("对不起,该航线末找到!
    ");
     99     return NULL;
    100 }
    101 
    102 void prtlink()
    103 /*打印订票乘员名单域的客户名单信息*/
    104 {
    105     linklist *p;
    106     struct airline *info;
    107     info = find();
    108     p = info->order;
    109     if (p != NULL){
    110         printf("客户姓名   订票数额   舱位等级
    ");
    111         while (p){
    112             printf("%s		%d	%d
    ", p->name, p->ord_amt, p->grade);
    113             p = p->next;
    114         }
    115     }
    116     else
    117         printf("该航线没有客户信息!!
    ");
    118 }
    119 
    120 linklist *insertlink(linklist *head, int amount, char name[], int grade)
    121 /*增加订票乘员名单域的客户信息*/
    122 {
    123     linklist*p1, *lnew;
    124     p1 = head;
    125     lnew = (linklist *)malloc(sizeof(linklist));
    126     if (!lnew) { printf("
    Out of memory!!
    "); return NULL; }
    127     strcpy(lnew->name, name);
    128     lnew->ord_amt = amount;
    129     lnew->grade = grade;
    130     lnew->next = NULL;
    131     if (head == NULL)/*若原无订票客户信息*/
    132     {
    133         head = lnew; lnew->next = NULL;
    134     }
    135     else
    136         head = lnew;
    137     lnew->next = p1;
    138     return head;
    139 }
    140 
    141 linkqueue appendqueue(linkqueue q, char name[], int amount)
    142 /*增加排队等候的客户名单域*/
    143 {
    144     qptr lnew;
    145     lnew = (qptr)malloc(sizeof(qnode));
    146     strcpy(lnew->name, name);
    147     lnew->req_amt = amount;
    148     lnew->next = NULL;
    149     if (q.front == NULL)/*若原排队等候客户名单域为空*/
    150         q.front = lnew;
    151     else
    152         q.rear->next = lnew;
    153     q.rear = lnew;
    154     return q;
    155 }
    156 
    157 void order()
    158 /*办理订票业务*/
    159 {
    160     struct airline *info;
    161     int amount, grade;
    162     char name[10];
    163     info = start;
    164     if (!(info = find())) return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
    165     printf("请输入你订票所需要的数量:");
    166     scanf("%d", &amount);
    167     if (amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
    168     {
    169         printf("
    对不起,您输入的票的数量已经超过乘员定额!");
    170         return;
    171     }
    172     if (amount <= info->tkt_sur)/*若客户订票额末超过余票量,订票成功并等记信息*/
    173     {
    174         int i;
    175         printf("请输入您的姓名(订票客户):");
    176         scanf("%s", name);
    177         printf("请输入%s票的舱位等级:", name);
    178         scanf("%d", &grade);
    179         info->order = insertlink(info->order, amount, name, grade);/*在订票乘员名单域中添加客户信息*/
    180         for (i = 0; i<amount; i++)/*依次输出该订票客户的座位号*/
    181             printf("%s的座位号是:%d
    ", name, info->tkt_amt - info->tkt_sur + i + 1);
    182         info->tkt_sur -= amount;/*该航线的余票量应减掉该客户的订票量*/
    183         printf("
    祝您乘坐愉快!
    ");
    184     }
    185     else       /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
    186     {
    187         char r;
    188         printf("
    已经没有更多的票,您需要排队等候吗?(Y/N)");
    189         r = getch();
    190         printf("%c", r);
    191         if (r == 'Y' || r == 'y')
    192         {
    193             printf("
    请输入您的姓名(排队订票客户):");
    194             scanf("%s", name);
    195             info->wait = appendqueue(info->wait, name, amount);/*在排队等候乘员名单域中添加客户信息*/
    196             printf("
    注册成功!
    ");
    197         }
    198         else printf("
    欢迎您下次再次订购!
    ");
    199     }
    200 }
    201 
    202 void return_tkt()
    203 /*退票模块*/
    204 {
    205     struct airline *info;
    206     qnode *t, *back, *f, *r;
    207     int grade;
    208     linklist *p1, *p2, *head;
    209     char cusname[10];
    210     if (!(info = find())) 
    211         return;/*调用查询函数,根据客户提供的航线进行搜索*/
    212     head = info->order;
    213     p1 = head;
    214     printf("请输入你的姓名(退票客户):");
    215     scanf("%s", cusname);
    216     while (p1 != NULL) 
    217     { /*根据客户提供的姓名到订票客户名单域进行查询*/
    218         if (!strcmp(cusname, p1->name))
    219             break;
    220         p2 = p1;
    221         p1 = p1->next;
    222     }
    223     if (p1 == NULL)
    224     { 
    225         printf("对不起,你没有订过票!
    "); 
    226         return; }/*若未找到,退出本模块*/
    227     else
    228     {/*若信息查询成功,删除订票客户名单域中的信息*/
    229         if (p1 == head) 
    230             head = p1->next;
    231         else 
    232             p2->next = p1->next;
    233         info->tkt_sur += p1->ord_amt;
    234         grade = p1->grade;
    235         printf("%s成功退票!
    ", p1->name);
    236         free(p1);
    237     }
    238     info->order = head;/*重新将航线名单域指向订票单链表的头指针 */
    239     f = (info->wait).front;/*f指向排队等候名单队列的头结点*/
    240     r = (info->wait).rear;/*r指向排队等候名单队列的尾结点*/
    241     t = f;/*t为当前满点条件的排队候补名单域*/
    242     while (t)
    243     {
    244         if (info->tkt_sur >= info->wait.front->req_amt)
    245         {/*若满足条件者为头结点*/
    246             int i;
    247             info->wait.front = t->next;
    248             printf("%s订票成功!
    ", t->name);
    249             for (i = 0; i<t->req_amt; i++)/*输出座位号*/
    250                 printf("%s的座位号是:%d
    ", t->name, (info->tkt_sur) - i);
    251             info->tkt_sur -= t->req_amt;
    252             info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/
    253             free(t);
    254             break;
    255         }
    256         back = t; 
    257         t = t->next;
    258         if ((info->tkt_sur) >= (t->req_amt) && t != NULL)/*若满足条件者不为头结点*/
    259         {
    260             int i;
    261             back->next = t->next;
    262             printf("%s订票成功!
    ", t->name);
    263             for (i = 0; i<t->req_amt; i++)/*输出座位号*/
    264                 printf("<%s>'s seat number is:%d
    ", t->name, (info->tkt_sur) - i);
    265             info->tkt_sur -= t->req_amt;
    266             info->order = insertlink(info->order, t->req_amt, t->name, grade);/*插入到订票客户名单链表中*/
    267             free(t); 
    268             break;
    269         }
    270         if (f == r)
    271             break;
    272     }
    273 }
    274 
    275 int menu_select()
    276 /*菜单界面*/
    277 {
    278     int c;
    279     char s[20];
    280     printf("
    		航空客运订票系统
    ");
    281     printf("******************************************
    ");
    282     printf("1.浏览航线信息:
    ");
    283     printf("2.浏览已订票客户信息:
    ");
    284     printf("3.查询航线
    ");
    285     printf("4.办理订票业务:
    ");
    286     printf("5.办理退票业务:
    ");
    287     printf("6.退出系统
    ");
    288     printf("*******************************************
    ");
    289     do{
    290         printf("请选择:");
    291         scanf("%s", s);
    292         c = atoi(s);/*参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,
    293         之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,*/
    294     } while (c<0 || c>7);
    295     return c;
    296 }
    297 
    298 main()
    299 {
    300     struct airline air[MAXSIZE] = { { "beijing", "1", "B8571", "SUN", 3, 3 },
    301     { "shanghai", "2", "S1002", "MON", 2, 2 },
    302     { "london", "3", "L1003", "FRI", 1, 1 } };/*初始化航线信息*/
    303     /*  clrscr();*/
    304     start = air;
    305     for (;;){
    306         switch (menu_select()){
    307         case 1:list(); break;
    308         case 2:prtlink(); break;
    309         case 3:search(); break;
    310         case 4:order(); break;
    311         case 5:return_tkt(); break;
    312         case 6:printf("
    欢迎使用本系统,再见!
    "); exit(0);
    313         }
    314         printf("
    Press any key to continue!
    ");
    315         getch();
    316     }
    317 }
  • 相关阅读:
    设计者模式详解--代理模式
    设计者模式详解--适配器模式
    设计者模式详解--原型模式
    设计者模式详解--建造者模式
    设计者模式详解--单例模式
    设计者模式详解--抽象工厂模式
    设计者模式详解--工厂方法模式
    angularjs 选项卡 --- 自定义属性
    AngularJS 自定义指令
    Jquery中的prop()方法 全选或全不选
  • 原文地址:https://www.cnblogs.com/yuanqi/p/3500577.html
Copyright © 2020-2023  润新知