Alguien me puede facilitar el algoritmo d\'hont para recuentos electorales?

barbaman
12 de Mayo del 2004
Alguien me puede facilitar el algoritmo d'hont para recuentos electorales? Ando perdido con este problema..

noel solw
12 de Mayo del 2004
Mira lo que encontre buscando en el internet con la rubrica "algoritmo de d'hont" :



Ejercicio 5: Programa electoral, que no electoralista.


Aprovechando las muy recientes elecciones al Parlamento Vasco, vamos a ver cómo se convierten en escaños los votos de los sufridos ciudadanos siguiendo el método d'Hont. ¿Estás familiarizado con este método? Por si acaso te los vamos a explicar.

Supongamos que concurren 3 partidos a las elecciones y que la provincia o distrito electoral dispone de 2 escaños. El primer escaño se lo llevará el partido más votado. Para el segundo escaño se dividen los votos de cada partido entre el número de escaños obtenidos más uno (el partido que no tenga todavía ningún escaño se dividirá entre 1). El escaño se asigna al partido que tras esta operación tenga más votos. Vamos a verlo con un ejemplo:

Partido 1: 6000 votos Se lleva el 1º escaño 6000/(1+1)=3000

Partido 2: 4000 votos 4000/(1+0)=4000 Se lleva el 2º escaño.

Partido 3: 2000 votos 2000/(1+0)=2000

El programa que te presentamos a continuación es para 3 partidos y 2 escaños, pero queda a tu entera disposión para que lo particularices -si dispones de datos- para el caso de las recientes elecciones. Ten mucho cuidado porque un fallo en la programación de este tipo de asuntos puede hacer caer sobre ti una acusación de fraude electoral. Llamaremos al programa escaño.c.

Lo primero que hace este programa es inicializar a cero el vector n_esca . En este vector se va a almacenar el número de escaños de cada partido: n_esca0 contendrá el número de escaños del partido número 1, n_esca1 los escaños del partido número 2, etc. Este vector se va a ir modificando a lo largo de la ejecución del programa.

A continuación se almacenan en el vector n_votos los números de votos obtenidos por cada partido, estos datos serán introducidos por el usuario a través del teclado.

La novedad de este programa es que incluye una función: next_esc(long *,int *). Esta función tiene como argumento dos punteros a sendos vectores, es decir, las direcciones de memoria o los nombres de dos vectores. Cuando se llama a la función, next_esc(n_votos, n_esc) se pasa la dirección de memoria de los vectores n_esca y n_votos . El nombre de un vector (como por ejemplo n_esca) es un puntero a la posición del primer elemento. La función devuelve el número del partido que ha conseguido el escaño y se almacena en la variable esca. Este número será cero si el escaño corresponde al primer partido, 1 si corresponde al segundo, etc.

Con esta pequeña explicación ya estás en condiciones de escribir el programa y comprobar cómo funciona.

Solución comentada al Ejercicio 5.


--------------------------------------------------------------------------------


/* fichero escaño.c*/
/* Calculo de escaños por partido (d'Hondt). */
#include <stdio.h>
#define N_ESC 2 /* número de escaños en liza. */
#define N_PAR 3 /* número de partidos que concurren */
void main(void)
{
int i, esca;
int n_esc[N_PAR]; /* n_esc{[N_PAR]= nº de escaños por partido*/
long n_votos[N_PAR]; /* n_votos[N_PAR]=nº de votos por partido*/
int next_esc(long *, int *); /* definición de función */

for(i=0; i<N_PAR; ++i)
n_esc[i]=0;
printf("Teclea el nº de votos de cada partido.n");
for (i=0; i<N_PAR; ++i) {
printf("nPartido %d: ", i+1);
scanf("%ld", &n_votos[i]);
}

for(i=0; i<N_ESC; ++i) { /* asignación de escaños */
esca = next_esc(n_votos, n_esc);
n_esc[esca] = n_esc[esca]+1;
}
for (i=0; i<N_PAR; ++i)
printf("nEl partido %d ha obtenido %d escaños.",
i+1, n_esc[i]);
}
int next_esc( long n_votos[], int n_esc[])
{
int imaximo=0, i;
long maximo=0;
for( i=0; i<N_PAR; ++i) {
if( maximo<(n_votos[i]/(n_esc[i]+1)) ) {
maximo=n_votos[i]/(n_esc[i]+1);
imaximo=i;
}
}
return imaximo;
}