Skip to content

Instantly share code, notes, and snippets.

@rpc1910
Created October 29, 2013 21:40
Show Gist options
  • Select an option

  • Save rpc1910/7223140 to your computer and use it in GitHub Desktop.

Select an option

Save rpc1910/7223140 to your computer and use it in GitHub Desktop.
Exercício em C sobre sistema de eleição - Prof Hiromasa
/*
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