program Tehtava9123(input, output);
  const KPL = 4;  {p.o. 20, mutta helpompi testata pienellä arvolla!}
  type kilpailija = record
                      nimi: varying [20] of char;
                      tpist: 0..50;
                      ppist: 0..100
                    end;
  var K: array [1..KPL] of kilpailija;

{------------LueInteger-----------------------------------}
{Proseduuri palauttaa 1. parametrilla tiedon luvun löytymisestä,
 jos se on true, 2. parametri on löytynyt luku}

procedure LueInteger(var OK: boolean; var arvo: integer);
  var merkki: char;
      negat: boolean;
begin
  OK := false;
  negat := false;
  arvo := 0;
  if not eof then
    begin
      read(merkki);
      while (merkki = ' ') and not eof do
        read(merkki);           
      if merkki in ['+', '-'] then 
        begin
          if merkki = '-' then 
            negat := true;
          read(merkki);
        end;
      if merkki in ['0'..'9'] then
        begin
          OK := true;
          repeat
            arvo := 10*arvo + (ord(merkki)-ord('0'));
            read(merkki)
          until not(merkki in ['0'..'9']);
          if negat then
            arvo := - arvo;
        end;
    end;
end;
{------------------------------------------------------------}

procedure LueTiedot;
  var i, tyyli, perus: integer;
      kunnossa: boolean;
begin
  for i := 1 to KPL do
    begin
      writeln('Anna kilpailija ', i:1, ':n tiedot!');
      write('nimi: ');
      readln(K[i].nimi);
      repeat
        write('tyylipisteet: ');
        LueInteger(kunnossa, tyyli);
        kunnossa := kunnossa and (tyyli >= 0) and (tyyli <= 50);
        if kunnossa then
          K[i].tpist := tyyli
        else
          writeln('PITÄÄ OLLA LUKU 0-50! Anna uudelleen');
      until kunnossa;
      repeat
        write('peruspisteet: ');
        LueInteger(kunnossa, perus);
        kunnossa := kunnossa and (perus >= 0) and (perus <= 100);
        if kunnossa then
          K[i].ppist := perus
        else
          writeln('PITÄÄ OLLA LUKU 0-100! Anna uudelleen');
      until kunnossa;
    end; {for i}
end;

procedure TulostaTiedot;
  var i:  integer;
begin
  writeln('kilpailija             tyyli  perus  yhteensä');
  for i := 1 to KPL do
    with K[i] do
      writeln(nimi, ' ':21-length(nimi), {tasaus vasemmalle!}
              tpist:7, ppist:7, tpist+ppist:10);
  writeln;
end;

procedure AbcJarjesta;
  var i, j: integer;
      apu: kilpailija;
begin 
  for i := 1 to KPL-1 do
    for j := i+1 to KPL do
      if K[i].nimi > K[j].nimi then
        begin
          apu := K[i]; K[i] := K[j]; K[j] := apu;
        end;
end;

procedure PisteJarjesta;
  var i, j: integer;
      apu: kilpailija;
begin 
  for i := 1 to KPL-1 do
    for j := i+1 to KPL do
      if (K[i].ppist+K[i].tpist < K[j].ppist+K[j].tpist) 
                       or
         (K[i].ppist+K[i].tpist = K[j].ppist+K[j].tpist)
                       and
         (K[i].nimi > K[j].nimi)  then
        begin
          apu := K[i]; K[i] := K[j]; K[j] := apu;
        end;
end;

begin {pääohjelma}
  writeln;
  writeln('KILPAILUN TULOSOHJELMA');
  writeln;
  LueTiedot;
  AbcJarjesta;
  writeln;
  writeln('Kilpailijat aakkosjärjestyksessä:');
  TulostaTiedot;
  PisteJarjesta;
  writeln('Kilpailijat pistejärjestyksessä:');
  TulostaTiedot;
end.

