Umíte pascalsky - 14.lekce ...

Umíte pascalsky?
14.lekce
Vytisknout  

Programátorem definované typy

Datový typ je definován stanovením množiny hodnot daného typu, stanovením množiny přípustných operací a přiřazením jména daného typu.
Dosud jsme se seznámili s tzv. standardními jednoduchými typy - integer, real, char a Boolean. Programátor si ale také může definovat vlastní typy.

Výčtový typ má zadanou množinu hodnot explicitním vyjmenováním těchto hodnot.

Například při zpracování osobních dotazníků potřebujeme do proměnné stav uložit rodinný stav. Definujeme nový typ TStav a potom již můžeme deklarovat proměnnou stav typu TStav:

type TStav =(svobodny,zenaty,rozvedeny,vdovec);
var stav : TStav;

Výčtový typ je ordinální typ a jsou pro něj definovány relační operace a standardní funkce ord, succ a pred. Žádné další operace nejsou definovány - nelze požít pro načítání příkazu read a výstup write. Je třeba si pro vstup a výstup napsat procedury.

Interval má zadanou množinu hodnot jako interval hodnot už definovaného typu.

Chceme-li pracovat s proměnnou mesic,nota v obvyklém významu, definujeme nejprve typy TDen, TNota a potom deklarujeme proměnné mesic a nota:

type TMesic = 1..12;     (přesně dvě tečky)
         TNota = "'c'..'h'";
var mesic: TMesic:
       nota:TNota;

S proměnnou typu interval je již práce pohodlnější (než s proměnnou typu výčet), protože jsou pro ni definovány tytéž oprace jako pro hostitelský typ - typ z kterého byl interval vybrán. V našem příkladě jako pro typ integer u typu TDen a jako pro typ char a typu TNota.

Strukturované datové typy

Datovým jednotkám vytvořeným z více položek říkáme strukturovaná data. Jednotlivým položkám říkáme složky (prvky) strukturovaných dat. Každá složka má svůj vlastní typ a existují operace na zpřístupnění složek.

Podle typu a počtu složek můžeme rozdělit strukturované datové typy:
- pole
- záznam
- množina
- soubor
- objekt

Pole

Pole je homogenní datová struktura skládající se ze složek stejného typu, které se vzájemně rozlišují pomocí indexu.

Datový typ pole deklarujeme takto:

type <název> = array [typ indexu] of <typ složek>

Tedy například:
type TVektor = array[1..3] of integer;
          TKod = array[a..z] of char;

Proměnné těchto typů deklarujeme běžným způsobem :

var vektor, vektor_new : TVektor;
       kod: TKod;

S každou proměnnou typu pole můžeme pracovat buď jako s celkem nebo s její složkou.
Napíšeme-li někde v programu

vektor .... představuje všechny tři souřadnice vektoru, která jsou celá čísla
vektor[2] .... představuje druhou souřadnici (složku) vektoru a nazývá se indexovaná proměnná

Zpřístupnění složek proměnné typu pole provádíme pomocí indexu.

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

Například:
vektor[1]:=5 ; vektor[2]:=0 ; vektor[3]:=-2;

nebo najednou celé proměnné:

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

Příklady:

Příklad1:
Vstupovat bude 10 celých čísel. Sestavte program Maximum_na_konec pro vytvoření posloupnosti, která vznikne z původní posloupnosti tak. že poslední hodnota bude vyměněna s maximální hodnotou.

Tedy například:
poslopnost
V tomto příkladě budeme potřebovat proměnnou Cisla typu pole pro uložení všech čísel, protože zadaná čísla se budou procházet dvakrát. Poprvé při hledání maxima a podruhé při výměně maxima s posledním číslem.

Myšlenka (hrubý algoritmus):
< přečti zadaná čísla a ulož do pole Cisla >         - Nacti_Pole
< najdi maximální prvek v poli Cisla >         - Najdi_Maximum
< vyměň maximální prvek s posledním prvkem pole Cisla >         - Vymena
< napiš prvky pole Cisla >         - Tisk_Pole

Program Maximum_na_konec může vypadat takto:

program Maximum_na_konec;
  type TPole = array[1..10] of integer;
  var Cisla : TPole; maximum,posice :integer;
{typ pole o 10 celočíselných složkách} {Deklarace proměnné typu pole}
 
 procedure Nacti_Pole;
  var kolik : integer;
  begin
  for kolik:=1 to 10 do
    begin
        writeln('Zadejte ',kolik,'. celé číslo:');
{načtení čísel a uložení do pole Cisla}


         readln(Cisla[kolik]); {postupné načítání složek pole}
    end
  end;

 procedure Najdi_Maximum;
  var kolik : integer;
  begin
    maximum:=Cisla[1];
    posice:=1;
    for kolik:=2 to 10 do
{nalezení maximálního čísla}

      if Cisla[kolik]>maximum then
        begin
            maximum:=Cisla[kolik];
            posice:=kolik;
        end;

{porovnává a větší ukládá do Maxima} {ukládá posici maxima pro výměnu}
  end;

 procedure Vymena;
  begin
{nalezení maximálního čísla}

    Cisla[posice] := Cisla[10];
    Cisla[10] := maximum;
{na posici maxima dá 10. číslo}
{na poslední místo dá maximaum}
  end;

 procedure Tisk_Pole;
  var kolik : integer;
  begin
  writeln('Výsledná posloupnost čísel je: ');
  for kolik:=1 to 10 do
{tisk výsledné posloupnosti čísel}


     write(Cisla[kolik],' '); {postupný tisk složek pole}
  end;

Begin

{Hlavní program}
  Nacti_Pole;
  Najdi_Maximum;   
  Vymena;
  Tisk_Pole;   
{Načte pole}
{Najde maximum}
{Vymění s poslední složkou}
{Vytiskne pole}
End.


Příklad2:
Vstupovat bude zadaný počet celých čísel. Sestavte program Minimum_na_zacatek pro vytvoření posloupnosti, která vznikne z původní posloupnosti tak. že první hodnota bude vyměněna s minimální hodnotou.


Domácí úkol:

     Vstupovat bude zadaný počet celých čísel. Sestavte program Minimum_bublej_zacatek pro vytvoření posloupnosti, která vznikne z původní posloupnosti tak. že minimální hodnotou se postupnými výměnami sousedních čísel dostane na první místo.

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.