Programozási elemek II:
Országok listája
Hungary
Nyíregyházi Főiskola
Természettudományi Főiskolai Kar
Programozó matematikus
Záróvizsga
Programozási elemek II:
2009.02.01 19:29:20
Az alábbi szöveg egy formázás és képek nélküli előnézete a dokumentumnak. A tökéletes megjelenítéshez jelentkezz be, majd töltsd le a dokumentumot.
9. Programozási elemek II.
(alprogramok, rekurzió, fájlkezelés, mutatók)
Alprogramok:
Az alprogram olyan utasítások csoportja, amelyet a program bizonyos pontjairól aktivizálhatunk. Az alprogramokat a deklarációs részben kell megírnunk (procedure, function kulcsszavak után). Az alprogramok tartalmazhatnak újabb alprogramokat (egymásba ágyazás). Akkor írunk eljárást, vagy függvényt, ha:
- bizonyos tevékenység többször elQfordul a programunkban, vagy
- egy nagy programot tagolni, strukturálni szeretnénk.
Két fajtája van:
- eljárás (procedure): egy tevékenységcsoportot hajt végre, utasításszerqen hívjuk,
- függvény (function): feladata egy érték elQállítása, hívásakor neve operandusként egy kifejezésben szerepelhet
Felfoghatjuk az eljárások, függvények készítését, szerepét úgy is, hogy bizonyos részeket kiemelünk programunkból, külön eljárásként, függvényekként deklaráljuk Qket, majd a programban (fQprogramban) az eredeti helyükön meghívjuk új alprogramjainkat.
a. Eljárás
Az eljárás egy olyan alprogram, amely egy tevékenység sorozatot hajt végre. Saját eljárásainkat a program deklarációs részében kell elhelyeznünk, azaz deklarálnunk. Bár nem kötelezQen, de általában a változó deklarációk után következnek. Az eljárás szerkezete hasonló magának a programnak a szerkezetéhez. Három fQ részbQl áll:
eljárásfej
deklarációs rész
végrehajtó rész.
Az eljárásfej a procedure kulcsszóval kezdQdik, majd ezt követi az eljárás neve (azonosítója), és végül a paraméterek. Hasonlóan az egész programhoz, a végrehajtó részt a begin end utasítás-zárójel fogja közre, de itt az end után pontosvesszQt kell tennünk. Az eljárásokat többször meghívtuk a programunkban.
b. Függvény
A függvényekre is érvényesek az eljárások esetén megtanultak, a következQ különbségekkel. A függvény feladata egy érték elQállítása. Ezt az értéket a függvény nevéhez rendeljük, a függvény törzsében kell szerepelni legalább egy értékadó utasításnak, amelyben a függvény neve a baloldalon áll. (Vigyázzunk, ha a jobboldalon szerepeltetjük a függvény nevét, akkor az már rekurziót jelent.)
A függvényt egy kifejezésben hívhatjuk meg, pl. egy értékadó utasítás jobboldalán. Szerkezete megegyezik az eljáráséval, azzal a különbséggel, hogy a function kulcsszó után deklaráljuk, és még meg kell határoznunk a visszatérési érték típusát is a formális paramétereket követQen egy kettQspont után.
Rekurzió:
Ha egy alprogram saját magát meghívja, akkor rekurzióról beszélünk. A rekurzió alkalmazásának egyik területe, amikor úgy oldunk meg egy problémát, hogy visszavezetjük egy egyszerqbb esetre, majd ezt addig folytatjuk, míg el nem jutunk a triviális esetig. A módszer a matematikai indukción alapszik.
A megoldás lépései:
1. Megkeressük azt a legegyszerqbb esetet, ahol a megoldás már magától értetQdQ - triviális eset. Ekkor áll le a rekurzív hívások sorozata.
2. Megvizsgáljuk, hogy ismételt egyszerqsítésekkel hogyan juthatunk el a triviális esethez. (Az általános esetet visszavezetjük az eggyel egyszerqbbre.)
Vegyük például a faktoriális kiszámítását (N! = 1*2*3*...*N):
- Triviális eset: 0! = 1
- Egyszerqsítés: N! = N*(N-1)!
Ezzel a problémát megoldottuk, már csak kódolnunk kell.
Bár a feladat kitqnQ példa a rekurzív algoritmusra, az iterációs (ciklussal történQ) megoldás jobb, mivel az ismételt függvényhívások idQigényesek.
Rekurzív az az eljárás vagy függvény, amely közvetve vagy közvetlenül önmagára hivatkozik. Rekurzív módon megadott függvénnyel a matematikában is találkozhatunk. Példa a faktoriális függvénye:
n! (olvasd: n faktoriális):=2·3·...·(n-1)·n, valamint 0!:=1
Ez a definíció rekurzív formára is átírható: INCLUDEPICTURE "http://www.sulinet.hu/inform/szakkor/jegyzet/szakkor/abra31.gif" \* MERGEFORMATINET
Így tehát az 5!-t visszavezetjük 5·4!-ra, vagyis 4!-ra, azt 3!-ra stb..., míg végül elérkezünk 0!-hoz, amit már nem vezetünk vissza. A legtöbb rekurzív utasítás tartalmaz egy leállási feltételt, ez akadályozza meg a végtelen rekurziót. A fenti függvény megvalósítása Pascalban:
Function Fakt(n:integer):integer;
Begin
if n=0 then Fakt:=1
else Fakt:=n*Fakt(n-1); {a rekurzív hívás}
End;
Látható, hogy a matematikai definíció szinte egy az egyben átírható volt Pascalra. Ennek az az oka, hogy a Pascal eljáráskezelése fel van készülve a rekurzióra: eljáráshíváskor a Pascal elmenti a verembe a globális, hívott eljárásban is szereplõ változókat, majd az eljárás lefutása után az eljárás lokális változói megszûnnek, és a verembõl elõkerülnek a globális változók. Ha végigkövetjük a függvény mûködését, kiderül, hogy voltaképpen az n·(n- 1)·...·2·1·1 szorzást végzi el, amit akár ciklussal is megoldhattunk volna. A ciklus elõnye a rekurzív megoldáshoz képest, hogy a veremigénye (és olykor az idõigénye is) kisebb. A rekurzív megoldások viszont sokszor érthetõbbek és áttekinthetõbbek.
Fájlkezelés:
A programok a bemeneti adataikat nem csak a billentyqzetrQl, hanem a háttértárolókon lévQ állományokból is kaphatják, valamint kimeneti adataikat a képernyQn történQ megjelenítés mellett állományokban is tárolhatják. A Pascal nyelvben három összetett típus és az ezekhez kapcsolódó szabványos eljárások és függvények valósítják meg az állományok kezelését.
a. Típusos állomány
Deklarálása: FILE OF alaptípus
Összetett típus, fizikailag egy lemezes állomány. Egyforma méretq elemekbQl (komponensekbQl) áll. Az elemek számának csak a lemez mérete szab határt. A típusos állományból való olvasás illetve az állományba való írás egysége a komponens. Az elemekhez a rendszer sorszámot rendel 0-tól kezdQdQen. Az elérés szekvenciálisa (Read, Write) vagy a komponensek sorszáma szerint direkt módon történhet (az állomány mutató mozgatásával).
Assign: A program mindig egy logikai állományt kezel, melyet hozzá kell rendelnünk egy fizikai állományhoz, majd használat elQtt meg kell nyitnunk.
A Rewrite eljárás létrehozza, és megnyitja a logikai fájlhoz rendelt fizikai állomány. Ha a fizikai fájl már létezett, akkor törli annak tartalmát.
A Reset eljárással egy már létezQ állományt nyithatunk meg. Ekkor az állománymutató a 0. komponensre áll. (Ezért ezt az eljárást használhatjuk egy nyitott állomány elejére való ugrásra is.)
Használat után a Close eljárással zárjuk le fájlunkat!
A típusos állományból a Read eljárás olvas be változókba adatokat. Ügyeljünk arra, hogy a változó típusa egyezzen meg a fájl alaptípusával! Beolvasás után az állomány mutató automatikusan a következQ komponensre lép (szekvenciális elérés).
Egy változó (vagy kifejezés) értékét a Write eljárással írhatjuk ki egy fájlba. Hasonlóan az olvasáshoz a változó típusának meg kell egyeznie a fájl elemeinek a típusával, valamint az eljárás után az állomány mutató továbblép.
Ha az állomány mutató a fájl végén (az utolsó elem mögött) áll, akkor az Eof függvény értéke True.
Az állomány mutató direkt pozicionálását a Seek eljárás valósítja meg.
A FilePos függvénnyel lekérdezhetjük az aktuális pozíciót, a FileSize függvény pedig az állomány elemeinek a számát (méretét) adja vissza.
Az I/O mqveletek során nagy a hibalehetQség (pl. a lemezegység, fájl nem elérhetQ). Az esetleges futási hibákat tudnunk kell kezelni, ha megbízhatóan mqködQ programot szeretnénk írni. Ha az I/O mqveletek ellenQrzése aktív (ez az alapértelmezés), akkor programunk futási hibával leáll egy I/O hiba esetén. Ezért I/O mqveletek ellenQrzését inaktívvá kell tennünk a {$I-} fordítási direktívával a kényes mqveletek esetén. A mqvelet után az esetleges hiba kódját az IOResult függvénnyel kérdezhetjük le.
A Truncate eljárással levághatjuk a fájl komponenseit az aktuális pozíciótól kezdQdQen. Lezárt állományokra használhatjuk a Rename valamint az Erase eljárásokat a fájlok átnevezésére, illetve törlésére. Pl.:
program tipusos1;
uses crt;
var f:file of word;
begin
clrscr;
assign(f,'szamok.dat'); megfeleltetés
rewrite(f); fájl megnyitása írásara (ha létezett, akkor felülírja)
write(f,45); a 45 érték kiírása a fájlba
close(f); a fájl bezárása
repeat until keypressed;
end.
program tipusos2;
uses crt;
var f:file of word;
szam:word;
begin
clrscr;
assign(f,'szamok.dat'); megfeleltetés
reset(f); fájl megnyitása olvasásra (a mutató a elsQ elemre mutat)
szam:=read(f); a szam változóba beolvassuk a soron következQ értéket
writeln(szam); majd kiíratjuk annak tartalmát a képernyQre
close(f); a fájl bezárása
repeat until keypressed;
end.
b. Szöveges állomány - Text
Deklarálása: TEXT
A Pascal programban szöveges állományként kezelhetjük az egyszerq ASCII szövegeket. (Például a .pas kiterjesztésq forrásprogramjainkat.) A szöveges állomány változó hosszúságú sorokból áll, melyeket a sorvégjel zár le (CR/LF). Az állományt az állományvégjel zárja(^Z).
Az Eoln illetve az Eof függvény értéke True, ha az aktuális pozíció egy sorvégjelen vagy az állomány végén áll.
A SeekEoln illetve a SeekEof függvények az állomány következQ TAB szóköz illetve TAB szóköz és sorvégjel karaktereit átugorva tájékoztatnak arról, hogy sorvégjelen illetve az állomány végén állunk-e.
A szöveges állományt csak szekvenciálisan érhetjük el. Az állomány csak olvasásra vagy csak írásra lehet megnyitni.
Az állományból olvasni a Read, ReadLn, illetve írni a Write, Writeln eljárásokkal tudunk. Ha az eljárásoknak a fájl azonosító paraméterét elhagyjuk, akkor az olvasás / írás az alapértelmezett input / output szöveges állományból / -ba történik, ami a billentyqzet illetve a monitor.
Szöveges állományból (azaz a billentyqzetrQl is) olvashatunk egész, valós, karakteres és String típusú változókba adatokat. Az állományba az elQbbi típusokon kívül még logikai értéket is kiírathatunk.
A fizikai állományhoz az Assign eljárással rendelhetünk egy Text típusú változót, azaz a logikai állományt.
A Rewrite eljárás csak írásra nyitja meg a szöveges állományt, ha nem létezett létrehozza, egyébként törli a tartalmát.
A Reset eljárással csak olvasásra nyithatunk meg egy már létezQ fájlt.
Az Append eljárás egy létezQ állományt nyit meg írásra, és az állománymutató a fájl végére állítja.
Az állományt a Close eljárással zárhatjuk be.
Az I/O mqveletek hibakódját az IOResult függvény adja vissza.
Lezárt állományokra használhatjuk aIV{}í [ ®
z
~
\
\ j xîø,B¦ÌÜ ä ð >åË¿·¢}u}g}\}u}\P\P\P\P\P\P\P\PhZ_h5OJQJ hZ_hOJQJhZ_h@\5OJQJ\ hj$ÁOJQJ hZ_h@\OJQJ3hã0,h6B*CJOJQJ\aJnH phO½tH (hã0,hCJOJPJQJaJnH tH h'ÊCJ aJ hh5CJ aJ 3hã0,h5B*CJOJQJ\aJnH ph6_tH 3hã0,hZ_5B*CJOJQJ\aJnH ph6_tH -IV
@
®
Ð
z
\
^
T V l þ 6XÆÞsóæÖÎÎÎÎÎÎÎÎÎί¯¯ÂÎÂ$
&
F
Æh-^-a$gdc
$Å^Åa$gdc $a$gdc$$d ¤È ¤a$gdã0,
$d ¤Èa$gdã0,
$7$8$H$a$gdc >ßë Xlîò
Ê-Ì-!!v!y!"±"²"¸"¹"Î"Ï"ï"##Ã%Ð%&
&& &P&R&Ö&Ø&è&ê&l(n(õéõÞõéõÄõéõéõ¼¸°¸°¸ªªªªª¸ÄÞÞÞÞÞx hZ_hu:_CJOJQJ^JaJ hZ_h@\OJQJ hÖ|%CJ aJ hÖ|%CJ OJQJ^JaJ
hÖ|%0JjhÖ|%UhÖ|% hOJQJ3hã0,h6B*CJOJQJ\aJnH phO½tH hZ_hu:_OJQJhZ_h5OJQJ hZ_hOJQJ*sXlÄî<ºð2¤Ì-§ ã z!" #Ã%Ð%l(n((óãÛÛÛÛÛÛÛÛÛÖÖÖÖÖÎãÛÂÂ
$¤ ¤a$gdc $a$gd-
ÛgdÖ|% $a$gdc$$d ¤È ¤a$gdã0,
$Å^Åa$gdcn(r((°(¾(À(Ò(V)X)h)j)))++++0,2,>,B,,-.-Z-\-`-n-p-~-.....¤.Æ.È.ò.0/00000 090:0R0V0W0íÛÐÂдЩЩЩЩЩС¡Ð©Ð¡ÐÐ}СÐÐ}ЩЩСÐÐ}СÐÐh!WÎh@\6OJQJh!WÎh@\5OJQJh!WÎh!WÎ5OJQJ h!WÎOJQJ hZ_hu:_OJQJhZ_h@\6OJQJ]hZ_h@\5OJQJ\ hZ_h@\OJQJ#hZ_h@\5CJOJQJ^JaJ#hZ_hu:_5CJOJQJ^JaJ1(Ö(2,\-.0:0V24s4»4G5Ú9z; ;´;Ü;è;ø;#
Û $a$gd-
ÛW0^022T2V2¤2®2°2¾2 44X4[4\4d4q4r4s44¢4£4ª4º4»4½4Ä4Å4Î4ø455 5F5G566>6@6667 7&7(7v7x777h8j888 99<9>9Ø9Ú9Þ9î9ð9þ9|:~::::Ò:Þ:ø:óèÝèÕèÉèóèÕèÉèóè¾ÕèÉèóèÕèÉè²èÉè²èÕèÝèÝèÝèÝèÝèÝèÝèÝèÝèÝèÝèÕèÉè²èÝèݾèÉèhƸh@\6OJQJ hZ_hcOJQJh!WÎh@\5OJQJ h!WÎOJQJ hZ_hu:_OJQJ hZ_h@\OJQJh!WÎh@\6OJQJFø:;;;.;H;p;x;z;;;À;Ø;<< <#
*>.>D>H>P> >®>Ä>È>Î>&?
h
4¼h%@Hh%@HOJQJ^Jh
4¼h%@HOJQJ^J hZ_h%@HOJQJ hZ_hu:_OJQJhƸh@\6OJQJ hZ_h@\OJQJh!WÎh@\5OJQJ:ª<Ã<È<É<Ü<æ<ú<
===@=&>°>&?\????Ò?ø?ììÙÙììììììììììììÍÁ¹ $a$gd-
Û
$¤ ¤a$gdc
$¤ ¤a$gd%@H$Ť ¤[$\$^Åa$gd%@H$¤ ¤[$\$^a$gd%@H?Ò?ì?ô?x@z@Ø@Ú@B BB"B:B@BBBRBôBöBúB
C C.C0CDCnCpC(DBDCDDD¸D¹DÒDÖDØDÞDïDôDöDýDþD EFF0F2F|F~FFFäFæF
G GPGRGÂGÄGÆGÈGøGHHíâÔâÉâÉâÁâµâµâ©âÁâµâµâ©âÉâÉÁâÁâµâµâµâµâ©âÉâÁâÉâÉâÁâÉâÉâÁÉâµâ hZ_hcOJQJh¨zh@\6OJQJh¨zh@\5OJQJ h¨zOJQJ hZ_hu:_OJQJhZ_h@\5OJQJ\ hZ_h@\OJQJ#hZ_h@\5CJOJQJ^JaJ>ø? BöBDD¹D2FÆGPHÉH JÞJ
ff(fvfüfððððððððððððððÝÊÊÊÊÊ·$¤ ¤[$\$^a$gd%@H$¤ ¤[$\$^a$gd
4¼$Ť ¤[$\$^Åa$gdc $¤ ¤[$\$a$gd-
ÛH
HOHPHRHYHZHaHÈHÉHËHÐHÑHØHJJJ JJ&J(J6JJJLJÜJÞJüJKKK:K
A Fluss és a SetTextBuf eljárásokkal az írás, olvasás során a rendszer által használt átmeneti tárolóhoz (pufferhez) férhetünk hozzá. Pl.:
program szoveges1;
uses crt;
var f:text;
begin
clrscr;
assign(f,'szoveg.txt'); megfeleltetés
rewrite(f); fájl megnyitása írásara (ha létezett, akkor felülírja)
write(f,'alma'); az alma szó kiírása a fájlba
write('körte'); a körte szó kiírása a képernyQre
close(f); a fájl bezárása
repeat until keypressed;
end.
program szoveges2;
uses crt;
var f:text;
szoveg:string;
begin
clrscr;
assign(f,'szoveg.txt'); megfeleltetés
reset(f); fájl megnyitása olvasásra (a mutató a elsQ elemre mutat)
szoveg:=read(f); a szöveg változóba beolvassuk a soron következQ
szót
writeln(szoveg); majd kiíratjuk annak tartalmát a képernyQre
close(f); a fájl bezárása
repeat until keypressed;
end.
c. Típusnélküli állomány
Deklarálása: FILE
Általában gyors adatmozgatás vagy ismeretlen állomány esetén használjuk. Hasonló a típusos állományhoz, de az elemeinek nem a típusa, hanem a hossza a lényeges. A komponensek hosszát a fájl megnyitásakor adhatjuk meg (Reset, Rewrite), az alapértelmezés 128 bájt. Az állomány írható, olvasható, az elérés szekvenciálisan (BlockRead, BlockWrite eljárásokkal) vagy az elemek sorszáma szerint direkt módon történhet.
További függvények, eljárások: Assign, Close, Eof, Erase, FilePos, FileSize, IOResult, Rename, Seek, Truncate
Pl.:
program nemtipizalt1;
var f:file;
begin
assign(f,'valami.rec'); megfeleltetés
rewrite(f, 1); fájl megnyitása írásara (ha létezett, akkor felülírja)
blockwrite(f, 42, 1024); a 42 érték kiírása a fájlba 1024 blokkba
close(f); a fájl bezárása
repeat until keypressed;
end.
program nemtipizalt2;
var f:file;
adat:integer;
begin
assign(f,'valami.rec'); megfeleltetés
reset(f); fájl megnyitása olvasásra (a mutató a elsQ elemre mutat)
blockread(f, szam, 1024); a szam változóba beolvassuk a
soron következQ szót
writeln(szam); majd kiíratjuk annak tartalmát a képernyQre
close(f); a fájl bezárása
repeat until keypressed;
end.
Mutatók:
a. Típusos mutató
Deklarálása: azonosító: ^alaptípus
A mutató egy memóriacímet (4 bájtos: szegmens, ofszet) tartalmaz, egy alaptípusú változóra mutat. A mutatóhoz futás közben rendelhetünk memóriacímet és így tárterületet (dinamikus adattárolás). A New eljárás a heap memóriában foglalt területet a mutatott változó számára, a Dispose eljárás pedig felszabadítja a lefoglalt területet. Így lehetQvé válik, hogy egy nagy helyfoglalású adatstruktúra számára csak akkor kössünk le memóriát, amikor használjuk a változót. A mutatót ráirányíthatjuk egy az alaptípusával megegyezQ típusú változóra a @ operátorral vagy az Addr függvénnyel. A Ptr függvénnyel a mutatónak egy tetszQleges memóriacímet adhatunk értékül. A negyedik lehetQség arra, hogy egy mutatóhoz egy memóriacímet rendeljünk: értékadó utasítás egy vele azonos alaptípusú mutatóval.
Hivatkozás a mutatott változóra: mutató-azonosító^
Mutató típusú konstans: Nil.
A Nil nem mutat sehová. (Pl. láncolt lista végének a jelzésére használhatjuk).
Mqveletek:
Címe: @
EgyenlQség vizsgálat: =, <>
További szabványos eljárások, függvények:
Eljárások: Mark, Release
Függvények: MaxAvail, MemAvail, Ofs, Seg
Láncolt listák:
A különbözQ típusú láncolt listák nagyon fontos adatszerkezetek a számítástechnikában. Az egyes adatelemek (rekordok) közötti csatolást mutatókkal valósíthatjuk meg, így a rekordnak van egy mutató típusú mezQje, melynek alaptípusa maga a rekord. Pl.:
type TTomb = array[1..1000]of real;
var t: TTomb; {A rendszer már a program idításakor lefoglal 6000 bájtot az
adatszegmensben}
pt: ^TTomb;{A rendszer a program idításakor csak 4 bájtot foglal le a mutató
számára}
begin
...
New(pt); {A heap-ben létrejön a mutatott változó}
... {Használhatom a pt által mutatott változót (pt^)}
Dispose(pt) {A terület felszabadul a heap-ben}
end.
b. Típusnélküli mutató - Pointer
Deklarálása: POINTER
Egy négy bájtos memóriacímet tartalmaz. A mutatott változónak nincs típusa. A típusnélküli mqveleteknél használjuk (pl. adatmozgatás). A GetMem eljárással foglalhatunk le egy megadott méretq területet a heap-ben a mutatónk számára. Ha a memóriaterületre már nincs szükségünk a FreeMem eljárással azt felszabadíthatjuk. A mutatót ráirányíthatjuk akármilyen címre vagy változóra a @ operátorral vagy az Addr függvénnyel. A Ptr függvénnyel a mutatónak egy tetszQleges memóriacímet adhatunk értékül. Egy mutató értékadó utasítással egy másik mutató címét is felveheti. A mutatott változóhoz rendelhetünk típust: típus(mutató-azonosító^).
Hivatkozás a mutatott változóra: mutató-azonosító^
Mutató típusú konstans: Nil.
Mqveletek:
Címe: @
EgyenlQség vizsgálat: =, <>
További szabványos függvények: MaxAvail, MemAvail, Ofs, Seg
Koko Pascal mutatók:
A mutató olyan speciális változó, mely más objektumok memóriacímét tartalmazza. Esetünkben helyfoglalása 4 bájt. Az elsQ 2 bájt az offszet, a 2. két bájt a szegmens címet tárolja. Az objektum bármi lehet, úgy egy változó, mint egy függvény címe. Mindkét nyelv lehetQséget biztosít az úgynevezett dinamikus memóriakezelésre, melynek segítségével optimális tárfelhasználást valósíthatunk meg. A dinamikus memóriakezelés a mutatók használatára épül. A lényeg, hogy futási idQben foglalhatunk memóriát, majd ha nincs többé szükségünk rá visszaadhatjuk azt az operációs rendszernek.
A Pascal mutatók:
A Pascal mutatót egyrészt a pointer típusnévvel, másrészt változónév: ^típus alakú típusleírás segítségével deklarálhatunk.
var
barmiremutato: pointer;
integerremutato: ^integer;
realramutato: ^real;
i: integer;
Az elsQ esetben pointer típusú mutatót hoztunk létre, mely csak egy címet tartalmaz, bármire mutathat. Második esetben egy integer típusú változóra, harmadik esetben egy real típusú változóra mutathat. A deklarációt követQen, ezek a mutatók még nem ismert címre mutatnak. A mutatók kezeléséhez használható standard eljárások a new, és a dispose. A mutatónak értékül adhatjuk egy objektum címét, az addr függvény, vagy a @ operátor használatával, illetve egyik mutatót ráállíthatjuk egy másik mutató által mutatott címre. Annak jelölésére, hogy egy mutató sehová nem mutat, a nil értéket használjuk. A mutatott objektumra, a változónév^ formában hivatkozhatunk.
begin
new(integerremutato);{Helyfoglalás.}
integerremutato^:=17;{A mutatott területre 17 kerül.}
integerremutato^:=integerremutato^+13;{Hozzáadunk 13-at.}
new(barmiremutato);{Helyfoglalás.}
barmiremutato:=integerremutato;{Ugyanoda mutat.}
writeln(integerremutato^); {30-at ír ki.}
writeln(integer(barmiremutato^)); {30-at ír ki.}
i:=5;{Értékadás.}
barmiremutato:=@i;{Az i változó címét kapja értékül.}
writeln(integer(barmiremutato^)); {5-öt ír ki.}
dispose(integerremutato);{Ha már nem kell, felszabadítjuk.}
dispose(barmiremutato);{Ha már nem kell, felszabadítjuk.}
integerremutato:=nil;{Így majd tudom, hogy már felszabadítottam, nem mutat sehová.}
barmiremutato:=nil;{Így majd tudom, hogy már felszabadítottam, nem mutat sehová.}
end.
PAGE \* MERGEFORMAT 8
Hasonló témájú dokumentumok
Egyelőre még egyetlen hasonló témájú file sincs feltöltve a rendszerbe
A mások által feltöltött dokumentumokat értékelheted. Ha úgy ítéled meg, hogy a vizsgára való felkészülés szempontjából hasznos volt egy dokumentum, akkor adj rá sokcsillagos értékelést.
Ha hibákat tartalmaz, vagy egyéb probléma van vele, akkor keveset.
A dokumentumok sorrendje az értékelések alapján adódik. Ami fentebb van a listában, azt hasznosabbnak ítélték társaid. Az új dokumentumok pedig (értékelések hiányában) szintén a lista tetején kezdenek.
Hozzászólások
Ha észrevételed van egy dokumentummal kapcsolatban (például hibát találtál benne), akkor a Hozzászólások részben jelezheted. Az olyan jellegű kérdéseket mint pl.: A 2. feladat 4. sorából milyen átalakítással jutottunk az 5. sorban szereplő képlethez? - szintén ide érdemes írni
Egy tipp az oldalhoz! - Naptári bejegyzéseket vehettek fel egy tantárggyal kapcsolatban, vagy az egész szakotok számára. Például:
- Zh időpontok
- Gólyabál időpontja
- Házi leadási határidő
- Tanítási szünetek
- stb ...
Kattints a Naptárra, majd a jobb felső részen levő Új naptári bejegyzés felvétele linkre.