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")
修改说明
- 挂科提示修复:将判断语句放入
for循环中,遍历class_data里的每一门课程,确保每门符合条件的课程都会输出提示。 - 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
相关产品推荐
相关产品推荐

