上面是一场真实的高尔夫足球赛的得分记录,得分最低者胜出。各参赛选手的得分情况以姓名 + ':'/':' + 各分项得分进行记录,且各分项得分之间以一个或多个空格间隔,得分情况可以记录在一个字符串中,也可以记录在一个名为“scores.txt”的文本文件(详见scores.txt)中。试基于 OOP 编写 Python 程序: (1) 计算并输出每位选手的总得分;(2) 输出胜出的选手,并且在计算胜出选手时,不可以使用系统提供的 min/max 函数。 2. 系统实现 Python class AnalyScore: def __init__(self, all_scores): """ all_scores can be a string or a text file""" self.all_scores = self.read_scores(all_scores) pass def read_scores(self, all_scores): pass def parse_scores(self): pass def print_scores(self): pass def report_winner(self): pass def __call__(self): self.parse_scores() self.print_scores() self.report_winner() if __name__ == '__main__': player_scores = '\ 李:17 6 3 3 2 5 3 6 8\ 楼: 6 9 5 10 14 3 8 4 6\ 翁:3 4 8 9 3 5 4 6 6' AnalyScore(player_scores)() print() AnalyScore('scores.txt')()
时间: 2024-02-07 18:04:10 浏览: 157
很好,这是一个有趣的问题!这里是代码实现:
```python
class AnalyScore:
def __init__(self, all_scores):
self.all_scores = self.read_scores(all_scores)
def read_scores(self, all_scores):
if isinstance(all_scores, str):
return all_scores.split('\n')
else:
with open(all_scores, 'r') as f:
return f.readlines()
def parse_scores(self):
self.scores_dict = {}
for s in self.all_scores:
name, scores_str = s.split(':')
scores = [int(score) for score in scores_str.split()]
self.scores_dict[name] = scores
def print_scores(self):
for name, scores in self.scores_dict.items():
total_score = sum(scores)
print(f'{name}的总得分是{total_score}')
def report_winner(self):
winner = None
winner_score = float('inf')
for name, scores in self.scores_dict.items():
total_score = sum(scores)
if total_score < winner_score:
winner = name
winner_score = total_score
print(f'胜出者是{winner}')
def __call__(self):
self.parse_scores()
self.print_scores()
self.report_winner()
if __name__ == '__main__':
player_scores = '''李:17 6 3 3 2 5 3 6 8
楼: 6 9 5 10 14 3 8 4 6
翁:3 4 8 9 3 5 4 6 6'''
AnalyScore(player_scores)()
print()
AnalyScore('scores.txt')()
```
这个类的实例化需要一个字符串或者一个文本文件,因为我们需要读取得分记录。`read_scores` 方法负责读取得分记录,如果输入的是字符串,则使用 `split` 方法进行分割,如果输入的是文件名,则使用 `readlines` 方法读取。
`parse_scores` 方法负责将得分记录解析成一个字典,字典的键是选手的姓名,字典的值是一个得分列表。
`print_scores` 方法负责计算并输出每位选手的总得分。
`report_winner` 方法负责计算胜出的选手,并且在计算胜出选手时,不能使用系统提供的 `min/max` 函数。我们可以使用 `float('inf')` 来表示一个正无穷大的数,然后遍历字典,找到得分最低的选手。
`__call__` 方法负责调用其他方法,按照题目要求的顺序,依次输出每位选手的总得分,胜出的选手。
阅读全文