Skip to content

Instantly share code, notes, and snippets.

@edenfall
Last active December 28, 2015 02:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edenfall/7430645 to your computer and use it in GitHub Desktop.
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
/*
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