{ Toto je ukazkovy program pro praci s typovymi soubory. 

  Napiste vlastni program:
  . vytvorte vlastni datovy typ (napriklad pro ulozeni informaci o jednom
    aute, zvireti, rostline, kusu nabytku, pocitaci, 
    zbozi na sklade, knize, ...
  . z klavesnice nacitejte promenne tohoto datoveho typu, postupne 
    je ukladejte do typoveho souboru vami vytvoreneho datoveho typu
  . soubor uzavrete a znovu otevrete
  . v cyklu (repeat): 
    * zeptejte se, ktery zaznam chce uzivatel vypsat (cislo zaznamu)
    * pokud je zadano cislo 0, konec cyklu
    * jinak se presunte na zadany zaznam (pozor - prvni zaznam ma cislo 0)
    * nactete zaznam do promenne a vypiste ho na obrazovku. }

program osoby;

uses
  crt;

type
  TOsoba = record
    jmeno, prijmeni: string[10];
    os_cislo: word;
    kancelar: word;
    pocet_aut: byte;
  end;

var
  o: TOsoba;
  f: file of TOsoba;
  pom: word;


procedure Done;
{ Uklidime obrazovku. }
begin
  window(1,1,80,25);
  textbackground(black);
  textcolor(lightgray);
  clrscr;
end;


procedure Init;
{ V teto procedure muzeme vhodne upravit obrazovku (nemusime si s tim hrat),
  ale predevsim otevreme soubor pro zapis a pokud to nepujde,
  vypiseme chybove hlaseni a ukoncime program. }
var s: string;
begin
  textbackground(blue);
  textcolor(yellow);
  clrscr;

  writeln;
  write(' Zadejte nazev souboru pro ulozeni tabulky osob: ');
  readln(s);

  assign(f,s);
{$I-}
  rewrite(f);
{$I+}
  if IOResult <> 0 then begin
    writeln;
    write(' Soubor '+s+' se nepodarilo otevrit.');
    readln;
    Done;
    halt;
  end;
end;


function NactiOsobu(var os: TOsoba): boolean;
{ Z klavesnice nacteme udaje o jedne osobe,
  predtim smazeme obrazovku.
  Jestlize je jako jmeno nebo prijmeni zadan prazdny retezec,
  funkce vrati hodnotu FALSE, jinak TRUE. }
begin
  clrscr;
  writeln;
  with os do begin
    write(' Jmeno:                '); readln(jmeno);
    write(' Prijmeni:             '); readln(prijmeni);

    if (jmeno = '') or (prijmeni = '') then begin
      NactiOsobu := FALSE;
      exit;
    end;

    write(' Osobni cislo:         '); readln(os_cislo);
    write(' Cislo kancelare:      '); readln(kancelar);
    write(' Pocet sluzebnich aut: '); readln(pocet_aut);
  end;
  NactiOsobu := TRUE;
end;


procedure VypisHlavicku;
{ Smazeme obrazovku a vypiseme hlavicku tabulky. }
begin
  clrscr;
  writeln('Jmeno      Prijmeni    Osobni cislo  Kancelar  PocetAut');
  writeln('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
end;

procedure VypisOsobu(os: TOsoba);
{ Na jeden radek (tabulky) vypiseme udaje o zadane osobe, pouzijeme writeln. }
begin
  with os do
    writeln(jmeno:10, '  ', prijmeni:10, '    ',
            os_cislo:5, '       ',
            kancelar:5, '   ',
            pocet_aut:7);
end;


begin { hlavni program }
  Init;

  { V cyklu nacitame jednotlive osoby a hned je ukladame do otevreneho
    souboru. Pouzivame pri tom funkci NactiOsobu. Nacitame tak dlouho,
    dokud funkce vraci hodnotu TRUE, tedy pokud vrati FALSE, koncime
    nacitani. }
  while NactiOsobu(o) do begin
    write(f,o);
    writeln;
    write('Pozice v souboru (=pocet zapsanych zaznamu): ', FilePos(f));
    readln;
  end;

  close(f);
  reset(f);
  VypisHlavicku;

  { V cyklu nacitame do promenne o jednotlive osoby ze souboru,
    vypisujeme je pomoci procedury VypisOsobu na obrazovku. }
  while not eof(f) do begin
    read(f,o);
    VypisOsobu(o);
  end;

  { Pod tabulku napiseme, jak je soubor velky, a to
    * kolik ma polozek,
    * kolik ma Bytu. }
  writeln;
  pom := FileSize(f);
  writeln(' Pocet polozek souboru: ', pom);
  write  (' Velikost souboru:      ', pom * sizeof(TOsoba), ' Bytu');

  close(f);
  readln;
  Done;
end.