Publicado por Eduardo González Vaquero |
Visto en Sistema D'hondt en PHP:
¿Qué es el sistema D'hondt?
Es un algoritmo empleado generalmente para resultados electorales. Tomando como referencia los votos de cada partido, el número total de votos y la cantidad de escaños a repartir, asigna un número de escaños a cada partido.
¿Cómo funciona el sistema D'hondt?
Método 1.
- Tenemos un número n de escaños y varios partidos políticos con sus correspondientes votos.
- El partido que más votos tiene se suma un escaño. El número de votos será ahora el número de votos totales entre el número de escaños que tiene más 1 (en el caso del primer escaño, se dividen sus votos entre 2).
- Se vuelve a repetir el paso 2 hasta que se repartan todos los escaños.
Método 2.
También es común que se suela hacer mediante una tabla:
- Se hace una tabla con tantas filas como partidos políticos haya, y se pone en una primera columna su nombre o identificador.
- En las siguientes columnas irá el número de votos dividido por el número de la columna (sin contar la que le corresponde al nombre). Es decir, en la primera se dividirá por 1 el número de votos, y en las siguientes por 2,3,4,5...
- Siendo n el número de escaños a repartir, encuentra los n valores más grandes.
- Cada uno de los partidos tendrá tantos escaños como valores tenga dentro de esos n valores más grandes.
Además de aplicar el sistema D'hondt, en las elecciones también se puede imponer un porcentaje mínimo de votos: aquello que no lo superen, no participarán en el reparto de escaños. Esta funcionalidad estará incluida en el código, junto a la de contar los votos en blanco.
Sistema D'hondt en C++
La forma de actuar va a ser parecida a cómo hicimos en PHP, con la distinción de los datos que deberemos dar y el resultado que obtendremos.
struct DhondtParty { char* name; int votes, seats; bool ok; }; class Dhondt { public: DhondtParty* parties; double minimun; int votes, numparties, blank_votes, esc; Dhondt(int total) { this->esc = total; this->numparties = 0; this->minimun = 0; this->blank_votes = 0; this->parties = new DhondtParty[10]; } Dhondt(int total,int arrayMem) { this->esc = total; this->numparties = 0; this->minimun = 0; this->blank_votes = 0; this->parties = new DhondtParty[arrayMem]; } void addblank(int pvotes) { this->votes += pvotes; this->blank_votes += pvotes; } void addparty(char* partyname, int partyvotes) { DhondtParty party; party.name = partyname; party.seats = 0; party.votes = partyvotes; party.ok = false; this->parties[this->numparties] = party; this->votes = this->votes+partyvotes; this->numparties++; } void setminimun(double minimun) { this->minimun = minimun; } void results() { int i,z,mparty; for(z=0;this->parties[z].votes;z++) { if((double)this->parties[z].votes/(double)this->votes >= (double)this->minimun/100.0) this->parties[z].ok = true; } for(i=1;i<=this->esc;i++) { mparty = -1; for(z=0;this->parties[z].votes;z++) { if(this->parties[z].ok && (this->parties[z].votes/(this->parties[z].seats+1) > this->parties[mparty].votes/(this->parties[mparty].seats+1) || mparty < 0)) { mparty = z; } } this->parties[mparty].seats++; } } };
Para usar esta "librería" haremos los siguiente en nuestro código:
Dhondt d(350,6); // Se llama a la clase, y se guarda en la variable d. // Añadimos los partidos: d.addparty("Partido A",3501); d.addparty("Partido B",15327); d.addparty("Partido C",1684); d.addparty("Partido D",344); d.addparty("Partido E",4894); d.addparty("Partido F",357); d.addblank(1242); // votos en blanco d.setminimun(3); // En % d.results(); // Procesamos
En primer lugar llamaremos a la clase y definiremos los escaños a repartir y el total de partidos. Ésto último servirá para crear un array con la memoria justa. A continuación se añaden los partidos, se configuran los votos en blanco y el porcentaje mínimo y se procesa.
En último lugar para saber los resultados acudiremos al array d.parties, que contiene objetos DhondtParty que tienen los datos de cada partidos (nombres, votos y número de escaños obtenidos). Dejo un ejemplo donde se recorre el array para mostrar los resultados (he utilizado la librería iostream de C++ para imprimir los resultados con cout):
for(int i=0;i<d.numparties;i++) { cout <<d.parties[i].name<<" tiene "<<d.parties[i].seats<<" ("<<d.parties[i].seats*100/350<<"%) escaños, con un total de "<<d.parties[i].votes<<" votos ("<<d.parties[i].votes*100/d.votes<<"%)"<<endl; }