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 }