Last active
December 28, 2015 02:49
-
-
Save edenfall/7430645 to your computer and use it in GitHub Desktop.
FAFIT - Sistemas de Informação - 2º semestre 2013
Estruturas de Dados I - Professor Danilo
Lista/Exercício #03 de 2013-10-31
2013-10-31-ex03.c
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
/* | |
3)Faça um programa para auxiliar no processo de eleição do prefeito de um | |
determinado município. | |
Crie uma estrutura de dados chamada CANDIDATO com os seguintes membros: | |
nome char[30], partido[20], slogan[100] | |
int idade, numero_cand, votos | |
O programa deve, inicialmente, solicitar que o usuário faça o cadastro de 3 | |
candidatos, e então, exibir o menu de opções abaixo: | |
1-Votar (Exibe um menu com o número, nome e partido do candidato. Além disso, | |
deve ter uma opção para voto BRANCO e NULO. O sistema deve exibir todos os dados | |
do candidato e perguntar se o usuário confirma o seu voto ou deseja escolher | |
outro. Após confirmar o voto, deve ser exibida uma mensagem com o total de votos | |
do candidato escolhido.) | |
2-Exibir dados da eleição (Exibe o número, nome, partido, e total de votos de | |
cada candidato.) | |
0-Finalizar eleição (Exibe todos os dados dos candidatos, o percentual de votos | |
de cada um, o total de eleitores, e se houve vencedor – quando algum candidato | |
tem no mínimo 50% + 1 votos) | |
Para desenvolver o sistema, utilize funções com passagem de parâmetros por | |
referência. | |
*/ | |
#include <stdio.h> | |
// #include <stdlib.h> | |
#include <string.h> | |
#include <time.h> | |
#define MAX_CANDIDATOS 3 // Máximo de candidatos | |
// ----------------------------------------------------------------------------- | |
// Esrutura do Candidato | |
struct STRUCT_CANDIDATO { | |
char | |
nome[30], | |
partido[20], | |
slogan[100]; | |
int | |
idade, | |
numero, | |
votos; | |
}; | |
typedef struct STRUCT_CANDIDATO Candidato; | |
// ----------------------------------------------------------------------------- | |
// Estrutura da urna | |
struct STRUCT_URNA { | |
int | |
topo, | |
brancos, // Votos brancos | |
nulos; // Votos nulos | |
Candidato | |
candidato[MAX_CANDIDATOS]; | |
}; | |
typedef struct STRUCT_URNA Urna; | |
// ----------------------------------------------------------------------------- | |
// Funções de manipulação da urna | |
Urna novaUrna (); | |
int overflow (Urna *urna); | |
void cadastrar (Urna *urna); | |
// ----------------------------------------------------------------------------- | |
// Funções para a votação | |
void menu (int *opcao); | |
void votar (Urna *urna); | |
void exibir (Urna *urna); | |
void finalizar (Urna *urna); | |
// ----------------------------------------------------------------------------- | |
// PROGRAMA PRINCIPAL | |
int main () { | |
int | |
opcao; // Opção do menu | |
// Cria a urna | |
Urna urna = novaUrna(); | |
// ------------------------------------------------------------------------- | |
// TESTES: Gera valores automáticos para testes | |
/*urna.topo = 2; | |
urna.brancos = 0; | |
urna.nulos = 0; | |
strcpy(urna.candidato[0].nome, "Fulano 1"); | |
strcpy(urna.candidato[0].partido, "Partido 1"); | |
strcpy(urna.candidato[0].slogan, "Slogan 1"); | |
urna.candidato[0].numero = 23; | |
urna.candidato[0].idade = 23; | |
urna.candidato[0].votos = 0; | |
strcpy(urna.candidato[1].nome, "Fulano 2"); | |
strcpy(urna.candidato[1].partido, "Partido 2"); | |
strcpy(urna.candidato[1].slogan, "Slogan 2"); | |
urna.candidato[1].numero = 34; | |
urna.candidato[1].idade = 34; | |
urna.candidato[1].votos = 0; | |
strcpy(urna.candidato[2].nome, "Fulano 3"); | |
strcpy(urna.candidato[2].partido, "Partido 3"); | |
strcpy(urna.candidato[2].slogan, "Slogan 3"); | |
urna.candidato[2].numero = 45; | |
urna.candidato[2].idade = 45; | |
urna.candidato[2].votos = 0;*/ | |
// ------------------------------------------------------------------------- | |
// TESTES: Lança valores aleatórios nos votos | |
/*srand(time(NULL)); | |
urna.brancos = rand() % 301; | |
urna.nulos = rand() % 301; | |
urna.candidato[0].votos = rand() % 301; | |
urna.candidato[1].votos = rand() % 301; | |
urna.candidato[2].votos = rand() % 301;*/ | |
// ------------------------------------------------------------------------- | |
// Etapa de cadastramento dos candidatos | |
while (!overflow(&urna)) { | |
cadastrar(&urna); | |
} | |
// printf("%s\n%s\n%s\n", urna.candidato[0].nome, urna.candidato[1].nome, urna.candidato[2].nome); | |
// printf("%d\n%d\n%d\n", urna.candidato[0].idade, urna.candidato[1].idade, urna.candidato[2].idade); | |
// ------------------------------------------------------------------------- | |
// Etapa de votação | |
do { | |
menu(&opcao); | |
switch (opcao) { | |
case 1: | |
votar(&urna); | |
break; | |
case 2: | |
exibir(&urna); | |
break; | |
} | |
} while (opcao != 0); | |
// ------------------------------------------------------------------------- | |
// Etapa de finalização e contagem dos votos | |
finalizar(&urna); | |
// ------------------------------------------------------------------------- | |
} | |
// ----------------------------------------------------------------------------- | |
// Cria e retorna uma nova urna | |
Urna novaUrna () { | |
Urna urna; | |
urna.topo = -1; | |
urna.brancos = 0; | |
urna.nulos = 0; | |
return urna; | |
} | |
// ----------------------------------------------------------------------------- | |
// Verifica se a urna está cheia | |
int overflow (Urna *urna) { | |
return urna->topo >= MAX_CANDIDATOS - 1; | |
} | |
// ----------------------------------------------------------------------------- | |
// Cadastra um novo Candidato | |
void cadastrar (Urna *urna) { | |
int | |
existe = 0; // Verificador da existência de um número | |
// Topo + 1 -> para gravar na posição logo acima do topo | |
// Topo + 2 -> como inicia em 0, e o topo só é incrementado no final da função, adicionamos 2 para aparecer números de 1 a MAX | |
printf("\n\nCADASTRO DE CANDIDATO #%d\n", urna->topo + 2); | |
printf("Informe o nome do candidato (30 caracteres): "); | |
gets(urna->candidato[urna->topo + 1].nome); | |
printf("Informe o partido do candidato (20 caracteres): "); | |
gets(urna->candidato[urna->topo + 1].partido); | |
printf("Informe o slogan do candidato (100 caracteres): "); | |
gets(urna->candidato[urna->topo + 1].slogan); | |
// Aqui temos validação para os valores inteiros | |
do { | |
printf("Informe a idade do candidato (de 21 a 90): "); | |
scanf("%d", &(urna->candidato[urna->topo + 1].idade)); | |
getchar(); | |
if (urna->candidato[urna->topo + 1].idade < 21 || urna->candidato[urna->topo + 1].idade > 90) { | |
printf("A idade do candidato deve ser de 21 a 90 anos.\n"); | |
getchar(); | |
} | |
} while (urna->candidato[urna->topo + 1].idade < 21 || urna->candidato[urna->topo + 1].idade > 90); | |
do { | |
int | |
a1; // Contador | |
printf("Informe o número do candidato (de 10 a 99): "); | |
scanf("%d", &(urna->candidato[urna->topo + 1].numero)); | |
getchar(); | |
if (urna->candidato[urna->topo + 1].numero < 10 || urna->candidato[urna->topo + 1].numero > 99) { | |
printf("O número do candidato deve ser de 10 a 99.\n"); | |
getchar(); | |
} | |
// Itera em todos os candidatos cadastrados EXCETO o atual | |
// Não deixa cadastrar um número que já existe | |
for (a1 = 0, existe = 0; a1 <= urna->topo; a1 += 1) { | |
// printf("%d: %d == %d\n", a1, urna->candidato[a1].numero, urna->candidato[urna->topo + 1].numero); | |
if (urna->candidato[a1].numero == urna->candidato[urna->topo + 1].numero) { | |
existe = 1; | |
break; | |
} | |
} | |
if (existe) { | |
printf("O número informado já está cadastrado para outro candidato.\n"); | |
getchar(); | |
} | |
} while (urna->candidato[urna->topo + 1].numero < 10 || urna->candidato[urna->topo + 1].numero > 99 || existe); | |
// Os votos do candidato começam em 0 | |
urna->candidato[urna->topo + 1].votos = 0; | |
// Todos os dados preenchidos, "confirma" o cadastro movendo o topo pra cima | |
urna->topo += 1; | |
} | |
// ----------------------------------------------------------------------------- | |
// Menu principal | |
void menu (int *opcao) { | |
// *opcao = 0; | |
do { | |
system("clear"); | |
printf( | |
"MENU PRINCIPAL\n\n" | |
"1 - Votar\n" | |
"2 - Exibir dados da eleição\n" | |
"0 - Finalizar eleição\n\n" | |
"Informe sua opção: " | |
); | |
scanf("%d", opcao); | |
getchar(); | |
if (*opcao < 0 || *opcao > 2) { | |
printf("Opção inválida.\n"); | |
getchar(); | |
} | |
} while (*opcao < 0 || *opcao > 2); | |
} | |
// ----------------------------------------------------------------------------- | |
// Realiza uma votação | |
void votar (Urna *urna) { | |
int | |
a1, // Contador | |
opcao, // Voto | |
candidatoIndice, // Candidato escolhido | |
confirma; // Usuário confirmou o voto | |
// Repete enquanto o usuário não confirmar o voto | |
do { | |
// Nenhum candidato selecionado (voto nulo) | |
candidatoIndice = -1; | |
system("clear"); | |
// Menu de votação | |
printf("VOTAR\n\n"); | |
for (a1 = 0; a1 <= urna->topo; a1 += 1) { | |
printf( | |
"%d - %s (%s)\n", | |
urna->candidato[a1].numero, | |
urna->candidato[a1].nome, | |
urna->candidato[a1].partido | |
); | |
} | |
printf( | |
"0 - Votar em branco\n" | |
"Qualquer outro número para votar nulo\n\n" | |
); | |
printf("Digite a sua opção: "); | |
scanf("%d", &opcao); | |
getchar(); | |
// Verifica se houve escolha de um candidato ou voto nulo | |
for (a1 = 0; a1 <= urna->topo; a1 += 1) { | |
if (opcao == urna->candidato[a1].numero) { | |
candidatoIndice = a1; | |
break; | |
} | |
} | |
// Exibe uma mensagem de acordo com a escolha do usuário | |
if (opcao == 0) { | |
printf("Você escolheu votar em BRANCO.\n\n"); | |
} else if (candidatoIndice == -1) { | |
printf("Você escolheu votar NULO.\n\n"); | |
} else { | |
printf( | |
"Você escolheu votar em:\n" | |
"Nome: %s\n" | |
"Partido: %s\n" | |
"Slogan: %s\n" | |
"Número: %d\n" | |
"Idade: %d\n\n", | |
urna->candidato[candidatoIndice].nome, | |
urna->candidato[candidatoIndice].partido, | |
urna->candidato[candidatoIndice].slogan, | |
urna->candidato[candidatoIndice].numero, | |
urna->candidato[candidatoIndice].idade | |
); | |
} | |
// Solicita a confirmação do voto | |
do { | |
printf( | |
"Confirma?\n" | |
"1 - Sim\n" | |
"0 - Não\n" | |
"Informe sua opção: " | |
); | |
scanf("%d", &confirma); | |
getchar(); | |
if (confirma != 0 && confirma != 1) { | |
printf("Opção incorreta.\n"); | |
getchar(); | |
} | |
} while (confirma != 0 && confirma != 1); | |
} while (!confirma); | |
// Atualiza a urna com o voto do usuário | |
if (opcao == 0) { | |
(urna->brancos)++; | |
} else if (candidatoIndice == -1) { | |
(urna->nulos)++; | |
} else { | |
(urna->candidato[candidatoIndice].votos)++; | |
} | |
} | |
// ----------------------------------------------------------------------------- | |
// Exibe os dados da urna | |
void exibir (Urna *urna) { | |
int | |
a1, // Contador | |
total; // Total de eleitores | |
system("clear"); | |
// Exibe candidato por candidato | |
for (a1 = 0, total = 0; a1 <= urna->topo; a1 += 1) { | |
printf( | |
"CANDIDATO #%d\n" | |
"Nome: %s\n" | |
"Partido: %s\n" | |
"Número: %d\n" | |
"Votos: %d\n\n", | |
a1 + 1, | |
urna->candidato[a1].nome, | |
urna->candidato[a1].partido, | |
urna->candidato[a1].numero, | |
urna->candidato[a1].votos | |
); | |
// Incrementa o total de votos | |
total += urna->candidato[a1].votos; | |
} | |
// Exibe os votos brancos e nulos | |
printf( | |
"Votos brancos: %d\n" | |
"Votos nulos: %d\n\n", | |
urna->brancos, | |
urna->nulos | |
); | |
// Incrementa o valor total de votos | |
total += (urna->brancos + urna->nulos); | |
// Exibe o total de votos na urna | |
printf( | |
"TOTAL DE VOTOS: %d\n\n", | |
total | |
); | |
getchar(); | |
} | |
// ----------------------------------------------------------------------------- | |
// Finaliza e exibe o resultado da eleição | |
void finalizar (Urna *urna) { | |
int | |
a1, // Contador | |
total, // Total de eleitores | |
eleito = -1; // Índice do candidato eleito | |
float | |
representatividade, // Quantos % cada voto vale | |
meta, // Quantos % de representação o candidato precisa | |
votos[urna->topo + 1], // Votação de cada candidato (%) | |
brancos, // Votos em branco (%) | |
nulos; // Votos nulos (%) | |
system("clear"); | |
printf("FIM DAS VOTAÇÕES\n\n"); | |
// Calcula o total de eleitores | |
for (a1 = 0, total = 0; a1 <= urna->topo; a1 += 1) { | |
total += urna->candidato[a1].votos; | |
} | |
total += (urna->brancos + urna->nulos); | |
// Calcula a representatividade (quanto cada voto vale) | |
// Se 100 votos equivalem a 100%, 1 voto equivale a 1% | |
// Se 200 votos equivalem a 100%, 1 voto equivale a 0,5% | |
// Se 50 votos equivalem a 100%, 1 voto equivale a 2% | |
// Caso o total de votos seja 0, força a representação para 0% | |
representatividade = total == 0 ? 0 : (100.0 / (float) total); | |
// Calcula quantos % da representatividade o candidato precisa (50% + 1 voto (1 representação)) | |
// Caso haja apenas 1 voto, força a meta para 100% | |
meta = total == 1 ? 100.0 : 50.0 + representatividade; | |
// Calcula os votos (%) e exibe os candidatos | |
for (a1 = 0; a1 <= urna->topo; a1 += 1) { | |
votos[a1] = urna->candidato[a1].votos * representatividade; | |
if (votos[a1] >= meta) { | |
eleito = a1; | |
} | |
printf( | |
"CANDIDATO #%d\n" | |
"Nome: %s\n" | |
"Partido: %s\n" | |
"Slogan: %s\n" | |
"Número: %d\n" | |
"Idade: %d\n" | |
"Votos: %d (%.3f%%)%s\n\n", | |
a1 + 1, | |
urna->candidato[a1].nome, | |
urna->candidato[a1].partido, | |
urna->candidato[a1].slogan, | |
urna->candidato[a1].numero, | |
urna->candidato[a1].idade, | |
urna->candidato[a1].votos, | |
votos[a1], | |
(eleito == a1 ? " CANDIDATO ELEITO" : "") | |
); | |
} | |
// Exibe os votos brancos e nulos | |
printf("\nBrancos: %d (%.3f%%)\n", urna->brancos, urna->brancos * representatividade); | |
printf("\nNulos: %d (%.3f%%)\n", urna->nulos, urna->nulos * representatividade); | |
printf("\nTotal de eleitores: %d", total); | |
printf("\nRepresentatividade de cada voto: %.3f%% (1 de %d / 100%%/%d)", representatividade, total, total); | |
printf("\nMeta a ser atingida para ser eleito: %.3f%%", meta); | |
if (eleito == -1) { | |
printf("\nNENHUM CANDIDATO FOI ELEITO."); | |
} | |
getchar(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment