{
Doplňte kód procedur, načtěte několik zaměstnanců (nejméně 4), pak vypište
- všechny dojíždějící motorovými prostředky
- všechny zaměstnance účtárny
- všechny, kdo pracují ve výrobě a zároveň jsou mladší 20 let
(vždy vypište zadanou tabulku, pak čekejte na stisknutí jakékoliv klávesy,
zobrazte další tabulku, ...).
Potom vypište všechny zaměstnance, zeptejte se, kterého propustit, proveďte
a znovu všechny vypište. Vyzkoušejte na druhém zaměstnanci v pořadí.
P. S. Něco je nutné přidat také na začátek, aby program fungoval.
}

program Zamestnanci;
uses
  crt;

type
  TDoprava = (pesky, vlak, auto, bus, kolo, kolobezka);
  TOddeleni = (vyroba, uctarna, pokladna, vedeni);
  TNazev = string[20];

  TZamestnanec = record
    prijmeni, jmeno: TNazev;
    oddeleni: TOddeleni;
    eCislo: word;
    doprava: TDoprava;          { doprava do zamestnani }
    narozen: word;              { rok narozeni }
  end;

const
  dojizdejici: set of TDoprava = [vlak, auto, bus];
  dProstredky: set of TDoprava = [vlak, auto, bus, kolo, kolobezka];
  MaxZam = 22;

var
  zam: array [1..MaxZam] of TZamestnanec;
  pocetZam: byte;

procedure VypisHlavicku;
{ smaze obrazovku a vypise hlavicku tabulky ve tvaru
  Prijmeni     Jmeno      Oddeleni     Cislo     Doprava     Narozen
  a zaradkuje (tedy pouzije writeln) }

begin
  clrscr;
  writeln('Prijmeni            Jmeno               Oddeleni  Cislo     Doprava   Narozen');
  writeln('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
end;

procedure VypisZamestnance(z: TZamestnanec);
{ vypise udaje o zadanem zamestnanci zarovnane podle hlavicky, pak zaradkuje }

  function Zarovnej(s: TNazev; na_delku: byte): string;
  { vnorena funkce, ktera vrati retezec zarovnany na zadanou delku }
  var delka, j: byte;
  begin
    delka := length(s);
    if delka > na_delku then Delete(s, na_delku+1, delka-na_delku)
    else if delka < na_delku then
      for j := delka+1 to na_delku do s := s + ' ';
    Zarovnej := s;
  end;

begin
  with z do begin
    write(Zarovnej(prijmeni,20), Zarovnej(jmeno,20));
    case oddeleni of
      vyroba:   write('vyroba    ');
      uctarna:  write('uctarna   ');
      pokladna: write('pokladna  ');
      vedeni:   write('vedeni    ');
    end;
    write(eCislo:5,'     ');
    case doprava of
      pesky:     write('pesky     ');
      vlak:      write('vlak      ');
      auto:      write('auto      ');
      bus:       write('autobus   ');
      kolo:      write('kolo      ');
      kolobezka: write('kolobezka ');
    end;
    writeln(narozen:5);
  end;
end;

procedure NactiZamestnance;
{ smaze obrazovku, zjisti, zda pocet zamestnancu jeste neni na maximu,
  jestlize ne, postupne nacita jednotlive udaje o zamestnanci, uklada je
  na nejblizsi volne misto v poli zamestnanců a nezapomene zvysit hodnotu
  promenne pocetZam }
var
  c: char;
begin
  if pocetZam < MaxZam then begin
    clrscr;
    inc(pocetZam);
    with zam[pocetZam] do begin
      write('Jmeno:           '); readln(jmeno);
      write('Prijmeni:        '); readln(prijmeni);
      writeln('Oddeleni');
      write('(u: uctarna, p: pokladna, v: vedeni, jinak vyroba)');
      c := readkey;
      case c of
        'u': oddeleni := uctarna;
        'p': oddeleni := pokladna;
        'v': oddeleni := vedeni;
        else oddeleni := vyroba;
      end;
      writeln;
      write('Evidencni cislo: '); readln(eCislo);
      writeln('Doprava do zamestnani');
      write('(p: pesky, v: vlak, a: auto, b: bus, k: kolo, jinak kolobezka)');
      c := readkey;
      case c of
        'p': doprava := pesky;
        'v': doprava := vlak;
        'a': doprava := auto;
        'b': doprava := bus;
        'k': doprava := kolo;
        else doprava := kolobezka;
      end;
      writeln;
      write('Rok narozeni:    '); readln(narozen);
      write('Diky za snahu, zamestnanec prijat');
      readkey;
    end;
  end;
end;

procedure PropustZamestnance(ktery: byte);
{ Jestlize existuje zamestnanec s timto poradovym cislem (tzn. cislo je mensi
  nebo rovno pocetZam), posune na jeho misto nasledujiciho zamestnance,
  na misto toho nasledujiciho dalsiho, ... az na konec pole, pak snizi pocet
  zamestnancu }
var
  i: byte;
begin
  if (ktery > 0) and (ktery <= pocetZam) then begin
    for i := ktery+1 to pocetZam do
      with zam[i-1] do begin
        jmeno    := zam[i].jmeno;
        prijmeni := zam[i].prijmeni;
        oddeleni := zam[i].oddeleni;
        eCislo   := zam[i].eCislo;
        doprava  := zam[i].doprava;
        narozen  := zam[i].narozen;
      end;
    dec(pocetZam);
  end;
end;


begin
  pocetZam := 0;
  for i := 1 to 4 do
    NactiZamestnance;

  VypisHlavicku;
  for i := 1 to pocetZam do
    if (zam[i].doprava in dojizdejici) then VypisZamestnance(zam[i]);
  writeln;
  write('Vypsani vsichni, kdo dojizdi motorovymi prostredky.');
  readkey;

  VypisHlavicku;
  for i := 1 to pocetZam do
    if (zam[i].oddeleni = uctarna) then VypisZamestnance(zam[i]);
  writeln;
  write('Vypsani vsichni, kdo pracuji v uctarne.');
  readkey;

  VypisHlavicku;
  for i := 1 to pocetZam do
    with zam[i] do
      if (oddeleni = vyroba) and ((2002-narozen)<20) then
        VypisZamestnance(zam[i]);
  writeln;
  write('Vypsani vsichni, kdo pracuji ve vyrobe a je jim mene nez 20 let.');
  readkey;

  VypisHlavicku;
  for i := 1 to pocetZam do VypisZamestnance(zam[i]);
  writeln;
  write('Koho propustit? (zadejte poradove cislo) ');
  readln(i);
  PropustZamestnance(i);
  VypisHlavicku;
  for i := 1 to pocetZam do VypisZamestnance(zam[i]);
  readln;
end.