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

GPA计算器故障求助:两门挂科仅输出一条提示的问题排查

GPA计算器挂科提示异常修复

问题描述

输入两门挂科课程(Programming与Computer-Science成绩均为D)时,程序仅输出一条挂科提示,而非预期的两条,需修复代码末尾的逻辑问题。

原代码

name = input("What is your name? 
")
h1 = ("Class Name")
h2 = ("Class Grade")
h3 = ("Credit Hours")
point = input("
Enter your class name followed by your letter grade and hours (say Done to stop input):
")
class_data = []
while point != "Done":    
    words = point.split(" ")    
    if len(words) == 1:        
        print("Error: No spaces in string. Try again.")    
    elif len(words) > 4:        
        print("Error: Too many spaces in input. Try again. ")    
    else:        
        try:            
            class_name = words[0]            
            grades = (words[1])            
            hrs = int(words[2])            
            print("Name of class:", class_name)            
            print("Grade:", grades)            
            print("Class Hours:", hrs)            
            class_data.append((class_name, grades, hrs,))        
        except ValueError:            
            print("Error: Space not followed by an integer.")    
    point = input("
Enter your class name followed by your letter grade and hours (say Done to stop input):
")

def gpa_calculator(grades):        
    points = 0        
    i = 0        
    grade_c = {"A":4,"A-":3.67,"B+":3.33,"B":3.0,"B-":2.67, "C+":2.33,"C":2.0,"C-":1.67,"D+":1.33,"D":1.0,"F":0}        
    if grades != class_data:            
        for grade in grades:                
            points += grade_c[item[1]]        
        gpa = points / len(class_data)        
        return gpa    
    else:        
        return None 

print("Name: ", name)
print("-" * 66)
print("%-17s|%13s|%7s|" % (h1, h2, h3))
print("-" * 66)
for item in class_data:    
    print("%-17s|%13s|%12s|" % (item[0], item[1], item[2]))
print("-" * 66)
print('Your projected GPA is: ',(gpa_calculator(grades)))
print("-" * 66)
if item[0] == "Computer-Science" and item[1] == "D":    
    print ("failing CS")
if item[0] == "Programming" and item[1] == "D":    
    print ("failing programming")

当前输出

What is your name? 
Nich

Enter your class name followed by your letter grade and hours (say Done to stop input):
Programming D 10
Name of class: Programming
Grade: D
Class Hours: 10

Enter your class name followed by your letter grade and hours (say Done to stop input):
Computer-Science D 10
Name of class: Computer-Science
Grade: D
Class Hours: 10

Enter your class name followed by your letter grade and hours (say Done to stop input):
Done
Name:  Nich
------------------------------------------------------------------
Class Name     |Class Grade|Credit Hours|
------------------------------------------------------------------
Programming    |          D|          10|
Computer-Science|          D|          10|
------------------------------------------------------------------
Your projected GPA is:  0.5
------------------------------------------------------------------
failing CS

问题分析

末尾的两个if语句位于遍历class_data的for循环之外,此时item变量仅保留了循环最后一次迭代的元素(即Computer-Science),因此只会检查最后一门课程,不会遍历所有课程判断是否挂科。

修复后的代码

主要修改末尾的挂科提示逻辑,新增循环遍历所有课程进行判断,同时修复GPA计算函数的逻辑错误:

name = input("What is your name? 
")
h1 = ("Class Name")
h2 = ("Class Grade")
h3 = ("Credit Hours")
point = input("
Enter your class name followed by your letter grade and hours (say Done to stop input):
")
class_data = []
while point != "Done":    
    words = point.split(" ")    
    if len(words) == 1:        
        print("Error: No spaces in string. Try again.")    
    elif len(words) > 4:        
        print("Error: Too many spaces in input. Try again. ")    
    else:        
        try:            
            class_name = words[0]            
            grades = (words[1])            
            hrs = int(words[2])            
            print("Name of class:", class_name)            
            print("Grade:", grades)            
            print("Class Hours:", hrs)            
            class_data.append((class_name, grades, hrs,))        
        except ValueError:            
            print("Error: Space not followed by an integer.")    
    point = input("
Enter your class name followed by your letter grade and hours (say Done to stop input):
")

def gpa_calculator(class_list):        
    points = 0        
    total_hours = 0        
    grade_c = {"A":4,"A-":3.67,"B+":3.33,"B":3.0,"B-":2.67, "C+":2.33,"C":2.0,"C-":1.67,"D+":1.33,"D":1.0,"F":0}        
    for item in class_list:                
        points += grade_c[item[1]] * item[2]
        total_hours += item[2]    
    if total_hours == 0:
        return 0.0
    gpa = points / total_hours        
    return gpa    

print("Name: ", name)
print("-" * 66)
print("%-17s|%13s|%7s|" % (h1, h2, h3))
print("-" * 66)
for item in class_data:    
    print("%-17s|%13s|%12s|" % (item[0], item[1], item[2]))
print("-" * 66)
print('Your projected GPA is: ', round(gpa_calculator(class_data), 2))
print("-" * 66)
# 遍历所有课程判断挂科
for item in class_data:
    if item[0] == "Computer-Science" and item[1] == "D":    
        print ("failing CS")
    if item[0] == "Programming" and item[1] == "D":    
        print ("failing programming")

修改说明

  1. 挂科提示修复:将判断语句放入for循环中,遍历class_data里的每一门课程,确保每门符合条件的课程都会输出提示。
  2. GPA计算修复:原函数未考虑学分权重且变量引用错误,修复后按学分加权计算GPA,结果更准确。

修复后输出

What is your name? 
Nich

Enter your class name followed by your letter grade and hours (say Done to stop input):
Programming D 10
Name of class: Programming
Grade: D
Class Hours: 10

Enter your class name followed by your letter grade and hours (say Done to stop input):
Computer-Science D 10
Name of class: Computer-Science
Grade: D
Class Hours: 10

Enter your class name followed by your letter grade and hours (say Done to stop input):
Done
Name:  Nich
------------------------------------------------------------------
Class Name     |Class Grade|Credit Hours|
------------------------------------------------------------------
Programming    |          D|          10|
Computer-Science|          D|          10|
------------------------------------------------------------------
Your projected GPA is:  1.0
------------------------------------------------------------------
failing programming
failing CS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:45:36