class10_Demo

題目:健身房會(huì)員與課程預(yù)約管理系統(tǒng)
一、背景與要求
請(qǐng)編寫一個(gè)命令行交互程序,實(shí)現(xiàn)對(duì)健身房會(huì)員和團(tuán)課預(yù)約的管理。程序啟動(dòng)后顯示菜單,用戶輸入選項(xiàng)數(shù)字執(zhí)行相應(yīng)功能,直到選擇退出。

數(shù)據(jù)存儲(chǔ)要求:

使用一個(gè)字典 members 作為會(huì)員主數(shù)據(jù)容器,鍵為會(huì)員手機(jī)號(hào)(字符串,11位),值為另一個(gè)字典,包含:

name:姓名(字符串)

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

remain_days:剩余有效天數(shù)(整數(shù))

points:積分余額(整數(shù))

使用一個(gè)字典 courses 作為課程主數(shù)據(jù)容器,鍵為課程編號(hào)(字符串,格式如 C101),值為另一個(gè)字典,包含:

name:課程名稱(字符串)

coach:教練姓名(字符串)

capacity:課程容量上限(整數(shù))

booked:當(dāng)前已預(yù)約人數(shù)(整數(shù))

使用一個(gè)列表 reservations 記錄每一次預(yù)約操作的日志,每條日志為元組,格式為:

('預(yù)約', 會(huì)員手機(jī)號(hào), 會(huì)員姓名, 課程編號(hào), 課程名稱, 預(yù)約日期)

日期統(tǒng)一用字符串表示,如 '2026-04-13'

功能具體要求:

功能 說明
注冊(cè)新會(huì)員 輸入手機(jī)號(hào)、姓名、卡類型(1=月卡/2=季卡/3=年卡)。若手機(jī)號(hào)已存在則提示錯(cuò)誤并重新輸入。根據(jù)卡類型設(shè)置初始剩余天數(shù):月卡30天,季卡90天,年卡365天。初始積分為0。注冊(cè)成功后顯示提示信息。
查看所有會(huì)員 按手機(jī)號(hào)順序打印每個(gè)會(huì)員的手機(jī)號(hào)、姓名、卡類型、剩余天數(shù)、積分。若無(wú)會(huì)員則提示“暫無(wú)會(huì)員信息”。
查詢會(huì)員信息 輸入手機(jī)號(hào),若存在則顯示該會(huì)員的詳細(xì)信息和當(dāng)前積分。若不存在則提示“會(huì)員不存在”。
續(xù)費(fèi)會(huì)員卡 輸入手機(jī)號(hào),若不存在則提示錯(cuò)誤;若存在則顯示當(dāng)前卡類型和剩余天數(shù),然后輸入續(xù)費(fèi)類型(1/2/3)。續(xù)費(fèi)后疊加對(duì)應(yīng)的天數(shù),并增加積分(月卡+50分,季卡+150分,年卡+600分)。續(xù)費(fèi)成功后顯示更新后的信息。
添加新課程 輸入課程編號(hào)、課程名稱、教練姓名、容量上限。若編號(hào)已存在則提示錯(cuò)誤并重新輸入。容量必須為正整數(shù),初始已預(yù)約人數(shù)為0。添加成功后顯示提示。
查看所有課程 按課程編號(hào)順序打印每門課程的編號(hào)、名稱、教練、容量、已預(yù)約人數(shù)、剩余名額。若無(wú)課程則提示“暫無(wú)課程信息”。
預(yù)約課程 輸入會(huì)員手機(jī)號(hào),若不存在則提示錯(cuò)誤并返回;若存在但剩余天數(shù) ≤ 0 則提示“會(huì)員卡已過期,無(wú)法預(yù)約”;否則繼續(xù)輸入課程編號(hào)。若課程不存在則提示錯(cuò)誤;若課程已預(yù)約人數(shù)等于容量則提示“該課程已約滿”;否則預(yù)約成功:課程已預(yù)約人數(shù)加1,會(huì)員積分增加10分,并記錄一條預(yù)約日志到 reservations 列表中(日期輸入格式 YYYY-MM-DD)。成功后顯示“預(yù)約成功,積分+10”。
統(tǒng)計(jì)信息 輸出以下統(tǒng)計(jì)內(nèi)容:

  • 會(huì)員總數(shù),以及各卡類型(月卡/季卡/年卡)的會(huì)員人數(shù)
  • 積分最高的會(huì)員信息(手機(jī)號(hào)、姓名、積分;若有多人并列則顯示第一個(gè))
  • 預(yù)約率最高的課程信息(課程編號(hào)、名稱、預(yù)約率,即 booked/capacity;若無(wú)課程則跳過)
  • 剩余名額為0的課程列表(編號(hào)、名稱;若無(wú)則提示“所有課程均有空位”)
    顯示預(yù)約日志 按時(shí)間順序打印 reservations 中的每條記錄,格式清晰。若無(wú)日志則提示“暫無(wú)預(yù)約記錄”。
    退出系統(tǒng) 結(jié)束程序。
    二、函數(shù)設(shè)計(jì)約束(重點(diǎn)考察部分)
    必須按以下函數(shù)劃分來(lái)組織代碼,每個(gè)函數(shù)負(fù)責(zé)明確的功能,主程序僅負(fù)責(zé)菜單調(diào)度與用戶交互。

