news 2026/5/8 17:35:26

03健身房预约管理系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
03健身房预约管理系统

一.题目:

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

数据存储要求:

使用一个字典 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())。

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

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

二.代码:

str1 = """

1. 注册新会员

2. 查看所有会员

3. 查询会员信息

4. 续费会员卡

5. 添加新课程

6. 查看所有课程

7. 预约课程

8. 统计信息

9. 显示预约日志

10. 退出系统

"""

menbers={

"12345678911":{

"name":"moa",

"type":"季卡",

"remain_days":57,

"points":50,

},

"12345678912":{

"name":"Taehyun",

"type":"年卡",

"remain_days":90,

"points":150,

}

}

courses={

"A001":{

"name":"瑜伽",

"coach":"Yeonjun",

"capacity":40,

"booked":0,

},

"A002":{

"name":"跑步",

"coach":"Soobin",

"capacity":40,

"booked":0,

}

}

reservations=[]

def register_member(members: dict) -> None:

"""处理注册新会员逻辑,更新 members 字典"""

while True:

phone = input("请输入11位手机号:")

if len(phone) != 11 or not phone.isdigit():

print("请输入正确的11位手机号码")

continue

if phone in members:

print("该手机号已被注册,请重试")

continue

break

name = input("请输入姓名: ").strip()

while True:

print("卡类型:1.月卡 2.季卡 3.年卡")

type_choice = input("请输入选项(1/2/3): ").strip()

if type_choice == '1':

card_type = '月卡'

days = 30

break

elif type_choice == '2':

card_type = '季卡'

days = 90

break

elif type_choice == '3':

card_type = '年卡'

days = 365

break

else:

print("输入无效,请输入选项(1/2/3)")

members[phone] = {

'name': name,

'type': card_type,

'remain_days': days,

'points': 0

}

print(f"会员 {name} 注册成功!卡类型:{card_type},剩余天数:{days}天")

def show_all_members(members: dict) -> None:

"""打印所有会员信息,若无会员则输出提示"""

if not members:

print("暂无会员信息")

return

for phone in sorted(members.keys()):

info = members[phone]

print(f"手机号:{phone} 姓名:{info['name']} 卡类型:{info['type']} 剩余天数:{info['remain_days']} 积分:{info['points']}")

def query_member(members: dict) -> None:

"""按手机号查询并打印会员详细信息"""

phone = input("请输入会员手机号: ").strip()

if phone not in members:

print("会员不存在")

return

info = members[phone]

print(f"会员详情\n手机号:{phone}\n姓名:{info['name']}\n卡类型:{info['type']}\n剩余天数:{info['remain_days']}\n当前积分:{info['points']}")

def renew_membership(members: dict) -> None:

"""处理会员卡续费逻辑,更新剩余天数和积分"""

phone = input("请输入会员手机号: ").strip()

if phone not in members:

print("会员不存在,无法续费")

return

member = members[phone]

print(f"当前卡类型:{member['type']},剩余天数:{member['remain_days']}天")

print("续费类型:1.月卡(+30天,+50分) 2.季卡(+90天,+150分) 3.年卡(+365天,+600分)")

while True:

choice = input("请选择续费类型:(1.月卡 2.季卡 3.年卡)")

if choice not in ["1", "2", "3"]:

print("输入无效,请输入选项(1/2/3)")

continue

break

card_map = {

"1": ("月卡", 30),

"2": ("季卡", 90),

"3": ("年卡", 365),

}

new_type, add_days, add_points = card_map[choice]

member["remain_days"] += add_days

member["points"] += add_points

member["type"] = new_type

print(f"您已续费成功!{member['type']}卡剩余{member['remain_days']}天,总积分{member['points']}")

def add_course(courses: dict) -> None:

"""处理添加新课程逻辑,更新 courses 字典"""

while True:

cid = input("请输入课程编号:")

if cid in courses:

print("编号已存在,请重新输入")

continue

if not cid:

print("编号不能为空")

continue

break

name = input("课程名称: ").strip()

coach = input("教练姓名: ").strip()

while True:

cap_str = input("课程容量上限(正整数): ").strip()

if cap_str.isdigit() and int(cap_str) > 0:

capacity = int(cap_str)

break

else:

print("错误:请输入正整数")

courses[cid] = {"name": name,

"coach": coach,

"capacity": capacity,

"booked": 0

}

def show_all_courses(courses: dict) -> None:

"""打印所有课程信息,若无课程则输出提示"""

if not courses:

print("暂无课程信息")

return

sorted_cids = sorted(courses.keys())

print("所有课程信息:")

for cid in sorted_cids:

info = courses[cid]

remain = info["capacity"] - info["booked"]

print(

f"编号:{cid},名称:{info['name']},教练:{info['coach']},总容量:{info['capacity']},已预约:{info['booked']},剩余名额:{remain}")

def reserve_course(members: dict, courses: dict, reservations: list) -> None:

"""处理课程预约逻辑,更新课程已约人数、会员积分,并记录预约日志"""

phone = input("请输入会员手机号:").strip()

if phone not in members:

print("该会员不存在")

return

member = members[phone]

if member["remain_days"] <= 0:

print("您的会员卡已过期,无法进行预约")

return

cid = input("请输入课程编号:").split()

if cid not in courses:

print("该课程不存在")

return

course = courses[cid]

