Python第三次作业
题目:健身房会员与课程预约管理系统
一、背景与要求
请编写一个命令行交互程序,实现对健身房会员和团课预约的管理。程序启动后显示菜单,用户输入选项数字执行相应功能,直到选择退出。
数据存储要求:
使用一个字典 members 作为会员主数据容器,键为会员手机号(字符串,11位),值为另一个字典,包含:
name:姓名(字符串)
type:卡类型(‘月卡’、‘季卡’、‘年卡’,字符串)
remain_days:剩余有效天数(整数)
points:积分余额(整数)
使用一个字典 courses 作为课程主数据容器,键为课程编号(字符串,格式如 C101),值为另一个字典,包含:
name:课程名称(字符串)
coach:教练姓名(字符串)
capacity:课程容量上限(整数)
booked:当前已预约人数(整数)
使用一个列表 reservations 记录每一次预约操作的日志,每条日志为元组,格式为:
(‘预约’, 会员手机号, 会员姓名, 课程编号, 课程名称, 预约日期)
日期统一用字符串表示,如 ‘2026-04-13’
程序功能菜单:
text
- 注册新会员
- 查看所有会员
- 查询会员信息
- 续费会员卡
- 添加新课程
- 查看所有课程
- 预约课程
- 统计信息
- 显示预约日志
- 退出系统
功能具体要求:
功能 说明
注册新会员 输入手机号、姓名、卡类型(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
更多推荐

所有评论(0)