课程设计~民航管理系统

来源:互联网 发布:avmo 最新域名 编辑:程序博客网 时间:2024/05/01 11:53


#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>

/*宏定义*/
#define OK 1
#define ERROR 0
#define Max   7
 
/*全局变量*/
char *air_num[3]={"CA1588","FM9258","OZ3085"};//航班号
char password[Max];
  
//飞机航线信息,包括飞机航班号,此航线飞机总装载量等
typedef struct airline
{
        char air_num[8];//航班号
        char plane_num[8];//飞机型号
        char end_place[20];//达到地点
        int  total;//飞机总载量
        int  seat_number[130];
        int  left;//剩余座位
        struct airline *next;//指向下一结点
      
}airline;

//乘客的信息,包括姓名,所乘飞机航班号,以及座位号等
typedef struct customer
{
        char name[16];
        char password[6];
        char air_num[15];
        int  seat_num;
        struct customer *next;//指向下一结点
       
}customer;


//实现首架飞机基本信息的插入
airline *start_air()
{
        airline *air;
     
        //分配动态内存
      if(air=(airline*)malloc(sizeof(airline)))
      {  
    
          if(air==NULL)  //插入第一架飞机时
        
               air->next=NULL;
           
       } 
       
        else //分配内存失败
        
           printf("Memory's allotment is error");
           
        return air;
}

//实现首位乘客基本信息的插入
customer *start_customer()
{
        customer *cus;
       
         if(cus=(customer*)malloc(sizeof(customer)))//分配动态内存
         {
            if(cus==NULL)  //插入第一个乘客
        
             cus->next=NULL;
            
         }
        
         else //分配内存失败
        
           printf("Memory's allotment is error");
   
      return cus;
}

//实现乘客退票时,该飞机剩余座位数加1
airline *modefy_airline(airline *line,char *air_num,int seat_num)
{
     airline *p;
     p=line->next;
     
      for(;p!=NULL;p=p->next)//当还被没全部删除完毕时
      { 
         if(strcmp(p->air_num,air_num)==0)
             {
                 //如果删除乘客有效
                if(strcmp(air_num,p->air_num)==0)//字符串的比较
                {
                    p->seat_number[seat_num]=0;
                    p->left++;//则飞机剩余座位数加1
                   
                    return line;
                }
              
                //else printf("/nNO the airline!/n");
              
                return 0;
             }
        }
       
}


//对飞机所形成链表节点的添加

int insert_air(airline **p,char *air_num,char *plane_num,char *end_place,int *seat_number,int total,int left)
{
      
        airline *q;
        q=(airline*)malloc(sizeof(airline));//开辟内存
      
        strcpy(q->air_num,air_num);
        strcpy(q->plane_num,plane_num);
        strcpy(q->end_place,end_place);//复制飞机航班号,飞机型号 ,飞往地点
       
        strcpy(q->seat_number,seat_number);
 
       
        q->total=total;
        q->left=left;
        q->next=NULL;
       
        (*p)->next=q;   
         (*p)=(*p)->next;//添加节点数
       
        return OK;
}
       
//对乘客所形成链表节点的添加
       
int  insert_cus(customer **p,char *name,char *password,char *air_num,int seat_num)
{
        customer *q;
       
        q=(customer*)malloc(sizeof(customer));//开辟内存
      
        strcpy(q->name,name);
       
        strcpy(q->password,password);//储存密码
     
        strcpy(q->air_num,air_num);//复制乘客的名字以及所乘飞机航班号
     
        q->seat_num=seat_num;
       
        q->next=NULL;
       
        (*p)->next=q;
       
         (*p)=(*p)->next;
      
        return OK;
       
}

//实现乘客订票功能

int book(airline *a,char *air_num,customer *cus,char *name,char *password)
{
        airline *p=a;
       
        customer *q=cus->next;
      
        p=a->next;
       
        int i;//循环标志
      
       //循环实现指向飞机的指针指向链表末尾
        for(;q->next!=NULL;q=q->next)
        {
                                    
        }
       
 
       for(;p!=NULL;p=p->next)
        {
           if(strcmp(p->air_num,air_num)==0)
             {
                if(p->left>0)
                { 
                    i=1;
                  
                    while(p->seat_number[i]==i)
                          i++;
                        
                        
                           printf("/nYour seat number is %d/n",i);
                          
                          
                           p->seat_number[i]=i;
                         
                           //printf("/nYour seat number is %d/n",(p->total-p->left+1));
                   
                     
                         insert_cus(&q,name,password,air_num,i);
                        
                        
                         //insert_cus(&q,name,password,air_num,p->total-p->left+1);
                        //p->total-p->left+1  表示对当前座位数的计算公式
                       
                        p->left--;//订票成功,剩余空座数减1
                       
                        return OK;
                }
               
                else
                {
                        printf("Sorry! Seat is full/n");
                      
                        return 0;//正常退出,不用ERROR
                }
            }
        }
       
}

