Umíte pascalsky - 23.lekce ...

Umíte pascalsky?
23.lekce
Vytisknout  

Datový typ soubor (typový soubor)

Zadávat data při každém běhu programu z klávesnice je nepohodlné. Proto je počítač vybaven prostředky pro uchovávání dat - vnější paměti. Datový typ soubor umožňuje práci s takto uloženými daty.

Soubor je posloupnost složek stejného typu, které jsou uloženy ve vnější paměti a jsou pro ně definovány určité operace.
Počet složek souboru je proměnlivý. V každém okamžiku je přístupná jeho jediná složka.

Pascal rozlišuje několik druhů souborů:
    typové - s definovaným typem složek
    textové - posloupnosti znaků členěné do řádků
    netypové - složky mají libovolnou strukturu

Datový typ soubor deklarujeme takto:

type <název> = file of <typ složky> ;               typový
          <název> = text ;                                        textový
          <název> = file ;                                          netypový

V této lekci se budeme věnovat typovým souborům.

Například typový soubor pro uložení dat hokejisty bychom mohli deklarovat následovně:

type THrac = record
                                     jmeno: string[30];
                                     oddil: string[5];
                                     goly: integer;
                                     nahravky: integer;
                          end ;
          THraci = file of THrac ;

Proměnná typu soubor se deklaruje obvyklým způsobem. Pokud tedy chceme pracovat s proměnnou hraci, která je typu soubor výše deklarovaného typu Thraci, pak použijeme deklaraci:

var hraci: THraci;

Pro další práci se souborem v programu je nejprve nutné přiřadit proměnné typu soubor jméno skutečného souboru na disku. To provádí procedura assign, která má tvar:

assign(<proměnná typu soubor>,<jméno souboru na disku>);
Jméno souboru je proměnná typu string.

Například:     assign(hraci,'C:/hokej.dta');
Všechny oprace s proměnnou hraci se budou provádět na diskovém souboru C:/hokej.dta.

Po přiřazení jména je nutné soubor otevřít (jinak s ním nelze pracovat). Toho lze dosáhnout dvěma způsoby:

rewrite(<jméno souboru>)
      založí nový diskový soubor (existující je přepsán), do kterého můžeme zapisovat,číst a aktualizovat složky - otevření k zápisu

reset(<jméno souboru>)
      otevře existující soubor (pokud neexistuje, dojde k chybě), ze kterého můžeme číst a aktualizovat - otevření ke čtení

Přístup ke složkám otevřeného souboru může být:

sekvenční - postupný přístup k jednotlivým složkám
přímý - přístup ke složkám zadáním pořadového čísla požadované složky (první má pořadové číslo 0)
kombinovaný - kombinace obou možností

Přímý přístup ke složce s daným pořadovým číslem umožňuje procedura seek:
seek(<jméno souboru>,<pořadí složky>)
Tedy seek(hraci,4) umožní přímý přístup k 5. hokejistovi v souboru hraci.
seek(hraci,0) umožní přímý přístup k 1. hokejistovi v souboru hraci.
Funkce filesize(<jméno souboru>) udává aktuální počet složek v souboru a tedy:
seek(hraci,filesize(hraci)) umořní přímý přístup k poslednímu hokejistovi v souboru hraci.

Funkce pro práci se soubory (typovými).

eof(<jméno souboru>) udává,zda je aktuální složka poslední složkou souboru (pak je true jinak false)
filepos(<jméno souboru>) udává pořadí aktuální složky v souboru
filesize(<jméno souboru>) udává aktuální počet složek souboru

Procedury pro práci se soubory (typovými).

truncate(<jméno souboru>) smaže všechny složky od aktuální složky až do konce souboru
read(<jméno souboru>,<jméno proměnné>) uvedené proměnné (může jich být víc) je přiřazena aktuální složka souboru a aktuální složkou se stává následující složka - čtení ze souboru
write(<jméno souboru>,<jméno proměnné>) uvedená proměnné je zapsána jako aktuální složka souboru a aktuální složkou se stává následující složka - zápis do souboru

A nyní si můžeme práci s typovým souborem ukázat na příkladě:

Příklad:
Sestavte program Hokej pro zpracování kanadského bodování hokejistů. Sledovat budeme jméno,oddíl,branky a nahrávky hokejistů. Podle volby uživatele program umožní zadat údaje, vypsat údaje a vyhledat údaje zadaného hokejisty.

