windows API 开发飞机订票系统 图形化界面 (四)
接下来的是录入航班、修改航班信息功能的实现:
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()
至此,这个飞机订票系统算是完成了,其中还是有很多不足之处。查找算法只是简单的遍历链表,数据结构也只是采用了单链表,倒是订单用上了十字链表来存储。查找起来效率不高,一旦数据量变大,便会很耗费时间,不过考虑到这只是一个课程设计,数据量很小,查找起来时间耗费上没有多少差别,姑且就这样吧。
把头文件以及其资源头文件代码就不贴出来了,想看的朋友可以直接把源码下载下来看一下。