]> web.ist.utl.pt Git - iaed.git/commitdiff
Adding proj1 for 2013/14 s2.
authorAlexandre P Francisco <aplf@ist.utl.pt>
Wed, 12 Mar 2014 13:56:48 +0000 (13:56 +0000)
committerAlexandre P Francisco <aplf@ist.utl.pt>
Wed, 12 Mar 2014 13:56:48 +0000 (13:56 +0000)
1314s2p1.c [new file with mode: 0644]

diff --git a/1314s2p1.c b/1314s2p1.c
new file mode 100644 (file)
index 0000000..ced443b
--- /dev/null
@@ -0,0 +1,196 @@
+/**
+ * @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];
+}