/*
La llei d'Hondt per al repartiment d'escons a partir dels nombres de vots
Joan Aranès Clua
http://www.xtec.cat/~jaranes
jaranes@xtec.cat
19/02/2002
Procediment:
El primer escó s'assigna al partit més votat, els altres s'assignen, pas a pas,
al partit que li correspongui el valor més gran de la següent funció: vots[P]/(esc[P]+1)
aplicada en cada pas del repartiment a cada un dels partits {P} tenint en compte
el nombre de vots nominal.
Cas que a dos partits els correspongui el mateix valor per aquesta funció, l'escó
s'assigna al partit més votat; i, cas que els partits que tinguin el mateix valor
per a la funció vots[P]/(esc[P]+1 i també tinguin també el mateix nombre
de vots (cosa molt poc probable), l'assignació es fa per sorteig la primera vegada
que es doni l'empat, i per a la resta d'empats, l'escó s'assigna alternativament.
Exemple:
Suposem tres partits: A, B i C amb els següents nombres de vots: 200, 100, 80
Es volen repartir 4 escons. Vegem, pas a pas el procés:
A B C escons ...
200/(1+0)=200 100/(1+0) 80/(1+0) A ->1; B->0; C->0
200/(1+1)=100 100/(1+0) 80/(1+0) A-> 1+1=2; B->0; C->0
200/(2+1)~67 100/(1+0) 80/(1+0) A-> 2; B->1; C->0
200/(2+1)~67 100/(1+1)=50 80/(1+0) A-> 2; B->1; C->1
En aquest cas, correspondrien dos escons a A, un a B i un a C
*/
#include <stdio.h>
#define N_ESC 20 // nombre d’escons
#define N_PAR 30 // nombre de partits
int nou_esc(int *, int *, int);
void main(void){
int ct;
int esc[N_PAR]={0}; // esc{[N_ESC]= nomb. d’esc per partit
int vots[N_PAR]; // vots[N_PAR]= nomb. de vots per partit
int np,ne; //np = nombre de partits, ne = nombre d'escons
printf("nombre de partits = ");
scanf("%d", &np);
printf("nombre d'escons = ");
scanf("%d", &ne);
printf("Tecleja el nombre de vots de cada partit.\n");
for (ct=0; ct<np; ++ct) {
printf("\nPartit %d: ", ct+1);
scanf("%d", &vots[ct]);
}
for(ct=0; ct<ne; ++ct) esc[nou_esc(vots, esc, np)]++;
for (ct=0; ct<np; ++ct)
printf("\nEl partit %d ha obtingut %d escons.", ct+1,
esc[ct]);
}
int nou_esc( int vots[], int esc[], int np)
{
int imax=0, ct;
int max=0;
int maxvots=0;
// nombre màxim de vots
for (ct=0;ct<np;++ct)
{if (maxvots<vots[ct]) maxvots=vots[ct];}
for (ct=0; ct<np; ++ct)
{
if( max<=(vots[ct]/(esc[ct]+1)) )
{
if (max<(vots[ct]/(esc[ct]+1)))
{
max=vots[ct]/(esc[ct]+1);
imax=ct;
}
if (max==(vots[ct]/(esc[ct]+1)))
{
if (maxvots<vots[ct]) {imax=ct;}
}
}
}
return imax;
}
Un blog con cuestiones, ejercicios, problemas, aplicaciones y comentarios relacionados con los contenidos de Matemáticas del segundo curso de Bachillerato en las modalidades de Ciencias y Tecnología
Mostrando entradas con la etiqueta C. Mostrar todas las entradas
Mostrando entradas con la etiqueta C. Mostrar todas las entradas
martes, 1 de octubre de 2002
Implementación de la ley d'Hondt. Un ejercicio de programación en C/C++
lunes, 1 de octubre de 2001
Comprobando las leyes de Morgan. Un ejercicio de programación en C/C++
//-----------------------------------------------------------------
//lleis de Morgan
//
// Joan Aranès Clua
// data: 15/12/2001
//
//Comprovació de lleis de Morgan per comparació de les taules de
// veritat
//(no (p i q)) equival a ((no p) o (no q))
//(no (p o q)) equival a ((no p) i (no q))
//
//-----------------------------------------------------------------
#define V 1
#define F 0
#include <stdio.h>
void main()
{
printf("1a llei de Morgan\n");
printf("Taula de veritat de !(p||q) \n");
printf("!(F||F) = %d\n",!(F ||F) );
printf("!(F||V) = %d\n",!(F ||V) );
printf("!(V||F) = %d\n",!(V ||F) );
printf("!(V||V) = %d\n",!(V ||V) );
printf("Taula de veritat de !p&&!q \n");
printf("!F&&!F = %d\n",!F && !F );
printf("!F&&!V = %d\n",!F && !V );
printf("!V&&!F = %d\n",!V && !F );
printf("!V&&!V = %d\n",!V && !V );
printf("------------\n");
printf("2a llei de Morgan\n");
printf("Taula de veritat de !(p&&q) \n");
printf("!(F&&F) = %d\n",!(F && F));
printf("!(F&&V) = %d\n",!(F && V) );
printf("!(V&&F) = %d\n",!(V && F) );
printf("!(V&&V) = %d\n",!(V && V) );
printf("Taula de veritat de !p||!q \n");
printf("!F||!F = %d\n",!F || !F );
printf("!F||!V = %d\n",!F || !V );
printf("!V||!F = %d\n",!V || !F );
printf("!V||!V = %d\n",!V || !V );
}
domingo, 30 de septiembre de 2001
Localización de una celda en un retículo rectangular. Un ejercicio sencillo de programación en C/C++
//-----------------------------------------------------------------
// Localització d'una cel.la en un rectangle
//
// Joan Aranès Clua
// data: 15/12/2001
//
//
// Un rectangle està dividida en n files i m columnes.
// Les files estan numerades des del 0 fins al (n-1) i les columnes
// des del 0 fins al (m-1).
//
// Es tracta d'escriure un programa que,
// donat un número p comprés entre 0 i (n x m)-1,
// ens indiqui a quina fila i columna pertany aquest número.
// Per exemple, si el rectangle està dividit en n = 4 files i
// m = 5 columnes i escrivim p = 14, ha de respondre:
// "fila 2, columna 4"
//-----------------------------------------------------------------
#include <stdio.h>
#include <math.h>
void main ()
{
//declaració de les variables
unsigned short int n,m; // nombre de files i columnes que defineixen el rectangle
unsigned short int p; // variable d'entrada
//definició del rectangle n files x m columnes
printf("-----------------------------------\n");
printf("Definiu un rectangle donant el nombre de files n i columnes m:\n");
printf("separats per un espai\n");
scanf("%u %u",&n, &m);
//entrada d'un nombre p
printf("-----------------------------------\n");
printf("Entreu nombre p compr\x08As entre\n");
printf("%u",0);
printf(" i ");
printf("%u\n",n*m-1);
printf("p=");
scanf("%u",&p);
//ubicació de la cel.la
printf("-----------------------------------\n");
printf("fila = %u\n",int(p/m));
printf("columna = %u\n",p%m);
}
Etiquetas:
C,
C/C++,
ejercicios de programación
Suscribirse a:
Entradas (Atom)