Umíte pascalsky - 22.lekce ...

Umíte pascalsky?
22.lekce
Vytisknout  

Variantní záznam

Typ variantní záznam specifikuje několik variant téhož typu záznam.
Pevná část popisuje položky, které se vyskytují ve všech variantách (může chybět).
Variantní část obsahuje položky aktuálních variant, které se vybírajé pomocí tzv. rozlišovacích položek a rozlišovacích konstatnt.

Datový typ variantní záznam deklarujeme takto:

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

pevná část
case <rozlišovací pložka> : <typ rozlišovací položky> of
    <seznam rozlišovacích konstant1> : (<seznam položek1>);
    <seznam rozlišovacích konstant2> : (<seznam položek2>);
    ...
    <seznam rozlišovacích konstantn> : (<seznam položekn>);
variantní část
                             end;

Použití variantního záznamu si ukážeme na následujícím příkladě:

Příklad:
Navrhněte datovou strukturu pro katrotéku osob s položkami:
muž - příjmení, jméno, narození, pohlaví, váha, vous
žena - příjmení, jméno, narození, pohlaví, míry (prsa, pas, boky)

type TOsoba = record
prijmeni,jmeno: STRING[20];
narozen: STRING{10];

{pevná čás}
case pohlavi : boolean of
    true : (vaha: real; vous:boolean);
    false : (miry:array[1..3] of integer);
{variantní část}
{muž - true}
{žena - false]
                             end;
            TKartoteka = array[1..max] of TOsoba;

var osoba: TKartoteka;

Proměnná osoba[ktery]       obsahuje údaje příjmení, jméno a datum narození osoby s indexem ktery, a dálší údaje v závislosti podle pohlaví osoby (váha, vous nebo míry).

Příklad:
Napište proceduru Najdi_Ho pro nalezení nejtěžšího muže a nejštíhlejší ženu.
 
procedure Najdi_Ho(pocet:integer;Ten:TKartoteka);
  var ktery,tiha,pasek: integer;
         index_muz,index_zena:integer;
  begin
    tiha:=0; pasek:=200;
    for ktery:=1 to pocet do
        with Ten[ktery] do
          case pohlavi of
             true: if vaha>tiha then
                         begin
                             index_muz:=ktery; tiha:=vaha;
                         end;
             false: if miry[2]<pasek then
                         begin
                             index_zena:=ktery; pasek:=miry[2];
                         end;
           end
         end
    writeln('Nejtěžšší muž se jmenuje ',Ten[index_muz],' a váží ',tiha:4:1,' kg.');
    writeln('Nejštíhlejší žena se jmenuje ',Ten[index_zena],' a měří ',pasek:4:1,' cm.');

{opakuj pro všechny žáky}


{podle pohlaví testuj váhu nebo pas}



{index je třeba uložit pro tisk výsledku}





{tisk dat nalezeného žáka}


  end;



Domácí úkol:

    Sestavte program Moje_Trida, který umožňuje podle volby uživatele:
1. zadat údaje žáků třídy: chlapec - příjmení, jméno, narození, pohlaví, váha, vous ; dívka - příjmení, jméno, narození, pohlaví, míry (prsa, pas, boky)
2. vypsat všechny chlapce s vousy
3. vypsat všechny boubelky (boky přes 80 cm)
4. najít nejtěžšího chlapce
5. najít nejštíhlejší (v pase) děvče.

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.