Myšlenka (hrubý algoritmus):

<dokud nechceš skončit opakuj následující činnost
   - Nacti_hrace zadání údajů hokejistů
   - Napis_hrace výpis údaje hokejistů
   - Najdi_hrace najdi údaje hokejisty>

Program Hokej může vypadat takto:

program Hokej;
  type THrac = record
               jmeno:string[30];
               oddil:string[15];
               goly:integer;
               nahravky:integer;
           end;
           THraci = file of THrac;
  var hrac:THrac;
         hraci:THraci;
         pocet,volba:integer;
{údaje jednoho hokejisty}
{popisuje typ THrac - záznam}


{THraci popisuje sobor o složkách}
{typu THrac}

{hrac - údaje jednoho hokejisty}
{hraci - údaje všech hokejistů}
{pocet - počet všech hokejistů}
 
procedure Nacti_hrace;
  var kolik:integer;
  begin
    writeln('Zadej pocet hracu: '); readln(pocet);
    rewrite(hraci);
    for kolik:=1 to pocet do
      begin
        with hrac do
          begin
             writeln('Zadej jmeno:');readln(jmeno);
             writeln('Zadej oddil:');readln(oddil);
             writeln('Zadej goly:');readln(goly);
             writeln('Zadej nahravky:');readln(nahravky);
             write(hraci,hrac);
          end;
      end;

{otevření souboru hraci k zápisu}
{opakuje se pro zadaný počet hokejistů}



{zadání údajů nového hokejisty}



{zapsání údajů do souboru hraci}


  end;

procedure Napis_hrace;
  begin
    writeln('Jmeno - Oddil - Goly - Nahravky');
    writeln('-------------------------------');
    reset (hraci);
    while not eof(hraci) do
      begin
        with hrac do
          begin
             read(hraci,hrac);
             with hrac do
                writeln(jmeno,' - ',oddil,' - ',goly,' - ',nahravky);
          end
      end;
    writeln('-------------------------------');
{tisk hlavičky tabulky údajů}

{otevření souboru hraci pro čtení}
{opakuje dokud není konec souboru}



{přečte údaje aktuálního hokejisty ze souboru}

{vytiskne tyto údaje}


{vytiskne patičku tabulky}
  end;

procedure Najdi_hrace;
  var hledam_jmeno:string[30];
         nenasel:boolean;
  begin
    writeln('Zadej jmeno hrace:');readln(hledam_jmeno);
    nenasel:=true;
    reset(hraci);
    while not(eof(hraci)) and nenasel do
      begin
        read(hraci,hrac);
        with hrac do
          if jmeno = hledam_jmeno then
            begin
              writeln(jmeno,' - ',oddil,' - ',goly,' - ',nahravky);
              nenasel:=false;
            end;
      end;
    if nenasel then writeln('Hrac ',hledam_jmeno,' nebyl nalezen.');
{zadání jména hledaného hokejisty}
{hokejista nebyl dosud nalezen}
{otevření souboru hraci ke čtení}
{opakuj dokud není konec souboru a nebyl nalezen}
{načti hokejistu hrac ze souboru hraci}

{porovnej jeho jméno s hladaným}

{je-li stejné,vytiskni údaje hokejisty}
{hokejista byl nalezen-není už hledán}


{pokud nebyl nalezen, vytiskne o tom zprávu}
  end;

Begin
{přiřazení souboru hraci souboru na disku C:/hokej.dta}
assign(hraci,'C:/hokej.dta');
 Repeat
   writeln('Program Hokej umožňuje:');
   writeln('1. Zadat údaje hokejistů');
   writeln('2. Napsat údaje hokejistů');
   writeln('3. Vyhledat údaje hokejisty');
   writeln('0. Ukončit');
   writeln('Zadejte svoji volbu:');
   readln(volba);
   case volba of
     1: Nacti_hrace;
     2: Napis_hrace;
     3: Najdi_hrace;
     0: writeln('Ukončit');
   end;
 until volba = 0;
{opakuj}


{nabídka činností}




{vvýběr činnosti}


{provedení zvolené činnost}





End.



Domácí úkol:

    Doplňte program Hokej o volby Opravit - umožňující aktualizovat údaje hokejisty a Přidat - umožňující přidat nového hokejistu k již zapsaným hokejistům.

On-line účast na řešení úkolu

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen jednou). Volbou Hodnocení si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy, Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.