Enrere Mòdul 5
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
La llei d’HONDT. Càlcul dels escons assignats a cada partit en unes eleccions

En aquesta pràctica veurem un exemple pràctic i interessant on hi ha definida una funció que rep com arguments dos vectors.

 

Desenvolupament de la pràctica

Al nostre país els candidats a diputat es presenten a les eleccions agrupats en les anomenades candidatures o llistes, que poden ser presentades per partits polítics o per coalicions de partits. Cada elector vota una de les llistes. A partir del nombre de vots obtinguts, cada llista rep una certa quantitat d'escons. Per determinar el nombre d’escons que rep cada llista es fa servir el sistema que es coneix amb el nom de llei d'Hondt. Aquesta llei s'implementa en el següent programa:

Definiu un projecte nou anomenat m5p08 i afegiu-li un arxiu de font C/C++ anomenat m5p08.cpp. Escriviu el següent codi:

//m5p08.cpp. Mètode d’Hondt

#include <stdio.h>
#define
N_ESC 2 // nombre d’escons
#define
N_PAR 3 // nombre de partits

int nou_esc(int *, int *);

void main(void){

    int ct;
    int esc[N_PAR]={0}; // esc{[N_PAR]= nomb. d’esc per partit
    int vots[N_PAR]; // vots[N_PAR]= nomb. de vots per partit

    printf("Tecleja el nombre de vots de cada partit.\n");

    for (ct=0; ct<N_PAR; ++ct) {
        printf("\nPartit %d: ", ct+1);
        scanf("%d", &vots[ct]);
    }

    for(ct=0; ct<N_ESC; ++ct) esc[nou_esc(vots, esc)]++;
    for
(ct=0; ct<N_PAR; ++ct)
    printf("\nEl partit %d ha obtingut %d escons.", ct+1,
            esc[ct]);
}

 

int nou_esc( int vots[], int esc[]) {

    int imax=0, ct;
    int max=0;

    for( ct=0; ct<N_PAR; ++ct) {
        if( max<(vots[ct]/(esc[ct]+1)) ) {
            max=vots[ct]/(esc[ct]+1);
            imax=ct;
        }
    }
    return imax;
}

Explicació del programa

Anomenarem esc[0], esc[1],  esc[2],... respectivament al nombre d’escons que serà assignat a cada partit. Al començament aquestes tres variables seran 0 i a mesura que es vagin assignant escons canviaran el seu valor.

Anomenarem vots[0], vots[1], vots[2],... respectivament al nombre de vots que ha obtingut cada partit.

El primer escó s’assigna al partit més votat. Els altres escons s’assignen amb el següent criteri:

El següent escó s’assigna al partit que maximitzi l’expressió vots[]/(esc[]+1). Aquesta assignació es farà mitjançant la funció nou_esc(). Aquesta funció té com arguments dos punters als dos vectors vots[] i esc[], és a dir, les direccions de memòria (o el nom dels vectors) i torna un número enter que correspon al partit que rep un nou escó.

Per explicar com funciona aquesta llei veurem un exemple:

Imaginem que es presenten 3 partits: 0, 1 i 2 que han rebut 120, 50 i 40 vots respectivament i s’han de repartir un total de 7 escons.

vots[0]=110, vots[0]=50 i vots[2]=40 i, inicialment:

esc[0]=0, esc[1]=0, esc[2]=0,

El primer escó és per al partit 0 que té el nombre de vots més gran, per tant:

esc[0]=1, esc[1]=0, esc[2]=0,

el càlcul de vots[]/(esc[]+1) dóna com a resultat:

55, 50 i 40

per tant, el segon escó és també per al partit 0:

esc[0]=2, esc[1]=0, esc[2]=0

una altra vegada el càlcul de vots[]/(esc[]+1) és:

36.67, 50 i 40

per tant, el tercer escó és per al partit 1:

esc[0]=2, esc[1]=1, esc[2]=0

El càlcul de nou dóna:

36.67, 25, 40

per tant, el quart escó és per al partit 3, i així successivament.