期末课程设计

来源:互联网 发布:take it or leave it 编辑:程序博客网 时间:2024/04/27 20:33
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<iostream>#define MAXSIZE 5/*定义航线数量,可修改*/typedef struct wat_ros /*单链队列存储等候替补的客户信息*/{a 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或):");       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("\                               航空订票系统                              \n");  printf("               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\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;} void main(){    struct airline air[MAXSIZE]=/*初始化航线信息*/    {       {"beijing","1","1200","860",30,30},       {"shanghai","2","1000","770",20,20},       {"linyi","3","1330","960",10,10},       {"guangzhou","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();/*任意键继续*/   }}

0 0