Почему для всего выводится одна и та же буквенная оценка?
-
02-01-2020 - |
Вопрос
Мое задание — создать программу, которая открывает и читает текстовый файл, вычисляет оценки, включая средний вес, выставляет окончательную оценку, меняет ее на буквенную и затем записывает ее в новый текстовый файл.Все работало нормально до момента перевода баллов в буквенные оценки.Все оценки находятся в диапазоне от 70 до 89, поэтому я не удосужился поставить какой-либо другой код для A, B или E (F).Всякий раз, когда я пытаюсь преобразовать оценку в буквенную, общая оценка меняется на C.Где я ошибся?
infile = open("c:\\Python34\\MyFiles\\ClassGradebook.txt","r")
outfile = open("c:\\Python34\\myfiles\\ClassGrades.txt","w")
aline = infile.readline() # uses readline method to read the first line of the file
def quizsum():
quizsum1 = quiz1 + quiz2 + quiz3
quizavg = (quizsum1 / 30) * .3
return float(quizavg)
def midtermsum():
midtermsum1 = midterm1 + midterm2
midtermavg = (midtermsum1 / 200) * .4
return float(midtermavg)
def finalsum():
finalsum1 = final1
finalavg = (finalsum1 / 100) * .3
return float(finalavg)
def lettergrade():
if printedgrade >= 70 <= 79:
return "C"
else:
return "B"
while aline:
items = aline.split()
dataline = items[0] + " " + items[1]
quiz1 = int(items[2])
quiz2 = int(items[3])
quiz3 = int(items[4])
midterm1 = int(items[5])
midterm2 = int(items[6])
final1 = int(items[7])
quizavg = quizsum()
midtermavg = midtermsum()
finalavg = finalsum()
gradetotal = quizavg + midtermavg + finalavg
printedgrade = gradetotal * 100
printedgrade2 = lettergrade()
print(dataline)
print(printedgrade2)
outfile.write(printedgrade2 + '\n') newline character
aline = infile.readline()
infile.close()
outfile.close()
Решение
Потому что твой if
всегда оценивает true, потому что он не в порядке.Должен быть:
70 <= printedgrade <= 79
Ваше утверждение всегда оценивается как верное, потому что, как вы сказали, все оценки 70-89, поэтому printedgrade
будет больше или равно 70, а 70 меньше 79, поэтому всегда будет True
.
Хотя я настоятельно рекомендую заставить ваш код работать для всех классов.Вы не можете предполагать, что на этот раз оценки находятся в определенном диапазоне, что они будут всегда.
Другие советы
if printedgrade >= 70 <= 79:
.
должен быть
if printedgrade >= 70 and printedgrade <= 79:
.
Вы также можете сделать что-то вроде:
if printedgrade >= 90:
return "A"
elif printedgrade >= 80:
return "B"
elif printedgrade >= 70:
return "C"
...
.