Umíte pascalsky - 21.lekce ...

Umíte pascalsky?
21.lekce
Vytisknout  

Datový typ záznam (record)

Velmi často potřebujeme do proměnné uložit údaje různé povahy. Např. při zpracování výsledků sportovních závodů budeme u závodníka sledovat jméno řetězec) , startovní číslo a čas (číslo) případně další data. To nám pole neumožní, ale záznam ano.

Záznam (record) je nehomogenní datová struktura skládající se z určitého počtu pojmenovaných složek, které mohou být různého typu a nazýváme je položkami záznamu.

Datový typ záznam deklarujeme takto:

type <název> = record
                                 selektor_1: typ_1;
                                 selektor_2: typ_2;
                                 ...
                                 selektor_n: typ_n;
                            end;

Tedy například typ proměnné pro uložení dat o závodníkovi bychom mohli deklarovat následovně:

type TZavodnik = record
                                     cislo: 1..100;
                                     jmeno: string[30];
                                     cas: real;
                                end;

Proměnou typu záznam deklarujeme běžným způsobem :

var Zavodnik, Ten_zavodnik : TZavodnik;

S každou proměnnou typu záznam můžeme pracovat buď jako s celkem nebo s její položkou.

V proměnné Zavodnik ... jsou uloženy všechny položky závodníka (číslo, jméno, čas)

Pokud chceme pracovat pouze s určitou položkou (složkou) záznamu, píšeme název položky (selektoru) za název proměnné a oddělujeme tečkou.

Zavodnik.cislo ... startovní číslo závodníka
Zavodnik.jmeno ... jméno závodníka
Zavodnik.cas ... čas závodníka

Hodnoty proměnných typu záznam se definují a mění buď
a) postupně tak, že se přiřazují hodnoty jednotlivým položkám (složkám):

Například:
Zavodnik.cislo:=5;
Zavodnik.jmeno:='Novák';
Zavodnik.cas:=10,5;

nebo najednou celé proměnné:

Ten_zavodnik:=Zavodnik;
pokud jsou proměnné Zavodnik a Ten_zavodnik téhož typu (deklarovaná ve stejné deklaraci) a proměnná Zavodnik je již definovaná.

Proměnných typu záznam lze použít jako parametrů procedur a funkcí.

Příklad:
Sestavte program Zavody pro vyhodnocení sportovnich závodů. Vstupovat bude trojice tvaru startovní číslo, jméno a dosažený čas. Po každém vstupu (číslo, jméno, čas) se napíše tabulka se záhlavím:

pořadí       start.číslo       jméno       čas
-----------------------------------------------------

kde jsou závodníci uspořádáni podle dosažených časů.

Údaje o jednom závodníkovi budeme ukládat do proměnné typu TZavodnik (jak jsme již vysvětlili na začátku lekce). Tyto jednotlivé závodníky potom budeme ukládat do proměnné typu TZavodnici, což bude pole o složkách typu TZavodnik. Typ TZavodnici deklarujeme tedy takto:

type TZavodnici = array[1..100] of TZavodnik;

A uvedenou proměnnou pro údaje všech závodníků deklarujeme:

var Zavodnici : TZavodnici;

Připomeńme si ještě význam jednotlivých složek strukturované proměnné Zavodnici:

proměnné Zavodnici ................... představuje všechny údaje o všech závodnících
složka Zavodnici[ktery] ............... všechny údaje jednoho závodníka s indexem ktery
složka Zavodnici[ktery].cislo ..... startovní číslo jednoho závodníka s indexem ktery

Abychom nemuseli při práci s položkami záznamu Zavodnik psát Zavodnik.cislo, Zavodnik.jmeno, Zavodnik.cas, můžeme použít zkráceného zápisu pomocí příkazu with, který má tvar:

with <záznam> do <příkaz>

Uvnitř příkazu můžeme označovat položky proměnné typu záznam pouze uvedením selektoru.
Tak například
with Zavodnici[Ktery] do
  begin
    cislo:=2;
    jmeno:='Novak';
    cas:=2,89;
  end

Tento příkaz zjednodušuje zápisy a urychluje zpracování záznamů, protože se přístup k proměnné typu záznam provádí pouze jednou.

A teď k programu. Situaci lze přiblížit obrázkem:

příklad

Kostru programu si opět zapíšeme.

Myšlenka (hrubý algoritmus):

<dokud nechceš skončit opakuj následující činnost
   - načti údaje závodníka
   - najdi místo (index Tam), kam se má Ktery závodník zařadit (vsunout) podle času
   - posuň následující závodníky o jedno místo dozadu
   - vlož závodníka Ktery na místo Tam
   - napiš tabulku závodníků>

Jedná se tedy o modifikaci algoritmu InsertSort - zatřiďování podle času (bez vnějšího cyklu for - zatřiďujeme pouze jednoho, aktuálního závodníka).

Program Zavody může vypadat takto:

program Zavody;
  const Max = 100;
  type TZavodnik=record
               cislo:1..Max;
               jmeno:STRING[20];
               cas:real;
           end;
           TZavodnici=array[1..Max] of TZavodnik;
  var Zavodnik:TZavodnik;
         Zavodnici:TZavodnici;
         pocet,volba,ktery:integer;

{globální proměnné}
 
procedure Nacti_zavodnika(var Bezec:TZavodnik);
  begin
    with Bezec do
      begin
         writeln('Zadejte startovni cislo:');
         readln(cislo);
         writeln('Zadejte jmeno:');
         readln(jmeno);
         writeln('Zadejte cas:');
         readln(cas);
      end;



{zadání dat závodníka}


  end;

procedure Tisk_zavodniku(kolik:integer;Bezci:TZavodnici);
  var ktery : integer;
  begin
    writeln('Vysledkova listina:');
    writeln('por. cislo jmeno cas');
    for ktery:=1 to kolik do
       with Bezci[ktery] do
          writeln(ktery,'. ',cislo,' ',jmeno,' ',cas:5:2);


{tisk tabulky závodníků}

  end;

procedure Zarad_zavodnika(var kolik:integer;Bezec:TZavodnik;var Bezci:TZavodnici);
  var ktery,tam : integer;
      Pomoc : TZavodnik;
  begin
    if kolik=0
       then Bezci[1]:=Bezec;
       else
         begin
            tam:=1;
            while (Bezci[tam].cas < Bezec.cas) and (tam<=kolik) do
               tam:=tam+1;
            for ktery:=kolik downto tam do
               Bezci[ktery+1]:=Bezci[ktery];
            Bezci[tam]:=Bezec;
         end;
    kolik:=kolik+1;

{první závodník se jen uloží do pole}

{další závodnící se už zařazují}
{začne se od začátku}

{nalezení místa kam patří - tam}

{posunutí následujících o 1 dozadu}
{vložení aktual.závodníka}

{zvětšení počtu zařazených závodníků}
  end;

Begin

{Hlavní program}
pocet:=0;
 Repeat
   writeln('Program Razeni umožňuje:');
   writeln('1. Zadat zavodnika');
   writeln('0. Ukoncit');
   writeln('Zadejte svoji volbu:');
   readln(volba);
   case volba of
     1: begin
         Nacti_zavodnika(Zavodnik);
         Zarad_zavodnika(pocet,Zavodnik,Zavodnici);
         Tisk_zavodniku(pocet,Zavodnici);
       end;
     0: writeln('Ukoncit');
   end;
 until volba = 0;
{pocet-počet zařazených závodníků}
{opakuj}
{nabídka činností}






{vvýběr činnosti}
{provedení zvolené činnost}



End.



Domácí úkol:

    Sestavte program Trida, který umožňuje zadat údaje žáků třídy - jméno, příjmení, hmotnost a výšku a potom žáky seřadit podle příjmení, vyhledat žáka se zadanou výškou a zjistit průměrnou hmotnost žáků. Řešte užitím procedur s parametry.

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.