python-数据结构-大学生-航空订票系统

1.问题描述及任务描述

1.1问题描述

航空订票系统:可以实现航空客运订票的主要业务活动
基本要求:
(1)航线管理:每条航线所涉及的信息由:终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量;
(2)客户管理:有关订票的客户信息(包括姓名、订票数、舱位等级(1、2和3))以及等候替补的客户名单(包括姓名、所需票量);
(3)系统实现的主要操作和功能(查询航线、承办订票业务和承办退票业务);

1.2问题分析

按照IPO的程序撰写操作。本问题是设计一款航空订票系统,其中涵盖航线管理、订票服务和退票服务。
航线管理涉及添加航班信息、查询航班信息、修改航班休息、删除航班信息等操作,其中必须要保证成员定额必须大于等于余票量,否则不符合程序。同时需要将航班信息进行存储。
订票服务需包含航班信息的查找和修改操作以及添加乘客信息,并将乘客信息进行存储。按照余票量的有无,乘客需分为已定票和候补票两种,分别将这两类乘客信息存储到不同的文件中,防止数据的混乱。
退票服务涉及航班信息的查找、乘客信息的查找、乘客信息的删除、航班信息中余票量的修改。
根据问题分析,可以确定程序需要具备含有添加、删除、修改、查询、订票、退票功能,并能够对数据文件进行读写操作。完成程序基本思路的确定,程序主要框架的建立,编写主函数及子函数,同时编写文件的读写操作,数据的展示操作。设计完成后,对程序进行总体测试和优化。

2.概要设计

2.1基本思路

根据题目信息,确定好程序功能模块,建立主菜单,其中包含航班信息的添加、查询、删除、修改、乘客的订票服务和退票服务、以及退出系统,共计七大模块,利用函数对各个功能模块进行打包封装。在主函数中以while循环形式确定用户输入的指令,根据用户输入的不同指令调用不同的函数功能入口,从而实现航空订票系统的各项功能。

2.2功能模块设计

功能模块设计图如图所示,模块根据航空订票系统内容来划分,具体操作由用户键盘输入选择功能,将航班信息和乘客已定票和候补票信息分别存储到fly=“fly.txt”、ticket=“ticket.txt”、no_ticket=“no_ticket.txt”文件中。并对fly=“fly.txt”文件中的航班信息进行展示。
图2-1 功能设计模块

3.函数调用关系

3.1函数调用关系

在这里插入图片描述
代码展示如下:

def main():  #主函数
    while 1:
        print_menu()
        choice=int(input("请选择:"))
        if choice in [1,2,3,4,5,6]:
            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.客户订票服务
            elif choice==6:
                refund_system()       #6.客户退票服务
            elif choice==7:
                answer=input('你确定要退出系统吗?y/n')
                if answer =='y'or answer =='Y':
                    print('感谢你的使用!')
                    break
                else:
                    continue


def print_menu():  #菜单目录
    print('*' * 30)
    print('-' * 13 + '菜单' + '-' * 13)
    print('1.添加航班信息')
    print('2.查询航班信息')
    print('3.修改航班信息')
    print('4.删除航班信息')
    print('5.客户订票服务')
    print('6.客户退票服务')
    print('7.退出系统')
    print('*' * 30)

def add_info():
	pass

def search_info():
	pass

def modify_info():
	pass

def delete_info():
	pass

def booking_service():
	pass

def refund_system():
	pass

if __name__ == '__main__':
    main()

3.2子函数功能设计

3.2.1添加航班信息

函数add_info()无返回值,无形参。函数的主要功能是让管理员输入航班信息并添加到fly.txt文件中。在函数体中,首先创建了一个fly_list=[]列表,然后依次输入航班信息,并将信息储存在字典fly_dict{}中,然后将字典添加进fly_list.append(fly_dict)完成对航班信息的存储。输入信息时,按照要求,乘员定额必须大于或等于余票量,若违反此条规定,则重新输入航班信息。函数内部是以一个while无限循环为主体,顺利完成一组航班信息的录入之后,系统会自动提示,是否继续添加航班信息?y/n,输入“Y”或“y”则退出while无限循环即可安全退出添加航班信息操作,重新回到系统菜单。若输入“N”或“n”则再次循环,可再次添加航班信息。

def add_info():  #1、添加航班信息函数
    fly_list=[]
    while 1:
        home_name = input('终点站名称:')
        fight_number = input('航班号:')
        plane_number = input('飞机号:')
        fight_data = input('飞行日期(标准输入格式:星期三):')
        carrying_capacity = input('该型号飞机乘员定额:')
        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('是否继续添加航班信息?y/n')
        if answer=='y'or answer=='Y':
            continue
        else:
            break
    save(fly_list,fly)
    print('航班信息录入完毕')

3.2.2查询航班信息

函数search_info()无返回值,无形参。函数主要功能是让管理员输入航班号或终点站名称查询航班具体信息。在函数体中,首先创建了一个fly_query=[]列表,然后根据系统提示“按照航班号查找请输入1,按照终点站名称查找请输入2”,输入正确的格式即可进入查询模块,若输入格式错误,则重新输入,此时在函数体中嵌套了search_info()函数。进入查询模块之后,系统会读取fly.txt中航班信息数据,将读取的航班信息与输入的航班信息对比,若相等则将文件fly.txt中含该特定信息的整行航班信息添加到fly_query=[]列表中,然后利用函数show_fly(fly_query),对fly_query=[]列表中的信息进行展示。展示完成后,对fly_query=[]列表中的信息进行清除,以待下一次查询。函数内部是以一个while无限循环为主体,顺利完成一组航班信息的查询之后,系统会自动提示,是否继续查询航班信息?y/n,输入“Y”或“y”则退出while无限循环即可安全退出查询航班信息操作,重新回到系统菜单。若输入“N”或“n”则再次循环,可再次查询航班信息。若fly.txt文件中没有存储航班信息,系统会打印输出“暂时未保存航班信息数据!!!”,然后退回菜单系统。

def search_info():
    fly_query=[]
    while 1:
        fight_number=''
        home_name=''
        if os.path.exists(fly):
            mode=input('按照航班号查找请输入1,按照终点站名称查找请输入2:')
            if mode=='1':
                fight_number=input('请输入航班号:')
            elif mode=='2':
                home_name=input('请输入终点站名称:')
            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('是否继续查询航班信息?y/n')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break
        else:
            print('暂未保存此航班信息!!!')
            return

3.2.3修改航班信息

函数modify_info()无返回值,无形参。函数主要功能是让管理员输入航班号来修改已经存储完成的航班信息。在函数体中,首先套用了show()函数,目的是展示以存储的全部航班信息,便于接下来的操作。然后判断fly.txt文件中是否有数据存在,若没有数据存在,则返回主菜单。根据系统提示,输入航班号,接着打开文件,对文件内的航班信息进行行遍历操作。若航班信息中的航班号与输入信息相同,则修改该航班号所在行的所有航班信息,并将修改完成后的航班信息重新写入文件。若文件中没有与输入信息相同的航班号,则显示“未找到航班号为{fly_fight_number}的航班信息,无法进行删除操作!”。修改操作完成后,系统会自动提示,,是否继续修改航班信息?y/n,输入“Y”或“y”即可安全退出修改航班信息操作,重新回到系统菜单。若输入“N”或“n”则重新执行修改航班信息操作。

def modify_info():  #航班信息修改函数
    show()
    if os.path.exists(fly):
        with open(fly,'r') as rfile:
            fly_old=rfile.readlines()
    else:
        return
    fly_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('已经找到航班信息,可以进行修改操作')
                while 1:
                    try:
                        d['home_name']=input('请输入终点站名称:')
                        d['plane_number']=input('请输入飞机号:')
                        d['fight_data']=input('请输入飞行日期:')
                        d['carrying_capacity']=input('请输入乘员定额:')
                        d['tickets_left']=input('请输入余票量:')
                    except:
                        print('你的输入有误,请重新输入!')
                    else:
                        break
                file.write(str(d)+'\n')
                print('信息修改成功!')
            else:
                file.write(str(d) + '\n')
        answer=input('是否继续修改其他航班信息?y/n')
        if answer=='y' or answer=='Y':
            modify_info()

3.2.4删除航班信息

函数delete_info()无返回值,无形参。函数主要功能是让管理员输入航班号来删除已经存储完成的航班信息。在函数体中,首先套用了show()函数,目的是展示以存储的全部航班信息,便于接下来的操作。按照系统提示“请输入要删除航班信息的航班号:”然后接着打开文件,对文件内的航班信息进行行遍历操作fly_old=file.readlines()。若航班信息中的航班号与输入信息相同,则删除该航班号所在行的所有航班信息,并将其他不相关的航班信息再次写进文件fly.txt中。若文件中没有航班信息,系统会显示“暂时未保存航班信息数据!”并返回系统菜单。删除完成之后,显示文件中的航班信息。函数内部是以一个while无限循环为主体,顺利完成一组航班信息的删除操作之后,系统会自动提示,是否继续删除航班信息?y/n,输入“Y”或“y”则退出while无限循环即可安全退出删除航班信息操作,重新回到系统菜单。若输入“N”或“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=0
            if fly_old:
                with open(fly, 'w') as file:
                    for item in fly_old:
                        d = dict(eval(item))  # 将字符串转成字典
                        if d['fight_number'] == fly_fight_number:
                            flag=1
                        else:
                            file.write(str(d) + '\n')
                    if flag:
                        print(f'航班号为{fly_fight_number}的航班信息已被删除')
                    else:
                        print(f'没有找到航班号为{fly_fight_number}的航班信息')
            else:
                 print('无航班信息')
                 break
            show()  # 删除之后重新显示所有学生信息
            answer = input('是否继续删除?y/n\n')
            if answer == 'y':
                continue
            else:
                break

3.2.5客户订票服务

函数booking_service()无返回值,无形参。函数主要功能是让用户输入终点站名称和飞行日期来选择航班。在函数体中,首先创建了两个列表people_list = []、people_grade_list = []。然后系统会判断文件fly.txt中是否含有航班信息,若没存储航班信息,系统会自动返回到系统菜单。若文件中含有航班信息,会打开文件,对文件内的航班信息进行行遍历操作fly_old=rfile.readlines()。接着按照系统提示输入“请输入终点站名称:”和“请输入你的起飞日期(标准输入格式:星期三):”。根据用户订票习惯,依靠终点站名称和飞行日期可以满足用户的飞行需求。输入完成后,依靠for循环检验fly_old中的信息是否有同时符合用户输入的终点站名称和飞行日期。若有符合条件的航班信息,将信息添加至people_list = []列表中people_list.append(d)。检验列表people_list的长度,若len(people_list)==0,则系统显示“没有查询到航班信息,无数据显示!!!”,并再次执行booking_service()(我们在if语句中嵌套了booking_service()函数)。接着使用show_fly(people_list)展示符合条件的航班信息。函数内部是以一个while无限循环为主体,用户顺利完成一组航班信息的搜索之后,系统会自动提示,该航班基本符合情况是否预定?y/n,输入“Y”或“y”则退出while无限循环进入乘客信息录入函数booking_service_2()。若输入“N”或“n”则再次循环,则退出while无限循环进入系统菜单。

def booking_service():
    people_list = []
    people_grade_list = []
    print('航空客服:欢迎进入乘客订票系统,很高兴为你服务。')
    while 1:
        print('航空客服:下面是航班信息一览图,请选择合适的航班。')
        show()
        people_home_name=input('请输入终点站名称:')
        people_fight_data=input('请输入你的起飞日期(标准输入格式:星期三):')
        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('没有查询到航班信息,无数据显示!!!')
            booking_service()
        show_fly(people_list)
        answer = input('该航班基本符合情况是否预定?y/n')
        if answer == 'y' or answer == 'Y':
            booking_service_2(people_home_name,people_fight_data)
            break
        else:
            break


def booking_service_2(people_home_name,people_fight_data):
    ticket_list = []
    no_ticket_list=[]
    grade_ticket_list=[]
    grade_no_ticket_list = []
    people_ticket_number=0
    people_no_ticket_number = 0
    while 1:
        people_name = input('请输入你的姓名:')
        people_number = input('请输入你需要的飞机票数:')
        for i in range(1, eval(people_number) + 1):
            print(f'由于你订购了{people_number}张飞机票,接下来,你将选择第{i}张飞机票的舱位等级。')
            people_grade = input('请输入你的舱位等级(舱位等级:1、2、3):')
            if os.path.exists(fly):
                with open(fly, 'r') as rfile:
                    fly_old = rfile.readlines()
            else:
                return
            with 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)
                            break
                        wfile.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+=1
                        else:
                            answer = input('该航班没有余票,你将进入候补,您是否要预定?y/n')
                            if answer == 'y' or answer == 'Y':
                                grade_no_ticket_list.append(people_grade)
                                people_no_ticket_number+=1
        if people_ticket_number!=0:
            ticket_dict={"终点站名称":people_home_name,"飞行日期":people_fight_data,
                         "乘客姓名":people_name,"飞机票数":people_ticket_number,"舱位等级":grade_ticket_list}
            ticket_list.append(ticket_dict)
        if people_no_ticket_number!=0:
            no_ticket_dict = {"终点站名称": people_home_name, "飞行日期": people_fight_data,
                           "乘客姓名": people_name, "飞机票数": people_no_ticket_number, "舱位等级": grade_no_ticket_list}
            no_ticket_list.append(no_ticket_dict)
        break
    save(ticket_list,ticket)
    save(no_ticket_list, no_ticket)
    print('订票成功')

3.2.6客户退票服务

函数refund_system()无返回值,无形参。函数主要功能是让用户输入姓名来进行飞机票退票操作。首先系统会提示用户“请输入你的姓名:”,输入完成后。系统会判断文件ticket.txt和no_ticket.txt中是否含有乘客信息,若没有乘客信息,系统会自动返回到系统菜单。若文件中含有乘客信息,系统会打开文件,并对文件内的乘客信息进行遍历操作fly_old_1=file_1.readlines()、fly_old_2=file_2.readlines()。依靠for循环检验fly_old_1中的信息是否有符合用户输入的姓名。若有符合条件的乘客信息,令people_home_name=str(d[“终点站名称”])、people_fight_data=str(d[“飞行日期”])、people_ticket_number+=d[‘飞机票数’]便于下一步操作。再次依靠for循环检验fly_old_2中的信息是否有符合用户输入的姓名。若有符合条件的乘客信息,令people_ticket_number += d[‘飞机票数’]。同时系统会删除文件ticket.txt和no_ticket.txt中该名乘客信息。紧接着系统会判断文件fly.txt中是否含有航班信息,若没有航班信息,系统会自动返回到系统菜单。若文件中含有航班信息,系统会打开文件,并对文件内的航班信息进行遍历操作fly_old = rfile.readlines()。依靠for循环检验fly_old中的信息是否有同时符合people_home_name和people_fight_data,若有同时符合的航班信息,将该条航班信息中的余票量进行修改d[‘tickets_left’] = str(eval(d[‘tickets_left’]) + people_ticket_number)并写入文件中进行保存。完成系统提示操作后,系统会回到系统菜单。

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=0
            if fly_old:
                with open(ticket, 'w') as file:
                    for item in fly_old:
                        d = dict(eval(item))  # 将字符串转成字典
                        if d['乘客姓名'] == people_name:
                            people_home_name=str(d["终点站名称"])
                            people_fight_data=str(d["飞行日期"])  
                            flag=1
                        else:
                            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:
                    return
                with 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)
                                break
                            wfile.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'   #储存候补乘客信息


def save(lst,txt):  #写入文件函数
    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):  #航班信息展示函数
    if len(lst) == 0:
        print('没有查询到航班信息,无数据显示!!!')
        return
    format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
    print(format_title.format('终点站名称','航班号','飞机号','飞行日期',
                              '乘员定额','余票量'))
    # 定义内容的显示格式
    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('暂时未保存航班信息数据!')


def main():  #主函数
    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.客户订票服务
            elif choice==6:
                refund_system()       #6.客户退票服务
            elif choice==7:
                answer=input('你确定要退出系统吗?y/n')
                if answer =='y'or answer =='Y':
                    print('感谢你的使用!')
                    break
                else:
                    continue


def print_menu():  #菜单目录函数
    print('*' * 30)
    print('-' * 13 + '菜单' + '-' * 13)
    print('1.添加航班信息')
    print('2.查询航班信息')
    print('3.修改航班信息')
    print('4.删除航班信息')
    print('5.客户订票服务')
    print('6.客户退票服务')
    print('7.退出系统')
    print('*' * 30)


def add_info():  #1、添加航班信息函数
    fly_list=[]
    while 1:
        home_name = input('终点站名称:')
        fight_number = input('航班号:')
        plane_number = input('飞机号:')
        fight_data = input('飞行日期(标准输入格式:星期三):')
        carrying_capacity = input('该型号飞机乘员定额:')
        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("乘员定额没有大于余票量!请重新输入信息")
            continue
        fly_list.append(fly_dict)
        answer=input('是否继续添加航班信息?y/n')
        if answer=='y'or answer=='Y':
            continue
        else:
            break
    save(fly_list,fly)
    print('航班信息录入完毕')


def search_info():  #查询航班信息函数
    fly_query=[]
    while 1:
        fight_number=''
        home_name=''
        if os.path.exists(fly): #检测文件中是否含有航班信息
            mode=input('按照航班号查找请输入1,按照终点站名称查找请输入2:')
            if mode=='1':
                fight_number=input('请输入航班号:')
            elif mode=='2':
                home_name=input('请输入终点站名称:')
            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('是否继续查询航班信息?y/n')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break
        else:
            print('暂时未保存航班信息数据!!!')
            return


def modify_info():  #修改航班信息函数
    show()
    if os.path.exists(fly):
        with open(fly,'r') as rfile:
            fly_old=rfile.readlines()
    else:
        return
    fly_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('已经找到航班信息,可以进行修改操作')
                while 1:
                    try:
                        d['home_name']=input('请输入终点站名称:')
                        d['plane_number']=input('请输入飞机号:')
                        d['fight_data']=input('请输入飞行日期:')
                        d['carrying_capacity']=input('请输入乘员定额:')
                        d['tickets_left']=input('请输入余票量:')
                    except:
                        print('你的输入有误,请重新输入!')
                    else:
                        break
                file.write(str(d)+'\n')
                print('信息修改成功!')
            else:
                file.write(str(d) + '\n')
    answer=input('是否继续修改其他航班信息?y/n')
    if answer=='y' or answer=='Y':
        modify_info()


def delete_info():  #删除航班信息函数
    while 1:
        show()  # 删除之后重新显示所有学生信息
        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=0
            if fly_old:
                with open(fly, 'w') as file:
                    for item in fly_old:
                        d = dict(eval(item))  # 将字符串转成字典
                        if d['fight_number'] == fly_fight_number:
                            flag=1
                        else:
                            file.write(str(d) + '\n')
                    if flag:
                        print(f'航班号为{fly_fight_number}的航班信息已被删除')
                    else:
                        print(f'没有找到航班号为{fly_fight_number}的航班信息')
            else:
                 print('暂时未保存航班信息数据!')
                 break
            show()  # 删除之后重新显示所有学生信息
            answer = input('是否继续删除?y/n')
            if answer == 'y':
                continue
            else:
                break


