Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Desafio 9 - 04. Estruturas de repetição

Oi pessoal, tudo bem?

No desafio 09 das estruturas de repetição eu resolvi de duas formas. Na primeira (abaixo) usando while funcionou legal, aqui não encontrei nenhum problema apesar de não ser a mais elegante:

voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))

cont_votantes = 0
cont1 = 0
cont2 = 0
cont3 = 0
cont4 = 0
cont5 = 0
cont6 = 0

while cont_votantes < 20:
        
    if voto_usuario < 1 or voto_usuario > 6:
        print("Voto do usuário é inválido, por favor, verifique o número digitado!")
        voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
    else:
        if voto_usuario == 1:
            cont1 += 1
            cont_votantes +=1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
        elif voto_usuario == 2:
            cont2 += 1
            cont_votantes +=1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
        elif voto_usuario == 3:
            cont3 += 1
            cont_votantes += 1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
        elif voto_usuario == 4:
            cont4 += 1
            cont_votantes += 1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
        elif voto_usuario == 5:
            cont5 += 1
            cont_votantes += 1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
        elif voto_usuario == 6:
            cont6 += 1
            cont_votantes += 1
            voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
            

    total_de_votos  = cont1 + cont2 + cont3 + cont4 + cont5 + cont6
    percent_nulos = (cont5 / cont_votantes) * 100
    percent_brancos = (cont6 / cont_votantes) * 100
print(f'Total de votantes na eleição foi de: {total_de_votos}\nApuração:\nJoão: {cont1} votos\nMaria: {cont2} votos\nJosé: {cont3} votos\nJosefina: {cont4} votos\nNulos: {cont5} votos\nBrancos: {cont6} votos\nPercentual de nulos foi de: {percent_nulos}%\nPercentual de brancos foi de: {percent_brancos}%')

Tentei fazer outra versão com "for", um pouco mais próxima do que foi colocado como resolução na aula. No entanto, estou com algum problema na reinicialização das variáveis. Aparentemente toda vez que eu executo o código novamente, parece que as variáveis não estão sendo "zeradas" para começar as eleições a partir do voto "0" e acaba saindo uns resultos esquisitos. Meu código ficou assim:

###método 2
cont1 = 0
cont2 = 0
cont3 = 0
cont4 = 0
cont5 = 0
cont6 = 0

for votos in range(0,20):
    voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))

    if voto_usuario < 1 or voto_usuario > 6:
        print("Voto do usuário é inválido, por favor, verifique o número digitado!")
        voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
    else:
        if voto_usuario == 1:
            cont1 += 1
        elif voto_usuario == 2:
            cont2 += 1
        elif voto_usuario == 3:
            cont3 += 1
        elif voto_usuario == 4:
            cont4 += 1
        elif voto_usuario == 5:
            cont5 += 13

        elif voto_usuario == 6:
            cont6 += 1

total_de_votos  = cont1 + cont2 + cont3 + cont4 + cont5 + cont6
percent_nulos = (cont5 / cont_votantes) * 100
percent_brancos = (cont6 / cont_votantes) * 100
    
print(f'Total de votantes na eleição foi de: {total_de_votos}\nApuração:\nJoão: {cont1} votos\nMaria: {cont2} votos\nJosé: {cont3} votos\nJosefina: {cont4} votos\nNulos: {cont5} votos\nBrancos: {cont6} votos\nPercentual de nulos foi de: {percent_nulos}%\nPercentual de brancos foi de: {percent_brancos}%')

E o resultado obtido na saída depois de ter rodado 2 vezes o programa somou 56 votos quando na verdade deveria ter somado somente 20 votos, independentemente do número de vezes que eu rodo o meu código.

Restultado:

Total de votantes na eleição foi de: 56 Apuração: João: 3 votos Maria: 4 votos José: 4 votos Josefina: 4 votos Nulos: 39 votos Brancos: 2 votos Percentual de nulos foi de: 195.0% Percentual de brancos foi de: 10.0%

Será que eu preciso passar alguma linha para informar a reinicialização das variáveis?

Muito obrigado por quem puder apoiar aqui! :)

4 respostas

Oi, Rafael! Tudo bem?

Sim! Para evitar que as variáveis usadas no loop for sejam afetadas pelo resultado obtido a partir do loop while, precisamos reinicializar algumas delas.

No início do seu código, recomendo escrever o seguinte trecho:

cont1 = 0
cont2 = 0
cont3 = 0
cont4 = 0
cont5 = 0
cont6 = 0

percent_nulos = 0
percent_brancos = 0

