15. príklady


Posledná zmena: 1.11.2002

Banner Text 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