Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Llei_Hont.cpp: define el punto de entrada de la aplicación de consola.
- //
- #include "stdafx.h"
- #include <string>
- #include <cmath>
- #include <iostream>
- #include <iomanip>
- using namespace std;
- #define N 16
- void inicialitzarArray(int **casellesHont, int caselles_y, int caselles_x) {
- for (int i = 0; i < caselles_y; i++) {
- for (int j = 0; j < caselles_x; j++) {
- casellesHont[i][j] = 0; //Emplanem totes les caselles amb un 0
- }
- }
- }
- int mesGran(int a, int b) { // T_T return b esk...
- if (a > b) {
- return a;
- }
- else {
- return b;
- }
- }
- void AfegirEsco(int **casellesHont, int esconsPartits[], int caselles_y) {
- 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.
- for (int i = 1; i < caselles_y; i++) {
- a = mesGran(a, casellesHont[i][esconsPartits[i]]); //Obtenim la casella mes gran
- }
- for (int i = 0; i < caselles_y; i++) {
- if (casellesHont[i][esconsPartits[i]] == a) { //Mirem de quin partit es la casella mes gran
- esconsPartits[i]++; //Li sumem un escó a aquest partit
- }
- }
- }
- void imprimirTaulell(int **casellesHont, int caselles_x, int caselles_y, string partits[]) {
- for (int i = 0; i < caselles_y; i++) {
- cout << endl << partits[i] << ":" << endl;
- for (int j = 0; j < caselles_x; j++) {
- cout << casellesHont[i][j] << endl;;
- }
- }
- }
- double calcularPercentatge(int a, int b) {
- //Provincia p(....);
- return (double)a * 100 / (double)b;
- }
- int main()
- {
- /*COSES A MODIFICAR*/
- int magnitud = 36;
- int personesQueVanVotar = 3621997;
- int votsNuls = 23313;
- int votsBlanc = 18729;
- 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" };
- int vots[N] = {
- 1204059,
- 750607,
- 676484,
- 643244,
- 189265,
- 43110,
- 28312,
- 22461,
- 5007,
- 4691,
- 4014,
- 2834,
- 1849,
- 1732,
- 1230,
- 1056
- };
- /*PROGRAMA*/
- int votsValids = personesQueVanVotar - votsNuls; //3.598.684
- int umbral = (int)round(((double)votsValids * 3.0) / 100.0); //107.961
- double preuEsco = votsValids / magnitud; //99.963
- int **casellesHont;
- double desviacio[N];
- int esconsPartits2[N];
- double esconsAmbDecimals[N];
- for (int i = 0; i < N; i++) {
- esconsAmbDecimals[i] = (vots[i] / preuEsco);
- }
- bool entren[N]; //Booleà sobre si passen o no l'umbral
- int NQueEntren = 0;
- for (int i = 0; i < N; i++) { //Emplenem aquest array de bools amb true o false segons si passen o no
- if (vots[i] >= umbral) {
- entren[i] = true;
- NQueEntren++;
- }
- else {
- entren[i] = false;
- }
- }
- 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
- for (int i = 0; i < NQueEntren; i++) {
- casellesHont[i] = (int*)malloc(sizeof(int)*magnitud); //Emmagatzem espai suficient per cada casella dins d'una fila
- }
- 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
- //Aixo no hauria de ser així[5] però no em deixa posar NQueEntren ja que no és una constant
- for (int i = 0; i < NQueEntren; i++) {
- esconsPartits[i] = (int)(trunc(vots[i] / preuEsco));//Posem els escons mínims que ha de tenir cada partit
- }
- inicialitzarArray(casellesHont, NQueEntren, magnitud); //Emplenem totes les celdes amb un 0 per si de cas, així ja estan inicialitzades
- for (int i = 0; i < N; i++) {
- if (entren[i]) {
- for (int j = 0; j < magnitud; j++) {
- int t = vots[i] / (j + 1); //Calculem el valor que tindra una casella
- casellesHont[i][j] = t; //Posem a cada casella el seu numero corresponent
- }
- }
- }
- int sum = 0;
- for (int i = 0; i < NQueEntren; i++) {
- sum = sum + esconsPartits[i]; //Calculem la suma total d'escons mínims
- }
- int dif = magnitud - sum; //Escons que ens falten a repartir. dif fa referencia a diferencia
- for (int i = 0; i < dif; i++) {
- AfegirEsco(casellesHont, esconsPartits, NQueEntren); //Afegim els escons que ens quedin per repartir
- }
- for (int i = 0; i < N; i++) {
- if (i < NQueEntren) {
- esconsPartits2[i] = esconsPartits[i];
- }
- else {
- esconsPartits2[i] = 0;
- }
- }
- for (int i = 0; i < N; i++) {
- double p1 = calcularPercentatge(vots[i], votsValids);
- double p2 = calcularPercentatge(esconsPartits2[i], magnitud);
- double des = p2 - p1; //desviacio es la resta de percentatges
- desviacio[i] = des;
- }
- for (int i = 0; i < N; i++) {
- cout << partits[i] << ": " << endl;
- cout << "Escons exactes: " << fixed << setprecision(2) << esconsAmbDecimals[i] << endl;;
- cout << "Escons que li toquen: " << esconsPartits2[i] << endl;
- cout << "Desviacio: ";
- if (desviacio[i] > 0) {
- cout << "+";
- }
- cout << fixed << setprecision(2) << desviacio[i] << "%" << endl << endl;
- }
- double desviacio_votsAmbBlanc = calcularPercentatge(votsBlanc, votsValids)*(-1);
- double esconsVotsBlanc = votsBlanc / preuEsco;
- cout << "VOTS EN BLANC" << endl;
- cout << "Escons exactes: " << esconsVotsBlanc << endl;
- cout << "Escons que li toquen: " << 0 << endl;
- cout << "Desviacio: " << fixed << setprecision(2) << desviacio_votsAmbBlanc << "%" << endl << endl;
- double sum_desviacio = 0;
- for (int i = 0; i < N; i++) {
- sum_desviacio += desviacio[i];
- }
- sum_desviacio += desviacio_votsAmbBlanc;
- cout << endl << "Suma de desviacions: " << sum_desviacio << endl;
- /* Per si és necessàri imprimir el taulell amb el valor de cada casella
- imprimirTaulell(casellesHont, magnitud, NQueEntren, partits); //El taulell el fa be, cada casella te el que li toca
- */
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement