前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows API 开发飞机订票系统 图形化界面 (四)

windows API 开发飞机订票系统 图形化界面 (四)

作者头像
欠扁的小篮子
发布2018-04-10 10:28:52
7500
发布2018-04-10 10:28:52
举报
文章被收录于专栏:技术碎碎念技术碎碎念

接下来的是录入航班、修改航班信息功能的实现:

 1 //录入航班
 2 BOOL EntryFlight(HWND hEntryDlg){
 3 
 4     TCHAR szDiscount[16];
 5     TCHAR szFare[16],szSeat_Number[16];
 6     TCHAR szFlight_Number[16], szDate[16];
 7     TCHAR szDeparture[16], szDestination[16];
 8     TCHAR szTakeOff_Time[16], szLanding_Time[16];
 9 
10     Flight *p = (Flight *)malloc(sizeof(Flight)),*q;
11     if (!p){
12         MessageBox(hEntryDlg, TEXT("内存申请错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
13         return FALSE;
14     }
15 
16     GetDlgItemText(hEntryDlg, IDC_DEPARTURE, szDeparture, 16);            //获取录入航班信息
17     GetDlgItemText(hEntryDlg, IDC_DESTINATION, szDestination, 16);
18     GetDlgItemText(hEntryDlg, IDC_FLTNUM, szFlight_Number, 16);
19     GetDlgItemText(hEntryDlg, IDC_FARE, szFare, 16);
20     GetDlgItemText(hEntryDlg, IDC_TAKEOFFTIME, szTakeOff_Time, 16);
21     GetDlgItemText(hEntryDlg, IDC_LANDINGTIME, szLanding_Time, 16);
22     GetDlgItemText(hEntryDlg, IDC_SEATNUM, szSeat_Number, 16);
23     GetDlgItemText(hEntryDlg, IDC_DISCOUNT, szDiscount, 16);
24     GetDlgItemText(hEntryDlg, IDC_DATE, szDate, 16);
25 
26     if (!lstrlen(szDeparture) || !lstrlen(szDestination) ||
27         !lstrlen(szFlight_Number) || !lstrlen(szFare) ||
28         !lstrlen(szTakeOff_Time) || !lstrlen(szLanding_Time) ||
29         !lstrlen(szSeat_Number))
30     {
31         MessageBox(hEntryDlg, TEXT("请您填写完整航班信息!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
32         return FALSE;
33     }
34 
35     q = flightlink.head;
36     while (q){
37         if (!lstrcmp(q->Flight_Number, szFlight_Number) && !lstrcmp(q->Date,szDate)){
38             MessageBox(hEntryDlg, TEXT("对不起,同一航班在一天内只能有一班"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
39             free(p);
40             return FALSE;
41         }
42         q = q->Next;
43     }//while
44 
45     lstrcpy(p->Date, szDate);                            //填入录入航班结点信息
46     lstrcpy(p->Discount, szDiscount);
47     lstrcpy(p->Departure, szDeparture);
48     lstrcpy(p->Destination, szDestination);
49     lstrcpy(p->TakeOff_Time, szTakeOff_Time);
50     lstrcpy(p->Landing_Time, szLanding_Time);
51     lstrcpy(p->Flight_Number, szFlight_Number);
52     p->Fare = _ttof(szFare);
53     p->Seat_Number = _ttoi(szSeat_Number);
54     p->Vacant_Seat = p->Seat_Number;
55     p->Next = NULL;
56 
57     if (flightlink.head == NULL)                        //将新结点添至航班链表
58         flightlink.head = p;
59     else
60         flightlink.tail->Next = p;
61     flightlink.tail = p;
62     flightlink.Flight_Number++;                            //航班数目增加
63 
64     MessageBox(hEntryDlg, TEXT("航班录入成功!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
65 
66     return TRUE;
67 }//EntryFlight()
 1 //修改航班信息
 2 BOOL ModifyFlight(HWND hModifyDlg){
 3     int seat_num;
 4     TCHAR szDiscount[16];
 5     TCHAR szFare[16], szSeat_Number[16];
 6     TCHAR szTakeOff_Time[16], szLanding_Time[16];
 7     TCHAR Mdf_flt_num[16], Mdf_flt_date[16];
 8 
 9     OrderForm *q;
10     Flight *p;
11 
12     GetDlgItemText(hModifyDlg, IDC_MDFFLTNUM, Mdf_flt_num, 16);                //获取要修改的航班
13     GetDlgItemText(hModifyDlg, IDC_MDFDATE, Mdf_flt_date, 16);
14 
15     if (!lstrlen(Mdf_flt_num)){
16         MessageBox(hModifyDlg, TEXT("请输入所要修改信息的航班号"), TEXT("信息"), MB_OK | MB_ICONINFORMATION);
17         return FALSE;
18     }
19 
20     GetDlgItemText(hModifyDlg, IDC_FARE, szFare, 16);                        //获取要修改的信息
21     GetDlgItemText(hModifyDlg, IDC_DISCOUNT, szDiscount, 16);
22     GetDlgItemText(hModifyDlg, IDC_SEATNUM, szSeat_Number, 16);
23     GetDlgItemText(hModifyDlg, IDC_TAKEOFFTIME, szTakeOff_Time, 16);
24     GetDlgItemText(hModifyDlg, IDC_LANDINGTIME, szLanding_Time, 16);
25     
26     p = flightlink.head;
27     while (p){                                                                //查找要修改的航班
28         if (!lstrcmp(Mdf_flt_num, p->Flight_Number) && !lstrcmp(Mdf_flt_date, p->Date)){
29             if (lstrlen(szFare))                                            //改变航班票价
30                 p->Fare = _ttof(szFare);
31             if (lstrlen(szDiscount))                                        //改变航班折扣
32                 wsprintf(p->Discount, szDiscount);
33             if (lstrlen(szSeat_Number)){
34                 seat_num = _ttoi(szSeat_Number);
35                 if ((p->Seat_Number - seat_num) > p->Vacant_Seat){            //余座数量>=0
36                     MessageBox(hModifyDlg, TEXT("对不起,座位数过少,请重新填写"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
37                     return FALSE;
38                 }
39                 p->Vacant_Seat -= p->Seat_Number - seat_num;                //改变余票数量
40                 p->Seat_Number = seat_num;                                    //改变座位数
41             }//if
42             if (lstrlen(szTakeOff_Time)){                                    //改变航班起飞时间
43                 wsprintf(p->TakeOff_Time, szTakeOff_Time);
44                 q = allorder.head;                                            //改变该航班所有订单出发时间
45                 while (q){
46                     if (!lstrcmp(q->Flight_Number, p->Flight_Number) && !lstrcmp(q->Date, p->Date))
47                         wsprintf(q->TakeOff_Time, szTakeOff_Time);
48                     q = q->Next;
49                 } 
50             }//if
51             if (lstrlen(szLanding_Time)){                                    //改变航班降落时间
52                 wsprintf(p->Landing_Time, szLanding_Time);
53                 q = allorder.head;                                            //改变该航班所有订单降落时间
54                 while (q) {
55                     if (!lstrcmp(q->Flight_Number, p->Flight_Number) && !lstrcmp(q->Date, p->Date))
56                         wsprintf(q->Landing_Time, szLanding_Time);
57                     q = q->Next;
58                 }
59             }//if
60             MessageBox(hModifyDlg, TEXT("修改成功!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
61             return TRUE;
62         }//if
63         p = p->Next;
64     }//while
65                                                                             
66     MessageBox(hModifyDlg, TEXT("对不起,您所要修改的航班尚未录入。"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
67     return FALSE;                                                            
68 
69 }//ModifyFlight()

至此,订票系统的功能已经基本全部实现了,剩下的问题就是在程序退出时将账户、航班、订单数据写进文件里。

具体实现起来很简单,需要注意的知识写入与读取要相对应。代码如下:

 1 //保存账户资料
 2 BOOL WriteAccountData(HWND hMainDlg){
 3     Passenger *p;
 4     FILE *fp;
 5     if ((fp = fopen(".\\AccountData.txt", "w")) == NULL){
 6         MessageBox(hMainDlg, TEXT("账户信息保存出现错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
 7         return FALSE;
 8     }
 9 
10     p = psglink.head;
11     while (p){
12         fprintf(fp, "%s\n%s\n%s\n", p->Name, p->IdNum, p->PassWord);
13         p = p->Next;
14     }//while
15 
16     fclose(fp);
17     return TRUE;
18 }//WriteAccountData
19 
20 
21 //保存订单信息
22 BOOL WriteOrderData(HWND hMainDlg){
23     OrderForm *p;
24     FILE *fp;
25     if ((fp = fopen(".\\OrderForm.txt", "w")) == NULL){
26         MessageBox(hMainDlg, TEXT("订单信息保存出现错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
27         return FALSE;
28     }
29     p = allorder.head;
30     while (p){
31         fprintf(fp, "%s\n", p->IdNum);
32         fprintf(fp, "%d\n", p->Order_Number);
33         fprintf(fp, "%d\n", p->Tickets_Num);
34         fprintf(fp, "%s\n", p->Flight_Number);
35         fprintf(fp, "%s\n", p->Departure);
36         fprintf(fp, "%s\n", p->Destination);
37         fprintf(fp, "%s\n", p->Date);
38         fprintf(fp, "%s\n", p->TakeOff_Time);
39         fprintf(fp, "%s\n", p->Landing_Time);
40         p = p->Next;
41     }//while
42     fclose(fp);
43     return TRUE;
44 }//WriteOrderData()
45 
46 
47 //保存航班信息
48 BOOL WriteFlightData(HWND hMainDlg){
49     Flight *p;
50     FILE *fp;
51     if ((fp = fopen(".\\FlightData.txt", "w")) == NULL){
52         MessageBox(hMainDlg, TEXT("航班信息保存出现错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
53         return FALSE;
54     }
55     p = flightlink.head;
56     while (p){
57         fprintf(fp, "%s\n", p->Flight_Number);
58         fprintf(fp, "%.2lf\n", p->Fare);
59         fprintf(fp, "%s\n", p->Discount);
60         fprintf(fp, "%d\n%d\n", p->Seat_Number, p->Vacant_Seat);
61         fprintf(fp, "%s\n", p->Departure);
62         fprintf(fp, "%s\n", p->Destination);
63         fprintf(fp, "%s\n", p->Date);
64         fprintf(fp, "%s\n", p->TakeOff_Time);
65         fprintf(fp, "%s\n", p->Landing_Time);
66         p = p->Next;
67     }//while
68     fclose(fp);
69     return TRUE;
70 }//WriteFlight()

至此,这个飞机订票系统算是完成了,其中还是有很多不足之处。查找算法只是简单的遍历链表,数据结构也只是采用了单链表,倒是订单用上了十字链表来存储。查找起来效率不高,一旦数据量变大,便会很耗费时间,不过考虑到这只是一个课程设计,数据量很小,查找起来时间耗费上没有多少差别,姑且就这样吧。

把头文件以及其资源头文件代码就不贴出来了,想看的朋友可以直接把源码下载下来看一下。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-05-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档