python

def main():
"""主菜單循環(huán)"""
pass
額外要求:

使用類型注解(如函數(shù)簽名中所示)增強(qiáng)代碼可讀性。

在適當(dāng)位置使用 if/elif/else 進(jìn)行條件判斷(例如菜單分支、手機(jī)號(hào)存在性、課程容量判斷)。

在統(tǒng)計(jì)信息計(jì)算、遍歷容器時(shí)必須使用循環(huán)(如 for 遍歷字典的 items())。

對(duì)用戶輸入的卡類型和容量等進(jìn)行合法性校驗(yàn)(非數(shù)字或超出范圍時(shí)提示重新輸入)。

日期格式不要求嚴(yán)格校驗(yàn),但需按字符串正確記錄。

str1 = """
1. 注冊(cè)新會(huì)員
2. 查看所有會(huì)員
3. 查詢會(huì)員信息
4. 續(xù)費(fèi)會(huì)員卡
5. 添加新課程
6. 查看所有課程
7. 預(yù)約課程
8. 統(tǒng)計(jì)信息
9. 顯示預(yù)約日志
10. 退出系統(tǒng)
"""
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" : "有氧運(yùn)動(dòng)","coach" : "教練1","capacity" : 50, "booked" : 0},
    "C102": {"name": "力量訓(xùn)練", "coach": "教練2", "capacity": 20, "booked": 0},
    "C103": {"name": "柔韌訓(xùn)練", "coach": "教練3", "capacity": 45, "booked": 0},
    "C104": {"name": "動(dòng)感單車", "coach": "教練4", "capacity": 60, "booked": 0}
}
reservations = []
def register_member(members: dict) -> None:
    """處理注冊(cè)新會(huì)員邏輯,更新 members 字典"""
    """輸入手機(jī)號(hào)、姓名、卡類型(1=月卡/2=季卡/3=年卡)。若手機(jī)號(hào)已存在則提示錯(cuò)誤并重新輸入。
    根據(jù)卡類型設(shè)置初始剩余天數(shù):月卡30天,季卡90天,年卡365天。初始積分為0。注冊(cè)成功后顯示提示信息"""
    num = input("輸入手機(jī)號(hào):")
    while True:
        if num in members:
            vip_name = input("輸入姓名:")
            vip_type = input("輸入卡號(hào)(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("注冊(cè)成功!")
            break
        else:
            print("錯(cuò)誤,請(qǐng)重新輸入!")


def show_all_members(members: dict) -> None:
    """打印所有會(huì)員信息,若無(wú)會(huì)員則輸出提示"""
    """按手機(jī)號(hào)順序打印每個(gè)會(huì)員的手機(jī)號(hào)、姓名、卡類型、剩余天數(shù)、積分。若無(wú)會(huì)員則提示“暫無(wú)會(huì)員信息”"""
    if len(members) == 0:
        print("暫無(wú)會(huì)員信息")
    else:
        for key,value in members.items():
            print(f"手機(jī)號(hào):{key},姓名:{value['name']},卡類型:{value['type']},剩余天數(shù):{value['remain_days']},積分:{value['points']}")


def query_member(members: dict) -> None:
    """按手機(jī)號(hào)查詢并打印會(huì)員詳細(xì)信息"""
    """輸入手機(jī)號(hào),若存在則顯示該會(huì)員的詳細(xì)信息和當(dāng)前積分。若不存在則提示“會(huì)員不存在”"""
    num = input("輸入手機(jī)號(hào):")
    if num in members:
        print(f"手機(jī)號(hào):{num},姓名:{members[num]['name']},卡類型:{members[num]['type']},剩余天數(shù):{members[num]['remain_days']},積分:{members[num]['points']}")
    else:
        print("會(huì)員不存在!")


def renew_membership(members: dict) -> None:
    """處理會(huì)員卡續(xù)費(fèi)邏輯,更新剩余天數(shù)和積分"""
    """輸入手機(jī)號(hào),若不存在則提示錯(cuò)誤;若存在則顯示當(dāng)前卡類型和剩余天數(shù),然后輸入續(xù)費(fèi)類型(1/2/3)。
    續(xù)費(fèi)后疊加對(duì)應(yīng)的天數(shù),并增加積分(月卡+50分,季卡+150分,年卡+600分)。續(xù)費(fèi)成功后顯示更新后的信息"""
    num = input("輸入手機(jī)號(hào):")
    if num in members:
        print(f"續(xù)費(fèi)前的卡類型:{members[num]['type']},續(xù)費(fèi)前的剩余天數(shù):{members[num]['remain_days']}")
        vip_type = input("輸入續(xù)費(fèi)類型(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"更新后的剩余天數(shù):{members[num]['remain_days']},更新后的積分:{members[num]['points']}")
    else:
        print("錯(cuò)誤")


def add_course(courses: dict) -> None:
    """處理添加新課程邏輯,更新 courses 字典"""
    """輸入課程編號(hào)、課程名稱、教練姓名、容量上限。若編號(hào)已存在則提示錯(cuò)誤并重新輸入。容量必須為正整數(shù),初始已預(yù)約人數(shù)為0。添加成功后顯示提示"""
    while True:
        courses_id = input("輸入課程編號(hào):")
        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("錯(cuò)誤,請(qǐng)重新輸入!")


def show_all_courses(courses: dict) -> None:
    """打印所有課程信息,若無(wú)課程則輸出提示"""
    if len(courses) == 0:
        print("無(wú)任何預(yù)約課程!")
    else:
        for key,value in courses.items():
            print(f"課程編號(hào):{key},課程名稱:{value['name']},教練姓名:{value['coach']},課程容量上限:{value['capacity']},當(dāng)前已預(yù)約人數(shù):{value['booked']}")


def reserve_course(members: dict, courses: dict, reservations: list) -> None:
    """處理課程預(yù)約邏輯,更新課程已約人數(shù)、會(huì)員積分,并記錄預(yù)約日志"""
    """輸入會(huì)員手機(jī)號(hào),若不存在則提示錯(cuò)誤并返回;若存在但剩余天數(shù) ≤ 0 則提示“會(huì)員卡已過期,無(wú)法預(yù)約”;否則繼續(xù)輸入課程編號(hào)。
    若課程不存在則提示錯(cuò)誤;若課程已預(yù)約人數(shù)等于容量則提示“該課程已約滿”;
    否則預(yù)約成功:課程已預(yù)約人數(shù)加1,會(huì)員積分增加10分,并記錄一條預(yù)約日志到 reservations 列表中(日期輸入格式 YYYY-MM-DD)。
    成功后顯示“預(yù)約成功,積分+10”。"""
    num = input("輸入會(huì)員手機(jī)號(hào):")
    if num in members:
        if members[num]["remain_days"] <= 0:
            print("會(huì)員卡已過期,無(wú)法預(yù)約!")
        else:
            courses_id = input("輸入課程編號(hào):")
            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
                    # ('預(yù)約', 會(huì)員手機(jī)號(hào), 會(huì)員姓名, 課程編號(hào), 課程名稱, 預(yù)約日期)
                    # 日期統(tǒng)一用字符串表示,如 '2026-04-13'
                    tuple1 = ('預(yù)約',num,members[num]["name"],courses_id,courses[courses_id]["name"],"2026-04-13")
                    reservations.append(tuple1)
                    print("課程預(yù)約成功!")
            else:
                print("課程不存在!")
    else:
        print("該手機(jī)號(hào)沒有注冊(cè)會(huì)員!")


def get_statistics(members: dict, courses: dict) -> dict:
    """
    返回統(tǒng)計(jì)信息字典,包含:
    - 'total_members': 會(huì)員總數(shù)
    - 'type_counts': {'月卡': 人數(shù), '季卡': 人數(shù), '年卡': 人數(shù)}
    - 'top_points_member': (手機(jī)號(hào), 姓名, 積分) 或 None
    - 'top_booking_course': (課程編號(hào), 名稱, 預(yù)約率) 或 None
    - 'full_courses': 預(yù)約滿的課程列表,元素為 (編號(hào), 名稱)
    """
    """統(tǒng)計(jì)信息 輸出以下統(tǒng)計(jì)內(nèi)容:
- 會(huì)員總數(shù),以及各卡類型(月卡/季卡/年卡)的會(huì)員人數(shù)
- 積分最高的會(huì)員信息(手機(jī)號(hào)、姓名、積分;若有多人并列則顯示第一個(gè))
- 預(yù)約率最高的課程信息(課程編號(hào)、名稱、預(yù)約率,即 booked/capacity;若無(wú)課程則跳過)
- 剩余名額為0的課程列表(編號(hào)、名稱;若無(wú)則提示“所有課程均有空位”) """
    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:
    """調(diào)用 get_statistics 并格式化打印統(tǒng)計(jì)結(jié)果"""
    result = get_statistics(members,courses)
    for key,value in result.items():
        print(key,value)
        print()


def show_reservations(reservations: list) -> None:
    """打印所有預(yù)約操作日志"""
    """按時(shí)間順序打印 reservations 中的每條記錄,格式清晰。若無(wú)日志則提示“暫無(wú)預(yù)約記錄”"""
    if len(reservations) == 0:
        print("暫無(wú)預(yù)約記錄")
    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():
    """主菜單循環(huán)"""
    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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容