Rafa, observei ainda outros dois detalhes em seu código que podem estar interferindo no resultado dos votos, acompanhe comigo:

Ao considerar a condição voto_usuario == 5, é somado mais 13 à variável cont5, no entanto, deveríamos somar apenas 1. Após alterar o valor da atribuição com soma, chegaremos no seguinte trecho de código:

elif voto_usuario == 5:
    cont5 += 1

Além disso, como no programa construído a partir de loop for não utilizamos a variável cont_votantes, o seu código atual possivelmente está resgatando o valor armazenado no cont_votantes do programa feito com loop while. Sendo assim, recomendo reescrever o trecho de código em que são atribuídos novos valores à total_de_votos, percent_nulos e percent_brancos:

total_de_votos  = cont1 + cont2 + cont3 + cont4 + cont5 + cont6
percent_nulos = (cont5 / total_de_votos) * 100
percent_brancos = (cont6 / total_de_votos) * 100

Feito isso, tente executar novamente todo o seu programa, Rafael! Caso queira o código completo, aqui está:

### método 2

cont1 = 0
cont2 = 0
cont3 = 0
cont4 = 0
cont5 = 0
cont6 = 0

percent_nulos = 0
percent_brancos = 0

for votos in range(0,20):
    voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))

    if voto_usuario < 1 or voto_usuario > 6:
        print("Voto do usuário é inválido, por favor, verifique o número digitado!")
        voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))
    else:
        if voto_usuario == 1:
            cont1 += 1
        elif voto_usuario == 2:
            cont2 += 1
        elif voto_usuario == 3:
            cont3 += 1
        elif voto_usuario == 4:
            cont4 += 1
        elif voto_usuario == 5:
            cont5 += 1
        elif voto_usuario == 6:
            cont6 += 1

total_de_votos  = cont1 + cont2 + cont3 + cont4 + cont5 + cont6
percent_nulos = (cont5 / total_de_votos) * 100
percent_brancos = (cont6 / total_de_votos) * 100
    
print(f'Total de votantes na eleição foi de: {total_de_votos}\nApuração:\nJoão: {cont1} votos\nMaria: {cont2} votos\nJosé: {cont3} votos\nJosefina: {cont4} votos\nNulos: {cont5} votos\nBrancos: {cont6} votos\nPercentual de nulos foi de: {percent_nulos}%\nPercentual de brancos foi de: {percent_brancos}%')

Espero que dê tudo certo. Qualquer dúvida, fico à disposição.

Um abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Andrielli, muito obrigado pela força. Esclareceu bastante.

Deu certo quando eu segui sua recomendação de zerar os contadores do "percent_nulos" e "percent_branco".No entanto, descobri que eu código tem um outro bug quando eu digito valores inválidos diversas vezes. Digitei 20 vezes o valor "zero" e a mensagem de "Voto do usuário é inválido, por favor, verifique o número digitado!" aparece corretamente, isto é, a exceção está entrando na condição correta. Porém, o código está considerando os valores errados na contagem dos 20 votos quando na verdade eles deveriam ser descartados. Saberia me orientar para resolver esse problema? Para tangibilizar, tente digitar 19 vezes o valor 0 e depois digite o valor 1. Você vai ver que ele vai sair do programa com um resultado errado.

Tentei inverter a condição do:

    if voto_usuario < 1 or voto_usuario > 6:
        print("Voto do usuário é inválido, por favor, verifique o número digitado!")

mas não deu certo....

solução!

Oi, Rafa! Fico feliz em saber que esclareci sua dúvida. :)

Para resolver este novo desafio que surgiu, podemos substituir a estrutura condicional if por um laço de repetição while — que só avança para a próxima iteração do loop quando um voto válido for inserido.

Abaixo há um exemplo de código:

while voto_usuario < 1 or voto_usuario > 6:
    print("Voto do usuário é inválido, por favor, verifique o número digitado!")
    voto_usuario = int(input("Digite o número do seu candidato:\n 1: João\n 2: Maria\n 3:José\n 4:Josefina\n 5:Nulo\n 6:Branco"))

Dessa maneira, enquanto o usuário não digitar um valor adequado (dentro do intervalo de 1 até 6), o programa continuará solicitando um número — isso impedirá que a repetição do for continue e que um valor incorreto apareça no "Total de votantes na eleição".

Abraços!

Obrigado Andrieli, solução simples é prática, mas, como quase tudo na programação, o olhar de alguém de fora é sempre muito valioso!

Muitas ideias para melhorar o código, mas seguimos em frente!