| Posledná zmena: 1.11.2002

triedy s dynamickým poľom

## tabuľka osôb

- trieda TTabOsoba, v ktorej budeme udržiavať databázu ľudí zoradených podľa veku - použijeme triedu TOsoba z predch. cvičení

trieda Osoba:
stavové premenné:

- meno, vek, adresa

metódy:

- inicializácia
- predstavenie sa
- zistenie, či daná osoba je alebo nie je mladíkom
- oslovenie

    type
      TOsoba = class
        meno:string;
        vek:byte;
        adresa:string;
        constructor Create(m,a:string; v:byte);
        function PredstavSa:string;
        function Mladik:boolean;
        function Oslovenie:string;
      end;

    constructor TOsoba.Create(m,a:string; v:byte);
    begin
      meno:=m; adresa:=a; vek:=v;
    end;

    function TOsoba.PredstavSa:string;
    begin
      Result:='Volám sa '+meno+', bývam v '+adresa+
              ' a mám '+IntToStr(vek)+' rokov';
    end;

    function TOsoba.Mladik:boolean;
    begin
      Result:=vek<=20;
    end;

    function TOsoba.Oslovenie:string;
    begin
      Result:='Vážený pán '+meno;
    end;

deklarácia triedy pre tabuľku osôb:
    type
      TTabOsoba = class
        t:array of TOsoba;
        constructor Create;
        procedure pridaj(m,a:string; v:byte);
        procedure vypis_mladikov(kam:TStrings);
      end;

    constructor TTabOsoba.Create;
    begin
      t:=nil;
    end;
pridať prvok do tabuľky:
pridávať na správne miesto tak, aby bola tabuľka stále utriedená podľa veku osôb |
    procedure TTabOsoba.pridaj(m,a:string; v:byte);
    var
      oo:TOsoba;
      i:integer;
    begin
      oo:=TOsoba.Create(m,a,v);
      SetLength(t,Length(t)+1);
      i:=High(t)-1;
      while (i>=0) and (t[i].vek>v) do begin
        t[i+1]:=t[i];
        dec(i);
      end;
      t[i+1]:=oo;
    end;
výpis len mladíkov:
nakoľko je tabuľka utriedená, stačí vypisovať postupne všetkých, kým sú mladíci - na prvom nie mladíkovi sa môže skončiť |
    procedure TTabOsoba.vypis_mladikov(kam:TStrings);
    var
      i:integer;
    begin
      i:=0;
      while (i<=High(t)) and t[i].mladik do begin
        kam.Add(t[i].meno);
        inc(i);
      end;
    end;
práca s triedou:
do inštancie triedy TTabOsoba načítajte informácie zo vstupu o jednotlivých ľuďoch a vypíšte všetkých mladíkov z tejto tabuľky |
    var
      tv:TTabOsoba;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Memo1.Clear;
      tv:=TTabOsoba.Create;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      v:integer;
    begin
      v:=StrToIntDef(Edit3.Text,0);
      if v<>0 then
        tv.pridaj(Edit1.Text,Edit2.Text,v);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Memo1.Clear;
      tv.vypis_mladikov(Memo1.Lines);
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    var
      i:integer;
    begin
      Memo1.Clear;
      with tv do
        for i:=0 to High(t) do
          t[i].PredstavSa(Memo1.Lines);
    end;

## Polynomy

trieda TPolynom:
polynóm reprezentujte dynamickým poľom koeficientov, pre neexistujúce mocniny je koef. 0 (koeficienty sú typu Integer) |
    type
      TPolynom = class
        koef:array of integer;
        constructor Create;
        procedure nacitaj(s:string);
        procedure vypis(kam:TStrings);
        procedure pricitaj(p:TPolynom);
      end;

    constructor TPolynom.Create;
    begin
      koef:=nil;
    end;
načítanie z reťazca:
v s sú koeficienty polynomu od najmenšej mocniny oddelené ' ' |
    procedure TPolynom.nacitaj(s:string);
    begin
      s:=s+' '; koef:=nil;
      while s<>'' do begin
        SetLength(koef,Length(koef)+1);
        koef[High(koef)]:=StrToInt(copy(s,1,pos(' ',s)-1));
        delete(s,1,pos(' ',s));
      end;
    end;
výpis polynomu do jedného riadka Memo
    procedure TPolynom.vypis(kam:TStrings);
    var
      i:longint;
      s:string;
    begin
      i:=high(koef); s:='';
      while i>=0 do begin
        if koef[i]<>0 then begin
          if i<>high(koef) then s:=s + ' + ';
          s:=s+IntToStr(koef[i]);
          if i>0 then s:=s + 'x^' + IntToStr(i);
        end;
        dec(i);
      end;
      kam.add(s);
    end;
súčet dvoch polynomov
    procedure TPolynom.pricitaj(p:TPolynom);
    var
      i:integer;
    begin
      for i:=0 to High(p.koef) do begin
        if i>High(koef) then begin
          SetLength(koef,Length(koef)+1);
          koef[i]:=0;
        end;
        inc(koef[i],p.koef[i]);
      end;
    end;

### Ďalšie úlohy

- polynóm reprezentujte dyn. poľom rekordov (koeficient a stupeň), ktoré bude obsahovať len členy s nenulovým koeficientom usporiadané podľa stupňa

- zadefinujte najprv triedu TClen (koeficient, stupeň a metódy na inicializáciu a vypísanie) a TPolynom potom bude obsahovat dynamické pole TClenov

- zadefinujte triedu TVektor pomocou dynamického poľa pre ľubovoľne -árne vektory. Ak budeme chcieť napr. sčítať dva vektory rôznej árnosti, tak sa buď vyhlási chyba, alebo sa ten kratší doplní nulami...

© 2002 AB, KVI
blaho@fmph.uniba.sk