Olá, Núria. Como vai?
Essa é uma dúvida muito comum quando estamos trabalhando com contadores e laços de repetição. O problema no seu código atual é que o for i in range(1, 21) vai rodar exatamente 20 vezes, independentemente de o voto ser válido ou não. Quando o voto é inválido, ele cai no else, exibe a mensagem, mas a "rodada" do loop é consumida e o programa passa para o próximo i.
Para resolver isso e garantir que o programa só avance quando receber um voto válido, você pode utilizar um laço while dentro ou no lugar do seu for.
Aqui estão duas formas de solucionar isso:
1. Utilizando while para validar cada entrada
Nesta abordagem, mantemos o seu for, mas criamos um "bloqueio" que só deixa o código sair do while quando o voto estiver entre 1 e 6:
for i in range(1, 21):
voto = int(input(f'Votante {i}, digite o seu voto: '))
# Enquanto o voto for menor que 1 ou maior que 6, ele pede novamente
while voto < 1 or voto > 6:
print('Voto inválido. Por favor, vote de 1 a 6.')
voto = int(input(f'Votante {i}, digite o seu voto novamente: '))
# Agora o processamento só acontece com votos garantidamente válidos
if voto == 1:
cand1 += 1
elif voto == 2:
cand2 += 1
# ... (restante dos seus elifs)
2. Utilizando apenas o while com um contador manual
Outra forma elegante é controlar a contagem manualmente. O contador só aumenta (votos_computados += 1) se o voto entrar em uma das condições válidas:
votos_computados = 0
while votos_computados < 20:
voto = int(input(f'Voto nº {votos_computados + 1}: '))
if voto == 1:
cand1 += 1
votos_computados += 1
elif voto == 2:
cand2 += 1
votos_computados += 1
# ... (faça isso para todos os candidatos, nulo e branco)
else:
print('Voto inválido. Este voto não será computado, tente novamente.')
Dica extra sobre a porcentagem:
Notei que no seu print final você usou (nulo/20). Para exibir em formato de porcentagem real (ex: 10%), você pode multiplicar por 100 ou usar a formatação do Python:
print(f'A porcentagem de votos nulos foi de {(nulo/20):.0%}')
Escolha a opção que achar mais clara para o seu raciocínio. A primeira opção (com while dentro do for) é excelente para garantir que cada um dos 20 eleitores cumpra sua tarefa de votar corretamente.
Espero que possa ter lhe ajudado!