From: Alexandre P Francisco Date: Wed, 12 Mar 2014 13:56:48 +0000 (+0000) Subject: Adding proj1 for 2013/14 s2. X-Git-Url: http://web.ist.utl.pt/aplf/git/?a=commitdiff_plain;h=71cea7c04ffb24d7d60870f3c30924e076609d03;p=iaed.git Adding proj1 for 2013/14 s2. --- diff --git a/1314s2p1.c b/1314s2p1.c new file mode 100644 index 0000000..ced443b --- /dev/null +++ b/1314s2p1.c @@ -0,0 +1,196 @@ +/** + * @file proj1.c + * @brief Implementacao do primeiro projecto de IAED 2013/14 S2. + */ +#include +#include + +#define ESTADOS 28 +#define PPES 12 + +/** + * @brief Lista de estados. + */ +static char estados[ESTADOS+1][3] = + { "DE", "AT", "BE", "BG", "CY", "HR", "DK", "SK", "SI", "ES", + "EE", "FI", "FR", "GR", "HU", "IE", "IT", "LV", "LT", "LU", + "MT", "NL", "PL", "PT", "GB", "CZ", "RO", "SE", "TE" }; + +/** + * @brief Numero de mandatos por pais* + */ +static int mandatos_por_pais[ESTADOS] = + { 96, 18, 21, 17, 6, 11, 13, 13, 8, 54, + 6, 13, 74, 21, 21, 11, 73, 8, 11, 6, + 6, 26, 51, 21, 73, 21, 32, 20 }; + +/** + * @brief Lista de partidos politicos europeus. + */ +static char ppes[PPES][4] = { "EPP", "PES", "LDE", "EGP", "ECR", + "ELP", "ELD", "EDP", "EAF", "EMN", "ECP", "AED" }; + +/** + * @brief Tabelas de mandatos e votos, respectivamente. + */ +static int mandatos[ESTADOS+1][PPES]; +static int votos[ESTADOS][PPES]; + +/** + * Declaracao das funcoes utilizadas neste programa. + */ +void do_plus(); +void do_m(); +void do_e(); + +void header(); +void show(int estado); +void update(int estado); + +/** + * @brief Funcao main. + * + * @return Codigo de estado de saida do programa. + */ +int main() +{ + char command; + + /* Comandos: +(3) m(1) e(0) x(0)*/ + while ((command = getchar()) != 'x') { /* le o comando */ + + switch (command) { + case '+': + getchar(); /* le o ' ' */ + do_plus(); + break; + case 'm': + getchar(); /* le o ' ' */ + do_m(); + break; + case 'e': + do_e(); + break; + default: + /* Comando desconhecido, terminar o programa com falha. */ + fprintf(stderr, "Error: Unknown command."); + exit(EXIT_FAILURE); + } + + getchar(); /* le o '\n' */ + } + + /* Terminar o programa com sucesso. */ + return EXIT_SUCCESS; +} + +/** + * @brief Funcao para processar o comando '+'. + */ +void do_plus() { + int estado, ppe, v; + + /* Ler informacao e actualizar o numero de votos. */ + scanf("%d %d %d", &estado, &ppe, &v); + votos[estado-1][ppe-1] += v; + + /* Actualizar a tabela de mandatos. */ + update(estado); +} + +/** + * @brief Funcao para processar o comando 'm'. + */ +void do_m() { + int estado; + + /* Ler o estado, escrever o cabecalho, e escrever a informacao. */ + scanf("%d", &estado); + header(); + show(estado); +} + +/** + * @brief Funcao para processar o comando 'e'. + */ +void do_e() { + int estado; + + /* Escrever o cabecalho seguido da informacao para cada estado, + * incluindo os totais (ultima linha da tabela mandatos). */ + header(); + for (estado = 1; estado <= ESTADOS + 1; estado++) + show(estado); +} + +/** + * @brief Funcao para imprimir o cabecalho da tabela dos mandatos. + */ +void header() { + int i; + + printf(" "); + for (i = 0; i < PPES; i++) + printf(" %s", ppes[i]); + printf("\n"); +} + +/** + * @brief Funcao para imprimir a informacao de um dado estado. + * + * @param 'estado' é um inteiro entre 1 e 28 e identifica do estado. + */ +void show(int estado) { + int i; + + printf("%s", estados[estado - 1]); + for (i = 0; i < PPES; i++) + printf(" %3d", mandatos[estado - 1][i]); + printf("\n"); +} + +/** + * @brief Funcao para actualizar a tabela de mandatos. + * + * Esta funcao actualiza a tabela de mandatos tendo em conta o numero + * actual de votos na tabela de votos, para um dado estado. Os valores + * totais (ultima linha da tabela mandatos) sao tambem actualizados. + * + * @param 'estado' é um inteiro entre 1 e 28 e identifica do estado. + */ +void update(int estado) { + /* 'mt' denota o numero de mandatos atribuidos ate ao momento. */ + int i, k, mt = 0; + float q[PPES]; /* Quocientes no metodo D'Hondt. */ + + /* Reinicializar o numero de mandatos para este estado, incluindo + * a correccao respectiva nos resultados globais. */ + for (i = 0; i < PPES; i++) { + mandatos[ESTADOS][i] -= mandatos[estado - 1][i]; + mandatos[estado - 1][i] = 0; + + /* Inicializar todos os quocientes a 1. */ + q[i] = 1; + } + + /* Atribuicao de mandatos segundo o metodo D'Hondt. */ + while (mt < mandatos_por_pais[estado - 1]) { + + /* Encontrar o proximo partido a receber um mandato. */ + for (k = 0, i = 1; i < PPES; i++) + if (votos[estado - 1][i]/q[i] > votos[estado - 1][k]/q[k] + || (votos[estado - 1][i]/q[i] == votos[estado - 1][k]/q[k] + && votos[estado - 1][i] < votos[estado - 1][k])) + k = i; + + /* O partido 'k' recebe o proximo mandato. */ + mandatos[estado - 1][k] ++; + q[k] ++; + mt ++; + } + + /* Actualizar os valores totais de mandatos atribuidos (ultima + * linha da tabela mandatos */ + for (i = 0; i < PPES; i++) + mandatos[ESTADOS][i] += mandatos[estado - 1][i]; +}