飛機訂票系統


  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <conio.h>
  5 typedef struct flightnode{
  6     char flight_num[10]; //航班號
  7     char start_time[10]; //起飛時間
  8     char end_time[10];   //抵達時間
  9     char start_place[20];//起飛城市
 10     char end_place[20];  //抵達城市
 11     int left;            //空座數
 12     float price;         //票價
 13     int isFull;          //航班是否滿倉
 14     struct flightnode *next;//指向下一個結點
 15 }flightnode;//航班結點
 16 typedef struct passengernode{
 17     char name[20];      //姓名
 18     char ID_num[20];    //證件號
 19     char flight_num[10];//航班號
 20     int order_num;      //訂單號
 21     int ticket_num;     //訂票數量
 22     struct passengernode *next;//指向下一個結點
 23 }passengernode;//客戶結點
 24 typedef struct passengerList
 25 {
 26     passengernode *head;
 27     passengernode *rear;
 28 }passengerList;
 29 void init_flight(flightnode *&h)//目的是要建立一個以h為頭結點的空鏈表,錄入航班信息和增加航班后將航班結點插入該鏈表
 30 {
 31     h=(flightnode *)malloc(sizeof(flightnode));//申請頭結點的空間
 32     if(h==NULL) exit(0);
 33     h->next=NULL;//將頭結點h的指針域置為空
 34 }
 35 void init_passengerList(passengerList *&pList)
 36 {
 37     pList=(passengerList *)malloc(sizeof(passengerList));
 38     pList->head=(passengernode *)malloc(sizeof(passengernode));//創建頭結點
 39     pList->rear=pList->head;
 40     pList->rear->order_num=0;//訂單號從0開始計數
 41     pList->head->next=NULL;
 42 }
 43 void save_passenger(passengerList *PList)
 44 {
 45     FILE* fp = fopen("passenger.dat","wb");
 46     if(fp==NULL)
 47         return;
 48     passengernode *temp=PList->head->next;
 49     while(temp!=NULL)
 50     {
 51         fwrite(temp,sizeof(passengernode),1,fp);
 52         temp = temp->next;
 53     };
 54     fclose(fp);
 55 }
 56 void load_passenger(passengerList *PList)
 57 {
 58     FILE* fp = fopen("passenger.dat","rb");
 59     if(fp==NULL)
 60         return;
 61     passengernode *q;
 62     int n;
 63     while(!feof(fp))
 64     {
 65         q=(passengernode *)malloc(sizeof(passengernode));
 66         n =fread(q,sizeof(passengernode),1,fp);
 67         if(n!=1)
 68             break;
 69         PList->rear->next=q;
 70         PList->rear=q;
 71     }
 72     PList->rear->next=NULL;
 73     fclose(fp);
 74 }
 75 void save_flight(flightnode *h)
 76 {
 77     FILE* fp = fopen("flightList.dat","wb");
 78     if(fp==NULL)
 79         return;
 80     flightnode *temp=h->next;
 81     while(temp!=NULL)
 82     {
 83         fwrite(temp,sizeof(flightnode),1,fp);
 84         temp = temp->next;
 85     };
 86     fclose(fp);
 87 }
 88 void load_flight(flightnode *&h)
 89 {
 90     flightnode *pt=h;
 91     FILE* fp = fopen("flightList.dat","rb");
 92     if(fp==NULL)
 93         return;
 94     flightnode *q;
 95     int n;
 96     while(!feof(fp))
 97     {
 98         q=(flightnode *)malloc(sizeof(flightnode));
 99         n=fread(q,sizeof(flightnode),1,fp);
100         if(n!=1)
101             break;
102         pt->next=q;
103         pt=q;
104     }
105     pt->next=NULL;
106     fclose(fp);
107 }
108 
109 int find_same_flight(flightnode *h,char *flight_num)
110 {
111     flightnode *t=h->next,*p=h->next;
112     int mark=0;
113     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數");
114     while(t!=NULL && strcmp(t->flight_num,flight_num)!=0) t=t->next;
115     while(p!=NULL){
116         if((strcmp(t->start_place,p->start_place)==0)&&(strcmp(t->end_place,p->end_place)== 0)&&(strcmp(t->flight_num,p->flight_num)!=0))
117         {
118             printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left);
119             mark=1;
120         }
121         p=p->next;
122     }
123     if(mark==0)
124     {
125         printf("\t\t抱歉,沒有可選的航班!\n");
126         return 0;
127     }
128     return 1;
129 }
130 
131 void insert_flight(flightnode *&h,char* flight_num,char* start_place,char* end_place,char* start_time,char* end_time,int left,float price,float price_discount,int isFull)
132 //在錄入航班情況或增加新的航班后,將新的航班結點插入到航線鏈表中
133 {
134     flightnode *q;//定義q為新增加的航班結點的指針的形參
135     flightnode *p=h;
136     q=(flightnode *)malloc(sizeof(flightnode));//為q結點申請空間
137     strcpy(q->flight_num,flight_num);
138     strcpy(q->start_place,start_place);
139     strcpy(q->end_place,end_place);
140     strcpy(q->start_time,start_time);
141     strcpy(q->end_time,end_time);
142     q->left=left;
143     q->price=price;
144     q->isFull=isFull;
145     //以上是用strcpy函數將新增加航班的各種信息復制到q結點中    
146     q->next=p->next;//將q結點的指針域置為空
147     p->next=q;
148     p=p->next;//將指針后移
149 }
150 void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)
151 //客戶訂票后,將客戶結點插入客戶鏈表中,並修改相應的航班信息。
152 {
153     flightnode *p=h->next;
154     for(;p!=NULL;p=p->next)
155         if(strcmp(p->flight_num,flight_num)==0)
156         {
157             p->left=p->left-ticket_num;
158             if(p->left==0)
159                 p->isFull=1;
160         }
161     passengernode *q=(passengernode *)malloc(sizeof(passengernode));//新建結點,存放新的客戶訂單信息
162     strcpy(q->name,name);
163     strcpy(q->ID_num,ID_num);
164     strcpy(q->flight_num,flight_num);
165     q->ticket_num=ticket_num;
166     q->next=NULL;
167     //將新訂單連接到鏈表中
168     PList->rear->next=q;
169     q->order_num=PList->rear->order_num+1;//生成訂單號
170     PList->rear=q;
171 }
172 
173 void delete_flight(flightnode *&h,passengerList *&PList)
174 //目的要按照某個航班號刪除航班結點
175 {
176     flightnode *p,*pr;
177     passengernode *q,*qr;
178     char flight_num[10];
179     int mark=1;
180     qr=PList->head;//pr為顧客鏈表的頭結點
181     q=qr->next;//用p作為中間指針對顧客鏈表中要刪除的顧客結點進行查找
182     pr=h;//pr為航線鏈表的頭結點
183     p=pr->next;//用p作為指針對航線鏈表中要刪除的航班結點進行查找
184     printf("\t\t請輸入你要刪除的航班號:");
185     scanf("%s",flight_num);
186     while(p!=NULL)//要刪除的航班存在,下面進行刪除操作
187     {
188         if(strcmp(flight_num,p->flight_num)==0)
189         {
190             pr->next=p->next;//移動指針找着要刪除的航班結點
191             free(p);//刪除操作
192             printf("\t\t刪除%s航班成功!\n",flight_num);
193             mark=0;
194             p=NULL;
195         }
196         if(pr->next!=NULL)
197         {
198             pr=pr->next;
199             p=pr->next;
200         }
201     }
202     if(mark==1)
203         printf("\t\t無此航班,無法刪除!\n");
204     else
205     {
206         while(q!=NULL)//要刪除的顧客存在,下面進行刪除操作
207         {
208             if(strcmp(flight_num,q->flight_num)==0)
209             {
210                 qr->next=q->next;//移動指針找着要刪除的顧客結點
211                 free(q);
212                 q=NULL;
213             }
214             if(qr->next!=NULL)
215             {
216                 qr=qr->next;
217                 q=qr->next;
218             }
219         }
220     }
221 }
222 int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num)
223 //目的是按照要退票的顧客的姓名查找該顧客結點,進行刪除操作
224 {
225     passengernode *p,*pr=PList->head;//pr指向顧客鏈表的頭結點
226     p=pr->next;
227     while(p!=NULL)
228     {
229         if(strcmp(name,p->name)==0&&strcmp(ID_num,p->ID_num)==0)
230         {
231             for(flightnode *f=h->next;f!=NULL;f=f->next)
232                 if(strcmp(p->flight_num,f->flight_num)==0)
233                 {
234                     f->left=f->left+p->ticket_num;
235                     f->isFull=0;
236                     break;
237                 }
238             pr->next=p->next;
239             free(p);
240             printf("\t\t顧客%s,%s退票成功!\n",name,ID_num);
241             return 1;
242         }
243         pr=pr->next;
244         p=pr->next;
245     }
246     printf("\t\t無此顧客,無法退票!\n");
247     return 0;
248 }
249 
250 void add_flight(flightnode *&h)//錄入航班信息后調用insert_flight函數增加航班
251 {
252     flightnode *p=h;
253     char flight_num[10],start_time[10],end_time[10],start_place[20],end_place[20];
254     int left,isFull,mark=1;
255     float price,price_discount;
256     for(;p->next!=NULL;p=p->next){}//移動指針,找到最后一個結點
257     while(mark==1)
258     {
259         printf("\t\t請輸入你要增加的航班號:");
260         scanf("%s",flight_num);
261         printf("\t\t請輸入出發地:");
262         scanf("%s",start_place);
263         printf("\t\t請輸入目的地:");
264         scanf("%s",end_place);
265         printf("\t\t請輸入起飛時間:");
266         scanf("%s",start_time);
267         printf("\t\t請輸入抵達時間:");
268         scanf("%s",end_time);
269         printf("\t\t請輸入票價:");
270         scanf("%f",&price);
271         printf("\t\t請輸入剩余座位數:");
272         scanf("%d",&left);
273         printf("\t\t請輸入是否滿倉(0表示沒有滿倉1以滿倉):");
274         scanf("%d",&isFull);
275         insert_flight(p,flight_num,start_place,end_place,start_time,end_time,left,price, price_discount,isFull);
276         printf("\t\t增加航班%s成功!\n",flight_num);
277         printf("\t\t是否繼續錄入航班信息(1表示繼續錄入;0表示停止錄入).\n");
278         printf("\t\t請輸入:");
279         scanf("%d",&mark);
280     }
281 }
282 
283 int flight_num_check(flightnode *h,char *flight_num)//用航班號進行查詢
284 {
285     flightnode *p=h;
286     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數");
287     for(;p!=NULL;p=p->next)
288     {
289         if(strcmp(p->flight_num,flight_num)==0)
290         {
291             printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left);
292             return 1;
293         }
294     }
295     printf("\t\t抱歉,沒有航班號為%s的航班信息!\n",flight_num);
296     return 0;
297 }
298 int place_check(flightnode *h,char *start_place,char *end_place)//用起飛抵達城市進行查詢
299 {
300     flightnode *p=h;
301     int mark=0;
302     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數");
303     for(;p!=NULL;p=p->next)
304     {
305         if(strcmp(p->start_place,start_place)==0&&strcmp(p->end_place,end_place)==0)
306         {
307             printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left);
308             mark=1;
309         }
310     }
311     if(mark==0)
312     {
313         printf("\t\t抱歉,沒有從%s到%s的航班信息!\n",start_place,end_place);
314         return 0;
315     }
316     return 1;
317 }
318 void check_all_flight(flightnode *h)
319 {
320     flightnode *p=h;
321     int m=0;
322     printf("%-8s%-12s%-12s%-10s%-10s%-8s%-10s%-8s\n","航班號","起飛城市","抵達城市","起飛時間","抵達時間","價格","是否滿倉","空座數");
323     for(;p!=NULL;p=p->next)
324     {
325         printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-10d%-8d\n",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->isFull,p->left);
326         m=1;
327     }
328     if(m==0)
329         printf("\t\t航班信息為空!\n");
330 }
331 void flight_check(flightnode *h)//選擇使用哪一個函數進行查詢
332 {
333     flightnode *p=h->next;
334     char flight_num[10],start_place[20],end_place[20];
335     char a;
336     printf("\t\t請選擇航班查詢方式:\n");
337     printf("\t\t1表示按航班號進行查詢;\n");
338     printf("\t\t2表示按起飛抵達城市進行查詢;\n");
339     printf("\t\t3表示瀏覽全部航班信息.\n\t\t請選擇輸入:");
340     a=getch();
341     printf("%c\n",a);
342     if(a=='1')
343     {
344         printf("\t\t請輸入航班號:");
345         scanf("%s",flight_num);
346         flight_num_check(p,flight_num);
347     }
348     else if(a=='2')
349     {
350         printf("\t\t請輸入起飛城市:");
351         scanf("%s",start_place);
352         printf("\t\t請輸入抵達城市:");
353         scanf("%s",end_place);
354         place_check(p,start_place,end_place);
355     }
356     else if(a=='3')
357         check_all_flight(p);
358     else
359         return;
360 }
361 
362 int ID_name_check(passengerList *PList,char *name,char *ID_num)
363 {
364     passengernode *p=PList->head->next;
365     int mark=0;
366     printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量");
367     for(;p!=NULL;p=p->next)
368     {
369         if(strcmp(p->ID_num,ID_num)==0&&strcmp(p->name,name)==0)
370         {
371             printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);
372             mark=1;
373         }
374     }
375     if(mark==0)
376     {
377         printf("\t\t抱歉,沒有%s,%s的訂單信息!\n",name,ID_num);
378         return 0;
379     }
380     return 1;
381 }
382 int order_num_check(passengerList *PList,int order_num)
383 {
384     passengernode *p=PList->head->next;
385     printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量");
386     for(;p!=NULL;p=p->next)
387     {
388         if(p->order_num==order_num)
389         {
390             printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);
391             return 1;
392         }
393     }
394     printf("\t\t抱歉,沒有訂單號為%d的訂單信息!\n",order_num);
395     return 0;
396 }
397 void check_all_passenger(passengerList *PList)
398 {
399     passengernode *p=PList->head->next;
400     int m=0;
401     printf("%-8s%-20s%-20s%-10s%-8s%\n","訂單號","姓名","證件號","航班號","訂票數量");
402     for(;p!=NULL;p=p->next)
403     {
404         printf("%-8d%-20s%-20s%-10s%-8d%\n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);
405         m=1;
406     }
407     if(m==0)
408         printf("\t\t訂單信息為空!\n");
409 }
410 void passenger_check(passengerList *PList)
411 {
412     char name[20],ID_num[15];
413     int order_num;
414     char a;
415     printf("\t\t請選擇訂單查詢方式:\n");
416     printf("\t\t1表示按客戶姓名和證件號進行查詢;\n");
417     printf("\t\t2表示按訂單號進行查詢;\n");
418     printf("\t\t3表示查看全部訂單信息.\n\t\t請選擇輸入:");
419     a=getch();
420     printf("%c\n",a);
421     if(a=='1')
422     {
423         printf("\t\t請輸入客戶姓名:");
424         scanf("%s",name);
425         printf("\t\t請輸入證件號:");
426         scanf("%s",ID_num);
427         ID_name_check(PList,name,ID_num);
428     }
429     else if(a=='2')
430     {
431         printf("\t\t請輸入訂單號:");
432         scanf("%d",&order_num);
433         order_num_check(PList,order_num);
434     }
435     else if(a=='3')
436         check_all_passenger(PList);
437     else
438         return;
439 }
440 
441 void modify_flight(flightnode *&h,passengerList *&PList)
442 {
443     flightnode *p=h->next;
444     char flight_num[10],start_time[10],end_time[10];
445     char a;
446     printf("\t\t************航線信息修改*************\n\n");
447     printf("\t\t*************************************\n\n");
448     printf("\t\t*         增加航班-------1          *\n\n");
449     printf("\t\t*         刪除航班-------2          *\n\n");
450     printf("\t\t*         修改航班時間---3          *\n\n");
451     printf("\t\t*************************************\n\n");
452     printf("\t\t請選擇:");
453     a=getch();
454     printf("%c\n",a);
455     if(a=='1')
456         add_flight(h);
457     else if(a=='2')
458         delete_flight(h,PList);
459     else if(a=='3')
460     {
461         printf("\t\t請輸入要修改的航班的航班號:");
462         scanf("%s",flight_num);
463         if(flight_num_check(p,flight_num)==1)
464         {
465             printf("\t\t請輸入修改后的起飛時間:");
466             scanf("%s",start_time);
467             printf("\t\t請輸入修改后的抵達時間:");
468             scanf("%s",end_time);
469             for(;p!=NULL;p=p->next)
470                 if(strcmp(flight_num,p->flight_num)==0)
471                 {
472                     strcpy(p->start_time,start_time);
473                     strcpy(p->end_time,end_time);
474                     printf("\t\t航班%s時間修改成功!\n",flight_num);
475                 }
476         }
477     }
478     else
479         return;
480 }
481 
482 int book(flightnode *&h,passengerList *&PList)
483 {
484     char name[20];       //姓名
485     char ID_num[20];     //證件號
486     char flight_num[10]; //航班號
487     char start_place[20];//起飛城市
488     char end_place[20];  //抵達城市
489     int ticket_num;      //訂票數量
490     int k;
491     flightnode *p=h->next;
492     printf("\t\t請輸入信息:\n");
493     printf("\t\t請輸入起飛城市:");
494     scanf("%s",start_place);
495     printf("\t\t請輸入抵達城市:");
496     scanf("%s",end_place);
497     if(place_check(h,start_place,end_place)==1)
498     {
499         printf("\t\t航班號:");
500         scanf("%s",flight_num);
501         while(flight_num==NULL){
502             printf("航班號不能為空!\n");
503             printf("\t\t航班號:");
504             scanf("%s",flight_num);
505         }
506         while(p!=NULL){
507             if(strcmp(p->flight_num,flight_num)==0)
508             {
509                 printf("\t\t姓名:");
510                 scanf("%s",name);
511                 printf("\t\t證件號碼:");
512                 scanf("%s",ID_num);
513                 printf("\t\t訂票數量:");
514                 scanf("%d",&ticket_num);
515                 while(name==NULL){
516                     printf("客戶姓名不能為空!\n");
517                     printf("\t\t姓名:");
518                     scanf("%s",name);
519                 }
520                 while(ID_num==NULL){
521                     printf("客戶證件號碼不能為空!\n");
522                     printf("\t\t證件號碼:");
523                     scanf("%s",ID_num);
524                 }
525                 while(ticket_num==0){
526                     printf("客戶訂票數量不能為空!\n");
527                     printf("\t\t訂票數量:");
528                     scanf("%d",&ticket_num);
529                 }
530                 if(p->left>0&&p->left>=ticket_num)
531                 {
532                     insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);
533                 
534                     getch();
535                     printf("\t\t恭喜您,訂票成功!\n");
536                     return 1;
537                 }
538                 else
539                 {
540                     printf("\t\t***很遺憾,該航班已滿!***\n");
541                     printf("\t\t***如選擇其他航班請輸入-----1\n\t\t***不選則輸入-----0***\n");
542                     printf("\t\t輸入數字進行選擇:");
543                     scanf("%d",&k);
544                     if(k==1)
545                     {
546                         printf("\t\t此航線上的其他航班有:\n");
547                         if(find_same_flight(h,flight_num)==1)
548                         {
549                             printf("\t\t請輸入您選的航班:");
550                             scanf("%s",flight_num);
551                             insert_passengerList(h,PList,name,ID_num,flight_num, ticket_num);
552                             printf("\t\t恭喜您,訂票成功!\n");
553                             return 1;
554                         }
555                     }
556                 }
557             }
558             else
559                 p=p->next;
560         }
561         if(p==NULL)
562             printf("\t\t對不起,您輸入的航班不存在!\n");
563     }
564     return 0;
565 }
566 
567 void cancel(passengerList *&PList,flightnode *&h)
568 {
569     char name[20],ID_num[20];
570     printf("\t\t請輸入你的姓名:");
571     scanf("%s",name);
572     printf("\t\t請輸入你的證件號:");
573     scanf("%s",ID_num);
574     delete_passenger(PList,h,name,ID_num);
575 }
576 
577 int main()
578 {
579     char choice;
580     int t=1;
581     flightnode *flight;
582     passengerList *PList;
583     init_flight(flight);//初始化航班鏈表
584     init_passengerList(PList);
585     load_flight(flight);
586     load_passenger(PList);
587     while(t==1)
588     {
589         printf("\t\t************飛機訂票系統菜單*************\n");
590         printf("\t\t*****************************************\n");
591         printf("\t\t*         錄入信息----------1           *\n\n");
592         printf("\t\t*         訂    票----------2           *\n\n");
593         printf("\t\t*         退    票----------3           *\n\n");
594         printf("\t\t*         查詢航班----------4           *\n\n");
595         printf("\t\t*         查詢訂單----------5           *\n\n");
596         printf("\t\t*         修改航線----------6           *\n\n");
597         printf("\t\t*         保存退出----------0           *\n\n");
598         printf("\t\t*****************************************\n\n");
599         printf("\t\t請選擇服務:");
600         choice=getch();
601         printf("%c\n",choice);
602         system("cls");
603         if(choice=='1'){
604             add_flight(flight);
605             getch();
606             system("cls");
607         }else if(choice=='2'){
608             book(flight,PList);
609             getch();
610             system("cls");
611         }else if(choice=='3'){
612             cancel(PList,flight);
613             getch();
614             system("cls");
615         }else if(choice=='4'){
616             flight_check(flight);
617             getch();
618             system("cls");
619         }else if(choice=='5'){
620             passenger_check(PList);
621             getch();
622             system("cls");
623         }else if(choice=='6'){
624             modify_flight(flight,PList);
625             getch();
626             system("cls");
627         }else if(choice=='0'){
628             printf("\t\t再見!\n");
629             t=0;
630         }
631     }
632     save_flight(flight);
633     save_passenger(PList);
634     return 0; 
635 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM