题目:健身房会员与课程预约管理系统
一、背景与要求
请编写一个命令行交互程序,实现对健身房会员和团课预约的管理。程序启动后显示菜单,用户输入选项数字执行相应功能,直到选择退出。

数据存储要求:

使用一个字典 members 作为会员主数据容器,键为会员手机号(字符串,11位),值为另一个字典,包含:

name:姓名(字符串)

type:卡类型(‘月卡’、‘季卡’、‘年卡’,字符串)

remain_days:剩余有效天数(整数)

points:积分余额(整数)

使用一个字典 courses 作为课程主数据容器,键为课程编号(字符串,格式如 C101),值为另一个字典,包含:

name:课程名称(字符串)

coach:教练姓名(字符串)

capacity:课程容量上限(整数)

booked:当前已预约人数(整数)

使用一个列表 reservations 记录每一次预约操作的日志,每条日志为元组,格式为:

(‘预约’, 会员手机号, 会员姓名, 课程编号, 课程名称, 预约日期)

日期统一用字符串表示,如 ‘2026-04-13’

程序功能菜单:

text

  1. 注册新会员
  2. 查看所有会员
  3. 查询会员信息
  4. 续费会员卡
  5. 添加新课程
  6. 查看所有课程
  7. 预约课程
  8. 统计信息
  9. 显示预约日志
  10. 退出系统
    功能具体要求:

功能 说明
注册新会员 输入手机号、姓名、卡类型(1=月卡/2=季卡/3=年卡)。若手机号已存在则提示错误并重新输入。根据卡类型设置初始剩余天数:月卡30天,季卡90天,年卡365天。初始积分为0。注册成功后显示提示信息。
查看所有会员 按手机号顺序打印每个会员的手机号、姓名、卡类型、剩余天数、积分。若无会员则提示“暂无会员信息”。
查询会员信息 输入手机号,若存在则显示该会员的详细信息和当前积分。若不存在则提示“会员不存在”。
续费会员卡 输入手机号,若不存在则提示错误;若存在则显示当前卡类型和剩余天数,然后输入续费类型(1/2/3)。续费后叠加对应的天数,并增加积分(月卡+50分,季卡+150分,年卡+600分)。续费成功后显示更新后的信息。
添加新课程 输入课程编号、课程名称、教练姓名、容量上限。若编号已存在则提示错误并重新输入。容量必须为正整数,初始已预约人数为0。添加成功后显示提示。
查看所有课程 按课程编号顺序打印每门课程的编号、名称、教练、容量、已预约人数、剩余名额。若无课程则提示“暂无课程信息”。
预约课程 输入会员手机号,若不存在则提示错误并返回;若存在但剩余天数 ≤ 0 则提示“会员卡已过期,无法预约”;否则继续输入课程编号。若课程不存在则提示错误;若课程已预约人数等于容量则提示“该课程已约满”;否则预约成功:课程已预约人数加1,会员积分增加10分,并记录一条预约日志到 reservations 列表中(日期输入格式 YYYY-MM-DD)。成功后显示“预约成功,积分+10”。
统计信息 输出以下统计内容:

  • 会员总数,以及各卡类型(月卡/季卡/年卡)的会员人数
  • 积分最高的会员信息(手机号、姓名、积分;若有多人并列则显示第一个)
  • 预约率最高的课程信息(课程编号、名称、预约率,即 booked/capacity;若无课程则跳过)
  • 剩余名额为0的课程列表(编号、名称;若无则提示“所有课程均有空位”)
    显示预约日志 按时间顺序打印 reservations 中的每条记录,格式清晰。若无日志则提示“暂无预约记录”。
    退出系统 结束程序。
    二、函数设计约束(重点考察部分)
    必须按以下函数划分来组织代码,每个函数负责明确的功能,主程序仅负责菜单调度与用户交互。

python
def register_member(members: dict) -> None:
“”“处理注册新会员逻辑,更新 members 字典”“”
pass

def show_all_members(members: dict) -> None:
“”“打印所有会员信息,若无会员则输出提示”“”
pass

def query_member(members: dict) -> None:
“”“按手机号查询并打印会员详细信息”“”
pass

