¿Por qué esta impresión de la misma carta grado para todo?
-
02-01-2020 - |
Pregunta
Mi tarea es la de crear un programa que se abre y se lee desde un archivo de texto, calcula los grados, incluyendo los pesos medios, le da una calificación final, cambia a una calificación de letra y, a continuación, escribe en un archivo de texto nuevo.Todo ha funcionado bien hasta la conversión de los puntos a las calificaciones de letras.Todos los grados están entre 70-89, así que todavía no se molestan en poner cualquier otro código para a,B, o E(F).Siempre que se intenta convertir el grado de calificación de letra, cambia todos los grados del C.¿De dónde me salió mal?
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()
Solución
Debido a su if
siempre está evaluando la verdad porque está fuera de orden.Debe ser:
70 <= printedgrade <= 79
Su declaración es siempre evaluar como verdadero porque, como usted dijo que todos los grados son 70-89 así printedgrade
será mayor que o igual a 70 y 70 es menor que el 79 por lo que siempre será True
.
Aunque me gustaría sugerir fuertemente que el código de trabajo para todos los grados.No se puede asumir, porque esta vez las calificaciones están en un cierto intervalo que siempre será.
Otros consejos
if printedgrade >= 70 <= 79:
debe ser
if printedgrade >= 70 and printedgrade <= 79:
También podrías hacer algo así:
if printedgrade >= 90:
return "A"
elif printedgrade >= 80:
return "B"
elif printedgrade >= 70:
return "C"
...