Mandaty
Kod był wyświetlany 2031 razy.
    /*
  Name: Mandaty
  Copyright GPL GNU
  Author: Adam Kuziemski
  Date: 21-05-09 16:44
  Description: Obliczanie liczby głosów uzyskanych w wyborach
*/
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
///////////////////////////////
struct partia
{
  int glosy, mandaty;

  partia (int a = 0) : glosy(a), mandaty(0) {}

  float wsp (string txt)
  {
    if (txt == "dhondt") return glosy / (mandaty + 1);
    if (txt == "sainte") return glosy / (2 * mandaty + 1);
    if (txt == "sainte_mod")
    {
      if (!mandaty) return glosy / 1.4f;
      return glosy / (2 * mandaty + 1);
    }
  }
  float wsp (int v, int s)
  {
    return (glosy * s * 1.0f) / v;
  }
};
///////////////////////////////
void rozdaj (vector<partia>&, int, string);
void dhondt (int*, int, int);
void sainte (int*, int, int);
void sainte_mod (int*, int, int);
void hare (int*, int, int);
///////////////////////////////
int main ()
{
  string nazwa;

  cout <<"Podaj nazwe pliku wraz z rozszerzeniem: ";
  cin >> nazwa;

  ifstream plik (nazwa.c_str());

  if (!plik)
  {
    cout <<"Podany plik nie istnieje.";
    return 1;
  }

  int ilosc_partii, do_rozdania, *glosy = 0;

  plik >> ilosc_partii >> do_rozdania;

  glosy = new int [ilosc_partii];

  for (int i = 0; i < ilosc_partii; ++i)
    plik >> glosy[i];

  dhondt (glosy, ilosc_partii, do_rozdania);
  sainte (glosy, ilosc_partii, do_rozdania);
  sainte_mod (glosy, ilosc_partii, do_rozdania);
  hare (glosy, ilosc_partii, do_rozdania);

  delete [] glosy;
  return 0;
}
///////////////////////////////////////
void rozdaj (vector<partia>& partie, int mandaty, string txt)
{
  int n = 0;
  float wsp, max;

  for (int i = 0; i < mandaty; ++i)
  {
    wsp = 0.0f, max = 0.0f;

    for (int k = 0; k < partie.size(); ++k)
    {
      wsp = partie[k].wsp(txt);

      if (wsp > max)
      {
        max = wsp;
        n = k;
      }
    }
    partie[n].mandaty += 1;
  }
}

void dhondt (int* glosy, int ile, int mandaty)
{
  vector <partia> partie;

  for (int i = 0; i < ile; ++i)
    partie.push_back(glosy[i]);

  rozdaj (partie, mandaty, "dhondt");

  cout <<"Metoda d'Hondt'a:\n\n";

  for (int i = 0; i < partie.size(); ++i)
    cout <<"Partia "<< i + 1 <<" - "<< partie[i].mandaty <<" mandatow.\n";

  cout <<'\n';
}

void sainte (int* glosy, int ile, int mandaty)
{
  vector <partia> partie;

  for (int i = 0; i < ile; ++i)
    partie.push_back(glosy[i]);

  rozdaj (partie, mandaty, "sainte");

  cout <<"Metoda Sainte-Lague:\n\n";

  for (int i = 0; i < partie.size(); ++i)
    cout <<"Partia "<< i + 1 <<" - "<< partie[i].mandaty <<" mandatow.\n";

  cout <<'\n';
}

void sainte_mod (int* glosy, int ile, int mandaty)
{
  vector <partia> partie;

  for (int i = 0; i < ile; ++i)
    partie.push_back(glosy[i]);

  rozdaj (partie, mandaty, "sainte_mod");

  cout <<"Zmodyfikowana metoda Sainte-Lague:\n\n";

  for (int i = 0; i < partie.size(); ++i)
    cout <<"Partia "<< i + 1 <<" - "<< partie[i].mandaty <<" mandatow.\n";

  cout <<'\n';
}

void hare (int* glosy, int ile, int mandaty)
{
  vector <partia> partie;
  vector <float> wsp;
  int mc = 0;
  int suma = 0;

  for (int i = 0; i < ile; ++i)
  {
    partie.push_back(glosy[i]);
    suma += partie[i].glosy;
  }

  for (int i = 0; i < partie.size(); ++i)
  {
    wsp.push_back(partie[i].wsp(suma, mandaty));
    partie[i].mandaty = static_cast<int>(wsp[i]);
    wsp[i] -= partie[i].mandaty;
    mc += partie[i].mandaty;
  }

  while (mc < mandaty)
  {
    float max = -1.0f;
    int n = 0;

    for (int i = 0; i < partie.size(); ++i)
    {
      if (wsp[i] > max)
      {
        n = i;
        max = wsp[i];
      }
    }

    partie[n].mandaty += 1;
    ++mc;
    wsp[n] = 0;
  }

  cout <<"Metoda Hare-Niemeyer'a:\n\n";

  for (int i = 0; i < partie.size(); ++i)
    cout <<"Partia "<< i + 1 <<" - "<< partie[i].mandaty <<" mandatow.\n";
}
    
Pobierz plik tekstowy
Załączniki
Administrator WJL
PHP&SQL coded by NOVA-IT