[ Foro de C++ ]

Ayuda con el metodo d´hondt

09-Dec-2021 22:53
Invitado (Ian)
0 Respuestas

no sabamos como hacer funcionar este programa ya que nos falta como contar cada vez q divide la posicion del vector para contar los escaños que lleva ese partido




#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

bool formula_dhondt (const vector<int>&, vector<int>&, int);
bool formula_sainte_lague (const vector<int>&, vector<int>&, int);
bool formula_sainte_lague_modificada (const vector<int>&, vector<int>&, int);
bool formula_dean (const vector<int>&, vector<int>&, int);
bool formula_adams (const vector<int>&, vector<int>&, int);
bool formula_cociente_hare (const vector<int>&, vector<int>&, int);
bool formula_cociente_imperiali (const vector<int>&, vector<int>&, int);
bool formula_cuota_droop (const vector<int>&, vector<int>&, int);
bool formula_cuota_hagasbach_bischoff (const vector<int>&, vector<int>&, int);
int main()
{
//consideramos como maximo 5 partidos y 8 escanos para repartir
const int NUMERO_MAXIMO_PARTIDOS=5;
const int NUMERO_MAXIMO_ESCANOS_REPARTIR=8;
//declaracion de variables
int numero_partidos=0;
int numero_escanos_repartir=0;
int votos_partido=0, suma_votos=0;
int opcion=0;
vector<int> votos, escanos;

//solicitar al usuario que indique el numero de partidos (como maximo 5)
do
{
cout << "Introduce el numero de partidos (max. "<<NUMERO_MAXIMO_PARTIDOS<<"):" << endl;
cin >> numero_partidos;
}
while((numero_partidos>NUMERO_MAXIMO_PARTIDOS) || (numero_partidos<0));

//solicitar al usuario que indique el numero de escanos a repartir (como maximo 8)
do
{
cout << "Introduce el numero de escanos a repartir (max. "<<NUMERO_MAXIMO_ESCANOS_REPARTIR<<"):" << endl;
cin >> numero_escanos_repartir;
}
while((numero_escanos_repartir>NUMERO_MAXIMO_ESCANOS_REPARTIR) || (numero_escanos_repartir<0));

//solicitar al usuario el numero de votos validos por partido.
for(int i=0; i<numero_partidos; i++)
{
cout << "Introduce el numero de votos partido "<< (char)(i+65) << " :"<< endl;
do
{
cin >> votos_partido;
}
while (votos_partido<0);
votos.push_back(votos_partido);
suma_votos+=votos_partido;

}

cout << "\nvotos :\n";
for (size_t i=0; i<votos.size(); i++) cout << votos.at(i)<<"\t";
escanos=votos;

//menu
do
{
cout << "\n\n Elige una formula electoral para el reparto: " << endl;
cout << "1. DHondt " << endl;
cout << "2. Sainte-Lague " << endl;
cout << "3. Sainte-Lague modificada " << endl;
cout << "4. Dean " << endl;
cout << "5. Adams " << endl;
cout << "6. Cociente Hare " << endl;
cout << "7. Cociente Imperiali " << endl;
cout << "8. Cuota Droop " << endl;
cout << "9. Cuota Hagasback-Bischoff " << endl;
cout << "0. Salir " << endl;
cin >> opcion;

switch (opcion)
{
case 1:
{
// ejemplo para el caso de la formula de DHondt
if (formula_dhondt (votos, escanos, numero_escanos_repartir))
{
cout << "formula DHondt" << endl;
cout << "numero de votos validos : " << suma_votos <<endl;
cout << "numero de escanos repartidos : " << numero_escanos_repartir << endl;
for (size_t i=0; i<escanos.size(); i++)
cout << "partido " << (char)(i+65) << " ha obtenido " << escanos.at(i) << " escanos" << endl;
}
else cout << "error en la formula DHondt " << endl;
break;

}
case 2: //simular al caso 1 pero para la formula Sainte Lague
case 3: //simular al caso 1 pero para la formula Sainte Lague modificada
case 4: //simular al caso 1 pero para la formula Dean
case 5: //simular al caso 1 pero para la formula Adams
case 6: //simular al caso 1 pero para la formula cociente Hare
case 7: //simular al caso 1 pero para la formula cociente Imperiali
case 8: //simular al caso 1 pero para la formula cuota Droop
case 9: //simular al caso 1 pero para la formula cuota Hagasbach-Bischoff
default:
break;
}
}
while (opcion!=0);


return 0;
}

/* Cada grupo desarrolla una funcion (formula electoral asignada).
cada funcion devuelve "true" si todo correcto y "false" si el vector con los votos
por partido esta vacio u otras situaciones de error.
1- El primer argumento es un vector de enteros con los votos validos por partido

2- El segundo argumento es un vector de enteros donde la funcion devuelve los escanos
que corresponden a cada partido segun la formula electoral correspondiente.

3- El tercer argumento es el numero entero de escanos a repartir.
*/

bool formula_dhondt (const vector<int>& votos, vector<int>& escanos, int numero_escanos_repartir)
{
int maximo=0;
if(escanos.size()==0)
return false;


/*Tenemos que en el vector escanos q solo nos quede los escaños q le quedan a cada partido, para eso tenemos q dectectar el maximo de dentro,
* despueds divideir ese maximo y repetir la deteccion del maximo aumentando un contador de cada partido .
* al final elemminamos todo y nos queda solo los escxaños de cada partido*/

for (int i=0; i<votos.size(); i++) //BUSCAMOS EL PARTIDO CN MAYOR NUMERO DE VOTOS.
{
int maximo_votos=0;
if(votos.at(i)> (maximo_votos=0))
{
maximo_votos=votos.at(i);
}
}


for (int i=0; i<escanos.size(); i++)
{int maximo;
if(escanos.at(i)>maximo)
{
maximo=escanos.at(i);


escanos.at(i)=(maximo/2);
}
}

//Idea
vector<int> escanos_2;
escanos_2.size()=escanos.size();
// vaciar el segundo vector luego cada vez q se asigne un macximo se sume 1 en la posicion q coresonda

for(int i=0;i<escanos_a_repartir;i++)
{
vector<int> escanos_2;
escanos_2.size()=escanos.size();
maximo=0;

for (int i=0; i<escanos.size(); i++)
{
if(escanos.at(i)>maximo)
{
maximo=escanos.at(i);

if(maximo){
escanos_2.at(i)=escanos_2.at(i)+1;
}


}

}
escanos.at(i)=escanos.at(i)/2;
}
//pauta de comprobacion cout<<maximo<<endl;


}
for(int i=0,i<escanos_a_repartir,i++)
{
for(int i=0;i<escanos.size();i++)
{

for(int j=i+1;j<escanos.size();j++)
{
if(escanos.at(i)<escanos.at(j))
{
int auxiliar;
auxiliar=escanos.at(i);
escanos.at(i)=escanos.at(j);
escanos.at(j)=auxiliar;
}
}

}
escanos.at(1)=escanos.at(1)/2;
escanos_aux??
}
//Idea para detectar un maximo:
/*#include <iostream>
#include <vector>
using namespace std;

bool maximo(vector<int>& v, int& maximo);
int main()
{
vector<int>v{4,1,5,3};
int maximoo;

if (minimo_vector_v3(v, maximo))
cout << "El mínimo es " << maximo << endl;
}

bool minimo_vector_v3(vector<int>& v, int& maximo)
{
if(v.empty())
return false;

maximo = v[0];
for (size_t i = 1; i < v.size(); ++i)
if (v[i] > maximo)
maximo= v[i];

return true;*/




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)