将键盘输入的学生信息(包括学号 姓名和成绩)逐行写入文件 Studentdat,当输入exit时结束。 统计文件Studentdat中包含的学生数,以及平均分、最高分和最低分。 程序检查成绩输入值,如果不是数值信息,或是负的数值信息,或超过成绩范围(100),抛出相应的异常。在抛出异常之前应提供详细的信息说明,从而使使用该程序的用户了解所出现的问题,同时考虑上述异常出现时程序应该如何处理。
时间: 2024-03-02 17:52:48 浏览: 82
好的,先说明一下,这是一个涉及文件操作和异常处理的问题,需要使用到Python编程语言。
下面是实现该功能的代码:
```python
class ScoreError(Exception):
def __init__(self, score):
self.score = score
def __str__(self):
return f"Invalid score: {self.score}"
def main():
try:
with open("Studentdat.txt", "w") as f:
count = 0
total_score = 0
highest_score = float("-inf")
lowest_score = float("inf")
while True:
line = input("请输入学生信息(学号 姓名 成绩),输入exit结束:")
if line == "exit":
break
student_info = line.split()
if len(student_info) != 3:
print("输入格式错误")
continue
try:
score = float(student_info[2])
if score < 0 or score > 100:
raise ScoreError(score)
except ValueError:
print("成绩必须是数值信息")
continue
except ScoreError as e:
print(e)
continue
count += 1
total_score += score
highest_score = max(highest_score, score)
lowest_score = min(lowest_score, score)
f.write(line + "\n")
if count == 0:
print("没有学生信息")
else:
print(f"学生数:{count}")
print(f"平均分:{total_score / count:.2f}")
print(f"最高分:{highest_score}")
print(f"最低分:{lowest_score}")
except IOError:
print("文件操作错误")
if __name__ == "__main__":
main()
```
代码解释如下:
首先定义了一个自定义异常类 `ScoreError`,用于处理成绩不合法的情况。在 `main()` 函数中,使用 `with` 语句打开文件 `Studentdat.txt`,并且初始化计数器 `count`、总分数 `total_score`、最高分 `highest_score` 和最低分 `lowest_score`。使用无限循环 `while True` 读取用户输入的学生信息,如果输入为 "exit",则跳出循环。
对于每一行输入的学生信息,首先使用 `split()` 方法将其分割成学号、姓名和成绩三个部分。如果分割后的长度不为 3,则说明输入格式错误,直接跳过该行输入。否则,尝试将成绩部分转换为浮点数,并且判断成绩是否在 0 到 100 范围内。如果成绩不是数值信息,或者不在范围内,则抛出 `ScoreError` 异常或 `ValueError` 异常,然后跳过该行输入。
如果输入没有问题,则更新计数器和各种统计数据,然后将该行输入写入文件。最后,如果没有读取到任何学生信息,则输出 "没有学生信息",否则输出学生数、平均分、最高分和最低分。如果文件操作发生错误,则输出 "文件操作错误"。
注意,这里使用了 `try-except` 语句来捕获可能出现的异常,以保证程序的稳定性。
阅读全文