Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. // Llei_Hont.cpp: define el punto de entrada de la aplicación de consola.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <string>
  6. #include <cmath>
  7. #include <iostream>
  8. #include <iomanip>
  9.  
  10. using namespace std;
  11.  
  12. #define N 16
  13.  
  14. void inicialitzarArray(int **casellesHont, int caselles_y, int caselles_x) {
  15.     for (int i = 0; i < caselles_y; i++) {
  16.         for (int j = 0; j < caselles_x; j++) {
  17.             casellesHont[i][j] = 0; //Emplanem totes les caselles amb un 0
  18.         }
  19.     }
  20. }
  21.  
  22. int mesGran(int a, int b) { // T_T return b esk...
  23.     if (a > b) {
  24.         return a;
  25.     }
  26.     else {
  27.         return b;
  28.     }
  29. }
  30.  
  31. void AfegirEsco(int **casellesHont, int esconsPartits[], int caselles_y) {
  32.     int a = casellesHont[0][esconsPartits[0]]; //equival a la casella 12 del PP(13 si contes que la primera es la 0) que es la que volem.
  33.     for (int i = 1; i < caselles_y; i++) {
  34.         a = mesGran(a, casellesHont[i][esconsPartits[i]]); //Obtenim la casella mes gran
  35.     }
  36.  
  37.     for (int i = 0; i < caselles_y; i++) {
  38.         if (casellesHont[i][esconsPartits[i]] == a) { //Mirem de quin partit es la casella mes gran
  39.             esconsPartits[i]++; //Li sumem un escó a aquest partit
  40.         }
  41.     }
  42. }
  43.  
  44. void imprimirTaulell(int **casellesHont, int caselles_x, int caselles_y, string partits[]) {
  45.     for (int i = 0; i < caselles_y; i++) {
  46.         cout << endl << partits[i] << ":" << endl;
  47.         for (int j = 0; j < caselles_x; j++) {
  48.             cout << casellesHont[i][j] << endl;;
  49.         }
  50.     }
  51. }
  52.  
  53. double calcularPercentatge(int a, int b) {
  54.     //Provincia p(....);
  55.  
  56.     return (double)a * 100 / (double)b;
  57. }
  58.  
  59. int main()
  60. {
  61.  
  62.     /*COSES A MODIFICAR*/
  63.     int magnitud = 36;
  64.     int personesQueVanVotar = 3621997;
  65.     int votsNuls = 23313;
  66.     int votsBlanc = 18729;
  67.     string partits[N] = { "PP","PODEMOS", "C's", "PSOE", "UPC", "UPYD", "PACMA", "VOX", "X LA IZQUIERDA-LOS VERDES", "FE de las JONS", "RECORTES CERO-GRUPO VERDE", "POR UN MUNDO MÁS JUSTO", "PARTIDO HUMANISTA", "PCPE", "SAI", "PLib" };
  68.     int vots[N] = {
  69.         1204059,
  70.         750607,
  71.         676484,
  72.         643244,
  73.         189265,
  74.         43110,
  75.         28312,
  76.         22461,
  77.         5007,
  78.         4691,
  79.         4014,
  80.         2834,
  81.         1849,
  82.         1732,
  83.         1230,
  84.         1056
  85.     };
  86.  
  87.     /*PROGRAMA*/
  88.     int votsValids = personesQueVanVotar - votsNuls; //3.598.684
  89.     int umbral = (int)round(((double)votsValids * 3.0) / 100.0); //107.961
  90.     double preuEsco = votsValids / magnitud; //99.963
  91.     int **casellesHont;
  92.     double desviacio[N];
  93.     int esconsPartits2[N];
  94.     double esconsAmbDecimals[N];
  95.  
  96.     for (int i = 0; i < N; i++) {
  97.         esconsAmbDecimals[i] = (vots[i] / preuEsco);
  98.     }
  99.  
  100.     bool entren[N]; //Booleà sobre si passen o no l'umbral
  101.     int NQueEntren = 0;
  102.     for (int i = 0; i < N; i++) { //Emplenem aquest array de bools amb true o false segons si passen o no
  103.         if (vots[i] >= umbral) {
  104.             entren[i] = true;
  105.             NQueEntren++;
  106.         }
  107.         else {
  108.             entren[i] = false;
  109.         }
  110.     }
  111.  
  112.     casellesHont = (int**)malloc(sizeof(int*)*NQueEntren); //Emmagatzem espai suficient per cada fila | sizeof(int*) vol dir tamany d'un array convencional, que correspondra a un fila. int = variable, (int*)= array convencional, (int**) = array doble
  113.     for (int i = 0; i < NQueEntren; i++) {
  114.         casellesHont[i] = (int*)malloc(sizeof(int)*magnitud); //Emmagatzem espai suficient per cada casella dins d'una fila
  115.     }
  116.  
  117.     int *esconsPartits = new int[NQueEntren]; //Array amb el nombre d'escons de cada partit, només dels que passen l'umbral, la resta tenen 0 escons
  118.                                               //Aixo no hauria de ser així[5] però no em deixa posar NQueEntren ja que no és una constant
  119.     for (int i = 0; i < NQueEntren; i++) {
  120.         esconsPartits[i] = (int)(trunc(vots[i] / preuEsco));//Posem els escons mínims que ha de tenir cada partit
  121.     }
  122.  
  123.     inicialitzarArray(casellesHont, NQueEntren, magnitud); //Emplenem totes les celdes amb un 0 per si de cas, així ja estan inicialitzades
  124.  
  125.     for (int i = 0; i < N; i++) {
  126.         if (entren[i]) {
  127.             for (int j = 0; j < magnitud; j++) {
  128.                 int t = vots[i] / (j + 1);  //Calculem el valor que tindra una casella
  129.                 casellesHont[i][j] = t; //Posem a cada casella el seu numero corresponent
  130.             }
  131.         }
  132.     }
  133.     int sum = 0;
  134.     for (int i = 0; i < NQueEntren; i++) {
  135.         sum = sum + esconsPartits[i]; //Calculem la suma total d'escons mínims
  136.     }
  137.  
  138.     int dif = magnitud - sum; //Escons que ens falten a repartir. dif fa referencia a diferencia
  139.     for (int i = 0; i < dif; i++) {
  140.         AfegirEsco(casellesHont, esconsPartits, NQueEntren); //Afegim els escons que ens quedin per repartir
  141.     }
  142.  
  143.     for (int i = 0; i < N; i++) {
  144.         if (i < NQueEntren) {
  145.             esconsPartits2[i] = esconsPartits[i];
  146.         }
  147.         else {
  148.             esconsPartits2[i] = 0;
  149.         }
  150.     }
  151.  
  152.     for (int i = 0; i < N; i++) {
  153.         double p1 = calcularPercentatge(vots[i], votsValids);
  154.         double p2 = calcularPercentatge(esconsPartits2[i], magnitud);
  155.         double des = p2 - p1; //desviacio es la resta de percentatges
  156.         desviacio[i] = des;
  157.     }
  158.  
  159.     for (int i = 0; i < N; i++) {
  160.         cout << partits[i] << ": " << endl;
  161.         cout << "Escons exactes: " << fixed << setprecision(2) << esconsAmbDecimals[i] << endl;;
  162.         cout << "Escons que li toquen: " << esconsPartits2[i] << endl;
  163.         cout << "Desviacio: ";
  164.         if (desviacio[i] > 0) {
  165.             cout << "+";
  166.         }
  167.         cout << fixed << setprecision(2) << desviacio[i] << "%" << endl << endl;
  168.     }
  169.  
  170.     double desviacio_votsAmbBlanc = calcularPercentatge(votsBlanc, votsValids)*(-1);
  171.     double esconsVotsBlanc =  votsBlanc / preuEsco;
  172.  
  173.     cout << "VOTS EN BLANC" << endl;
  174.     cout << "Escons exactes: " << esconsVotsBlanc << endl;
  175.     cout << "Escons que li toquen: " << 0 << endl;
  176.     cout << "Desviacio: " << fixed << setprecision(2) << desviacio_votsAmbBlanc << "%" << endl << endl;
  177.  
  178.  
  179.    
  180.     double sum_desviacio = 0;
  181.     for (int i = 0; i < N; i++) {
  182.         sum_desviacio += desviacio[i];
  183.     }
  184.     sum_desviacio += desviacio_votsAmbBlanc;
  185.  
  186.     cout << endl << "Suma de desviacions: " << sum_desviacio << endl;
  187.  
  188.  
  189.     /* Per si és necessàri imprimir el taulell amb el valor de cada casella
  190.     imprimirTaulell(casellesHont, magnitud, NQueEntren, partits); //El taulell el fa be, cada casella te el que li toca
  191.     */
  192.     system("pause");
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement