(转)一个航班预定系统

  1  #include <stdio.h>
  2  #include <stdlib.h>
  3  #include <windows.h>
  4  #include <time.h>
  5  #include <string.h>
  6  #define M 4
  7  #define B 2
  8  #define S 2
  9  typedef char keytype;
 10 
 11 
 12  /*=================机票结构体=============*/
 13  typedef struct Ticket
 14  {
 15     char  m_number[8];         /*航班号*/
 16     char m_Start_Time[6];  /*航班起飞时间*/
 17     char m_End_Time[6];     /*航班抵达目的地时间*/
 18     char m_Start_City[8];  //航班起飞城市
 19     char m_End_City[8];    //航班抵达城市
 20     int  m_price;          //票价
 21     int  m_discount;       //折扣
 22     int  m_Is_Full;        //航班是否满仓
 23  }Ticket,*pTicket;
 24 /*======================================*/
 25 
 26 /*====================线性表结构结点=============*/
 27   typedef struct
 28   {
 29     keytype key[8];Ticket tic;
 30   }TABLE;
 31  /*==============================================*/
 32 
 33  /*====================索引表结构结点=============*/
 34  typedef struct
 35  {
 36    keytype key[8];int low,high;
 37 
 38  }INDEX;
 39  /*==============================================*/
 40 
 41  /*==============管理员信息===========*/
 42  typedef struct Admin
 43  {
 44 
 45    char user_name[8];        //管理员姓名
 46    char user_password[8];    //管理员密码
 47 
 48  }Admin,*pAdmin;
 49  /*======================================*/
 50 
 51 
 52 
 53  /*===============客户信息结构体===========*/
 54 
 55 typedef struct Client
 56  {
 57 
 58    int cl_num;               //客户编号
 59    char cl_name[8];          //客户姓名
 60    char cl_portnum[8];         //客户证件号
 61    int cl_count;               //订票数量
 62    Ticket cl_tic;             //航班情况
 63  }Client;
 64 
 65 
 66  /*=======全局变量定义区=================================*/
 67 int choice;     //选择操作全局变量
 68 int choice2;
 69 int choice3;
 70 Admin *m_admin;  //管理员信息结构模块声明
 71 Ticket *m_ticket;  //机票信息结构指针
 72 Client *m_client;  //客户信息结构体指针
 73 TABLE list[M];     //说明线性表变量
 74 INDEX inlist[B];    //索引表变量
 75 int kc,cj;
 76 char key[8];
 77 
 78 /*=========================函数申明=======================*/
 79 void Init_Admin();                          //初始化管理员信息
 80 void Init_Ticket();                        //初始化机票信息
 81 void Init_Client();                        //初始化客户信息
 82 int Ticket_input();                         //航班录入
 83 int Ticket_write_into_database();    //航班信息存盘,写入数据文件
 84 int  Login_Check();                        /*管理员登录验证模块*/
 85 int  Client_input();                      //客户资料填写
 86 int  Clinet_write_into_database();       // 客户资料和客户订票信息写入数据文件
 87 void Ticket_read_from_database();      //从文件读取航班信息
 88 void Ticket_show();                     //显示当前航班信息
 89 void Clinet_read_from_database();             //从文件读取客户信息
 90  void modify (char*key,int kc,int cj);
 91  void modify_input();
 92  /*=========================函数申明=======================*/
 93 
 94 
 95 
 96 /*--------------菜单模块区域-------------------------*/
 97 void MenuFirst();          /*一级菜单*/
 98 void MenuSecond1();         /*二级菜单1*/
 99 void MenuSecond2();          /*二级菜单2*/
