--- /dev/null
+/**
+ * @file proj1.c
+ * @brief Implementacao do primeiro projecto de IAED 2013/14 S2.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+
+#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];
+}