|
Posledná zmena: 8.10.2002
|
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é:
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
|