Bevezetés a programozásba. 8. Előadás: Függvények 2.

Hasonló dokumentumok
Bevezetés a programozásba. 9. Előadás: Rekordok

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Programozás II. 2. Dr. Iványi Péter

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Bevezetés a programozásba I.

Bevezetés a programozásba I.

1. Alapok. Programozás II

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás II. 4. Dr. Iványi Péter

Programozás C++ -ban 2007/1

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a programozásba Előadás: A const

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Programozás I. 5. Előadás: Függvények

Alprogramok, paraméterátadás

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Számítógép és programozás 2

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

A C programozási nyelv II. Utasítások. A függvény.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Programozás C++ -ban

Bevezetés a programozásba I.

Maximum kiválasztás tömbben

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

5. Gyakorlat. struct diak {

Globális operátor overloading

Programozás C és C++ -ban

Programozási alapismeretek 2009/2010

Pénzügyi algoritmusok

A C++ Standard Template Library rövid összefoglalás

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Programozás C++ -ban 2007/7

Bevezetés a programozásba I.

Programozás C++ -ban

Informatika terméktervezőknek

Programozás C és C++ -ban

Programozás II gyakorlat. 8. Operátor túlterhelés

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Pénzügyi algoritmusok

Szövegek C++ -ban, a string osztály

Programozás alapjai 8.Gy: Program struktúra

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Pénzügyi algoritmusok

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

és az instanceof operátor

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

7. fejezet: Mutatók és tömbök

Eljárások és függvények

Algoritmizálás + kódolás C++ nyelven és Pascalban

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

4. Öröklődés. Programozás II

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás alapjai. 7. előadás

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Bevezetés a C++ programozásba

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

2. Alapfeltevések és a logisztikus egyenlet

A C programozási nyelv I. Bevezetés

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Objektumorientált Programozás VI.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

A C programozási nyelv I. Bevezetés

Sejtautomaták. Szőke Kálmán Benjamin - SZKRADT.ELTE május 17.

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

3. Osztályok II. Programozás II

500. CC Megoldó Alfréd CC 500.

Bevezetés a programozásba I 7. gyakorlat. C++: szövegkezelés, szekvenciális fájlkezelés. Szövegkezelés Karakterkezelés

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Mutatók és mutató-aritmetika C-ben március 19.

Programozási alapismeretek 1. előadás

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozási Nyelvek: C++

Programozási Nyelvek (C++) Összefoglaló

A programozás alapjai 1 Rekurzió

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Bevezetés a programozásba Előadás: Fordítási egység

C++ függelék. Tartalom

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése

Programozás II. 6.Öröklés Dr. Iványi Péter

Géptermi zh-írás forgatókönyve

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

A C programozási nyelv III. Pointerek és tömbök.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Átírás:

Bevezetés a programozásba 8. Előadás: Függvények 2.

ISMÉTLÉS Helló #include <iostream> using namespace std; int main() cout << << "Hello"; return 0; 0;

ISMÉTLÉS Függvények írásmódja Ha egy C++ kódban ezt látjuk: típusnév bármilyennév(tetszőleges deklarációk)... #include <iostream> return valami; using namespace std; Akkor az egy függvény int main() cout << << "Hello"; return 0; 0;

ISMÉTLÉS Függvényhívás #include #include <iostream> <iostream> #include #include <cmath> <cmath> using using namespace namespace std; std; double double terulet(double terulet(double a, a, double double b, b, double double c) c) double double s = (a+b+c)/2.0; (a+b+c)/2.0; return return sqrt((s-a)*(s-b)*(s-c)*s); sqrt((s-a)*(s-b)*(s-c)*s); int int main() main() double double ha,hb,hc; ha,hb,hc; cin cin >> >> ha ha >> >> hb hb >> >> hc; hc; double double t = terulet(ha,hb,hc); terulet(ha,hb,hc); cout cout << << "terulet: "terulet: " << << t << << endl; endl; return return 0; 0;

ISMÉTLÉS Függvények double double terulet(double terulet(double a, a, double double b, b, double double c) c) Szignatúra: Visszatérési típus (a függvény típusának is nevezik) Függvény neve Zárójelben Paraméter 1, ha van Paraméter 2, ha van.. A szignatúrából minden kiderül arról, hogyan kell használni a függvényt

Szimbolikus és aktuális paraméter ISMÉTLÉS #include #include <iostream> <iostream> #include #include <cmath> <cmath> using using namespace namespace std; std; double double terulet(double terulet(double a, a, double double b, b, double double c) c) double double s = (a+b+c)/2.0; szimbolikus (a+b+c)/2.0; return return sqrt((s-a)*(s-b)*(s-c)*s); sqrt((s-a)*(s-b)*(s-c)*s); int int main() main() double double ha,hb,hc; ha,hb,hc; cin cin >> >> ha ha >> >> hb hb >> >> hc; aktuális hc; double double t = terulet(ha,hb,hc); terulet(ha,hb,hc); cout cout << << "terulet: "terulet: " << << t << << endl; endl; return return 0; 0;

ISMÉTLÉS Változó láthatósága Egy változó látható a programkód azon soraiban, ahol a nevének leírásával használható C++ nyelvben a lokális változók nem láthatóak más függvényekben A mindenhol látható változót függvényen kívül kell deklarálni: globális változó A globális változókat ahol lehet, kerüljük. Néhány értelmes használata van, ezekre általában kitérünk majd, minden másnál a jó stratégia az, hogy paraméterben adjuk át a szükséges adatokat Ha mégis használjuk, azokban a függvényekben lesz látható, amelyek a deklaráció alatt vannak

ISMÉTLÉS Változó érvényessége A változó érvényes a program futásának azon szakaszain, ahol az értékét megtartja A lokális változó a függvényben levő deklarálásától számítva addig él, amíg a deklarálásának blokkja be nem fejeződik. A paraméterek a függvény végéig élnek Ha egy A függvényből egy B függvényt hívunk, az A lokális változói ugyan nem láthatóak B- ben, de érvényesek maradnak, mert mikor B befejeződik, A-ban továbbra is használhatóak, és értéküket megtartották ezalatt.

ISMÉTLÉS Strukturált programozás Programtervezési elv: a feladatot osszuk részfeladatokra, és függvényekben csoportosítsuk azokat dekompozíció, redukció int nagyonnehézfeladat(p1 P2 P3..) egyikkicsitkönnyebb(p2 P4..); másikkicsitkönnyebb(p1 P2..);... Top-down vagy Bottom-up felépítés 80-as évekig nagy szoftvereknél egyeduralkodó

ISMÉTLÉS Rekurzív függvény int int faktor(int p) p) if if (p>1) return p*faktor(p-1); else return 1; 1; int int main() cout << << faktor(5) << << endl; return 0; 0;

