algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Metoda Sainte-Laguë (zmodyfikowana) - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 07 marca 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

sainte_lague_m_d/sainte_lague_m_d.dpr:
program sainte_lague_m_d;
{$APPTYPE CONSOLE}
uses
  SysUtils;

//
// Algorytm Sainte-Lague (zmodyfikowany)
//
// www.algortym.org
// (c)2006 Tomasz Lubinski
//

function calcNewValue(votes: Integer; mandates: Integer): Real;
begin
   if mandates = 0 then
      Result := (votes*1.0) / 1.4
   else
      Result := (votes*1.0) / (2*mandates + 1.0);
end;


var
   mandates : Array [1..100] of Integer;
   votes : Array [1..100] of Integer;
   calcTab : Array [1..100] of Real;
   max : Real;
   groupCount, mandatesCount, maxInd, i, j: Integer;

begin
   //get all data
   writeln('Podaj liczbe partii (max.100)');
   readln(groupCount);

   writeln('Podaj liczbe mandatow');
   readln(mandatesCount);

   for i:=1 to groupCount do
   begin
      writeln('Podaj liczbe glosow na partie ' + IntToStr(i));   
      readln(votes[i]);
   end;
   
   //clear number of mandates
   for i:=1 to groupCount do
      mandates[i] := 0;
   
   //calculate mandates (Sainte-Lague)
   for i:=1 to groupCount do
      calcTab[i] := votes[i];

   for i:=1 to mandatesCount do
   begin
      //find max 
      max := -1;
      maxInd := 1;
      for j:=1 to groupCount do
      begin
         if max<calcTab[j] then
         begin
            max := calcTab[j];
            maxInd := j;
         end
      end;
      
      //give mandate for party with max
      mandates[maxInd] := mandates[maxInd] + 1;
      calcTab[maxInd] := calcNewValue(votes[maxInd], mandates[maxInd]);
   end;
   
   //present results
   for i:=1 to groupCount do
   begin
      writeln('Partia ' + IntToStr(i) + ' ma ' + IntToStr(mandates[i]) + ' mandatow');
   end;

   readln;
   
end.

Dodaj komentarz