Criar um programa de votação

galera to meio perdido em criar esse programa. se alguem puder ajudar e ver onde esta o erro.(em linguagem Python)
Em uma eleição especial, uma instituição está procurando pessoas que possam criar um programa de votação eletrônica. Esta eleição será daqui a uma semana e a instituição viu seu potencial para programar este software. Com o pagamento deste serviço, você poderá pagar suas contas durante 3 meses (sem dívidas durante 3 meses).
A eleição terá apenas três candidatos com seus respectivos números:
01 - José da Silva
02 - Maria do Jurunas
03 - João do Tapanã
Para finalizar a votação o mesário deve digitar a palavra “Fim”. Ao finalizar a votação, o programa deve mostrar quantos votos cada candidato obteve na eleição.

candidato_ José_da_Silva = 0;

candidato_ Maria_do_Jurunas = 0;

candidato_ João_do_Tapanã = 0;

Print(‘ELEIÇÃO ESPECIAL’) candidato = str(input(‘Digite o numero do seu candidato:’))

While(candidato != ‘fim’): if candidato == ’1’:

candidato_José_da_Silva += 1

else

if candidato == ’2’:

candidato_ Maria_do_Jurunas += 1

else

if candidato == ’3’:

Candidato_ João_do_Tapanã += 1

else:

candidato=str(input(‘Digite um numero valido para o candidato: ‘))

Print(‘ELEIÇÃO ESPECIAL’)

Candidato = str(input(‘Digite o numero do seu candidato: ‘))

If candidato == “fim”:\ break

Print(‘QUANTIDADE DE VOTOS’)

Print(‘CANDIDATO JOSÉ DA SILVA - TOTAL DE (‘..1F) VOTOS’. Format(Candidato_José_da_Silva))

Print(‘CANDIDATO MARIA DO JURUNAS - TOTAL DE (‘..1f)

votos’.format(Candidato_ Maria_do_Jurunas))

Print(‘CANDIDATO JOÃO DO TAPANÃ - TOTAL DE (‘..1f)

votos’.format(Candidato_ João_do_Tapanã))
1 curtida

Opa, tudo certo?

  • Refatorei seu programa, mudei um pouco as variáveis (tirei acentos, por ex), separei as operações em funções e utilizei globais para cada candidato.

  • O programa ficou simples e ocorre a partir do main quando você roda o código.

  • A votação finaliza quando o usuário digita ‘Fim’, ‘fim’ ou ‘FIM’. Ocorrendo a contagem de votos e o encerramento do programa com a funcao built in exit().

Código:

def votacao(candidato):  # fução para votação com a variavel candidato como argumento
    global candidato_Maria_do_Jurunas, candidato_Jose_da_Silva, candidato_Joao_do_Tapana
 
    if candidato.isalpha():  # checa se candidato contem apenas letras
        if candidato == 'Fim' or candidato == 'fim' or candidato == 'FIM':
            print('FIM DA VOTAÇÃO')
            print_resultados()

    elif candidato.isnumeric():  # checa se candidato e um caracter numerico
        if candidato == '1' or candidato == '2' or candidato == '3':
            if candidato == '1':
                candidato_Jose_da_Silva += 1
            elif candidato == '2':
                 candidato_Maria_do_Jurunas += 1
            elif candidato == '3':
                 candidato_Joao_do_Tapana += 1
        else:  # se o valor digitado nao e valido, há entrada de novo candidato e a funcao repete
            candidato= str(input('Digite um numero valido para o candidato: '))
            votacao(candidato)


def print_resultados():  # printa resultados e encerra programa
    global candidato_Maria_do_Jurunas, candidato_Jose_da_Silva, candidato_Joao_do_Tapana

    print('QUANTIDADE DE VOTOS:\n')
    print('CANDIDATO JOSÉ DA SILVA - TOTAL DE ' + str(candidato_Jose_da_Silva))
    print('CANDIDATO MARIA DO JURUNAS - TOTAL DE ' + str(candidato_Maria_do_Jurunas))
    print('CANDIDATO JOÃO DO TAPANÃ - TOTAL DE ' + str(candidato_Joao_do_Tapana))

    exit()  # encerra prog


