python-数据结构-大学生-航空订票系统
python-數(shù)據(jù)結(jié)構(gòu)-大學(xué)生-航空訂票系統(tǒng)
1.問題描述及任務(wù)描述
1.1問題描述
航空訂票系統(tǒng):可以實(shí)現(xiàn)航空客運(yùn)訂票的主要業(yè)務(wù)活動
基本要求:
(1)航線管理:每條航線所涉及的信息由:終點(diǎn)站名、航班號、飛機(jī)號、飛行周日(星期幾)、乘員定額、余票量;
(2)客戶管理:有關(guān)訂票的客戶信息(包括姓名、訂票數(shù)、艙位等級(1、2和3))以及等候替補(bǔ)的客戶名單(包括姓名、所需票量);
(3)系統(tǒng)實(shí)現(xiàn)的主要操作和功能(查詢航線、承辦訂票業(yè)務(wù)和承辦退票業(yè)務(wù));
1.2問題分析
按照IPO的程序撰寫操作。本問題是設(shè)計(jì)一款航空訂票系統(tǒng),其中涵蓋航線管理、訂票服務(wù)和退票服務(wù)。
航線管理涉及添加航班信息、查詢航班信息、修改航班休息、刪除航班信息等操作,其中必須要保證成員定額必須大于等于余票量,否則不符合程序。同時(shí)需要將航班信息進(jìn)行存儲。
訂票服務(wù)需包含航班信息的查找和修改操作以及添加乘客信息,并將乘客信息進(jìn)行存儲。按照余票量的有無,乘客需分為已定票和候補(bǔ)票兩種,分別將這兩類乘客信息存儲到不同的文件中,防止數(shù)據(jù)的混亂。
退票服務(wù)涉及航班信息的查找、乘客信息的查找、乘客信息的刪除、航班信息中余票量的修改。
根據(jù)問題分析,可以確定程序需要具備含有添加、刪除、修改、查詢、訂票、退票功能,并能夠?qū)?shù)據(jù)文件進(jìn)行讀寫操作。完成程序基本思路的確定,程序主要框架的建立,編寫主函數(shù)及子函數(shù),同時(shí)編寫文件的讀寫操作,數(shù)據(jù)的展示操作。設(shè)計(jì)完成后,對程序進(jìn)行總體測試和優(yōu)化。
2.概要設(shè)計(jì)
2.1基本思路
根據(jù)題目信息,確定好程序功能模塊,建立主菜單,其中包含航班信息的添加、查詢、刪除、修改、乘客的訂票服務(wù)和退票服務(wù)、以及退出系統(tǒng),共計(jì)七大模塊,利用函數(shù)對各個功能模塊進(jìn)行打包封裝。在主函數(shù)中以while循環(huán)形式確定用戶輸入的指令,根據(jù)用戶輸入的不同指令調(diào)用不同的函數(shù)功能入口,從而實(shí)現(xiàn)航空訂票系統(tǒng)的各項(xiàng)功能。
2.2功能模塊設(shè)計(jì)
功能模塊設(shè)計(jì)圖如圖所示,模塊根據(jù)航空訂票系統(tǒng)內(nèi)容來劃分,具體操作由用戶鍵盤輸入選擇功能,將航班信息和乘客已定票和候補(bǔ)票信息分別存儲到fly=“fly.txt”、ticket=“ticket.txt”、no_ticket=“no_ticket.txt”文件中。并對fly=“fly.txt”文件中的航班信息進(jìn)行展示。
3.函數(shù)調(diào)用關(guān)系
3.1函數(shù)調(diào)用關(guān)系
代碼展示如下:
3.2子函數(shù)功能設(shè)計(jì)
3.2.1添加航班信息
函數(shù)add_info()無返回值,無形參。函數(shù)的主要功能是讓管理員輸入航班信息并添加到fly.txt文件中。在函數(shù)體中,首先創(chuàng)建了一個fly_list=[]列表,然后依次輸入航班信息,并將信息儲存在字典fly_dict{}中,然后將字典添加進(jìn)fly_list.append(fly_dict)完成對航班信息的存儲。輸入信息時(shí),按照要求,乘員定額必須大于或等于余票量,若違反此條規(guī)定,則重新輸入航班信息。函數(shù)內(nèi)部是以一個while無限循環(huán)為主體,順利完成一組航班信息的錄入之后,系統(tǒng)會自動提示,是否繼續(xù)添加航班信息?y/n,輸入“Y”或“y”則退出while無限循環(huán)即可安全退出添加航班信息操作,重新回到系統(tǒng)菜單。若輸入“N”或“n”則再次循環(huán),可再次添加航班信息。
def add_info(): #1、添加航班信息函數(shù)fly_list=[]while 1:home_name = input('終點(diǎn)站名稱:')fight_number = input('航班號:')plane_number = input('飛機(jī)號:')fight_data = input('飛行日期(標(biāo)準(zhǔn)輸入格式:星期三):')carrying_capacity = input('該型號飛機(jī)乘員定額:')tickets_left = input('余票量:')fly_dict= {'home_name':home_name,'fight_number':fight_number,'plane_number':plane_number,'fight_data':fight_data,'carrying_capacity':carrying_capacity,'tickets_left':tickets_left}fly_list.append(fly_dict)answer=input('是否繼續(xù)添加航班信息?y/n')if answer=='y'or answer=='Y':continueelse:breaksave(fly_list,fly)print('航班信息錄入完畢')3.2.2查詢航班信息
函數(shù)search_info()無返回值,無形參。函數(shù)主要功能是讓管理員輸入航班號或終點(diǎn)站名稱查詢航班具體信息。在函數(shù)體中,首先創(chuàng)建了一個fly_query=[]列表,然后根據(jù)系統(tǒng)提示“按照航班號查找請輸入1,按照終點(diǎn)站名稱查找請輸入2”,輸入正確的格式即可進(jìn)入查詢模塊,若輸入格式錯誤,則重新輸入,此時(shí)在函數(shù)體中嵌套了search_info()函數(shù)。進(jìn)入查詢模塊之后,系統(tǒng)會讀取fly.txt中航班信息數(shù)據(jù),將讀取的航班信息與輸入的航班信息對比,若相等則將文件fly.txt中含該特定信息的整行航班信息添加到fly_query=[]列表中,然后利用函數(shù)show_fly(fly_query),對fly_query=[]列表中的信息進(jìn)行展示。展示完成后,對fly_query=[]列表中的信息進(jìn)行清除,以待下一次查詢。函數(shù)內(nèi)部是以一個while無限循環(huán)為主體,順利完成一組航班信息的查詢之后,系統(tǒng)會自動提示,是否繼續(xù)查詢航班信息?y/n,輸入“Y”或“y”則退出while無限循環(huán)即可安全退出查詢航班信息操作,重新回到系統(tǒng)菜單。若輸入“N”或“n”則再次循環(huán),可再次查詢航班信息。若fly.txt文件中沒有存儲航班信息,系統(tǒng)會打印輸出“暫時(shí)未保存航班信息數(shù)據(jù)!!!”,然后退回菜單系統(tǒng)。
def search_info():fly_query=[]while 1:fight_number=''home_name=''if os.path.exists(fly):mode=input('按照航班號查找請輸入1,按照終點(diǎn)站名稱查找請輸入2:')if mode=='1':fight_number=input('請輸入航班號:')elif mode=='2':home_name=input('請輸入終點(diǎn)站名稱:')else:print('您的輸入格式有誤,請重新輸入!')search_info()with open(fly,'r') as rfile:fly_info=rfile.readlines()for item in fly_info:d=dict(eval(item))if fight_number!='':if d['fight_number']==fight_number:fly_query.append(d)elif home_name!='':if d['home_name']==home_name:fly_query.append(d)show_fly(fly_query)fly_query.clear()answer = input('是否繼續(xù)查詢航班信息?y/n')if answer == 'y' or answer == 'Y':continueelse:breakelse:print('暫未保存此航班信息!!!')return3.2.3修改航班信息
函數(shù)modify_info()無返回值,無形參。函數(shù)主要功能是讓管理員輸入航班號來修改已經(jīng)存儲完成的航班信息。在函數(shù)體中,首先套用了show()函數(shù),目的是展示以存儲的全部航班信息,便于接下來的操作。然后判斷fly.txt文件中是否有數(shù)據(jù)存在,若沒有數(shù)據(jù)存在,則返回主菜單。根據(jù)系統(tǒng)提示,輸入航班號,接著打開文件,對文件內(nèi)的航班信息進(jìn)行行遍歷操作。若航班信息中的航班號與輸入信息相同,則修改該航班號所在行的所有航班信息,并將修改完成后的航班信息重新寫入文件。若文件中沒有與輸入信息相同的航班號,則顯示“未找到航班號為{fly_fight_number}的航班信息,無法進(jìn)行刪除操作!”。修改操作完成后,系統(tǒng)會自動提示,,是否繼續(xù)修改航班信息?y/n,輸入“Y”或“y”即可安全退出修改航班信息操作,重新回到系統(tǒng)菜單。若輸入“N”或“n”則重新執(zhí)行修改航班信息操作。
def modify_info(): #航班信息修改函數(shù)show()if os.path.exists(fly):with open(fly,'r') as rfile:fly_old=rfile.readlines()else:returnfly_fight_number=input('請輸入要修改的航班的航班號:')with open(fly,'w') as file:for item in fly_old:d=dict(eval(item))if d['fight_number']==fly_fight_number:print('已經(jīng)找到航班信息,可以進(jìn)行修改操作')while 1:try:d['home_name']=input('請輸入終點(diǎn)站名稱:')d['plane_number']=input('請輸入飛機(jī)號:')d['fight_data']=input('請輸入飛行日期:')d['carrying_capacity']=input('請輸入乘員定額:')d['tickets_left']=input('請輸入余票量:')except:print('你的輸入有誤,請重新輸入!')else:breakfile.write(str(d)+'\n')print('信息修改成功!')else:file.write(str(d) + '\n')answer=input('是否繼續(xù)修改其他航班信息?y/n')if answer=='y' or answer=='Y':modify_info()3.2.4刪除航班信息
函數(shù)delete_info()無返回值,無形參。函數(shù)主要功能是讓管理員輸入航班號來刪除已經(jīng)存儲完成的航班信息。在函數(shù)體中,首先套用了show()函數(shù),目的是展示以存儲的全部航班信息,便于接下來的操作。按照系統(tǒng)提示“請輸入要刪除航班信息的航班號:”然后接著打開文件,對文件內(nèi)的航班信息進(jìn)行行遍歷操作fly_old=file.readlines()。若航班信息中的航班號與輸入信息相同,則刪除該航班號所在行的所有航班信息,并將其他不相關(guān)的航班信息再次寫進(jìn)文件fly.txt中。若文件中沒有航班信息,系統(tǒng)會顯示“暫時(shí)未保存航班信息數(shù)據(jù)!”并返回系統(tǒng)菜單。刪除完成之后,顯示文件中的航班信息。函數(shù)內(nèi)部是以一個while無限循環(huán)為主體,順利完成一組航班信息的刪除操作之后,系統(tǒng)會自動提示,是否繼續(xù)刪除航班信息?y/n,輸入“Y”或“y”則退出while無限循環(huán)即可安全退出刪除航班信息操作,重新回到系統(tǒng)菜單。若輸入“N”或“n”則再次循環(huán),可再次刪除航班信息。
def delete_info():while 1:fly_fight_number=input('請輸入要刪除航班信息的航班號:')if fly_fight_number!='':if os.path.exists(fly):#判斷括號里的文件是否存在with open (fly,'r') as file:fly_old=file.readlines()else:fly_old=[]flag=0if fly_old:with open(fly, 'w') as file:for item in fly_old:d = dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['fight_number'] == fly_fight_number:flag=1else:file.write(str(d) + '\n')if flag:print(f'航班號為{fly_fight_number}的航班信息已被刪除')else:print(f'沒有找到航班號為{fly_fight_number}的航班信息')else:print('無航班信息')breakshow() # 刪除之后重新顯示所有學(xué)生信息answer = input('是否繼續(xù)刪除?y/n\n')if answer == 'y':continueelse:break3.2.5客戶訂票服務(wù)
函數(shù)booking_service()無返回值,無形參。函數(shù)主要功能是讓用戶輸入終點(diǎn)站名稱和飛行日期來選擇航班。在函數(shù)體中,首先創(chuàng)建了兩個列表people_list = []、people_grade_list = []。然后系統(tǒng)會判斷文件fly.txt中是否含有航班信息,若沒存儲航班信息,系統(tǒng)會自動返回到系統(tǒng)菜單。若文件中含有航班信息,會打開文件,對文件內(nèi)的航班信息進(jìn)行行遍歷操作fly_old=rfile.readlines()。接著按照系統(tǒng)提示輸入“請輸入終點(diǎn)站名稱:”和“請輸入你的起飛日期(標(biāo)準(zhǔn)輸入格式:星期三):”。根據(jù)用戶訂票習(xí)慣,依靠終點(diǎn)站名稱和飛行日期可以滿足用戶的飛行需求。輸入完成后,依靠for循環(huán)檢驗(yàn)fly_old中的信息是否有同時(shí)符合用戶輸入的終點(diǎn)站名稱和飛行日期。若有符合條件的航班信息,將信息添加至people_list = []列表中people_list.append(d)。檢驗(yàn)列表people_list的長度,若len(people_list)==0,則系統(tǒng)顯示“沒有查詢到航班信息,無數(shù)據(jù)顯示!!!”,并再次執(zhí)行booking_service()(我們在if語句中嵌套了booking_service()函數(shù))。接著使用show_fly(people_list)展示符合條件的航班信息。函數(shù)內(nèi)部是以一個while無限循環(huán)為主體,用戶順利完成一組航班信息的搜索之后,系統(tǒng)會自動提示,該航班基本符合情況是否預(yù)定?y/n,輸入“Y”或“y”則退出while無限循環(huán)進(jìn)入乘客信息錄入函數(shù)booking_service_2()。若輸入“N”或“n”則再次循環(huán),則退出while無限循環(huán)進(jìn)入系統(tǒng)菜單。
def booking_service():people_list = []people_grade_list = []print('航空客服:歡迎進(jìn)入乘客訂票系統(tǒng),很高興為你服務(wù)。')while 1:print('航空客服:下面是航班信息一覽圖,請選擇合適的航班。')show()people_home_name=input('請輸入終點(diǎn)站名稱:')people_fight_data=input('請輸入你的起飛日期(標(biāo)準(zhǔn)輸入格式:星期三):')with open(fly, 'r') as rfile:fly_info = rfile.readlines()for item in fly_info:d = dict(eval(item))if people_home_name != ''and people_fight_data!='':if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:people_list.append(d)if len(people_list) == 0:print('沒有查詢到航班信息,無數(shù)據(jù)顯示!!!')booking_service()show_fly(people_list)answer = input('該航班基本符合情況是否預(yù)定?y/n')if answer == 'y' or answer == 'Y':booking_service_2(people_home_name,people_fight_data)breakelse:breakdef booking_service_2(people_home_name,people_fight_data):ticket_list = []no_ticket_list=[]grade_ticket_list=[]grade_no_ticket_list = []people_ticket_number=0people_no_ticket_number = 0while 1:people_name = input('請輸入你的姓名:')people_number = input('請輸入你需要的飛機(jī)票數(shù):')for i in range(1, eval(people_number) + 1):print(f'由于你訂購了{people_number}張飛機(jī)票,接下來,你將選擇第{i}張飛機(jī)票的艙位等級。')people_grade = input('請輸入你的艙位等級(艙位等級:1、2、3):')if os.path.exists(fly):with open(fly, 'r') as rfile:fly_old = rfile.readlines()else:returnwith open(fly,'w') as wfile:for item in fly_old:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:while 1:d['tickets_left']=str(eval(d['tickets_left'])-1)breakwfile.write(str(d) + '\n')else:wfile.write(str(d) + '\n')with open(fly, 'r') as rfile:fly_info = rfile.readlines()for item in fly_info:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:if eval(d['tickets_left'])>=0:grade_ticket_list.append(people_grade)people_ticket_number+=1else:answer = input('該航班沒有余票,你將進(jìn)入候補(bǔ),您是否要預(yù)定?y/n')if answer == 'y' or answer == 'Y':grade_no_ticket_list.append(people_grade)people_no_ticket_number+=1if people_ticket_number!=0:ticket_dict={"終點(diǎn)站名稱":people_home_name,"飛行日期":people_fight_data,"乘客姓名":people_name,"飛機(jī)票數(shù)":people_ticket_number,"艙位等級":grade_ticket_list}ticket_list.append(ticket_dict)if people_no_ticket_number!=0:no_ticket_dict = {"終點(diǎn)站名稱": people_home_name, "飛行日期": people_fight_data,"乘客姓名": people_name, "飛機(jī)票數(shù)": people_no_ticket_number, "艙位等級": grade_no_ticket_list}no_ticket_list.append(no_ticket_dict)breaksave(ticket_list,ticket)save(no_ticket_list, no_ticket)print('訂票成功')3.2.6客戶退票服務(wù)
函數(shù)refund_system()無返回值,無形參。函數(shù)主要功能是讓用戶輸入姓名來進(jìn)行飛機(jī)票退票操作。首先系統(tǒng)會提示用戶“請輸入你的姓名:”,輸入完成后。系統(tǒng)會判斷文件ticket.txt和no_ticket.txt中是否含有乘客信息,若沒有乘客信息,系統(tǒng)會自動返回到系統(tǒng)菜單。若文件中含有乘客信息,系統(tǒng)會打開文件,并對文件內(nèi)的乘客信息進(jìn)行遍歷操作fly_old_1=file_1.readlines()、fly_old_2=file_2.readlines()。依靠for循環(huán)檢驗(yàn)fly_old_1中的信息是否有符合用戶輸入的姓名。若有符合條件的乘客信息,令people_home_name=str(d[“終點(diǎn)站名稱”])、people_fight_data=str(d[“飛行日期”])、people_ticket_number+=d[‘飛機(jī)票數(shù)’]便于下一步操作。再次依靠for循環(huán)檢驗(yàn)fly_old_2中的信息是否有符合用戶輸入的姓名。若有符合條件的乘客信息,令people_ticket_number += d[‘飛機(jī)票數(shù)’]。同時(shí)系統(tǒng)會刪除文件ticket.txt和no_ticket.txt中該名乘客信息。緊接著系統(tǒng)會判斷文件fly.txt中是否含有航班信息,若沒有航班信息,系統(tǒng)會自動返回到系統(tǒng)菜單。若文件中含有航班信息,系統(tǒng)會打開文件,并對文件內(nèi)的航班信息進(jìn)行遍歷操作fly_old = rfile.readlines()。依靠for循環(huán)檢驗(yàn)fly_old中的信息是否有同時(shí)符合people_home_name和people_fight_data,若有同時(shí)符合的航班信息,將該條航班信息中的余票量進(jìn)行修改d[‘tickets_left’] = str(eval(d[‘tickets_left’]) + people_ticket_number)并寫入文件中進(jìn)行保存。完成系統(tǒng)提示操作后,系統(tǒng)會回到系統(tǒng)菜單。
def refund_system():while 1:people_name=input('請輸入你的姓名:')people_home_name=''people_fight_data=''if people_name!='':if os.path.exists(ticket):#判斷括號里的文件是否存在with open (ticket,'r') as file:fly_old=file.readlines()else:fly_old=[]flag=0if fly_old:with open(ticket, 'w') as file:for item in fly_old:d = dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['乘客姓名'] == people_name:people_home_name=str(d["終點(diǎn)站名稱"])people_fight_data=str(d["飛行日期"]) flag=1else:file.write(str(d) + '\n')if flag:print(f'姓名為{people_name}的訂票信息已被刪除')else:print(f'沒有找到姓名為{people_name}的訂票信息')if os.path.exists(fly):with open(fly, 'r') as rfile:fly_old = rfile.readlines()else:returnwith open(fly, 'w') as wfile:for item in fly_old:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:while 1:d['tickets_left'] = str(eval(d['tickets_left']) + 1)breakwfile.write(str(d) + '\n')else:wfile.write(str(d) + '\n')else:print('無訂票信息')break下面是完整代碼:
import os.path import os fly='fly.txt' #儲存航班信息的文件夾 ticket='ticket.txt' #儲存完成訂票操作的乘客 no_ticket='no_ticket.txt' #儲存候補(bǔ)乘客信息def save(lst,txt): #寫入文件函數(shù)try:txt=open(txt,'a')except:txt = open(txt, 'w')for item in lst:txt.write(str(item)+'\n')txt.close()def show_fly(lst): #航班信息展示函數(shù)if len(lst) == 0:print('沒有查詢到航班信息,無數(shù)據(jù)顯示!!!')returnformat_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'print(format_title.format('終點(diǎn)站名稱','航班號','飛機(jī)號','飛行日期','乘員定額','余票量'))# 定義內(nèi)容的顯示格式format_data = '{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^14}\t{:^16}'for item in lst:print(format_data.format(item.get('home_name'),item.get('fight_number'),item.get('plane_number'),item.get('fight_data'),item.get('carrying_capacity'),item.get('tickets_left')))def show():fly_lst=[]if os.path.exists(fly):with open(fly,'r') as rfile:fly_info=rfile.readlines()for item in fly_info:fly_lst.append(eval(item))if fly_lst:show_fly(fly_lst)else:print('暫時(shí)未保存航班信息數(shù)據(jù)!')def main(): #主函數(shù)while 1:print_menu()choice=int(input("請選擇:"))if choice in [1,2,3,4,5,6,7]:if choice==1:add_info() #1.添加航班信息elif choice==2:search_info() #2.查詢航班信息elif choice==3:modify_info() #3.修改航班信息elif choice==4:delete_info() #4.刪除航班信息elif choice==5:booking_service() #5.客戶訂票服務(wù)elif choice==6:refund_system() #6.客戶退票服務(wù)elif choice==7:answer=input('你確定要退出系統(tǒng)嗎?y/n')if answer =='y'or answer =='Y':print('感謝你的使用!')breakelse:continuedef print_menu(): #菜單目錄函數(shù)print('*' * 30)print('-' * 13 + '菜單' + '-' * 13)print('1.添加航班信息')print('2.查詢航班信息')print('3.修改航班信息')print('4.刪除航班信息')print('5.客戶訂票服務(wù)')print('6.客戶退票服務(wù)')print('7.退出系統(tǒng)')print('*' * 30)def add_info(): #1、添加航班信息函數(shù)fly_list=[]while 1:home_name = input('終點(diǎn)站名稱:')fight_number = input('航班號:')plane_number = input('飛機(jī)號:')fight_data = input('飛行日期(標(biāo)準(zhǔn)輸入格式:星期三):')carrying_capacity = input('該型號飛機(jī)乘員定額:')tickets_left = input('余票量:')if eval(carrying_capacity)>=eval(tickets_left):fly_dict= {'home_name':home_name,'fight_number':fight_number,'plane_number':plane_number,'fight_data':fight_data,'carrying_capacity':carrying_capacity,'tickets_left':tickets_left}else:print("乘員定額沒有大于余票量!請重新輸入信息")continuefly_list.append(fly_dict)answer=input('是否繼續(xù)添加航班信息?y/n')if answer=='y'or answer=='Y':continueelse:breaksave(fly_list,fly)print('航班信息錄入完畢')def search_info(): #查詢航班信息函數(shù)fly_query=[]while 1:fight_number=''home_name=''if os.path.exists(fly): #檢測文件中是否含有航班信息mode=input('按照航班號查找請輸入1,按照終點(diǎn)站名稱查找請輸入2:')if mode=='1':fight_number=input('請輸入航班號:')elif mode=='2':home_name=input('請輸入終點(diǎn)站名稱:')else:print('您的輸入格式有誤,請重新輸入!')search_info()with open(fly,'r') as rfile:fly_info=rfile.readlines()for item in fly_info:d=dict(eval(item))if fight_number!='':if d['fight_number']==fight_number:fly_query.append(d)elif home_name!='':if d['home_name']==home_name:fly_query.append(d)show_fly(fly_query)fly_query.clear()answer = input('是否繼續(xù)查詢航班信息?y/n')if answer == 'y' or answer == 'Y':continueelse:breakelse:print('暫時(shí)未保存航班信息數(shù)據(jù)!!!')returndef modify_info(): #修改航班信息函數(shù)show()if os.path.exists(fly):with open(fly,'r') as rfile:fly_old=rfile.readlines()else:returnfly_fight_number=input('請輸入要修改的航班的航班號:')with open(fly,'w') as file:for item in fly_old:d=dict(eval(item))if d['fight_number']==fly_fight_number:print('已經(jīng)找到航班信息,可以進(jìn)行修改操作')while 1:try:d['home_name']=input('請輸入終點(diǎn)站名稱:')d['plane_number']=input('請輸入飛機(jī)號:')d['fight_data']=input('請輸入飛行日期:')d['carrying_capacity']=input('請輸入乘員定額:')d['tickets_left']=input('請輸入余票量:')except:print('你的輸入有誤,請重新輸入!')else:breakfile.write(str(d)+'\n')print('信息修改成功!')else:file.write(str(d) + '\n')answer=input('是否繼續(xù)修改其他航班信息?y/n')if answer=='y' or answer=='Y':modify_info()def delete_info(): #刪除航班信息函數(shù)while 1:show() # 刪除之后重新顯示所有學(xué)生信息fly_fight_number=input('請輸入要刪除航班信息的航班號:')if fly_fight_number!='':if os.path.exists(fly):#判斷括號里的文件是否存在with open (fly,'r') as file:fly_old=file.readlines()else:fly_old=[]flag=0if fly_old:with open(fly, 'w') as file:for item in fly_old:d = dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['fight_number'] == fly_fight_number:flag=1else:file.write(str(d) + '\n')if flag:print(f'航班號為{fly_fight_number}的航班信息已被刪除')else:print(f'沒有找到航班號為{fly_fight_number}的航班信息')else:print('暫時(shí)未保存航班信息數(shù)據(jù)!')breakshow() # 刪除之后重新顯示所有學(xué)生信息answer = input('是否繼續(xù)刪除?y/n')if answer == 'y':continueelse:breakdef booking_service(): #乘客訂票系統(tǒng)people_list = []people_grade_list = []print('航空客服:歡迎進(jìn)入乘客訂票系統(tǒng),很高興為你服務(wù)。\n')while 1:print('航空客服:下面是航班信息一覽圖,請選擇合適的航班。\n')show()if os.path.exists(fly):with open(fly,'r') as rfile:fly_old=rfile.readlines()else:returnpeople_home_name=input('請輸入終點(diǎn)站名稱:')people_fight_data=input('請輸入你的起飛日期(標(biāo)準(zhǔn)輸入格式:星期三):')with open(fly, 'r') as rfile:fly_info = rfile.readlines()for item in fly_info:d = dict(eval(item))if people_home_name != ''and people_fight_data!='':if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:people_list.append(d)if len(people_list) == 0:print('沒有查詢到航班信息,無數(shù)據(jù)顯示!!!')booking_service()show_fly(people_list)answer = input('該航班基本符合情況是否預(yù)定?y/n')if answer == 'y' or answer == 'Y':booking_service_2(people_home_name,people_fight_data)breakelse:breakdef booking_service_2(people_home_name,people_fight_data): #乘客信息錄入函數(shù)ticket_list = []no_ticket_list=[]grade_ticket_list=[]grade_no_ticket_list = []people_ticket_number=0people_no_ticket_number = 0while 1:people_name = input('請輸入你的姓名:')people_number = input('請輸入你需要的飛機(jī)票數(shù):')for i in range(1, eval(people_number) + 1):print(f'由于你訂購了{people_number}張飛機(jī)票,接下來,你將選擇第{i}張飛機(jī)票的艙位等級。')people_grade = input('請輸入你的艙位等級(艙位等級:1、2、3):')if os.path.exists(fly):with open(fly, 'r') as rfile:fly_old = rfile.readlines()else:returnwith open(fly,'w') as wfile:for item in fly_old:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:while 1:d['tickets_left']=str(eval(d['tickets_left'])-1)breakwfile.write(str(d) + '\n')else:wfile.write(str(d) + '\n')with open(fly, 'r') as rfile:fly_info = rfile.readlines()for item in fly_info:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:if eval(d['tickets_left'])>=0:grade_ticket_list.append(people_grade)people_ticket_number+=1else:answer = input('該航班沒有余票,你將進(jìn)入候補(bǔ),您是否要預(yù)定?y/n')if answer == 'y' or answer == 'Y':grade_no_ticket_list.append(people_grade)people_no_ticket_number+=1if people_ticket_number!=0:ticket_dict={"終點(diǎn)站名稱":people_home_name,"飛行日期":people_fight_data,"乘客姓名":people_name,"飛機(jī)票數(shù)":people_ticket_number,"艙位等級":grade_ticket_list}ticket_list.append(ticket_dict)if people_no_ticket_number!=0:no_ticket_dict = {"終點(diǎn)站名稱": people_home_name, "飛行日期": people_fight_data,"乘客姓名": people_name, "飛機(jī)票數(shù)": people_no_ticket_number, "艙位等級": grade_no_ticket_list}no_ticket_list.append(no_ticket_dict)breaksave(ticket_list,ticket)save(no_ticket_list, no_ticket)print('訂票成功')def refund_system(): #乘客退票系統(tǒng)函數(shù)while 1:people_name=input('請輸入你的姓名:')people_home_name=''people_fight_data=''people_ticket_number=0if people_name!='':if os.path.exists(ticket):#判斷括號里的文件是否存在with open(ticket , 'r') as file_1,open(no_ticket,'r') as file_2:fly_old_1=file_1.readlines()fly_old_2=file_2.readlines()else:fly_old_1=[]fly_old_2 = []flag=0if fly_old_1 and fly_old_2:with open(ticket , 'w') as file_1,open(no_ticket,'w') as file_2:for item in fly_old_1:d = dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['乘客姓名'] == people_name:people_home_name=str(d["終點(diǎn)站名稱"])people_fight_data=str(d["飛行日期"])people_ticket_number+=d['飛機(jī)票數(shù)']flag=1else:file_1.write(str(d) + '\n')for item in fly_old_2:d = dict(eval(item)) # 將字符串轉(zhuǎn)成字典if d['乘客姓名'] == people_name:people_ticket_number += d['飛機(jī)票數(shù)']flag = 1else:file_2.write(str(d) + '\n')if flag:print(f'姓名為{people_name}的訂票信息已被刪除')else:print(f'沒有找到姓名為{people_name}的訂票信息')if os.path.exists(fly):with open(fly, 'r') as rfile:fly_old = rfile.readlines()else:returnwith open(fly, 'w') as wfile:for item in fly_old:d = dict(eval(item))if d['home_name'] == people_home_name and d['fight_data'] == people_fight_data:while 1:d['tickets_left'] = str(eval(d['tickets_left']) + people_ticket_number)breakwfile.write(str(d) + '\n')else:wfile.write(str(d) + '\n')else:print('無訂票信息')breakif __name__ == '__main__':main()總結(jié)
以上是生活随笔為你收集整理的python-数据结构-大学生-航空订票系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud面试题
- 下一篇: 利用Python收发邮件