def renew_membership(members: dict) -> None:
“”“处理会员卡续费逻辑,更新剩余天数和积分”“”
pass

def add_course(courses: dict) -> None:
“”“处理添加新课程逻辑,更新 courses 字典”“”
pass

def show_all_courses(courses: dict) -> None:
“”“打印所有课程信息,若无课程则输出提示”“”
pass

def reserve_course(members: dict, courses: dict, reservations: list) -> None:
“”“处理课程预约逻辑,更新课程已约人数、会员积分,并记录预约日志”“”
pass

def get_statistics(members: dict, courses: dict) -> dict:
“”"
返回统计信息字典,包含:
- ‘total_members’: 会员总数
- ‘type_counts’: {‘月卡’: 人数, ‘季卡’: 人数, ‘年卡’: 人数}
- ‘top_points_member’: (手机号, 姓名, 积分) 或 None
- ‘top_booking_course’: (课程编号, 名称, 预约率) 或 None
- ‘full_courses’: 预约满的课程列表,元素为 (编号, 名称)
“”"
pass

def show_statistics(members: dict, courses: dict) -> None:
“”“调用 get_statistics 并格式化打印统计结果”“”
pass

def show_reservations(reservations: list) -> None:
“”“打印所有预约操作日志”“”
pass

def main():
“”“主菜单循环”“”
pass
额外要求:

使用类型注解(如函数签名中所示)增强代码可读性。

在适当位置使用 if/elif/else 进行条件判断(例如菜单分支、手机号存在性、课程容量判断)。

在统计信息计算、遍历容器时必须使用循环(如 for 遍历字典的 items())。

对用户输入的卡类型和容量等进行合法性校验(非数字或超出范围时提示重新输入)。

日期格式不要求严格校验,但需按字符串正确记录。
代码:

members={
    "13699417463":{"name":"张三","type":"年卡","remain_days":100,"points":10086},
    "18008167463":{"name":"李四","type":"季卡","remain_days":150,"points":14156}
}
courses={
    "C101":{"name":"C程序设计","coach":"王八","capacity":60,"booked":20,},
    "C102":{"name":"JAVA设计","coach":"劳大","capacity":80,"booked":30,}
}
reservations= [
    ('预约',13699417463,"张三","C101","C程序设计",'2026-04-13'),
    ]

def add_members(members):
    yes_no = True
    phone = input("请输入手机号")
    for i,j in members.items():
        if phone == i:
            yes_no = False
    if yes_no == False:
        print("添加失败,该用户已存在!")
    else:    
        name = input("请输入会员名")
        type_num = input("请输入卡类型")
        if type_num == 1:
            type = "月卡"
            remain_days = 30
        elif type_num == 2:
            type = "季卡"
            remain_days = 90
        elif type_num == 3:
            type = "年卡"
            remain_days = 365
        points = 0
        dict1={
            "name":name,
            "type":type,
            "remain_days":remain_days,
            "points":points
        }
        members[phone]=dict1
        print(f"会员{name}添加成功")

def show_all_members():
    if len(members) == 0:
        print("暂无会员信息")
    else:
        for i,j in members.items():
            print(f"会员名:{j['name']},手机号:{i},卡类型:{j['type']},剩余天数:{j['remain_days']},积分余额:{j['points']}")

def show_it_members():
    yes_no = False
    phone = input("请输入会员手机号")
    for i,j in members.items():
        if i == phone:
            print(f"会员名:{j['name']},手机号:{i},卡类型:{j['type']},剩余天数:{j['remain_days']},积分余额:{j['points']}")
            yes_no = True
    if yes_no == False:
        print("用户不存在,请检查手机号是否正确")

def add_card():
    yes_no = False
    phone = input("请输入手机号")
    for i,j in members.items():
        if i == phone:
            print(f"当前卡类型:{j['type']},剩余:{j['remain_days']}天")
            yes_no = True
            add_card1 = input("请输入续费类型")
            if add_card1 == "1":
                for i,j in members.items():
                    if i == phone:
                        j["type"]="月卡"
                        j["remain_days"] = j["remain_days"]+50
            elif add_card1 == "2":
                for i,j in members.items():
                    if i == phone:
                        j["type"]="季卡"
                        j["remain_days"] = j["remain_days"]+150
            elif add_card1 == "3":
                for i,j in members.items():
                    if i == phone:
                        j["type"]="年卡"
                        j["remain_days"] = j["remain_days"]+600
            for i,j in members.items():
                if i == phone:
                    print(f"会员名:{j['name']},手机号:{i},卡类型:{j['type']},剩余天数:{j['remain_days']},积分余额:{j['points']}")
    if yes_no == False:
        print("暂无会员信息")