if __name__ == '__main__':  # funcao main 
    candidato_Maria_do_Jurunas = 0
    candidato_Jose_da_Silva = 0
    candidato_Joao_do_Tapana = 0

    while True:  # laço ocorre indefinidamente ate que ocorra o 'Fim'
        candidato = str(input('ELEIÇÃO ESPECIAL\nDigite o numero do seu candidato: '))
        votacao(candidato)
1 curtida

No seu caso só tem 3 candidatos e “tudo bem” usar 3 variáveis para as contagens, mas e se tiver mais (10, 50, 300 candidatos)? Você vai criar realmente uma variável para cada um?

Para deixar o código um pouco mais genérico, você pode usar um dicionário que mapeia cada candidato com o seu número. Algo assim:

candidatos = {
    '01': 'José da Silva',
    '02': 'Maria do Jurunas',
    '03': 'João do Tapanã'
}

E para computar os votos, basta criar outro dicionário, com as mesmas chaves (os números de cada candidato), mas o valor sendo a quantidade de votos.

Vale lembrar que input já retorna uma string, então fazer str(input()) é redundante e desnecessário.

Ficaria assim:

candidatos = {
    '01': 'José da Silva',
    '02': 'Maria do Jurunas',
    '03': 'João do Tapanã'
}

votos = {} # dicionário com total de votos começa vazio
while True:
    voto = input('Digite o número do candidato (ou "fim" para encerrar): ')
    if voto == 'fim':
        break # sai do while True
    if voto in candidatos: # se é um dos números de candidato válido
        votos[voto] = votos.get(voto, 0) + 1
    else:
        print(f'Número inválido: {voto}')

print('Resultado:')
for numero, qtd_votos in votos.items():
    print(f'{candidatos[numero]} teve {qtd_votos} votos')

Fica mais fácil saber se o número é válido verificando se ele é uma das chaves do dicionário (if voto in candidatos).

E para atualizar o total de votos, usei votos.get(voto, 0) (se já existir algum valor, retorna, senão retorna zero). Depois basta somar 1 e atualizar o total de votos.

Ao final, teremos todos os votos, bastando imprimi-los.

Assim fica mais genérico porque se tiver que adicionar mais candidatos, basta acrescentá-los no dicionário candidatos. O restante do código permanece igual.


Se quiser, pode usar também um Counter, que seria útil para saber quem ganhou a eleição:

from collections import Counter

candidatos = {
    '01': 'José da Silva',
    '02': 'Maria do Jurunas',
    '03': 'João do Tapanã'
}

votos = Counter()
while True:
    voto = input('Digite o número do candidato (ou "fim" para encerrar): ')
    if voto == 'fim':
        break # sai do while True
    if voto in candidatos: # se é um dos números de candidato válido
        votos.update([voto])
    else:
        print(f'Número inválido: {voto}')

print('Resultado:')
for numero, qtd_votos in votos.most_common():
    print(f'{candidatos[numero]} teve {qtd_votos} votos')

É quase igual ao código anterior, a diferença é que o Counter possui o método most_common, que já retorna os valores na ordem (primeiro aparecerão os mais votados).

2 curtidas

boa tarde glr tbm peguei a idéia de vcs e adaptei pra minha necessidade…

cand = [‘candidato A’, ‘candidato B’, ‘candidato C’, ‘candidato D’, ‘Nulos’, ‘Brancos’]
num = {cand[0] : 0, cand[1] : 0, cand[2] : 0, cand[3] : 0, cand[4] : 0, cand[5] : 0}
print(“SISTEMA DE VOTAÇÃO\n”)
print(" Digite: \n\n 1 para votar no candidato A \n 2 para votar no canditado B \n 3 para votar no canditado C \n 4 para votar no canditado D \n 5 para anular seu voto ou \n 6 para votar em branco\n")
print(" Qualquer outro numero ou caractere digitado será computado como voto em branco!\n")
for x in range (10) :
voto = input("\n Digite o número correspondente a sua opção: “)
if voto == str(1) : num[cand[0]] += 1
elif voto == str(2) : num[cand[1]] += 1
elif voto == str(3) : num[cand[2]] += 1
elif voto == str(4) : num[cand[3]] += 1
elif voto == str(5) : num[cand[4]] += 1
elif voto == str(6) : num[cand[5]] += 1
else: num[cand[5]] += 1
print (”\n RESULTADO \n")
print (num.items())