if course["booked"] >= course["capacity"]:

print("该课程已约满")

return

course["booked"] += 1

member["points"] += 10

log = ("预约", phone, member["name"], cid, course["name"])

reservations.append(log)

print("预约成功,积分+10")

def get_statistics(members: dict, courses: dict) -> dict:

"""

返回统计信息字典,包含:

- 'total_members': 会员总数

- 'type_counts': {'月卡': 人数, '季卡': 人数, '年卡': 人数}

- 'top_points_member': (手机号, 姓名, 积分) 或 None

- 'top_booking_course': (课程编号, 名称, 预约率) 或 None

- 'full_courses': 预约满的课程列表,元素为 (编号, 名称)

"""

total_members = len(members)

type_counts = {"月卡": 0, "季卡": 0, "年卡": 0}

top_points_member = None

if members:

max_points = -1

for phone, info in members.items():

current_points = info["points"]

if current_points > max_points:

max_points = current_points

top_points_member = (phone, info["name"], current_points)

top_booking_course = None

full_courses = []

if courses:

max_rate = -1.0

for cid, info in courses.items():

capacity = info["capacity"]

booked = info["booked"]

booking_rate = booked / capacity if capacity != 0 else 0.0

if booking_rate > max_rate:

max_rate = booking_rate

top_booking_course = (cid, info["name"], booking_rate)

if booked == capacity:

full_courses.append((cid, info["name"]))

return {

"total_members": total_members,

"type_counts": type_counts,

"top_points_member": top_points_member,

"top_booking_course": top_booking_course,

"full_courses": full_courses

}

def show_statistics(members: dict, courses: dict) -> None:

"""调用 get_statistics 并格式化打印统计结果"""

str2 = get_statistics(menbers, courses)

print("======统计信息======")

print(f"会员总数为:{str2['total_members']}")

type_count1 = str2["type_counts"]

print(f"月卡会员有:{type_count1['月卡']}人,季卡会员有:{type_count1['季卡']}人,年卡会员有:{type_count1['年卡']}人")

if str2['top_points_member']:

phone, name, points = str2['top_points_member']

print(f"积分最高会员为:手机号{phone},姓名:{name},积分:{points}")

else:

print("暂无会员!")

if str2['top_booking_course']:

cid, name, rate = str2['top_booking_course']

print(f"预约率最高课程:编号 {cid},名称 {name},预约率 {rate:.2%}")

else:

print("暂无课程,无预约率信息")

full_list = str2['full_courses']

if full_list:

print("\n已约满的课程:")

for cid, name in full_list:

print(f"编号:{cid},名称:{name}")

else:

print("\n所有课程均有空位")

def show_reservations(reservations: list) -> None:

"""打印所有预约操作日志"""

if not reservations:

print("暂无预约记录")

return

print("====== 预约日志(按时间顺序) ======")

for log in reservations:

act, phone, name, cid, cname, date = log

print(f"{date}{act} | 会员:{name}({phone}) | 课程:{cname}({cid}) | 日期:{date}")

def main():

"""主菜单循环"""

menbers = {}

courses = {}

reservations = []

print("======健身房 会员与课程预约管理系统======")

while True:

print(str1)

choice = input("\n请输入功能选项:")

if choice == "1":

register_member(menbers)

elif choice == "2":

show_all_members(menbers)

elif choice == "3":

query_member(menbers)

elif choice == "4":

renew_membership(menbers)

elif choice == "5":

add_course(courses)

elif choice == "6":

show_all_courses(courses)

elif choice == "7":

reserve_course(menbers, courses, reservations)

elif choice == "8":

show_statistics(menbers, courses)

elif choice == "9":

show_reservations(reservations)

elif choice == "10":

print("感谢使用,系统已退出")

break

else:

print("输入无效,请输入 1-10 之间的数字")

main()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 17:34:55

别光刷题了!用这5个华为云AI小项目,带你吃透HCCDA认证核心考点

用5个华为云AI实战项目打通HCCDA认证核心技能 最近两年&#xff0c;我辅导过上百位开发者备考华为云HCCDA认证&#xff0c;发现一个有趣现象&#xff1a;那些死记硬背题库的考生&#xff0c;往往在实操题上栽跟头&#xff1b;而真正通过认证的&#xff0c;都是把知识点融入真实…

作者头像 李华
网站建设 2026/5/8 17:33:40

inner join 和 join 的区别

结论&#xff1a;在绝大多数数据库&#xff08;MySQL、PostgreSQL、SQL Server、Oracle 等&#xff09;中&#xff0c;JOIN 默认就是 INNER JOIN&#xff0c;二者完全等价&#xff0c;没有任何功能区别。详细解释默认规则当你只写 JOIN 关键字时&#xff0c;数据库会自动识别为…

作者头像 李华
网站建设 2026/5/8 17:33:24

鸿蒙码字软件开发踩坑:正文缩成一行?标点栏与输入法兼容方案详解

最近在论坛中看到在鸿蒙HarmonyOS码字软件开发过程中&#xff0c;不少开发者会遇到一个棘手的兼容性问题&#xff1a;正文页面的文字始终缩在第一行&#xff0c;无法正常换行和滚动&#xff0c;删除底部标点栏后却能恢复正常。看似是标点栏与正文的简单冲突&#xff0c;实则涉及…

作者头像 李华