Error calculating a loop value

0
#O usuário informa o número de alunos totais na sala, em seguida são declaradas as variáveis que complementarão os loops
alunos = int(input("Qual o número de alunos na sala?\n"))
notasAlunos = []
count = 0
#loop de armazenamento de notasXalunos
while count < alunos:
    notaAluno = int(input("Qual a nota do aluno " + str(count + 1) + "? (0 a 100 pontos)\n"))
    notasAlunos.append(notaAluno)
    count = count + 1
#count zerado para ser reutilizado no próximo loop
count = 0
#Variáveis de notas
menorNota = 100
maiorNota = 0
alunosMeN,alunosMaN = 0,0
#loop de verificação do valor de notas (min e max), e verificação de notas mínimas ou máximas iguais
while count < len(notasAlunos):
    if notasAlunos[count] < menorNota:
        menorNota = notasAlunos[count]
    if notasAlunos[count] > maiorNota:
        maiorNota = notasAlunos[count]
    if notasAlunos[count] == menorNota:
        alunosMeN = alunosMeN + 1
    elif notasAlunos[count] == maiorNota:
        alunosMaN = alunosMaN + 1
    count = count + 1
#print com os valores da maior e menor nota, junto ao número de alunos que tiraram determinada nota
print("A maior nota tirada foi ", maiorNota, " Essa nota foi tirada por ", alunosMaN, " aluno(s)\n")
print("A menor nota tirada foi ", menorNota, " Essa nota foi tirada por ", alunosMeN, " aluno(s)\n")

Given the code above, when you enter, for example, 5 students, with notes 10, 22, 10, 100, 100 The program does not display 2 students with the highest grades as desired but 3 students. Why does this occur? How can I troubleshoot?

    
asked by anonymous 27.03.2018 / 21:39

3 answers

2

The problem is being in the second while , the highest grade changes as it passes loop and the student count with the smallest and largest note continues adding, I would change the way to get the largest and lower note for the code below:

menorNota = min(notasAlunos)
maiorNota = max(notasAlunos)

the whole code would look like this:

#O usuário informa o número de alunos totais na sala, em seguida são declaradas as variáveis que complementarão os loops
alunos = int(input("Qual o número de alunos na sala?\n"))
notasAlunos = []
count = 0
#loop de armazenamento de notasXalunos
while count < alunos:
    notaAluno = int(input("Qual a nota do aluno " + str(count + 1) + "? (0 a 100 pontos)\n"))
    notasAlunos.append(notaAluno)
    count = count + 1
#count zerado para ser reutilizado no próximo loop
count = 0
#Variáveis de notas
menorNota = min(notasAlunos)
maiorNota = max(notasAlunos)
alunosMeN,alunosMaN = 0,0
#loop de verificação do valor de notas (min e max), e verificação de notas mínimas ou máximas iguais
while count < len(notasAlunos):    
    if notasAlunos[count] == menorNota:
        alunosMeN = alunosMeN + 1
    if notasAlunos[count] == maiorNota:
        alunosMaN = alunosMaN + 1
    count = count + 1
#print com os valores da maior e menor nota, junto ao número de alunos que tiraram determinada nota
print("A maior nota tirada foi ", maiorNota, " Essa nota foi tirada por ", alunosMaN, " aluno(s)\n")
print("A menor nota tirada foi ", menorNota, " Essa nota foi tirada por ", alunosMeN, " aluno(s)\n")
    
27.03.2018 / 21:53
4

It is because you have mixed the logic in the same code snippet.

while count < len(notasAlunos):
    if notasAlunos[count] < menorNota:
        menorNota = notasAlunos[count]
    if notasAlunos[count] > maiorNota:
        maiorNota = notasAlunos[count]
    if notasAlunos[count] == menorNota:
        alunosMeN = alunosMeN + 1
    elif notasAlunos[count] == maiorNota:
        alunosMaN = alunosMaN + 1
    count = count + 1

With this loop, you both define the lowest and highest grades and count how many students have them. This hurts the principle of code uniqueness.

What are "code units"?

To understand better, just do a table test.

What is a Table Test? How to apply it?

In addition, your code has many language vices, far from being considered pythonic .

What is pythonic code?

A better solution would look like in this answer , using the collections.Counter class.

from collections import Counter

numero_alunos = int(input("Qual o número de alunos na sala?\n"))
notas_alunos = [
    float(input("Nota do aluno {}? (0 a 100 pontos)".format(i+1))) 
        for i in range(numero_alunos)
]

maior_nota = max(notas_alunos)
menor_nota = min(notas_alunos)

classificacao = Counter(notas_alunos)

print("A maior nota tirada foi ", maior_nota, " Essa nota foi tirada por ", classificacao[maior_nota], " aluno(s)")
print("A menor nota tirada foi ", menor_nota, " Essa nota foi tirada por ", classificacao[menor_nota], " aluno(s)")

See working at Repl.it

    
27.03.2018 / 21:55
0

In this case, simply reset the count if the value of the higher or lower grade is updated, so that the count of the students with the same value (being the largest or the smallest only) starts again.

    if notasAlunos[count] < menorNota:
        alunosMeN = 0
        menorNota = notasAlunos[count]
    if notasAlunos[count] > maiorNota:
        alunosMaN = 0
        maiorNota = notasAlunos[count]
    
27.03.2018 / 21:48