13. príklady


Posledná zmena: 8.10.2002

Banner Text objekty

Objekty

trieda Veľké číslo

zadefinujte triedu TVelkeCislo - ktorá bude realizovať veľaciferné (napr. 1000) celé čísla aj s aritmetikou:

  • pole bajtov
  • metódy na priradenie, pričítanie, násobenie celým číslom
  • výpis - vráti reťazec

najprv riešte bez stavovej premennej p - počet platných cifier, t.j. pracujte so všetkými ciframi od 1 do max

const
  max = 1000;    // maximálny počet cifier

type
  TVelkeCislo = class
    c:array[1..max] of 0..9;
    p:0..max;                // počet platných cifier
    constructor Create;
    procedure prirad(x:integer);
    procedure priradStr(x:string);
    procedure pricitaj(x:integer);
    procedure nasob(x:integer);
    function vypis:string;
  end;

konštruktor

 

constructor TVelkeCislo.Create;
var
  i:integer;
begin
  p:=0;
  for i:=1 to max do c[i]:=0;
end;

priradí celé číslo

rozoberie celé číslo na cifry

 

priradenie iného veľkého čísla VC by mohlo vyzerať nasledovne:

...priradVC(x:TVelkeCislo);
begin
  p:=x.p; c:=x.c;
end;
procedure TVelkeCislo.prirad(x:integer);
begin
  p:=0;
  repeat
    inc(p);
    c[p]:=x mod 10;
    x:=x div 10;
  until x = 0;
end;

procedure TVelkeCislo.priradStr(x:string);
begin
  p:=0;
  while x<>'' do begin
    inc(p);
    c[p]:=ord(x[Length(x)])-48;
    SetLength(x,Length(x)-1);
  end;
end;

súčet a súčin

 

najprv zjednodušená verzia bez p - počtu platných cifier:

...pricitaj(x:integer);
var
  i:integer;
begin
  for i:=1 to max do begin
    x:=c[i]+x;
    c[i]:=x mod 10;
    x:=x div 10;
  end;
end;
procedure TVelkeCislo.pricitaj(x:integer);
var
  i:integer;
begin
  i:=1;
  while (x<>0) and (i<=max) do begin
    if i>p then begin
      p:=i; c[i]:=0;
    end;
    x:=c[i]+x;
    c[i]:=x mod 10;
    x:=x div 10;
    inc(i);
  end;
end;

procedure TVelkeCislo.nasob(x:integer);
var
  i,suc,prenos:integer;
begin
  i:=1; prenos:=0;
  while ((prenos<>0)or(i<=p)) and (i<=max) do begin
    if i>p then begin
      p:=i; c[i]:=0;
    end;
    suc:=c[i]*x+prenos;
    c[i]:=suc mod 10;
    prenos:=suc div 10;
    inc(i);
  end;
end;

prevod na reťazec

 

function TVelkeCislo.vypis:string;
var
  i:integer;
begin
  Result:='';
  for i:=p downto 1 do
    Result:=Result+chr(c[i]+ord('0'));
end;

faktoriál

 

var
  f:TVelkeCislo;
  i:integer;
begin
  f:=TVelkeCislo.Create;
  f.prirad(1);
  for i:=1 to 100 do begin
    f.nasob(i);
    Memo1.Lines.Add(IntToStr(i)+'! = '+f.vypis);
  end;
  f.Free;
end;

Ďalšie úlohy

  • dopíšte metódu na pričítanie veľkého čísla a pomocou nej vypočítajte niektoré veľké fibonacciho číslo
  • navrhnite aritmetiku pre prácu s racionálnými číslami - do veľkých čísel aj desatinnú časť a vypočítajte na nejakú presnosť e (základ prirodzených logaritmov) a pi
  • zadefinujte triedy na prácu s vektormi a s komplexnými čislami

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;

potomok triedy TOsoba

trieda TOsobaP:

  • s novou stavovou premennou pohlavie
  • s novou metódou Oslovenie (predkova metóda bola v mužskom rode)
  • funkcia mladik - ak je to žena, tak sa akceptuje vek do 30
type
  TOsobaP = class(TOsoba)
    pohlavie:boolean;      // true = žena
    constructor Create(const m,a:string; v:byte;
                       p:boolean);
    function Mladik:boolean;
    function Oslovenie:string;
  end;

constructor TOsobaP.Create(const m,a:string; v:byte;
                           p:boolean);
begin
  inherited Create(m,a,v);
  pohlavie:=p;
end;

function TOsobaP.Oslovenie:string;
begin
  if pohlavie then Result:='Vážená pani '+meno
  else Result:=inherited Oslovenie;
end;

function TOsobaP.Mladik:boolean;
begin
  Result:=(vek<=20) or pohlavie and (vek<=30);
end;

Ďalšie úlohy

  • predpokladajte, že v súbore zoznam.txt je pripravený zoznam ľudí, kotrým sa bude posielať list zo súboru list.txt - zoznam ľudí obsahuje tieto informácie: meno, vek, adresa a pohlavie; do listu bude treba pridať prvý riadok - adresu, druhý riadok oslovenie a ako posledný riadok buď "Ahoj", ak to bol mladík a inak "Dovidenia"; Program načíta oba súbory, vytvorí z nich pole osôb typu TOsobaP a pre každú osobu vytvorí list s danými doplnenými časťami (listy môžete vypísať do Memo)


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