Nyitott kérdések Miért nem tudtam tömböt átadni paraméterként? Néztem fórumokat, és ott valami int* volt int[10] helyett.. Azt írta a PLanG-C++ táblázat, hogy sort tudok beolvasni úgy, hogy getline(cin, s). Ez miért nem úgy van, hogy s=getline(cin)? Akkor hogy is lehet több eredményt visszaadni? Nem tudtam fájlt sem paraméterként átadni!

Tömb Nagy vonalakban kétféle megoldás: C nyelv, mutatók, memóriában egymást követő elemek Nincs mérete művelet Mutatót kell átadni (int * : egészre mutató mutató) és méretet C++ szabványos könyvtár deklaráció: vector<int> tombom(10,0) formális paraméter: vector<int> tomb méret lekérdezése: tomb.size()

Primitív tömb PLanG: VÁLTOZÓK : t:egész[10] t[0] := 1 [ilyet PLanG-ban nem lehet csinálni] C int t[10]; t[0]=1 int osszeg(int *t, int m) int sum=0; for (int i=0;i<m;i++) sum+=t[i]; return sum; osszeg(t,10)

STL vector PLanG: [semmi] VÁLTOZÓK : t:egész[10] t[0] := 1 [ilyet PLanG-ban nem lehet csinálni] C++ #include <vector> vector<int> t(10); vagy vector<int> t(10,0); t[0]=1 int osszeg(vector<int> t) int sum=0; for (int i=0;i<t.size() ;i++) sum+=t[i]; return sum; osszeg(t)

Nyitott kérdések Miért nem tudtam tömböt átadni paraméterként? Néztem fórumokat, és ott valami int* volt int[10] helyett.. Azt írta a PLanG-C++ táblázat, hogy sort tudok beolvasni úgy, hogy getline(cin, s). Ez miért nem úgy van, hogy s=getline(cin)? Akkor hogy is lehet több eredményt visszaadni? Nem tudtam fájlt sem paraméterként átadni!

Paraméterátadások #include #include <iostream> <iostream> #include #include <cmath> <cmath> using using namespace namespace std; std; double double terulet(double terulet(double a, a, double double b, b, double double c) c) double double s = (a+b+c)/2.0; (a+b+c)/2.0; return return sqrt((s-a)*(s-b)*(s-c)*s); sqrt((s-a)*(s-b)*(s-c)*s); int int main() main() double double ha,hb,hc; ha,hb,hc; cin cin >> >> ha ha >> >> hb hb >> >> hc; hc; double double t = terulet(ha,hb,hc); terulet(ha,hb,hc); cout cout << << "terulet: "terulet: " << << t << << endl; endl; return return 0; 0;

Paraméterátadások Azt beszéltük meg, hogy a függvény paraméterei a paraméterlistában vannak deklarálva az értéküket az aktuális paraméterekből kapják érvényességük és láthatóságuk a függvényre szorítkozik tehát az aktuális paraméter másolatáról van szó Következésképp a getline(cin, s) nem változtathatja meg s értékét, tehát sort sem olvashatunk bele?

