Error when calculating a loop value

Asked

Viewed 268 times

1

#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 above code when inserting, for example, 5 students, with the grades 10, 22, 10, 100, 100 The program does not display 2 students with the highest grades as desired, but 3 students. Why does this happen? How can I solve?

3 answers

4

It is because you mixed the logics 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 which are 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 take a table test.

What is a Table Test? How to Apply It?

Besides, your code has many language flaws, far from being considered pythonic.

What is pythonic code?

A better solution would be similar to the one I presented in this answer, using the class collections.Counter.

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 on Repl.it

  • I’m starting now in python, and yes, I define the biggest and smallest notes, because that’s exactly what I have to do, so I can make the comparisons. I’ll take a look at the references, thanks :D

  • 1

    @The problem is just doing it in the same loop. For example, the first note is 10, which is greater than 0 (initial), so you update the value to 10 and then add to the counter if the student’s grade is equal to the highest grade. The highest note will not be 10, but even so in this loop you compare and add the counter.

  • was adding the note, but saw that I should not, and I zero the counter, the addition in Count occurs at the end of all checks, and without that addition, the loop would be infinite

  • 1

    @Withered by that counter: alunosMaN = alunosMaN + 1

2


The problem is being in the second while, the highest note changes according to what it passes on loop and the student counter with the lowest and highest grade keeps adding up, I would change the way to get the highest and lowest grade to 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")
  • A small repair: the performance level the condition of the while, given the value of len(notasAlunos) be constant at that point, you don’t need to always perform len(...) each loop, https://ideone.com/0BNU7s, when using while can/should assign this value to a variable previously, or change the cycle to a for ...

1

In this case, simply reset the Count if the value of the highest, or lowest grade is updated, causing the count of students with the same value (being the highest, or the lowest only) to resume.

    if notasAlunos[count] < menorNota:
        alunosMeN = 0
        menorNota = notasAlunos[count]
    if notasAlunos[count] > maiorNota:
        alunosMaN = 0
        maiorNota = notasAlunos[count]

Browser other questions tagged

You are not signed in. Login or sign up in order to post.