//实现乘客退票功能
int delete_customer(customer *cus,airline *line,char *name,char *password)
{      
        int seat_num;
       
        customer *p,*pr;
       
        airline *q;//飞机结点
       
        char air_num[8];
       
        pr=cus;
       
        p=pr->next;
       
     
        //航班当中至少还有一名乘客待删除
       
       
        while(p!=NULL)
        {
               if(strcmp(p->name,name)==0&&strcmp(p->password,password)==0)
               //如果真有乘客已经退票,并且输入密码正确
               {
                
                        strcpy(air_num,p->air_num);
                       
                        seat_num=p->seat_num;
                       
                        /*正确删除时,调用此函数,实现剩余座位数加1*/
                        line=modefy_airline(line,air_num,seat_num);
                       
                      
                        pr->next=p->next;
                       
                        p=pr->next;      //删除节点P内容
                      
                      
                        printf("/nFinish Deleting!/n");
                       
                        return OK;
                  

                }
              
             
                pr=pr->next;
               
                p=pr->next;//删除节点P内容
               
        }
      
        printf("/nSorry! User name or password is wrong!/n");
      
        return ERROR;//异常退出0
}

//实现查询飞机基本信息情况
int search_air(airline *head)//实参传入形参链表的头节点
{
        airline *p=head->next;//p指向第一个节点
       
        printf("/n********** ^   Airline  Information  ^  ************/n");
       
        printf("Air_num   Plane_num  End_place      Total       Left/n");
     
      /*格式化打印每个飞机节点的结构体里面的属性*/
        for(;p!=NULL;p=p->next)
        {
           
             printf("%s    %-10s %-8s       %-12d%-10d/n",p->air_num,p->plane_num,p->end_place
           
            ,p->total,p->left);
           
        }
       
        printf("****************************************************/n");
       
        free(p);
       
        return OK;//正常退出 
       
}

//实现查询乘客购票情况
int search_customer(customer *head)//实参传入形参链表的头节点
{
        customer *q=head->next->next;//p指向第一个节点
     
        printf("/n********** ^  Customer  Information  ^  ************/n");
        printf("Name            Air_num      Seat_num/n");
      
        for(;q!=NULL;q=q->next)
        {
            printf("%-14s  %-12s  %-d/n",q->name,q->air_num,q->seat_num);
        }
       
        printf("****************************************************/n/n");
        return OK;//正常退出
       
 }

//创建初始化时飞机航班的基本信息
int creat_air(airline **line)
{
        airline *p=*line;
        int i=0;
  
        char *plane_num[3]={"B733","CRJ","A319"};//机型
        char *end_place[3]={"Beijing","Shanghai","Harbin"};
       
        int *seat_number[3]={"0","0","0"};
        
        //Shanghai means Shanghai Pudong International Airport
       
        int total[3]={128,86,124};
        int left[3]={128,86,124};
      
       /* 实现链表的添加节点 */
        for(i=0;i<3;i++)//实现链表的添加节点
           insert_air(&p,air_num[i],plane_num[i],end_place[i],seat_number[i],total[i],left[i]);
      
        return OK;
       
}

//创建初始化时所载乘客的基本信息
int creat_customer(customer **cus)
{
        customer *p=*cus;
       
        int i=0;
   
        char *name="Xunian";
       
        char password2[3]="abc";
        //我们需要建立一个链表头节点
   
    
        int seat_num[1]={0};
       
       // int sp;
  
       
           insert_cus(&p,name,password,air_num[i],seat_num[i]);
      
 
 
       return OK;
      
}

/*设置用户密码*/
int set_password()
{
   char ch;
  
   int j=0;
 
 
   printf("Now we will check your password/n");                   
 
   while((ch=getch())!=13) //将输入的密码转换成字符***
   
     {
     
      if(ch!='/b')
       putchar('*'); //打印密码显示为*
     
       password[j]=ch;

       j++;//记录密码长度
                  
     }
 
 
 
 

     if(j<=6 && j>0) return 0;
    
     else {
             printf("/nSorry,Password is error(length<=6)!/n");
            
             return -1;
           }
                    
}


//服务菜单打印

void printmenu(void)
{
     /*打印用户界面*/
               
                
          printf("/n****************************************/n");
          printf("*      Welcome to Weihai air System!   */n");
          printf("*                                      */n");
          printf("*         Book   ---------1            */n");
          printf("*         Delete ---------2            */n");
          printf("*         Search ---------3            */n");
          printf("*         Exit   ---------4            */n");
          printf("*                                      */n");
          printf("****************************************/n");
 
    
}

/*打印课程设计基本信息*/
void ourprint(void)
{
 
        ////////// ///////////////
       
    //    printf("***   Datastruction Designing   ***");
      
        printf("/**********************************/n");
        printf("***   DataStruction Designing   ***/n");
        printf("***********************************/n");

    
}
/*
     下面是航空订票服务程序 main()
*/


/*主函数*/
int main()
{
        int sign=1;//设置一个退出循环的标志
       

        int sign2;//内层循环退出的一个标志 
       
        int name_length; //乘客姓名的长度

        char name[16],air_num[8],ch;
       
        char num;
       
             /* 初始化过程 */
       
        /*分别开辟两个链表的头节点*/
       
        /*一个是关于飞机航班的链表,一个是关于乘客的链表*/
        customer *cus=start_customer();
       
        airline  *air=start_air();
       
        /*两个链表分别添加节点数*/
        creat_air(&air);
       
        creat_customer(&cus);
      
        while(sign==1)
        {
                 sign2=1;//循环开始标志
                
                /*打印菜单*/     
                printmenu();
               
                printf("Please input your choice/n");
      
              
                ch=getch();//等待输入
           
               /*结构化的选择*/

     
               /*第一个功能实现订票book*/

                if(ch=='1')
                {
                         printf("Which airline will you travel by? /n");
                        
                         printf("1: CA1588   2: FM9258   3: OZ3085/n");
                        
                         num=getch();      
                       
                               
              
                         if(num=='1')    
                             { 
                                       strcpy(air_num,"CA1588");
                                      
                                       sign2=0;
                             }
                         
                         else
                             if(num=='2')   
                              {
                                        strcpy(air_num,"FM9258");
                                       
                                        sign2=0;
                              }
                        
                         else
                            if(num=='3') 
                              { 
                                         strcpy(air_num,"OZ3085");
                                        
                                         sign2=0;
                              }
                         
                            
                         if(sign2==0)  
                         {  
                            
                              printf("Please input a customer name:");
                            
                              scanf("%s",name);
                            
                            
                            /*计算输入的乘客名字长度*/
                           
                            name_length = strlen(name); // 总长度/单个元素的长度
                             
                            if(name_length<16)
                            {
                      
                           
                              if(!set_password())//密码设置
                                    
                             {
                                     /*调用乘客订票函数*/
                                     book(air,air_num,cus,name,password);
                            
                                     printf("Finish!/n");
                           
                             }//end if(!set_password())
                            
                             
                           }  //end  if(name_length<16)
                                  /*名字过长时,打印出错误*/
                             else  
                            
                               printf("Error,Name is too long/n");
                       
                        }
                       
                         else
                           printf("Error!Please input agian~");
                          
                          
                }
             
                else
                  
                   /*第二个功能实现退票delete*/

                     if(ch=='2')
                     {
                               
                        printf("Please input your name:");
                        scanf("%s",name);
                       
                      //   printf("Now we will cheek your password./n");
                       
                             if(!set_password())//核对密码
                      
                       /*删除链表中的一个节点*/
                             delete_customer(cus,air,name,password);
                       
                                                 
                                    
               
                   }
                    
                      else
                     
                        /*第三个功能实现查询*/

                          if(ch=='3')
                          //查询飞机航班与已够买机票的乘客信息二者信息
                          {
                                search_air(air);
                               
                                search_customer(cus);
                               
                          }
                        
                          else
                         
                           /*最后选择退出*/

                              if(ch=='4')
                              {
                               
                                    sign=0;//外层循环退出标志
                               
                              }
                             
                               else
                              
                                /*错误输入时,打印提示信息*/
                              
                                printf("Sorry! The number is wrong,please input again (1-4)!/n");
         
        }
       
       
        getch();
       
        system("pause");
        
        
        return 0;  //返回操作系统
       
}