Paraméterátadások A különbség a paraméter átadásában és átvételében van Lehet úgy átvenni paramétert, hogy csak másolat készül, és így az átadott aktuális paraméter írásvédett Lehet viszont úgy is, hogy magát a változót adjuk át, és minden, amit a függvény csinál vele, az maradandó károsodást okoz Ezeket érték szerinti és referencia szerinti paraméterátadásnak hívjuk

Érték szerinti paraméterátadás #include #include <iostream> <iostream> using using namespace namespace std; std; Másolat készül void void fv(double fv(double a) a) a=0; a=0; int int main() main() double double d; d; d=1; d=1; fv(d); fv(d); cout cout << << "eredmeny: "eredmeny: " << << d << << endl; endl; return return 0; 0; Az eredmény: 1

Referencia szerinti paraméterátadás #include #include <iostream> <iostream> using using namespace namespace std; std; Másolat készül void void fv(double fv(double & a) a) a=0; a=0; int int main() main() double double d; d; d=1; d=1; fv(d); fv(d); cout cout << << "eredmeny: "eredmeny: " << << d << << endl; endl; return return 0; 0; Az eredmény: 0

Referencia szerinti paraméterátadás void fv(double & a) Érdemes úgy gondolni rá, hogy a függvényen belül a paraméterként kapott változót így fogjuk hívni Maga a referencia egy önálló fogalom C++-ban, tetszőleges változóra lehet referenciát állítani, és minden amit az egyikkel csinálunk, az a másikra is hatással van int a; int &r=a; a=0 r==0 és viszont. Paraméter átvétele is így történik

Referencia szerinti paraméterátadás Következmények: ha szeretnénk, hogy egy függvény változtassa a változónkat, akkor lehetséges referencia szerint átvenni a paramétert csak változó lehet a paraméter, kifejezés eredménye vagy konstans nem gyors, mert nem kell másolatot készíteni, ami nagyobb memóriaigényű változóknál (pl string egymillió karakterrel) lassíthat veszélyes lehet, a legtöbb függvényhívásnál nem számítunk arra, hogy megváltozhat a paraméterül átadott változó (pl. matematikai függvények)

Nyitott kérdések Miért nem tudtam tömböt átadni paraméterként? Néztem fórumokat, és ott valami int* volt int[10] helyett.. Azt írta a PLanG-C++ táblázat, hogy sort tudok beolvasni úgy, hogy getline(cin, s). Ez miért nem úgy van, hogy s=getline(cin)? Akkor hogy is lehet több eredményt visszaadni? Nem tudtam fájlt sem paraméterként átadni!

Több eredmény Lesz még egy megoldás, de ez most könnyű: Egyszerűen több paramétert átveszünk referencia szerint ezek értékével egyáltalán nem foglalkozunk, csak felülírjuk azokat így a paraméter jelentése az lesz, hogy ide meg ide kérem az eredményt A jövő héten nézünk majd egy másik megközelítést

Nyitott kérdések Miért nem tudtam tömböt átadni paraméterként? Néztem fórumokat, és ott valami int* volt int[10] helyett.. Azt írta a PLanG-C++ táblázat, hogy sort tudok beolvasni úgy, hogy getline(cin, s). Ez miért nem úgy van, hogy s=getline(cin)? Akkor hogy is lehet több eredményt visszaadni? Nem tudtam fájlt sem paraméterként átadni!

Fájlok paraméterben A fájlokat (ifstream, ofstream) mindig referencia szerint kell átvenni Miért? Mert nem készíthető róluk másolat, aminek az az oka, hogy a hol tartunk bennevan a fájl típusban: képzeljük el, hogy egy függvény lemásol (érték szerint átvesz) egy ifstream-et, és olvas belőle visszatérés után a következő olvasásnál a fájl előző olvasásainak kéne újra megtörténni, hisz csak a másolatból olvastunk, az átadottból nem, az tehát nem is mehetett odébb ez viszont követhetetlen, és technikailag rémálom

Fájlok paraméterben #include #include <iostream> <iostream> #include #include <fstream> <fstream> using using namespace namespace std; std; void void olvas(ifstream olvas(ifstream & f, f, double double & a) a) f >> >> a; a; int int main() main() double double d; d; ifstream ifstream befile("a.txt"); befile("a.txt"); olvas(befile, olvas(befile, d); d); cout cout << << "eredmeny: "eredmeny: " << << d << << endl; endl; return return 0; 0;

Összefoglalás Paraméterként a fájlok és a tömbök speciálisak Paramétert kétféleképpen is át lehet adni Érték szerint: másolat készül lokális változóra Referencia szerint: ugyanaz a változó több néven Mivel veszélyes mindent referenciaként átvenni, ezért csak akkor tegyük, ha a specifikációnk szerint eredményt adunk vissza benne