def add_courses():
    yes_no = True
    courses_id = input("请输入课程编号")
    for i,j in members.items():
        if courses_id == i:
            yes_no = False
    if yes_no == False:
        print("添加失败,该课程已存在!")
    else:    
        name = input("请输入课程名")
        coach = input("请输入教练姓名")
        cap = input("请输入最大容量")
        booked = 0
        dict1={
            "name":name,
            "coach":coach,
            "capacity":cap,
            "booked":booked
        }
        courses[courses_id]=dict1
        print(f"课程{name}添加成功")
        
def show_all_courses():
    if len(courses) == 0:
        print("暂无课程信息")
    else:
        for i,j in courses.items():
            cap_num = int(j['capacity'])-int(j['booked'])
            print(f"课程:{j['name']},课程编号:{i},课程教练:{j['coach']},容量:{j['capacity']},已预约人数:{j['booked']}剩余容量:{cap_num}")    

def reserve_courses():
    phone = input("请输入手机号")
    yes_no1 = False
    for i,j in members.items():
        if i == phone:
            yes_no1 = True
            if j['remain_days']<=0:
                print("会员卡已过期,无法预约")
            else:
                courses_id = input("请输入预约的课程编号")
                yes_no2 = False
                for i,j in courses.items():
                    if i == courses_id:
                        yes_no2=True
                        if int(j['capacity'])==int(j['booked']):
                            print("该课程已约满")
                        else:
                            print("预约成功")
                            j["booked"]=j["booked"]+1
                            members[phone]['points'] = members[phone]['points']+10
                            booked = ("预约",phone,members[phone]['name'],i,j['name'],"2026-04-13")
                            print("预约成功,积分+10")
                if yes_no2 == False:
                    print("该课程不存在")
    if yes_no1 == False:
        print("手机号不存在")

def get_statistics():

    print(f"会员总数:{len(members)}")#total_members
    top_points_member=0
    num_m=num_j=num_y=0
    for i,j in members.items():
        if j['type']=="月卡":
            num_m = num_m+1
        elif j['type']=="季卡":
            num_j = num_j+1        
        elif j['type']=="年卡":
            num_y = num_y+1
        if j['points']>top_points_member:
            top_points_member = j["points"]
    print(f"月卡人数:{num_m},季卡人数:{num_j},年卡人数:{num_y}")
    top_booking_course = 0
    count = 1
    for i,j in courses.items():
        if (j['booked']/j['capacity'])>top_booking_course:
            top_booking_course = (j['booked']/j['capacity'])
        if (j['booked']/j['capacity'])==1:
            print(f"剩余名额为0的课程编号:{i},名称:{j['name']},")
            count = 0
    if count ==1:
        print("所有课程均有空位")
    for i,j in courses.items():
        if (j['booked']/j['capacity'])==top_booking_course:
            print(f"预约率最高的课程编号:{i},名称:{j['name']},预约率:{top_booking_course}")
    
def show_reservations():
    if (len(reservations) == 0):
        print("暂无预约记录")
    else:
        for i in reservations:
            print(i)

                   
        



str1 = """1. 注册新会员
2. 查看所有会员
3. 查询会员信息
4. 续费会员卡
5. 添加新课程
6. 查看所有课程
7. 预约课程
8. 统计信息
9. 显示预约日志
10. 退出系统"""


while True:
    print(str1)
    num = input("请输入功能编号")
    if num == "1":
        add_members(members)
    if num =="2":
        show_all_members()
    if num == "3":
        show_it_members()
    if num == "4":
        add_card()
    if num == "5":
        add_courses()
    if num =="6":
        show_all_courses()
    if num =="7":
        reserve_courses()
    if num =="8":
        get_statistics()
    if num == "9":
        show_reservations()
    if num == "10":
        break

更多推荐