Kezdőoldal » Számítástechnika » Programozás » El tudná-e nekem valaki...

El tudná-e nekem valaki magyarázni a következő Pascal programot?

Figyelt kérdés

Uses Crt;

Var a,b,c:integer;


Procedure adatbekeres;

Begin

Clrscr;

Write('Kérem az elsá számot: ');

Readln(a);

Write('Kérem a második számot: ');

Readln(b);

End;


Procedure Osszead(var x:integer);

Begin

x:=a+b;

End;


Procedure eredmeny(x:integer);

Begin

Writeln('A két szám összege: ',x);

End;


BEGIN

adatbekeres;

Osszead(c);

Eredmeny(c);

Readln;

END.



Természetesen tudom, hogy mit csinál a program, csak azt nem tudom, hogy miért és hogyan. A tankönyvben a mintapélda ez volt, biztosan így kell megoldani, csak némi magyarázatra szorulni számomra (és tudom, hogy egyszerűbben is össze lehet két számot adni, de a feladatot így kell megoldani)...

A kérdéseim:

Először is nagyon örülnék neki ha egy folyamatábrával (elég betűkkel és --> nyilakkal :)) össze tudná nekem hasonlítani valaki az érték és a cím szerinti paraméterátadást. És miért használjuk az elsőnél ezt, a másiknál azt?

Másrészt miért van a főprogramban "c"?


Köszönöm! :)


2015. júl. 23. 22:49
 1/5 anonim ***** válasza:
83%

Hú, ezt fájt megnézni :D

Az Osszead globális változókkal dolgozik, de az eredményt egy cím szerint átadott paraméterben adja vissza? Működni működik, de ez így nagyon nem elegáns. Arra inkább egy Function kellett volna, és ennek paramétereként kellett volna átadni a két összeadandó számot.


A cím szerinti paraméterátadásnál (var kulcsszó) a változó memóriabeli címe adódik át, és ebből adódóan ha bármit megváltoztatunk azon a változón, az kihatással lesz az úgymond eredeti változóra. Érték szerintinél csak az érték adódik át, és hiába változtatod meg, az globálisan nem lesz kihatással a paraméterként megadott változóra.

2015. júl. 23. 23:10
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
78%
Bocsi, ha kicsit kuszán fogalmazok, már fáradok. :D
2015. júl. 23. 23:10
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:
100%

Amikor az jön, hogy

Osszead(c);

akkor valójában a c globális változó címét adja át az Osszead eljárásnak, tehát azt mondja meg, hogy az eredményt majd hova tegye. A

Procedure Osszead(var x:integer);

sor azt jelenti, hogy paraméterként egy változót kap, de nem kell létrehozni lokális változóként (a var miatt), hanem csak egy hivatkozás valamilyen már létező változóra. Itt x-ként hivatkozik rá (formális paraméter), de ebben az esetben ez ugyanarra a memóriaterületre hivatkozik, mint a c. Tehát az x-be rakja az eredményt, de az valójában azonos a c-vel, mindkét szimbólum ugyanarra az értékre hivatkozik.


[link]

[link]

A másodiknál keress rá a "Cím szerinti paraméter átadás"-ra.

2015. júl. 24. 00:09
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
100%

Ja igen, ha nem lenne ott a "var", akkor az Osszead létrehozna egy új x lokális változót, "beletenné" a kapott értéket (tehát a c egy másolatát), és azzal dolgozna. Szépen beleírná az eredményt, de mivel ez egy másik változó, az eredeti c értéke ettől nem változna meg. Amikor lefut az Osszead, akkor az x megszűnik létezni, és az eredmény elvész, nem kerül át c-be.


Mondjuk, hogy te egy Javit nevű procedure vagy, és én a fő részben "meghívlak" így: Javit(óra). Nézzünk két deklarációt a Javit eljáráshoz:


1. Procedure Javit(óra:kütyü)

Ebben az esetben a híváskor lemásolódik az óra, és te azt fogod megjavítani. Amikor elkészülsz, és hiába nézem az órámat, az még mindig rossz lesz, mert te nem azzal dolgoztál.


2. Procedure Javit(var óra:kütyü)

Itt híváskor a saját órámat fogom átadni, megjavítod, és a végén örülök. :)


A var nélküli eset akkor jó, ha csak a számításhoz szükséges információt akarom átadni. Például hogy mennyit adj hozzá valamihez, de az eredmény máshol jelenjen meg. A var akkor hasznos, ha az eredményt is ugyanebben a változóban szeretném látni.


Egy függvény tényleg elegánsabb lett volna a példában, de van, amikor nem lehet kikerülni ezt módot, például amikor több különböző értéket szeretnék visszakapni, nem csak egyet. (Próbáltam Pascal-ul gondolkodni, a C-ben pl. ez kicsit másképp néz ki.)

2015. júl. 24. 00:23
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Köszönöm szépen a segítséget! Nagyjából most már érthető! :)
2015. júl. 24. 21:04

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!