<think>
我们根据用户的需求,实现一个电影评分系统。用户要求使用Python编写具体程序并实现运行。我们将按照用户之前提供的步骤进行代码编写,并确保系统能够完成电影的添加、删除、修改、查询以及评分功能。
### 设计思路
1. **Movie类**:表示电影对象,包含电影的基本信息(如ID、片名)和评分列表,以及计算平均分的方法。
2. **ChangeMovie类**:负责电影的管理,包括添加、删除、修改和查询电影。
3. **GetScore类**:负责对电影进行评分,包括添加评分和修改评分。
4. **MovieScore类**:作为系统的入口,封装了ChangeMovie和GetScore,根据用户请求调用相应方法。
5. **主程序**:通过循环接收用户输入,调用MovieScore类的方法执行操作。
### 具体代码实现
```python
import re
class Movie:
def __init__(self, movie_id, title):
self.id = movie_id
self.title = title
self.ratings = [] # 存储评分
def add_rating(self, score):
"""添加评分,评分在0到10之间"""
try:
score = float(score)
if score < 0 or score > 10:
return False
self.ratings.append(score)
return True
except ValueError:
return False
def get_average_score(self):
"""计算平均分"""
if not self.ratings:
return 0.0
return round(sum(self.ratings) / len(self.ratings), 1)
def __str__(self):
return f"电影ID: {self.id}, 片名: {self.title}, 平均分: {self.get_average_score()}, 评分次数: {len(self.ratings)}"
class ChangeMovie:
def __init__(self):
self.movies = {} # 电影ID到电影对象的映射
self.next_id = 1 # 下一个可用的电影ID
def add_movie(self, title):
"""添加新电影,返回电影ID"""
if not title:
return None
movie_id = self.next_id
self.movies[movie_id] = Movie(movie_id, title)
self.next_id += 1
return movie_id
def delete_movie(self, movie_id):
"""删除电影"""
if movie_id in self.movies:
del self.movies[movie_id]
return True
return False
def modify_movie_title(self, movie_id, new_title):
"""修改电影标题"""
if movie_id in self.movies and new_title:
self.movies[movie_id].title = new_title
return True
return False
def query_movie(self, movie_id=None, title=None):
"""查询电影,可以按ID或标题(模糊匹配)查询"""
if movie_id is not None:
return [self.movies[movie_id]] if movie_id in self.movies else []
elif title is not None:
# 模糊匹配标题
pattern = re.compile(title, re.IGNORECASE)
return [m for m in self.movies.values() if pattern.search(m.title)]
else:
return list(self.movies.values())
class GetScore:
def __init__(self, movie_manager):
self.movies = movie_manager.movies
def add_score(self, movie_id, score):
"""给电影添加评分"""
if movie_id in self.movies:
return self.movies[movie_id].add_rating(score)
return False
def modify_score(self, movie_id, rating_index, new_score):
"""修改电影的某条评分"""
if movie_id not in self.movies:
return False
movie = self.movies[movie_id]
if rating_index < 0 or rating_index >= len(movie.ratings):
return False
try:
new_score = float(new_score)
if new_score < 0 or new_score > 10:
return False
movie.ratings[rating_index] = new_score
return True
except ValueError:
return False
class MovieScore:
def __init__(self):
self.movie_manager = ChangeMovie()
self.score_manager = GetScore(self.movie_manager)
def handle_request(self, request, **kwargs):
"""处理用户请求"""
if request == 'add_movie':
title = kwargs.get('title')
if not title:
return False, "电影标题不能为空"
movie_id = self.movie_manager.add_movie(title)
if movie_id:
return True, f"电影添加成功,ID为: {movie_id}"
return False, "电影添加失败"
elif request == 'delete_movie':
movie_id = kwargs.get('movie_id')
if movie_id is None:
return False, "需要提供电影ID"
if self.movie_manager.delete_movie(movie_id):
return True, "电影删除成功"
return False, "电影删除失败,ID不存在"
elif request == 'modify_movie_title':
movie_id = kwargs.get('movie_id')
new_title = kwargs.get('new_title')
if movie_id is None or not new_title:
return False, "需要提供电影ID和新标题"
if self.movie_manager.modify_movie_title(movie_id, new_title):
return True, "电影标题修改成功"
return False, "电影标题修改失败,ID不存在"
elif request == 'query_movie':
movie_id = kwargs.get('movie_id')
title = kwargs.get('title')
movies = self.movie_manager.query_movie(movie_id, title)
if movies:
result = "\n".join(str(movie) for movie in movies)
return True, result
return False, "未找到符合条件的电影"
elif request == 'add_score':
movie_id = kwargs.get('movie_id')
score = kwargs.get('score')
if movie_id is None or score is None:
return False, "需要提供电影ID和评分"
if self.score_manager.add_score(movie_id, score):
return True, "评分添加成功"
return False, "评分添加失败,请检查电影ID是否存在或评分是否在0-10之间"
elif request == 'modify_score':
movie_id = kwargs.get('movie_id')
rating_index = kwargs.get('rating_index')
new_score = kwargs.get('new_score')
if movie_id is None or rating_index is None or new_score is None:
return False, "需要提供电影ID、评分索引和新评分"
try:
rating_index = int(rating_index)
except ValueError:
return False, "评分索引必须是整数"
if self.score_manager.modify_score(movie_id, rating_index, new_score):
return True, "评分修改成功"
return False, "评分修改失败,请检查参数"
else:
return False, "未知请求"
def main():
system = MovieScore()
print("欢迎使用电影评分系统!")
print("可用命令: add, delete, modify_title, query, add_score, modify_score, exit")
while True:
command = input("\n请输入命令: ").strip().lower()
if command == 'exit':
print("退出系统。")
break
# 根据命令解析参数
if command == 'add':
title = input("请输入电影标题: ")
success, message = system.handle_request('add_movie', title=title)
print(message)
elif command == 'delete':
movie_id = input("请输入要删除的电影ID: ")
try:
movie_id = int(movie_id)
except ValueError:
print("电影ID必须是整数")
continue
success, message = system.handle_request('delete_movie', movie_id=movie_id)
print(message)
elif command == 'modify_title':
movie_id = input("请输入要修改的电影ID: ")
try:
movie_id = int(movie_id)
except ValueError:
print("电影ID必须是整数")
continue
new_title = input("请输入新的电影标题: ")
success, message = system.handle_request('modify_movie_title', movie_id=movie_id, new_title=new_title)
print(message)
elif command == 'query':
print("查询方式:1.按ID查询 2.按标题查询 3.查询所有")
sub_cmd = input("请选择查询方式: ").strip()
if sub_cmd == '1':
movie_id = input("请输入电影ID: ")
try:
movie_id = int(movie_id)
except ValueError:
print("电影ID必须是整数")
continue
success, message = system.handle_request('query_movie', movie_id=movie_id)
elif sub_cmd == '2':
title = input("请输入电影标题(支持模糊匹配): ")
success, message = system.handle_request('query_movie', title=title)
elif sub_cmd == '3':
success, message = system.handle_request('query_movie')
else:
print("未知选项")
continue
print(message if success else f"查询失败: {message}")
elif command == 'add_score':
movie_id = input("请输入电影ID: ")
try:
movie_id = int(movie_id)
except ValueError:
print("电影ID必须是整数")
continue
score = input("请输入评分(0-10): ")
success, message = system.handle_request('add_score', movie_id=movie_id, score=score)
print(message)
elif command == 'modify_score':
movie_id = input("请输入电影ID: ")
try:
movie_id = int(movie_id)
except ValueError:
print("电影ID必须是整数")
continue
rating_index = input("请输入要修改的评分序号(从0开始): ")
try:
rating_index = int(rating_index)
except ValueError:
print("评分序号必须是整数")
continue
new_score = input("请输入新的评分(0-10): ")
success, message = system.handle_request('modify_score', movie_id=movie_id, rating_index=rating_index, new_score=new_score)
print(message)
else:
print("未知命令,请重新输入。")
if __name__ == '__main__':
main()
```
### 运行方法
1. 将上述代码保存为`movie_rating_system.py`
2. 在终端运行:`python movie_rating_system.py`
3. 根据提示输入命令进行操作
### 功能说明
1. **添加电影**:命令`add`,输入电影标题
2. **删除电影**:命令`delete`,输入电影ID
3. **修改电影标题**:命令`modify_title`,输入电影ID和新标题
4. **查询电影**:命令`query`,可以选择按ID、标题(模糊匹配)或查询所有
5. **添加评分**:命令`add_score`,输入电影ID和评分(0-10)
6. **修改评分**:命令`modify_score`,输入电影ID、评分序号(从0开始)和新评分
7. **退出系统**:命令`exit`
### 注意事项
- 电影ID由系统自动分配,从1开始递增
- 评分支持小数,但必须在0到10之间
- 查询电影时,按标题查询支持模糊匹配(不区分大小写)
### 示例运行
```
欢迎使用电影评分系统!
可用命令: add, delete, modify_title, query, add_score, modify_score, exit
请输入命令: add
请输入电影标题: 肖申克的救赎
电影添加成功,ID为: 1
请输入命令: add_score
请输入电影ID: 1
请输入评分(0-10): 9.5
评分添加成功
请输入命令: query
查询方式:1.按ID查询 2.按标题查询 3.查询所有
请选择查询方式: 1
请输入电影ID: 1
电影ID: 1, 片名: 肖申克的救赎, 平均分: 9.5, 评分次数: 1
请输入命令: exit
退出系统。
```
此系统实现了用户所需的核心功能,并提供了友好的命令行交互界面。
§§相关问题§§
1. 如何将电影数据保存到文件以便下次启动时加载?
2. 如何扩展系统支持用户注册和登录?
3. 如何为电影添加更多属性(如导演、演员、类型等)?
</think>
### Python电影评分系统实现代码及运行方法
下面是根据您需求实现的完整电影评分系统代码,包含所有功能模块:
```python
class Movie:
def __init__(self, movie_id, title, original_title=None):
self.id = movie_id
self.title = title
self.original_title = original_title if original_title else title
self.ratings = [] # 存储所有评分
self.name_change = 1 if title == self.original_title else 0 # 名称变更特征[^2]
def add_rating(self, score):
"""添加新评分"""
if 0 <= score <= 10: # 评分范围0-10分
self.ratings.append(score)
return True
return False
def get_average_score(self):
"""计算平均分"""
if not self.ratings:
return 0.0
return round(sum(self.ratings) / len(self.ratings), 1)
def __str__(self):
return f"ID: {self.id} | 片名: {self.title} | 平均分: {self.get_average_score()} | 评分次数: {len(self.ratings)}"
class ChangeMovie:
def __init__(self):
self.movies = {} # {movie_id: Movie}
self.next_id = 1 # 自动递增ID
def add_movie(self, title, original_title=None):
"""添加新电影[^1]"""
movie_id = self.next_id
new_movie = Movie(movie_id, title, original_title)
self.movies[movie_id] = new_movie
self.next_id += 1
return movie_id
def delete_movie(self, movie_id):
"""删除电影"""
if movie_id in self.movies:
del self.movies[movie_id]
return True
return False
def modify_movie_title(self, movie_id, new_title):
"""修改电影标题[^1]"""
if movie_id not in self.movies:
return False
movie = self.movies[movie_id]
movie.title = new_title
# 更新名称变更特征
movie.name_change = 1 if movie.title == movie.original_title else 0
return True
def query_movies(self, keyword=None):
"""查询电影[^1],支持模糊查询"""
if not keyword:
return list(self.movies.values())
# 支持模糊查询(不区分大小写)
return [m for m in self.movies.values()
if keyword.lower() in m.title.lower()
or keyword.lower() in m.original_title.lower()]
class GetScore:
def __init__(self, movie_manager):
self.movies = movie_manager.movies
def add_rating(self, movie_id, score):
"""添加新评分"""
if movie_id not in self.movies:
return False
return self.movies[movie_id].add_rating(score)
def modify_rating(self, movie_id, rating_index, new_score):
"""修改已有评分"""
if movie_id not in self.movies:
return False
movie = self.movies[movie_id]
if rating_index < 0 or rating_index >= len(movie.ratings):
return False
if 0 <= new_score <= 10:
movie.ratings[rating_index] = new_score
return True
return False
class MovieScoreSystem:
def __init__(self):
self.movie_manager = ChangeMovie()
self.score_manager = GetScore(self.movie_manager)
def add_movie(self, title, original_title=None):
"""添加电影"""
return self.movie_manager.add_movie(title, original_title)
def delete_movie(self, movie_id):
"""删除电影"""
return self.movie_manager.delete_movie(movie_id)
def modify_movie_title(self, movie_id, new_title):
"""修改电影标题"""
return self.movie_manager.modify_movie_title(movie_id, new_title)
def query_movies(self, keyword=None):
"""查询电影"""
return self.movie_manager.query_movies(keyword)
def add_rating(self, movie_id, score):
"""添加评分"""
return self.score_manager.add_rating(movie_id, score)
def modify_rating(self, movie_id, rating_index, new_score):
"""修改评分"""
return self.score_manager.modify_rating(movie_id, rating_index, new_score)
def display_movies(self):
"""显示所有电影信息"""
movies = self.query_movies()
if not movies:
print("系统中暂无电影")
return
print("\n===== 电影列表 =====")
for movie in movies:
print(movie)
print("====================")
def main():
# 创建评分系统实例
system = MovieScoreSystem()
print("===== 电影评分系统 =====")
print("1. 添加电影")
print("2. 删除电影")
print("3. 修改电影标题")
print("4. 查询电影")
print("5. 为电影添加评分")
print("6. 修改电影评分")
print("7. 显示所有电影")
print("8. 退出系统")
while True:
try:
choice = input("\n请输入操作编号: ")
if choice == '1': # 添加电影
title = input("请输入电影标题: ")
original_title = input("请输入原始标题(可选,直接回车跳过): ")
movie_id = system.add_movie(title, original_title if original_title else None)
print(f"电影添加成功! ID: {movie_id}")
elif choice == '2': # 删除电影
system.display_movies()
movie_id = int(input("请输入要删除的电影ID: "))
if system.delete_movie(movie_id):
print("电影删除成功!")
else:
print("删除失败,电影ID不存在")
elif choice == '3': # 修改电影标题
system.display_movies()
movie_id = int(input("请输入要修改的电影ID: "))
new_title = input("请输入新标题: ")
if system.modify_movie_title(movie_id, new_title):
print("电影标题修改成功!")
else:
print("修改失败,电影ID不存在")
elif choice == '4': # 查询电影
keyword = input("请输入查询关键词(直接回车显示全部): ")
results = system.query_movies(keyword)
if results:
print("\n===== 查询结果 =====")
for movie in results:
print(movie)
print("====================")
else:
print("未找到匹配的电影")
elif choice == '5': # 添加评分
system.display_movies()
movie_id = int(input("请输入要评分的电影ID: "))
score = float(input("请输入评分(0-10): "))
if system.add_rating(movie_id, score):
print("评分添加成功!")
else:
print("评分添加失败,请检查ID或评分值")
elif choice == '6': # 修改评分
system.display_movies()
movie_id = int(input("请输入电影ID: "))
movie = system.movie_manager.movies.get(movie_id)
if not movie:
print("电影不存在")
continue
print(f"当前评分: {movie.ratings}")
rating_index = int(input("请输入要修改的评分序号(从0开始): "))
new_score = float(input("请输入新评分(0-10): "))
if system.modify_rating(movie_id, rating_index, new_score):
print("评分修改成功!")
else:
print("修改失败,请检查参数")
elif choice == '7': # 显示所有电影
system.display_movies()
elif choice == '8': # 退出系统
print("感谢使用电影评分系统,再见!")
break
else:
print("无效选择,请重新输入")
except ValueError:
print("输入格式错误,请重新输入")
except KeyboardInterrupt:
print("\n操作已取消")
except Exception as e:
print(f"发生错误: {str(e)}")
if __name__ == "__main__":
main()
```
### 运行方法
1. 将上述代码保存为 `movie_rating_system.py`
2. 在终端执行命令:
```bash
python movie_rating_system.py
```
3. 根据菜单提示选择操作:
```
===== 电影评分系统 =====
1. 添加电影
2. 删除电影
3. 修改电影标题
4. 查询电影
5. 为电影添加评分
6. 修改电影评分
7. 显示所有电影
8. 退出系统
```
### 功能演示
1. **添加电影**:
```
请输入操作编号: 1
请输入电影标题: 肖申克的救赎
请输入原始标题(可选,直接回车跳过): The Shawshank Redemption
电影添加成功! ID: 1
```
2. **为电影评分**:
```
请输入操作编号: 5
请输入要评分的电影ID: 1
请输入评分(0-10): 9.7
评分添加成功!
```
3. **查询电影**:
```
请输入操作编号: 4
请输入查询关键词(直接回车显示全部): 肖申克
===== 查询结果 =====
ID: 1 | 片名: 肖申克的救赎 | 平均分: 9.7 | 评分次数: 1
====================
```
4. **修改电影标题**:
```
请输入操作编号: 3
请输入要修改的电影ID: 1
请输入新标题: 肖申克的救赎(1994)
电影标题修改成功!
```
### 系统特点
1. **完整功能实现**:
- 电影增删改查[^1]
- 评分添加与修改
- 平均分自动计算
2. **用户友好界面**:
- 清晰的菜单系统
- 错误输入处理
- 操作结果即时反馈
3. **扩展性设计**:
- 电影名称变更特征记录[^2]
- 支持原始标题存储
- 模块化设计便于扩展
4. **数据完整性**:
- 输入验证(评分范围0-10)
- ID自动管理
- 异常处理机制
此系统完全满足您的需求,实现了电影管理的所有核心功能,并提供了直观的用户界面。系统设计遵循面向对象原则,便于后续扩展更多功能(如用户管理、电影推荐等)。