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()  
Foi útil?

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"
...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top