100 void Select_MenuF();          /*一级菜单选择操作函数*/
101 void Select_MenuS();            /*二级菜单选择操作函数*/
102 void Select_MenuS2();            /*二级菜单选择操作函数2*/
103 /*--------------菜单模块区域-------------------------*/
104 
105 
106 
107 /*===================================全局变量定义区结束---*/
108 
109 
110 
111 
112  /*
113 一级菜单*/
114  void MenuFirst()
115  {
116     printf("\n\n\n\n                   ** powerd by:shenkai 2010.5. version:1.0.0.0 **\n");
117     printf("\n                    ---------------航班订票系统--------------------\n");
118     printf("                    ==                                           == \n");
119     printf("                    ==              1.管理员登录                 == \n");
120     printf("                    ==                                           == \n");
121     printf("                    ==              2.乘客登录                   == \n");
122     printf("                    ==                                           == \n");
123     printf("                    ==              3.退出系统                   == \n");
124     printf("                    ==                                           == \n");
125     printf("                    ------------------------------------------------\n");
126     printf("                请选择操作:          ");
127     scanf("%d",&choice);
128 
129     Select_MenuF();
130  }
131 /*
132  一号二级菜单*/
133  void MenuSecond1()
134  {
135     printf("\n\n\n\n                       ** powerd by:shenkai 2010.5. version:1.0.0.0 **\n");
136     printf("\n                        ---------------后台操作--------------------\n");
137     printf("                         ===                                           ===\n  ");
138     printf("                       ===                 1.航班录入                ===\n  ");
139     printf("                       ===                                           ===\n  ");
140     printf("                       ===                 2.修改航班信息            ===\n  ");
141     printf("                       ===                                           ===\n  ");
142     printf("                       ===                 3.返回主菜单              ===\n");
143     printf("                        -------------------------------------------------\n\n  ");
144     printf("                请选择操作:          ");
145     scanf("%d",&choice2);
146  }
147  /*
148 二号二级菜单*/
149  void MenuSecond2()
150  {
151    printf("\n\n\n\n                       ** powerd by:shenkai 2010.5. version:1.0.0.0 **\n");
152    printf("\n                        ---------------欢迎(%s)乘客的到来!----------------\n",m_client->cl_name);
153    printf("                         ===                                           ===\n  ");
154    printf("                       ===                 1.订票                    ===\n  ");
155    printf("                       ===                                           ===\n  ");
156    printf("                       ===                 2.退票                    ===\n  ");
157    printf("                       ===                                           ===\n  ");
158    printf("                       ===                 3.查看今日航班信息        ===\n  ");
159    printf("                       ===                                           ===\n  ");
160    printf("                       ===                 4.返回主菜单              ===\n");
161    printf("                       -------------------------------------------------\n\n ");
162    printf("                请选择操作:          ");
163    scanf("%d",&choice3);
164  }
165 /*
166 一级菜单选择操作函数*/
167 void Select_MenuF()
168  {
169     int i;
170     while(choice<4)
171     {
172         switch(choice)
173         {
174             case 1:{
175                  system("cls");//清屏
176                  Init_Admin();              //初始化管理员信息
177 
178                  i=Login_Check();
179                  //printf("%d",i);             //调式代码
180                  if(i==1)
181                  {
182                   printf("成功登录后台管理系统!将在3秒后进入系统,请等待......");
183                   Sleep(3000);                         //延时3秒
184                   system("cls");
185                  MenuSecond1();                          //进入2级菜单
186                   Select_MenuS();                        //2级菜单选择操作
187                  }
188                  else
189                  printf("用户名或者密码错误,请重新输入!");
190                  Sleep(2000);                      //延时2秒
191             }break;
192             case 2:{
193                  system("cls");               //清屏
194                   Client_input();           // 客户信息填写
195                   printf("欢迎您,%s先生(女士)!即将进入用户操作界面,请稍候...",m_client->cl_name);
196                   Sleep(4000);              //延时2秒
197                   system("cls");
198                  MenuSecond2();                 //客户2级菜单操作界面
199 
200                  Select_MenuS2();               //客户2级菜单操作函数
201             }break;
202             case 3:{
203             i=MessageBox(NULL,"确定要退出系统吗?","谢谢您的使用,再见!--by:沈凯",MB_YESNO);
204             if(i==IDYES)
205             {
206             exit(0);
207 
208             }
209             else
210             {
211             system("cls");
212               MenuFirst();
213             }
214             }break;
215         }
216 
217     }
218  }
219  void Select_MenuS()       /*二级菜单选择操作函数*/
220  {
221     int i;
222 
223     int ch1;
224     while(choice<4)
225     {
226         switch(choice2)
227         {
228             case 1:{
229                         i=Ticket_input();                     //进行航班录入操作
230                          if(i==0)
231                          {
232                             printf("信息录入失败,请重新录入!");
233                          }
234                          else
235                          {
236                          printf("成功录入信息!");
237                          Ticket_show();
238                          Sleep(4000);
239                          system("cls");
240                           MenuSecond1();      //成功录入后返回二级菜单继续操作
241                           Select_MenuS();
242                          }
243 
244             }break;
245             case 2:{
246                         system("cls");
247 
248                          modify_input();
249 
250 
251                           printf("按 1键返回上级菜单...\n");
252                          scanf("%d",&ch1);
253                          if(ch1==1)
254                       {
255                             system("cls");
256                              MenuSecond1();      //成功查询结束后返回二级菜单继续操作
257                             Select_MenuS();
258                       }
259 
260 
261 
262             }break;
263             case 3:{
264                system("cls");
265                 MenuFirst();
266             }break;
267         }
268     }
269  }
270 void Select_MenuS2()             /*二级菜单选择操作函数2*/
271 {
272     int i,k,now_ticket, now_ticket2;
273     char j[8],ch;
274    while(choice3<5)
275     {
276         switch(choice3)
277         {
278             case 1:{
279                     // m_client->cl_count+=1;  //订票, 本客户飞机票数量增加 1
280                      Ticket_read_from_database();     //从文件读取当前可选航班信息
281                      system("cls");
282                      printf("今日航班安排:\n");
283                      Ticket_show();                   //屏幕显示航班信息,供客户选择
284                      printf("请选择您需要订购的机票航班号: ");
285                      again: scanf("%s",j);
286                      for(i=0;i<M;i++)
287                       {
288                           if(strcmp(j,list[i].tic.m_number)==0)
289                              {
290                                 printf("请输入您需要订购的数量: ");
291                                 scanf("%d",&k);
292                                 now_ticket=list[i].tic.m_Is_Full;
293                                 now_ticket-=k;
294                                 while(now_ticket<0)
295                                 {
296 
297                                   printf("此航班票数不足,您最多可以订购此航班机票 %d 张",list[i].tic.m_Is_Full);
298                                    printf("请输入您需要订购的数量: ");
299                                   scanf("%d",&k);
300                                   now_ticket=list[i].tic.m_Is_Full;
301                                   now_ticket-=k;
302                                 }
303                                 list[i].tic.m_Is_Full=now_ticket;
304                                    Ticket_write_into_database();
305                                       m_client->cl_count+=k;   //客户本身订票数量
306                                     i=Clinet_write_into_database();   //把客户及其订票信息写入数据文件
307                             if(i==0)
308                               {
309                               printf("信息录入失败,请重新录入!");
310                               }
311                          else
312                          {
313 
314                                printf("订票成功!");
315                              Sleep(1500);
316                             system("cls");
317                             MenuSecond2();      //成功录入后返回二级菜单继续操作
318                             Select_MenuS2();        //递归调用自身
319                          }
320 
321 
322                              }
323 
324                       }
325                               if(i==M)
326                              {
327                                printf("不存在您所选择的航班号,请重新输入: ");
328                                goto again;
329                              }
330 
331             }break;
332             case 2:{
333                      // m_client->cl_count-=1;        //客户信息中的订票数量减1,退票
334                       Ticket_read_from_database();     //从文件读取当前可选航班信息
335                       Clinet_read_from_database();
336                       system("cls");
337                      printf("今日航班安排:/n");
338                      Ticket_show();                   //屏幕显示航班信息,供客户选择
339                        printf("请选择您需要退票的航班号: ");
340                        again2: scanf("%s",j);
341                      for(i=0;i<M;i++)
342                       {
343                           if(strcmp(j,list[i].tic.m_number)==0)
344                              {
345                                 printf("请输入您需要退票的数量: ");
346                                 scanf("%d",&k);
347                                   now_ticket2=m_client->cl_count;
348                                 now_ticket2-=k;
349                                 while(now_ticket2<0)
350                                 {
351                                 printf("您当前最多能退%d张票",m_client->cl_count);
352                                    printf("请输入您需要退票的数量: ");
353                                 scanf("%d",&k);
354                                   now_ticket2=m_client->cl_count;
355                                 now_ticket2-=k;
356 
357                                 }
358                                 now_ticket=list[i].tic.m_Is_Full;
359                                 now_ticket+=k;
360                                  list[i].tic.m_Is_Full=now_ticket;
361                                    Ticket_write_into_database();
362                                      m_client->cl_count-=k;   //客户本身订票数量
363 
364 
365                                     i=Clinet_write_into_database();   //把客户及其订票信息写入数据文件
366                             if(i==0)
367                               {
368                               printf("信息录入失败,请重新录入!");
369                               }
370                          else
371                          {
372 
373                                printf("退票成功!");
374                              Sleep(1500);
375                             system("cls");
376                             MenuSecond2();      //成功录入后返回二级菜单继续操作
377                             Select_MenuS2();        //递归调用自身
378                          }
379                              }
380 
381                       }
382                               if(i==M)
383                              {
384                                printf("不存在您所选择的航班号,请重新输入: ");
385                                goto again2;
386                              }
387 
388             }break;
389             case 3:{
390                       Ticket_read_from_database();     //从文件读取当前可选航班信息
391                      system("cls");
392                      printf("今日航班:\n");
393                      Ticket_show();
394 
395                printf("\n请按b键返回上级菜单");
396                       ch=getchar();
397 
398                          if(ch=='b')
399                       {
400                             system("cls");
401                        MenuSecond2();      //成功查询结束后返回二级菜单继续操作
402                             Select_MenuS2();
403                       }
404             }break;
405             case 4:{
406                system("cls");
407                 MenuFirst();
408 
409             }break;
410         }
411     }
412 
413 }
414 
415   /*--------初始化管理员信息-------------*/
416  void Init_Admin()
417 {
418    m_admin=(pAdmin)malloc(sizeof(Admin));
419    strcpy(m_admin->user_name,"sk");
420    strcpy(m_admin->user_password,"123456");
421 
422 }
423 /*----------------------------------------*/
424 
425 /*--------初始化客户信息-------------*/
426  void Init_Client()
427  {
428    m_client=(Client*)malloc(sizeof(Client));
429 
430  }
431 /*----------------------------------------*/
432 void Init_Ticket()   //初始化机票信息
433 {
434   m_ticket=(pTicket)malloc(sizeof(Ticket));
435 }
436 
437  /*----------------------------------------*/
438    //客户资料填写
439  int  Client_input()
440  {
441        int i;
442        char ch;
443        i=1;
444        Init_Client();               //初始化客户信息的结构体指针
445        m_client->cl_num=i;            //初始化客户编号
446        m_client->cl_count=0;          //初始化时,订票数量为0张
447        printf("您的名字: ");
448        scanf("%s",m_client->cl_name);
449        printf("/n");
450 
451           printf("请选择您的证件类型: \n");
452           printf("a:身份证          b:学生证 \n");
453           ch=getchar();
454           ch=getchar();
455           if(ch=='a')
456           printf("请输入您的身份证号: ");
457           if(ch=='b')
458           printf("请输入您的学生证号: ");
459 
460        scanf("%s",m_client->cl_portnum);
461        printf("\n");
462        return 1;
463 
464  }
465 
466  /*----------------------------------------*/
467 int Ticket_input()   //航班录入
468 {
469  int i,j;
470  Init_Ticket();   //初始化机票
471  for(i=0;i<M;i++)
472  {
473   printf(" 航班号: ");
474   scanf("%s",list[i].tic.m_number);
475 
476   printf("\n");
477   printf("航班起飞时间: ");
478   scanf("%s",list[i].tic.m_Start_Time);
479   printf("\n");
480    printf("航班抵达目的地时间: ");
481   scanf("%s",list[i].tic.m_End_Time);
482   printf("\n");
483    printf("航班起飞城市: ");
484   scanf("%s",list[i].tic.m_Start_City);
485   printf("\n");
486    printf("航班抵达城市: ");
487   scanf("%s",list[i].tic.m_End_City);
488   printf("\n");
489   printf("票价: ");
490   scanf("%d",&list[i].tic.m_price);
491   printf("\n");
492   printf("折扣: ");
493   scanf("%d",&list[i].tic.m_discount);
494   printf("\n");
495   printf("航班座位数量: ");
496   scanf("%d",&list[i].tic.m_Is_Full);
497   printf("\n");
498  }
499   /*=========================写入数据文件=============*/
500    j=Ticket_write_into_database();
501    if(j)
502    {
503    return 1;
504    }
505    else
506    return 0;
507  /*=======================================================*/
508 }
509 
510 int Ticket_write_into_database()
511 {
512     FILE *p; int i,d;
513     char max[8];
514     if((p=fopen("D://hbxx.txt","w"))==NULL)
515     {
516       printf("文件打开失败!请重新启动系统!");
517     return 0;
518     }
519 
520     for(i=0;i<M;i++)
521     {
522         fprintf(p,"%s",list[i].tic.m_number);
523         fprintf(p," ");
524         fprintf(p,"%s",list[i].tic.m_Start_Time);
525         fprintf(p," ");
526         fprintf(p,"%s",list[i].tic.m_End_Time);
527         fprintf(p," ");
528         fprintf(p,"%s",list[i].tic.m_Start_City);
529         fprintf(p," ");
530         fprintf(p,"%s",list[i].tic.m_End_City);
531         fprintf(p," ");
532         fprintf(p,"%d",list[i].tic.m_price);
533         fprintf(p," ");
534         fprintf(p,"%d",list[i].tic.m_discount);
535         fprintf(p," ");
536         fprintf(p,"%d",list[i].tic.m_Is_Full);
537         fprintf(p,"\n");
538     }
539 
540    fclose(p);                       //关闭文件
541 
542    return 1;
543 
544 }
545 //从文件读取航班信息到结构体
546 void Ticket_read_from_database()
547 {
548       FILE *p; int i,d;
549       char max[8];
550     if((p=fopen("D://hbxx.txt","r"))==NULL)
551     {
552       printf("文件打开失败!请重新启动系统!");
553     return ;
554     }
555      for(i=0;i<M;i++)
556     {
557         fscanf(p,"%s",list[i].tic.m_number);
558         fscanf(p,"%s",list[i].tic.m_Start_Time);
559         fscanf(p,"%s",list[i].tic.m_End_Time);
560         fscanf(p,"%s",list[i].tic.m_Start_City);
561         fscanf(p,"%s",list[i].tic.m_End_City);
562         fscanf(p,"%d",&list[i].tic.m_price);
563         fscanf(p,"%d",&list[i].tic.m_discount);
564         fscanf(p,"%d",&list[i].tic.m_Is_Full);
565    strcpy(list[i].key,list[i].tic.m_number);  //将第i个航班的航班号设为关键字
566     }
567          for(i=0;i<B;i++)                    // 构造索引表inlist,B是线性表的块数
568 {
569     inlist[i].low=i+(i*(S-1));      // 每块内结点数为S
570     inlist[i].high=i+(i+1)*(S-1);
571   }
572      strcpy(max,list[0].tic.m_number);//将第0个航班的航班号复制到数组max中
573           d=0;
574 for(i=1;i<M;i++)
575 {
576     if(strcmp(max,list[i].tic.m_number)<0) //串max小于串list[i].tic.m_number
577       strcpy(max,list[i].tic.m_number); //将大的串放到max中,这是在线性表的一块中找
578     if((i+1)%2 == 0 )
579 {
580       strcpy(inlist[d].key,max); d++;//将索引表中第d个元素的inlist[d].key
581       if(i<M-1)                          //设为线性表中第d个块的航班号的最大值
582 strcpy(max,list[i+1].tic.m_number);//将线性表中的下一块的第一个航班的航班号
583 i++;                               //复制到max中,去求该块中的最大航班号
584 }
585     }
586       fclose(p);                       //关闭文件
587 }
588 void Ticket_show()                   //屏幕显示航班信息
589 {
590     int i;
591     for(i=0;i<M;i++)
592     {
593      printf("航班号: %s",list[i].tic.m_number);
594      printf("\n");
595      printf("起飞时间: %s",list[i].tic.m_Start_Time);
596      printf("\n");
597      printf("到达时间: %s",list[i].tic.m_End_Time);
598      printf("\n");
599      printf("起飞城市: %s",list[i].tic.m_Start_City);
600      printf("\n");
601      printf("到达城市: %s",list[i].tic.m_End_City);
602      printf("\n");
603      printf("价格: %d",list[i].tic.m_price);
604      printf("\n");
605      printf("折扣: %d",list[i].tic.m_discount);
606      printf("\n");
607      printf("剩余票数: %d",list[i].tic.m_Is_Full);
608      printf("\n");
609     }
610 }
611 
612 // 客户资料和客户订票信息写入数据文件
613 int  Clinet_write_into_database()
614 {
615     FILE *p; int i;
616     if((p=fopen("D://client-info.txt","w"))==NULL)
617     {
618       printf("文件打开失败!请重新启动系统!");
619     return 0;
620     }
621    fprintf(p,"%d",m_client->cl_num);
622    fprintf(p," ");
623    fprintf(p,"%d",m_client->cl_count);
624    fprintf(p," ");
625    fprintf(p,"%s",m_client->cl_name);
626    fprintf(p," ");
627    fprintf(p,"%s",m_client->cl_portnum);
628    fclose(p);                                   //关闭文件
629    return 1;
630 
631 }
632  void Clinet_read_from_database()             //从文件读取客户信息
633 {
634     FILE *p; int i;
635     if((p=fopen("D://client-info.txt","r"))==NULL)
636     {
637       printf("文件打开失败!请重新启动系统!");
638     return ;
639     }
640         fscanf(p,"%d",&m_client->cl_num);
641         fscanf(p,"%d",&m_client->cl_count);
642         fscanf(p,"%s",m_client->cl_name);
643         fscanf(p,"%s",m_client->cl_portnum);
644 
645 }
646  /*
647 管理员登录验证模块*/
648  int Login_Check()
649  {
650     char m_name[8];
651     char m_pass[8];
652     /*
653     int result;
654     int result2;*/
655     printf("\n\n\n\n                   ** powerd by:shenkai 2010.5. version:1.0.0.0 **\n");
656     printf("\n                    ---------------航班订票系统--------------------\n\n\n");
657     printf("                                     用户名: ");
658     scanf("%s",m_name);
659     printf("\n");
660     printf("                                      密码: ");
661     scanf("%s",m_pass);
662      printf("\n");
663      printf("\n");
664      if(strcmp(m_name,m_admin->user_name)==0)
665      {
666        if(strcmp(m_pass,m_admin->user_password)==0)
667      return 1;
668      else
669      return 0;
670      }
671      else
672       return 0;
673 
674 
675  }
676  void modify (char* key,int kc,int cj)//kc是旧数据cj是航班号key是要找的具体信息
677 {
678    int low1=0,high1=B-1,mid1,i,j;
679    int flag=0;
680    while(low1<=high1 && !flag)
681    {
682       mid1=(low1+high1)/2;       //在索引表中求中间块位置
683       if (strcmp(inlist[mid1].key,key)==0)//中间块的关键字值与要找的键值相比较
684           flag=1;                              //找到了
685       else if(strcmp(inlist[mid1].key,key)>0) //到前边的块内查找
686           high1=mid1-1;
687       else   low1=mid1+1;     //到后边的块内查找
688    }
689   if (low1<B)//以下是在所找到的块内查找
690   {
691     i=inlist[low1].low;
692     j=inlist[low1].high;
693   }
694   while(i<j && strcmp(list[i].key,key))
695      i++;//在块内找学号相符的学生,可能找到,也可能找不到
696 
697   if(strcmp(list[i].key,key)==0)//找到了,根据所给的学号去修改相应的成绩
698    { if(kc==1)
699       list[i].tic.m_price=cj;
700     else if(kc==2)
701        list[i].tic.m_discount=cj;
702          else if(kc==3)
703              list[i].tic.m_Is_Full=cj;
704    }
705    else
706    printf("您所查询的航班不存在,请重新输入:");
707 
708 }
709 void modify_input()
710 {
711 
712   printf("请输入欲修改航班的航班号:\n");
713                      scanf("%s",key);
714 
715 
716 printf("选择欲修改航班的相关信息:票价(1)折扣(2)座位数量(3): ");
717                      scanf("%d",&kc);
718 
719 
720          printf("输入该选项的新信息: ");
721                      scanf("%d",&cj);
722                      Ticket_read_from_database();
723                      modify(key,kc,cj);
724                       Ticket_write_into_database();
725                      //system("cls");
726                      printf("更新信息成功\n");
727                      //Ticket_show();
728 
729 }
730  int main()
731  {
732     system("mode con cols=95  &color 6f");
733     MenuFirst();
734     return 0;
735 
736  }

 

posted @ 2013-04-05 19:34  天晴会下雨  阅读(322)  评论(0)    收藏  举报