Por que isso imprime a mesma nota para tudo?
-
02-01-2020 - |
Pergunta
Minha tarefa é criar um programa que abra e leia um arquivo de texto, calcule notas, incluindo pesos médios, dê uma nota final, altere-a para uma nota em letras e, em seguida, escreva-a em um novo arquivo de texto.Tudo funcionou bem até a conversão dos pontos em notas em letras.Todas as notas estão entre 70 e 89, então não me incomodo em colocar nenhum outro código para A, B ou E(F).Sempre que tento converter a nota em letra, a nota de todos muda para C.Onde foi que eu errei?
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()
Solução
Porque o seu if
está sempre avaliando true porque está fora de ordem.Deveria ser:
70 <= printedgrade <= 79
Sua afirmação é sempre avaliada como verdadeira porque, como você disse, todas as notas são de 70 a 89, então printedgrade
será maior ou igual a 70 e 70 é menor que 79, então sempre será True
.
Embora eu sugira fortemente que seu código funcione para todas as séries.Você não pode presumir porque desta vez as notas estão em uma determinada faixa que sempre estarão.
Outras dicas
if printedgrade >= 70 <= 79:
deveria estar
if printedgrade >= 70 and printedgrade <= 79:
Você também pode fazer algo como:
if printedgrade >= 90:
return "A"
elif printedgrade >= 80:
return "B"
elif printedgrade >= 70:
return "C"
...