Vissza a főoldalra
Segédanyag az 1. gyakorlathoz
Tartalom:
Alap adattípusok:
Előjeles egész:
név | méret (Windowsban) |
SHORT_SHORT_INTEGER | 1 byte |
SHORT_INTEGER | 2 byte |
INTEGER | 4 byte |
LONG_INTEGER | 4 byte |
LONG_LONG_INTEGER | 8 byte |
NATURAL | 0..INTEGER'LAST |
POSITIVE | 1..INTEGER'LAST |
A méret architektúránként és operációs rendszerenként változhat. A kikötés csak annyi, hogy pl. az INTEGER mérete leglább akkora kell hogy legyen mint a SHORT_INTEGER, és így tovább. Az INTEGER mérete általában akkora, hogy azt az adott rendszeren kényelmesen lehessen kezelni. (pl. egy 32 bites rendszeren 4 byte)
Karakter típus:
CHARACTER
Logikai típus:
BOOLEAN
Lebegőpontos típus:
FLOAT
Felhasználó által elkészített adattípusok:
Felsorolásos típus:
TYPE <azonosító>
IS (<érték1>,<érték2>,<érték3>,...,<értékn>);
Megszorításos típus:
TYPE <azonosító>
IS NEW <alaptípus> [
RANGE <n..m>];
Örökli a szülő típus típusmüveleteit, struktúráját stb.
pl.:
TYPE napok
IS NEW integer
RANGE 1..31;
Altípus:
SUBTYPE <azonosító>
IS <alaptípus> [
RANGE <n..m>];
pl.:
TYPE napok2
IS integer
RANGE 1..31;
A két típus között lényeges különbség van. A napok új típus, így egy napok típusú változónak nem lehet értékül adni egy integer típusút (még akkor sem, ha annak az értéke 1 és 31 között lenne), ezzel szemben a napok2-nek már lehet, hiszen az nem új típus, hanem csak az integer típusnak egy altípusa.
Az eddig ismertetett típusokat DISZKRÉT típusoknak nevezzük
Saját lebegőpontos típusok
TYPE <azonosító>
IS [
NEW FLOAT]
DIGITS <n>
A n tizedesjegyig pontos lebegőpontos típus
TYPE <azonosító>
IS DELTA <lépésköz>
RANGE <intervallum>
Olyan lebegőpontos típus, ami az intervallumban megadott tartományon van értelmezve, és a lépésközben megadott pontosséggal követik egymást a számok.
Attribútumok:
Az attribútumok az adott típusokhoz tartozó típusműveletek. Ezek segítségével információkat tudunk kérni a típusról, valamint típusspecifikus műveleteket hajthatunk végre. A diszkrét típusok attribútumai a következők: (T egy tetszőleges diszkrét típus)
T'First | típusértékhalmaz alsó határa |
T'Last | típusértékhalmaz felső határa |
T'Range | First..Last intervallumot adja vissza |
T'Min(a,b) | a és b közül a kiesbbiket adja vissza |
T'Max(a,b) | a és b közül a nagyobbikat adja vissza |
T'Succ(a) | az a érték rákövetkezője pl. integer esetén a+1, felsorolásos típus esetén mondjuk a hét napjai a típusértékek halmaza, akkor a=hétfő esetén kedd, a=vasárnap esetén pedig hiba |
T'Pred(a) | az a érték megelőzője |
T'Image(a) | az a-t stringgé konvertálja |
T'Value(s) | az s stringből T típusú értéket konvertál |
T'Width(a) | a T'Image által visszaadott string maximális hossza. pl. SHORT_SHORT_INTEGER'WIDTH = 4 (3 számjegy és egy előjel) |
példák az attribútumok használatára:
TYPE hetnap
IS (hetfo, kedd, szerda, csutortok, pentek, szombat, vasarnap);
s1, s2 : STRING;
h1 : NATURAL;
i : INTEGER :=
42;
nap : hetnap := hetfo;
nap2 : hatnap;
s2 := INTEGER'IMAGE(i);
i := INTEGER'SUCC(i);
i := INTEGER'MAX(
13,
54);
i := INTEGER'VALUE(s1(
1..h1));
nap2 := hetnap'SUCC(nap);
nap2 := hetnap'SUCC(kedd);
nap2 := hetnap'PRED(hetfo);
Műveletek precedenciája
A legnagyobb precedenciájú van legfelül
- **; abs; not
- *; /; mod; rem
- +; - (egyoperandusú)
- +; -; & (kétoperandusú)
- =; /=; <; <=; >; >=; in; not in
- and; or; xor; and then; or else;
Operátorok jelentése:
** | hatványozás pl.: 2**5 = 32 |
abs | abszolút érték pl. abs(-2) = 2 |
not | logikai tagadás |
* | szorzás |
/ | osztás, egész operandusok esetében egészrészes osztás |
mod | moduló képzés (mint a matekban) |
rem | maradék képzés példa a táblázat után |
- | ellentett vagy kivonás |
+ | összeadás |
& | string konkatenáció |
= | egyenlőség vizsgálat |
/= | nem egyenlő |
< | kisebb |
<= | kisebb egyenlő |
> | nagyobb |
>= | nagyob egyenlő |
in | bal operandus egy érték, ajobb pedig egy intervallum, igaz, ha az érték benne van az intervallumban; pl. -1 in -5..10 igaz; -1 in POSITIVE'RANGE hamis |
not in | az in tagadása |
and | logikai és (mindig kiértékali a két operandusát) |
or | logikai vagy (mindig kiértékali a két operandusát) |
xor | logikai kizáró vagy |
and then | logikai és (csak akkor értékeli ki a második operandusát, ha az első igaz) |
or else | logikai vagy (csak akkor értékeli ki a második operandusát, ha az első hamis) |
| mod | rem |
12/5 | 2 | 2 |
-12/5 | 3 | -2 |
15/-5 | -3 | 2 |
ezek már nem operátorok
:= | értékadás |
-- | magyarázó szöveg, a sor végéig hat |
Vezérlési szerkezetek
Elágazás:
IF <feltétel
1>
THEN
<utasítások>
[
ELSIF <feltétel
2>
THEN
<utasítások>
[
ELSIF <feltétel
3>
THEN
<utasítások>
.
.
.
[
ELSIF <feltétel n>
THEN
<utasítások>
]]...]
[
ELSE
<utasítások>
]
END IF;
CASE <diszkrét kifejezés>
IS
WHEN <érték
1> =>
<utasítások>
[
WHEN <érték
2> =>
<utasítások>]
.
.
.
[
WHEN <érték n> =>
<utasítások>]
[
WHEN OTHERS =>
<utasítások>]
END CASE;
érték lehet pl. 1 vagy 1|2|8 vagy 1|3..8;
de fontos, hogy vagy others ágat kell használni, vagy az értékekkel az egész típusértékhalmazt le kell fedni
Ciklus:
Előltesztelő:
WHILE <feltétel>
LOOP
<utasítások>
END LOOP;
Növekményes
FOR <változó> [
REVERSE]
IN <intervallum>
LOOP
<utasítások>
END LOOP;
A változót nem kell előre deklarálni, REVERSE beírásával visszafele halad az intervallumon
Végtelen
LOOP
<utasítások>
END LOOP;
Trükkös hátultesztelős
Az adában nincs valódi hátultesztelős ciklus. Ha mégis szeretnénk ilyet használni, az alábbi trükköt alkalmazzuk
LOOP
<utasítások>
EXIT WHEN <feltétel>;
END LOOP;
Az EXIT utasítás hatására a vezérlés a ciklus után folytatódik, ha a WHEN utáni kifejezés igaz. Az EXIT-et bármelyik fajta ciklusmagban is használhatjuk. A WHEN kulcsszó elhagyható, hatása a WHEN TRUE-val ekvivalens.
Blokkok
DECLARE
<deklarációs rész>
BEGIN
<utasítások>
END;
A Blokkok egymásba ágyazhatóak
Hello World program
with ada.text_io;
use ada.text_io;
procedure main
is
begin
put_line(
"HELLO WORLD");
end main;
Példaprogramok
Vissza a főoldalra