Created
October 29, 2013 21:40
-
-
Save rpc1910/7223140 to your computer and use it in GitHub Desktop.
Exercício em C sobre sistema de eleição - Prof Hiromasa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| EXERCÍCIO | |
| Fazer um programa para o tribunal eleitoral que apresente um menu com as seguintes opções: | |
| [1] – Mané Furtado | |
| [2] – Vô Roubar | |
| [3] – Só Ladrão | |
| [4] – Zé Pilantra | |
| [5] - Encerrar | |
| Digite o seu voto: _ | |
| OBS: | |
| - Não é preciso considerar empates. | |
| - A opção [5] Encerrar deverá apresentar os resultados: | |
| 1o colocado: xxxxxxxxxx com 99% | |
| 2o colocado: xxxxxxxxxx com 99% | |
| 3o colocado: xxxxxxxxxx com 99% | |
| 4o colocado: xxxxxxxxxx com 99% | |
| */ | |
| #include <stdio.h> | |
| #include <conio.h> | |
| #include <stdlib.h> | |
| int op, i, candidatosExibidos[4], candidatos[4] = {0, 0, 0, 0}; | |
| void menu(); //Apresenta e faz leitura do Menu | |
| void apuracao(); //Faz todo o processo de apuração dos votos | |
| int totalVotos(); //Retorna o número total de votos | |
| void somaVoto(int posicao); //Soma voto ao candidato escolhido | |
| int in_array(int alvo, int tamanho); //Verifica existência de um número no vetor | |
| void main() { | |
| do { | |
| menu(); | |
| switch(op) { | |
| case 1: | |
| somaVoto(0); | |
| break; | |
| case 2: | |
| somaVoto(1); | |
| break; | |
| case 3: | |
| somaVoto(2); | |
| break; | |
| case 4: | |
| somaVoto(3); | |
| break; | |
| } | |
| system("cls"); | |
| } while(op != 5); | |
| apuracao(); | |
| getch(); | |
| } | |
| void menu() { | |
| printf("\nEscolha sua opcao:"); | |
| printf("\n\n[1] - Mane Furtado"); | |
| printf("\n[2] - Vo Roubar"); | |
| printf("\n[3] - So Ladrao"); | |
| printf("\n[4] - Ze Pilantra"); | |
| printf("\n[5] - Encerrar"); | |
| printf("\n\nDigite seu voto: "); | |
| scanf("%d", &op); | |
| } | |
| /* | |
| Como estou utilizando um vetor para armazenar os votos, | |
| utilizo apenas uma função para contabilizar os votos | |
| O que tem de diferente ai é que a função recebe como parâmetro a posição no vetor referente ao candidato | |
| Provavelmente o Hiro vá falar sobre isso na próxima aula... | |
| */ | |
| void somaVoto(int posicao) { | |
| candidatos[posicao]++; | |
| } | |
| void apuracao() { | |
| int total, ordenado[4], j, aux; | |
| /* | |
| A função totalVotos() me retorna o número total de votos, esse número é armazenado na variável total | |
| */ | |
| total = totalVotos(); | |
| //Aqui apenas copio todos os votos para um vetor auxiliar para realizar a ordenação | |
| for(i = 0; i < 4; i++) { | |
| ordenado[i] = candidatos[i]; | |
| } | |
| //Aqui ocorre a ordenação na ordem decrescente, ou seja | |
| //do maior para o menor... | |
| for (i = 0; i < 4; i++) { | |
| for (j = i; j < 4; j++) { | |
| if (ordenado[i] < ordenado[j]) { | |
| aux = ordenado[i]; | |
| ordenado[i] = ordenado[j]; | |
| ordenado[j] = aux; | |
| } | |
| } | |
| } | |
| /* | |
| Depois de ter ordenado o vetor, eu percorro esse vetor ordenado para mostrar os resultados | |
| O vetor foi ordenado, porém esta com seus votos todos bagunçados na ordem que eu defini na leitura | |
| */ | |
| printf("\n\nTotal de votos: %d", total); | |
| for (i = 0; i < 4; i++) { | |
| /*A cada posição do vetor ordenado eu percorro o vetor original comparando os votos que são iguais | |
| Ao encontrar no vetor original o número de votos que seja igual, ele entra no if para mostrar o nome | |
| do candidato referente a aquela posição... | |
| Porém, fazendo dessa forma caso tenha candidatos com o mesmo número de votos, dará merda... | |
| Então eu utilizei um terceiro vetor para armazenar a posição dos candidatos que já foram exibidos | |
| Para verificar se determinado candidato já foi exibido, eu criei a função in_array que retorna o número 1 caso a posição esteja armazenada no vetor | |
| "!in_array" faz com que eu negue a condição, ou seja: | |
| if (ordenado[i] == candidatos[j] && !in_array(j, i)) { | |
| nesse if para a condição ser verdadeira, é necessário que os valores sejam igual e o retorno da função in_array seja 0, ou seja, não encontrado | |
| com teste de mesa vcs vão entender melhor... | |
| Exemplo de execução: | |
| candidatos[0] = 1; | |
| candidatos[1] = 15; | |
| candidatos[2] = 5; | |
| candidatos[3] = 30; | |
| ordenado[0] = 30; | |
| ordenado[1] = 15; | |
| ordenado[2] = 5; | |
| ordenado[3] = 1; | |
| Executando o loop.. Só pra lembrar, exclamação (!) em C é a porta lógica NOT | |
| quando i vale 0 e j vale 0, temos a seguinte condição: | |
| (30 == 1 && !0) //Condição falsa | |
| i = 0, j = 1 | |
| (30 == 15 && !0) //Condição falsa | |
| i = 0, j = 2 | |
| (30 == 5 && !0) //Condição falsa | |
| i = 0, j = 3 | |
| (30 == 30 && !0) //Condição verdadeira imprime Zé Pilantra | |
| --------------- termina for do J | |
| i = 1, j = 0 | |
| (15 == 1 && !0) //Condição falsa | |
| i = 1, j = 1 | |
| (15 == 15 && !0) //Condição verdadeira, imprime Vô Roubar | |
| e assim por diante... | |
| */ | |
| for (j = 0; j < 4; j++) { | |
| if (ordenado[i] == candidatos[j] && !in_array(j, i)) { | |
| printf("\n[%d] - ", i + 1); | |
| switch(j) { | |
| case 0: | |
| printf("Mane Furtado"); | |
| break; | |
| case 1: | |
| printf("Vo Roubar"); | |
| break; | |
| case 2: | |
| printf("So Ladrao"); | |
| break; | |
| case 3: | |
| printf("Ze Pilantra"); | |
| break; | |
| } | |
| printf(" - %d Votos (%.2f %%)", candidatos[j], (float)(candidatos[j] * 100 / total)); | |
| /* | |
| Arqui eu armazeno a posição do candidato que foi exibido para pular esse candidato | |
| caso tenha candidatos com o mesmo número... | |
| */ | |
| candidatosExibidos[i] = j; | |
| /*Esse break força a saída do loop para evitar imprimir dois candidatos com o mesmo número de votos | |
| caso ele encontre. Se tiver dois candidatos com o mesmo número de votos, ele mostrará só | |
| o primeiro resultado encontrado. | |
| Como armazenei a posição desse candidato, na próxima interação que o número de votos será igual, | |
| a função in_array irá mostrar que o candidato já foi exibido, continuando a busca por outro candidato que tenha o mesmo número de votos.. | |
| */ | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| int totalVotos() { | |
| int total = 0; | |
| for (i = 0; i < 4; i++) { | |
| total += candidatos[i]; | |
| } | |
| return total; | |
| } | |
| /* | |
| Faz um loop percorrendo um vetor para buscar a existência de um número nele | |
| Recebe como parâmetro o tamanho do vetor e o número a ser procurado | |
| Retorna 0 se não foi encontrado e 1 caso tenha encontrado o número | |
| */ | |
| int in_array(int busca, int tamanho) { | |
| int x; | |
| int encontrado = 0; | |
| for (x = 0; x < tamanho; x++) { | |
| if(candidatosExibidos[x] == busca) { | |
| encontrado = 1; | |
| } | |
| } | |
| return encontrado; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment