Dnes si povieme niečo o rozsahu číselných premenných. Ukážeme si tiež niektoré užitočné funkcie, ktoré sme doteraz nespomínali. Slúžia na prácu s celými a desatinnými číslami.
Každé celé číslo má určitý rozsah hodnôt, ktoré môže nadobúdať. Tu je prehľad celočíselných typov a ich rozsahov (platí pre 32-bitový Free Pascal):
Typ | Rozsah (vrátane) |
---|---|
Byte |
0 .. 255 |
ShortInt |
-128 .. 127 |
Word |
0 .. 65 535 |
SmallInt |
-32 768 .. 32 767 |
LongWord |
0 .. 4 294 967 295 |
LongInt (integer) |
-4 294 967 296 .. 4 294 967 295 |
QWord |
0 .. 264-1 |
Int64 |
-263 .. 263-1 |
Vždy by sme mali použiť ten najmenší z číselných typov, ktorý dokáže uchovať všetky potrebné hodnoty. Napríklad, ak chceme do premennej uložiť číslo hodené na kocke, použijeme typ Byte
. Ak máme v pláne použiť premennú ako počítadlo uplynutých mikrosekúnd, pravdepodobne zvolíme typ QWord
.
Na rozdiel od celých čísel, desatinné čísla majú zvyčajne veľký rozsah, ale obmedzenú presnosť. Rozsah bežne používaného typu Real
závisí od platformy. Tieto typy čísel majú „plávajúcu“ desatinnú čiarku (presnosť závisí od veľkosti čísla): Single
, Double
, Comp
, Extended
(zoradené od najmenej presných po najpresnejšie). Typ Currency
má pevnú desatinnú čiarku - uchová vždy štyri desatinné čísla.
Miesto desatinnej čiarky používame bodku.
Ak vypíšeme desatinné číslo bežným spôsobom, pravdepodobne sa vypíše v tzv. vedeckej notácii. Preto použijeme špeciálne formátovacie parametre, ktoré majú nasledujúci tvar:
writeln(Cislo:PocetZnakov:Desatinne);
Cislo
je číslo, ktoré chceme vypísať. PocetZnakov
je minimálny počet znakov, ktoré sa vypíšu. Zvyšok sa vyplní medzerami - používa sa to na zarovnávanie. Desatinne
je počet desatinných číslic. Príklad
writeln('Cislo:', 1.507:10:2);
vypíše:
Cislo: 1.51
Ak potrebujeme určiť iba počet desatinných miest, ktoré sa majú vypísať, môžeme ako prostredný parameter použiť nulu.
writeln('Prem = ', prem:0:4);
Čo sa stane, ak premennej priradíme hodnotu, ktorá je mimo jej rozsahu? Ukážeme si to na príklade. Toto je kód jednoduchého bezchybného programu:
program rozsah; var cislo: byte; begin cislo := 255; writeln(cislo); end.
Teraz kód upravíme. Skúsime zvýšiť hodnotu premennej cislo o 1.
cislo := 255; Inc(cislo); // ako cislo := cislo + 1 writeln(cislo);
Ak sme nemenili nastavenia Free Pascalu, po spustení programu dostaneme správu o chybe. Premenná cislo je typu byte
a preto nemôže nadobudnúť hodnotu 256.
Skúsime však vypnúť kontrolu takýchto chýb (Range checking). Najjednoduchšie direktívou {$R-}
priamo v zdrojovom kóde:
cislo := 255; {$R-} // vypneme kontrolu chyb Inc(cislo); writeln(cislo);
Program prekvapivo nevypíše ani číslo 256, ani chybovú hlášku, ale vypíše:
0
Z čísla 255 sa pričítaním jednotky stala nula. Je to typický príklad javu nazývaného „pretečenie“ - hodnota akoby pretiekla z najvyššej hodnoty späť na najnižšiu. Pretečeniu by sme sa mali vyhýbať, ale sú aj prípady, keď je užitočné.
Pri rôznych výpočtoch sa nám určite zídu bežné matematické funckie. Niektoré môžeme používať ihneď, kvôli iným je nutné pridať jednotku math
do sekcie uses
.
Funkcia abs
vráti absolútnu hodnotu čísla zadaného ako parameter. Sqrt
je odmocnina.
Max
vráti väčší z dvoch zadaných číselných parametrov, Min
ten menší.
Trunc
vráti celočíselnú časť desatinného čísla, Frac
zas desatinnú. Round
zaokrúhli číslo bežným spôsobom.
Význam funkcií sin
, cos
, tan
a cotan
určite nemusím vysvetľovať. Len dodám, že parameter je vždy v radiánoch (nie v stupňoch). Funkcia Pi
(bez parametra) vráti hodnotu Ludolfovho čísla.
S použitím niektorej zo spomenutých funkcií skúsme vytvoriť program, ktorý zistí vzdialenosť dvoch desatinných čísel na číselnej osi. Čísla získame prečítaním z klávesnice.
Riešenie je v súbore vzdial.pas