def booking_service():  #乘客订票系统
    people_list = []
    people_grade_list = []
    print('航空客服:欢迎进入乘客订票系统,很高兴为你服务。\n')
    while 1:
        print('航空客服:下面是航班信息一览图,请选择合适的航班。\n')
        show()
        if os.path.exists(fly):
            with open(fly,'r') as rfile:
                fly_old=rfile.readlines()
        else:
            return
        people_home_name=input('请输入终点站名称:')
        people_fight_data=input('请输入你的起飞日期(标准输入格式:星期三):')
        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('没有查询到航班信息,无数据显示!!!')
            booking_service()
        show_fly(people_list)
        answer = input('该航班基本符合情况是否预定?y/n')
        if answer == 'y' or answer == 'Y':
            booking_service_2(people_home_name,people_fight_data)
            break
        else:
            break


def booking_service_2(people_home_name,people_fight_data):  #乘客信息录入函数
    ticket_list = []
    no_ticket_list=[]
    grade_ticket_list=[]
    grade_no_ticket_list = []
    people_ticket_number=0
    people_no_ticket_number = 0
    while 1:
        people_name = input('请输入你的姓名:')
        people_number = input('请输入你需要的飞机票数:')
        for i in range(1, eval(people_number) + 1):
            print(f'由于你订购了{people_number}张飞机票,接下来,你将选择第{i}张飞机票的舱位等级。')
            people_grade = input('请输入你的舱位等级(舱位等级:1、2、3):')
            if os.path.exists(fly):
                with open(fly, 'r') as rfile:
                    fly_old = rfile.readlines()
            else:
                return
            with 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)
                            break
                        wfile.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+=1
                        else:
                            answer = input('该航班没有余票,你将进入候补,您是否要预定?y/n')
                            if answer == 'y' or answer == 'Y':
                                grade_no_ticket_list.append(people_grade)
                                people_no_ticket_number+=1
        if people_ticket_number!=0:
            ticket_dict={"终点站名称":people_home_name,"飞行日期":people_fight_data,
                         "乘客姓名":people_name,"飞机票数":people_ticket_number,"舱位等级":grade_ticket_list}
            ticket_list.append(ticket_dict)
        if people_no_ticket_number!=0:
            no_ticket_dict = {"终点站名称": people_home_name, "飞行日期": people_fight_data,
                           "乘客姓名": people_name, "飞机票数": people_no_ticket_number, "舱位等级": grade_no_ticket_list}
            no_ticket_list.append(no_ticket_dict)
        break
    save(ticket_list,ticket)
    save(no_ticket_list, no_ticket)
    print('订票成功')



def refund_system():  #乘客退票系统函数
    while 1:
        people_name=input('请输入你的姓名:')
        people_home_name=''
        people_fight_data=''
        people_ticket_number=0
        if 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=0
            if 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))  # 将字符串转成字典
                        if d['乘客姓名'] == people_name:
                            people_home_name=str(d["终点站名称"])
                            people_fight_data=str(d["飞行日期"])
                            people_ticket_number+=d['飞机票数']
                            flag=1
                        else:
                            file_1.write(str(d) + '\n')
                    for item in fly_old_2:
                        d = dict(eval(item))  # 将字符串转成字典
                        if d['乘客姓名'] == people_name:
                            people_ticket_number += d['飞机票数']
                            flag = 1
                        else:
                            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:
                    return
                with 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)
                                break
                            wfile.write(str(d) + '\n')
                        else:
                            wfile.write(str(d) + '\n')
            else:
                 print('无订票信息')
                 break

if __name__ == '__main__':
    main()
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