You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python成绩处理程序无报错但失效问题及代码调试求助

问题排查与修正:Python成绩处理程序无功能输出问题

需求与要求

需要实现的功能:读取grades.txt中的学生ID与成绩,计算每位学生的平均分,输出结果并将ID和平均分写入gradeAverage.txt。

教授明确要求:

  • 禁止使用全局变量
  • 程序必须包含main函数,以及一个接收三门成绩为参数、计算并返回平均分的函数
  • 支持未知数量的学生条目
  • 输出匹配样例格式
  • 平均分格式化为两位小数
  • 使用循环读取学生记录

现有代码问题分析

你的代码虽未报错,但核心逻辑存在多处致命错误,导致程序卡在文件读取阶段,后续代码完全无法执行:

  1. 文件读取逻辑崩溃

    • 在for line in infile循环内,每次迭代都重置student_IDs和gradeList为空列表,之前读取的数据会被直接清空
    • 嵌套的while line != ''循环未更新line的值,会无限重复处理第一行数据,程序彻底卡在这一步,后续代码永远无法运行
  2. 未定义变量与变量名错误

    • 使用了grades、old、Velocity等未定义的变量
    • 打印语句中用了student_IDS(大写S),但前面定义的是student_IDs(小写s),大小写不匹配
    • newfile=gradeAverage.txt未给文件名加引号,属于语法错误(因程序未走到这一步才未触发报错)
  3. 平均分计算函数不符合要求

    • 教授要求函数接收三门成绩为参数,但你的grade_average接收的是列表和人数,逻辑完全偏离要求
    • sum(newlist)若传入子列表会直接报错,因为列表无法直接求和
  4. 文件写入与打印逻辑错误

    • 写入文件时误用newfile.write,实际打开的文件对象是outfile
    • 打印语句硬编码3个学生的输出,不支持未知数量的条目

修正后的代码

以下是完全符合要求的修正代码:

def calculate_average(grade1, grade2, grade3):
    """接收三门成绩,计算并返回平均分"""
    return (grade1 + grade2 + grade3) / 3

def main():
    # 读取输入文件
    try:
        with open('grades.txt', 'r') as infile:
            student_records = []
            current_id = None
            current_grades = []
            
            for line in infile:
                line = line.strip()  # 去除首尾空白(包括换行符)
                if not line:
                    continue  # 跳过空行
                
                # 判断当前行是学生ID还是成绩(假设ID以M开头,可根据实际格式调整)
                if line.startswith('M'):
                    # 保存上一个学生的记录(如果存在完整的三门成绩)
                    if current_id and len(current_grades) == 3:
                        avg = calculate_average(*current_grades)
                        student_records.append((current_id, avg))
                        current_grades = []
                    current_id = line
                else:
                    # 转换成绩为数值类型
                    try:
                        grade = float(line)
                        current_grades.append(grade)
                    except ValueError:
                        print(f"警告:无法解析成绩 '{line}',已跳过")
            
            # 处理最后一个学生的记录
            if current_id and len(current_grades) == 3:
                avg = calculate_average(*current_grades)
                student_records.append((current_id, avg))
    
    except FileNotFoundError:
        print("错误:未找到grades.txt文件")
        return
    
    # 输出结果并写入文件
    with open('gradeAverage.txt', 'w') as outfile:
        for student_id, avg in student_records:
            formatted_avg = "{0:.2f}".format(avg)
            # 打印到控制台
            print(f"Student {student_id} average is {formatted_avg}")
            # 写入文件(制表符分隔)
            outfile.write(f"{student_id}\t{formatted_avg}\n")

if __name__ == "__main__":
    main()

代码说明

  • 使用with语句自动管理文件生命周期,避免资源泄漏
  • calculate_average函数严格符合要求:接收三个成绩参数,返回平均分
  • 循环读取文件时动态收集每个学生的ID和三门成绩,支持任意数量的学生条目
  • 处理空行和无效成绩的异常情况,提升程序鲁棒性
  • 平均分格式化为两位小数,输出同时覆盖控制台打印与文件写入
  • 完全未使用全局变量,符合教授要求

内容的提问来源于stack exchange,提问作者Demonic Printer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:40:22