class10_Demo

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

数据存储要求:

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

name:姓名(字符串)

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

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

points:积分余额(整数)

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

name:课程名称(字符串)

coach:教练姓名(字符串)

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

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

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

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

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

功能具体要求:

功能 说明
注册新会员 输入手机号、姓名、卡类型(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 main():
"""主菜单循环"""
pass
额外要求:

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

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

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

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

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

str1 = """
1. 注册新会员
2. 查看所有会员
3. 查询会员信息
4. 续费会员卡
5. 添加新课程
6. 查看所有课程
7. 预约课程
8. 统计信息
9. 显示预约日志
10. 退出系统
"""
members = {
    "15649786715" : {"name" : "古大","type" : "月卡","remain_days" : 30,"points" : 50},
    "13980266255": {"name": "大古", "type": "年卡", "remain_days": 365, "points": 600},
    "18026524012": {"name": "嘉豪", "type": "季卡", "remain_days": 90, "points": 150}
}
courses = {
    "C101" : {"name" : "有氧运动","coach" : "教练1","capacity" : 50, "booked" : 0},
    "C102": {"name": "力量训练", "coach": "教练2", "capacity": 20, "booked": 0},
    "C103": {"name": "柔韧训练", "coach": "教练3", "capacity": 45, "booked": 0},
    "C104": {"name": "动感单车", "coach": "教练4", "capacity": 60, "booked": 0}
}
reservations = []
def register_member(members: dict) -> None:
    """处理注册新会员逻辑,更新 members 字典"""
    """输入手机号、姓名、卡类型(1=月卡/2=季卡/3=年卡)。若手机号已存在则提示错误并重新输入。
    根据卡类型设置初始剩余天数:月卡30天,季卡90天,年卡365天。初始积分为0。注册成功后显示提示信息"""
    num = input("输入手机号:")
    while True:
        if num in members:
            vip_name = input("输入姓名:")
            vip_type = input("输入卡号(1=月卡/2=季卡/3=年卡):")
            if vip_type == "1":
                members[num]["type"] = 30
            elif vip_type == "2":
                members[num]["type"] = 90
            elif vip_type == "3":
                members[num]["type"] = 365
            members[num]["points"] = 0
            dict1 = {
                "name" : vip_name,
                "type" : vip_type,
                "remain_days" : members[num]["type"],
                "points" : members[num]["points"]
            }
            members[num] = dict1
            print(members)
            print("注册成功!")
            break
        else:
            print("错误,请重新输入!")


def show_all_members(members: dict) -> None:
    """打印所有会员信息,若无会员则输出提示"""
    """按手机号顺序打印每个会员的手机号、姓名、卡类型、剩余天数、积分。若无会员则提示“暂无会员信息”"""
    if len(members) == 0:
        print("暂无会员信息")
    else:
        for key,value in members.items():
            print(f"手机号:{key},姓名:{value['name']},卡类型:{value['type']},剩余天数:{value['remain_days']},积分:{value['points']}")


def query_member(members: dict) -> None:
    """按手机号查询并打印会员详细信息"""
    """输入手机号,若存在则显示该会员的详细信息和当前积分。若不存在则提示“会员不存在”"""
    num = input("输入手机号:")
    if num in members:
        print(f"手机号:{num},姓名:{members[num]['name']},卡类型:{members[num]['type']},剩余天数:{members[num]['remain_days']},积分:{members[num]['points']}")
    else:
        print("会员不存在!")


def renew_membership(members: dict) -> None:
    """处理会员卡续费逻辑,更新剩余天数和积分"""
    """输入手机号,若不存在则提示错误;若存在则显示当前卡类型和剩余天数,然后输入续费类型(1/2/3)。
    续费后叠加对应的天数,并增加积分(月卡+50分,季卡+150分,年卡+600分)。续费成功后显示更新后的信息"""
    num = input("输入手机号:")
    if num in members:
        print(f"续费前的卡类型:{members[num]['type']},续费前的剩余天数:{members[num]['remain_days']}")
        vip_type = input("输入续费类型(1/2/3)")
        if vip_type == "1":
            members[num]["remain_days"] += 30
            members[num]["points"] += 50
        elif vip_type == "2":
            members[num]["remain_days"] += 90
            members[num]["points"] += 150
        elif vip_type == "3":
            members[num]["remain_days"] += 365
            members[num]["points"] += 600
        print(f"更新后的剩余天数:{members[num]['remain_days']},更新后的积分:{members[num]['points']}")
    else:
        print("错误")


def add_course(courses: dict) -> None:
    """处理添加新课程逻辑,更新 courses 字典"""
    """输入课程编号、课程名称、教练姓名、容量上限。若编号已存在则提示错误并重新输入。容量必须为正整数,初始已预约人数为0。添加成功后显示提示"""
    while True:
        courses_id = input("输入课程编号:")
        if courses_id in courses:
            courses_name = input("输入课程名称:")
            coach_name = input("输入教练的名称:")
            courses[courses_id]["booked"] = 0
            capacity_max = int(input("输入容量上限:"))
            if capacity_max > 0:
                dict1 = {
                    "name" : courses_name,
                    "coach" : coach_name,
                    "capacity_max" : capacity_max,
                    "booked" :  courses[courses_id]["booked"]
                }
                courses[courses_id] = dict1
                print("添加成功!")

        else:
            print("错误,请重新输入!")


def show_all_courses(courses: dict) -> None:
    """打印所有课程信息,若无课程则输出提示"""
    if len(courses) == 0:
        print("无任何预约课程!")
    else:
        for key,value in courses.items():
            print(f"课程编号:{key},课程名称:{value['name']},教练姓名:{value['coach']},课程容量上限:{value['capacity']},当前已预约人数:{value['booked']}")


def reserve_course(members: dict, courses: dict, reservations: list) -> None:
    """处理课程预约逻辑,更新课程已约人数、会员积分,并记录预约日志"""
    """输入会员手机号,若不存在则提示错误并返回;若存在但剩余天数 ≤ 0 则提示“会员卡已过期,无法预约”;否则继续输入课程编号。
    若课程不存在则提示错误;若课程已预约人数等于容量则提示“该课程已约满”;
    否则预约成功:课程已预约人数加1,会员积分增加10分,并记录一条预约日志到 reservations 列表中(日期输入格式 YYYY-MM-DD)。
    成功后显示“预约成功,积分+10”。"""
    num = input("输入会员手机号:")
    if num in members:
        if members[num]["remain_days"] <= 0:
            print("会员卡已过期,无法预约!")
        else:
            courses_id = input("输入课程编号:")
            if courses_id in courses:
                if courses[courses_id]["capacity"] == courses[courses_id]["booked"]:
                    print("该课程已约满!")
                else:
                    courses[courses_id]["booked"] += 1
                    members[num]["points"] += 10
                    # ('预约', 会员手机号, 会员姓名, 课程编号, 课程名称, 预约日期)
                    # 日期统一用字符串表示,如 '2026-04-13'
                    tuple1 = ('预约',num,members[num]["name"],courses_id,courses[courses_id]["name"],"2026-04-13")
                    reservations.append(tuple1)
                    print("课程预约成功!")
            else:
                print("课程不存在!")
    else:
        print("该手机号没有注册会员!")


def get_statistics(members: dict, courses: dict) -> dict:
    """
    返回统计信息字典,包含:
    - 'total_members': 会员总数
    - 'type_counts': {'月卡': 人数, '季卡': 人数, '年卡': 人数}
    - 'top_points_member': (手机号, 姓名, 积分) 或 None
    - 'top_booking_course': (课程编号, 名称, 预约率) 或 None
    - 'full_courses': 预约满的课程列表,元素为 (编号, 名称)
    """
    """统计信息 输出以下统计内容:
- 会员总数,以及各卡类型(月卡/季卡/年卡)的会员人数
- 积分最高的会员信息(手机号、姓名、积分;若有多人并列则显示第一个)
- 预约率最高的课程信息(课程编号、名称、预约率,即 booked/capacity;若无课程则跳过)
- 剩余名额为0的课程列表(编号、名称;若无则提示“所有课程均有空位”) """
    total_members = total_yue = total_ji = total_year = 0
    type_counts = {}
    info = {}
    full_courses = tuple()
    total_members += len(members)
    for key,value in members.items():
        if value["type"] == "月卡":
            total_yue += 1
        elif value["type"] == "季卡":
            total_ji += 1
        elif value["type"] == "年卡":
            total_year += 1
    type_counts.update({total_yue,total_ji,total_year})
    for key2,value2 in courses.items():
        if value2["capacity"] - value2["booked"] == 0:
            full_courses = (key2,value2["name"])
        else:
            print("所有课程均有空位!")
    sorted_points = sorted(members,key=lambda a : members[a]["points"],reverse=True)
    top_points_member = (sorted_points[0],members[sorted_points[0]]["name"],members[sorted_points[0]]["points"])
    sorted_booked = sorted(courses,key=lambda a : (courses[a]["booked"]/courses[a]["capacity"]),reverse=True)
    top_booking_course = (sorted_booked[0],courses[sorted_booked[0]]["name"],courses[sorted_booked[0]]["booked"]/courses[sorted_booked[0]]["capacity"])
    dict1 = {
        "total_members" : total_members,
        "type_counts" : type_counts,
        "top_points_member" : top_points_member,
        "top_booking_course" : top_booking_course,
        "full_courses" : full_courses
    }
    info.update(dict1)
    return info


def show_statistics(members: dict, courses: dict) -> None:
    """调用 get_statistics 并格式化打印统计结果"""
    result = get_statistics(members,courses)
    for key,value in result.items():
        print(key,value)
        print()


def show_reservations(reservations: list) -> None:
    """打印所有预约操作日志"""
    """按时间顺序打印 reservations 中的每条记录,格式清晰。若无日志则提示“暂无预约记录”"""
    if len(reservations) == 0:
        print("暂无预约记录")
    else:
        reservations_print = sorted(reservations,key=lambda a : a[-1])
        record = 1
        for i in reservations_print:
            print(f"记录{record}:i")
            record += 1


def main():
    """主菜单循环"""
    while True:
        print(str1)
        choose = input("输入选择(1-10):")
        if choose == "1":
            register_member(members)
        elif choose == "2":
            show_all_members(members)
        elif choose == "3":
            query_member(members)
        elif choose == "4":
            renew_membership(members)
        elif choose == "5":
            add_course(courses)
        elif choose == "6":
            show_all_courses(courses)
        elif choose == "7":
            reserve_course(members,courses)
        elif choose == "8":
            get_statistics(members,courses)
            show_statistics(members,courses)
        elif choose == "9":
            show_reservations(reservations)
        elif choose == "10":
            print("退出成功!")
            break


main()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容