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

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

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

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

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

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

Bevezetés a programozásba I.

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

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

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

1. Alapok. Programozás II

Maximum kiválasztás tömbben

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Bevezetés a programozásba I.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

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

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Alkalmazott Modul III 3. előadás. Procedurális programozás: alprogramok, kivételkezelés

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

8. gyakorlat Pointerek, dinamikus memóriakezelés

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

INFORMATIKA tétel 2019

Alkalmazott Modul III 3. előadás. Procedurális programozás: alprogramok, kivételkezelés. Alprogramok Szükségessége

INFORMATIKA javítókulcs 2016

Bevezetés a programozásba I.

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

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

A programozás alapjai 1 Rekurzió

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

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

5. Gyakorlat. struct diak {

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

Programozás alapjai 9.Gy: Struktúra 2.

Alprogramok, paraméterátadás

INFORMATIKA tétel 2017

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

Bevezetés a programozásba I.

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

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

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

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

Felvételi tematika INFORMATIKA

Pénzügyi algoritmusok

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

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Programozási nyelvek Java

Programozási alapismeretek 2009/2010

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

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

3. Osztályok II. Programozás II

Programozás C++ -ban

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

INFORMATIKA tétel 2018

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

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

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

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

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

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás C++ -ban 2007/1

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

2018, Funkcionális programozás

Programozás I gyakorlat. 10. Stringek, mutatók

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

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

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

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

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

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

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

10. gyakorlat Tömb, mint függvény argumentum

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

Objektumorientált Programozás VI.

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

OOP #14 (referencia-elv)

Informatika terméktervezőknek

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

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

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

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

Programozás I. gyakorlat

Kivételkezelés a C++ nyelvben Bevezetés

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Eljárások, függvények

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Occam 1. Készítette: Szabó Éva

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a C++ programozásba

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

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

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

Programozás Minta programterv a 1. házi feladathoz 1.

Programozás C++ -ban

Programozás C és C++ -ban

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 10. gyakorlat C++: alprogramok deklarációja és paraméterátadása 2011.11.22. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Deklaráció és definíció szétválasztása C++-ban is szétválaszthatjuk az alprogram deklarációját a definíciójától Az alprogram deklarációjában nem kell megírnunk a változók neveit, csak a típusait: <típus> <név>(<paraméterek típusa>); A definíció megegyezik a alprogram függvényleírással: <típus> <név>(<paraméterek>){<utasítások> például megvalósítható, hogy az alprogramokat a főprogram előtt deklaráljuk, és a törzsét a főprogram után írjuk, így rögtön láthatjuk, mit tartalmaz a főprogram, pl.: void fv(); /* itt használhatjuk fv-t */ void fv(){ /* utasítások */ PPKE ITK, Bevezetés a programozásba I 10:2 Feladat: Számoljuk ki függvény segítségével egy szám n-edik hatványát. használjunk szorzást a függvényben, amelynek paraméterei a szám, illetve a kitevő lesznek a függvénytörzset helyezzük a főprogram alá /* hatványozás bemenet: egy egész (a), egy természetes szám (n) kimenet: a-nak n-edik hatványa */ int pow(int, int); // deklaráció // főprogram int szam, n; cout << "A szám: "; cin >> szam; cout << "A kitevő: "; cin >> n; cout << "Eredmény: " << pow(szam, n) << endl; PPKE ITK, Bevezetés a programozásba I 10:3 PPKE ITK, Bevezetés a programozásba I 10:4 int pow(int a, int n){ // definíció (törzs) int x = 1; for (int i = 0; i < n; i++) x *= a; // hatványozás szorzással return x; PPKE ITK, Bevezetés a programozásba I 10:5 Álnevek Használata Lehetőségünk van olyan változókat létrehozni, amelyek egy másik változó értékét használják fel, azaz pontosan ugyanazt az értéket tárolják, mint a másik változó, ezek az úgynevezett álnevek (alias-k) Az álneveket mindig egy már létező változóra állítjuk rá, és onnan a ponttól bármelyik értékének módosítása a másik értékét is módosítja Az álnevek típusának meg kell egyeznie az eredeti változó típusával, a neve pedig tetszőleges lehet A C++-ban az álneveket az & operátorral jelöljük meg: <típus> <változó 1>; <típus> &<változó 2> = <változó 1>; // a változó 2 lesz a változó 1 álneve PPKE ITK, Bevezetés a programozásba I 10:6 1

Álnevek Egyszerű változókra Egy változóra persze több álnevet is ráállíthatunk Pl.: char x = 'a'; char &y = x; // ráállítunk egy y álnevet az x-re cout << y << endl; // ez kiírja az 'a' értéket x = 'b'; cout << y << endl; // ez kiírja a 'b' értéket y = 'c'; cout << x << endl; // ez kiírja a 'c' értéket PPKE ITK, Bevezetés a programozásba I 10:7 Álnevek Tömbökre Lehetőségünk van tömbökre is ráállítani álneveket, de ekkor a * operátort használnunk: <típus> <változó 1>[<méret>]; <típus> *<változó 2> = <változó 1>; Ténylegesen a következő történik: mivel minden változót a memóriában tárolunk, rendelkezik egy memóriabeli címmel, amit lekérdezhetünk az & és * operátorokkal létrehozott változók megkapják a már létező változók memóriabeli címét, és ezért pont ugyanarra a memóriaterületre fognak mutatni értékmódosításkor ugyanarra a memóriaterületre fognak írni, ezért ugyanazt az értéket fogják ott felülírni PPKE ITK, Bevezetés a programozásba I 10:8 Alprogramok kommunikációja A C++ programok függvényekből állnak, amelyek tetszőleges utasítássorozatot, műveletet végrehajthatnak, ezeket a függvényeket más függvényekben, alprogramokban használhatjuk meghívással A függvények kommunikálhatnak visszatérési értéken (minden függvénynek csak egy lehet), globális változókon (használatuk hibákat rejt magában) és paramétereken keresztül Eddig paraméterátadásnál az aktuális paraméter értéke átkerült a formális paraméterbe, és azt az egész függvényben használhatjuk Azonban a paraméterátadásnál nem csak az alprogramnak adhatunk át értéket, hanem az alprogram is adhat át értéket az őt meghívó programrésznek PPKE ITK, Bevezetés a programozásba I 10:9 A paraméterátadás iránya Ennek megfelelően a paraméterátadás iránya szerint a következő paramétertípusokat különböztetjük meg: bemenő paraméter: a hívás pillanatában átadódik az az aktuális paraméter értéke a formálisnak, és onnantól az adatok módosítása az alprogramban nincs hatással a főprogramra (ezt használtuk eddig) kimenő paraméter: az értékeket az alprogram állítja be, majd a hívás végeztével (azaz az alprogram lefutásának végén) a formális értékek visszaíródnak a főprogramba az aktuális paraméterbe be- és kimenő paraméter: az értékek a főprogramból bekerülnek az alprogramba, amely azokat átírhatja, majd a hívás végeztével a módosított értékek visszakerülnek a főprogramba PPKE ITK, Bevezetés a programozásba I 10:10 A három irány megvalósításához különböző módszereket kell alkalmaznunk: Érték szerinti paraméterátadás: az aktuális paraméter értékét átadjuk a formális paraméternek a hívás pillanatában a formális paraméter ezután azzal az értékkel fog dolgozni az alprogramban hiába módosítjuk az aktuális, vagy a formális paramétert, az nincs hatással a másikra pl.: void fv(int x); int y; fv(y); // y érték szerint adódik át PPKE ITK, Bevezetés a programozásba I 10:11 Feladat: Számítsuk ki függvény segítségével két egész szám legnagyobb közös osztóját. a függvénynek érték szerinti paraméterátadással adjuk át a két egész számot, és a visszatérési értéke legyen az osztó használjuk az euklédeszi algoritmust a függvényben /* legnagyobb közös osztó meghatározása bemenet: két természetes szám (a, b) kimenet: a és b legnagyobb közös osztója */ int lnko(int a, int b); PPKE ITK, Bevezetés a programozásba I 10:12 2

// főprogram int x = 10, y = 8; int z = lnko(x,y); // itt x = 10, y = 8, z = 2 cout << "LNKO: " << z << endl; int lnko(int a, int b){ // itt a = 10, b = 8 while (a!= b){ // euklédeszi algoritmus if (a > b) a -= b; else b -= a; return a; // itt a = 2, b = 2 Cím szerinti paraméterátadás: az aktuális paraméter memóriacímét adja át a formális paraméternek, a formális paraméter csak a változó memóriacímét tárolja, és az megváltoztathatatlan, viszont a memóriacímen található érték megváltoztatható az alprogramban új értéket adhatunk a változónak, és az az érték visszakerül a főprogramba a C++-ban ezt meg lehet valósítani álnevek használatával úgy, hogy formális paraméterként álneveket definiálunk, így az egyszerre módosul az aktuális paraméterrel ezzel lehetőségünk van be- és kimenő paraméterátadást megvalósítani PPKE ITK, Bevezetés a programozásba I 10:13 PPKE ITK, Bevezetés a programozásba I 10:14 Tekintsük az előző példát cím szerinti paraméterátadást használva: int lnko(int &a, int &b){ // itt a = 10, b = 8 return a; // itt a = 2, b = 2 int x = 10; int y = 8; int z = lnko(x,y); // itt x = 2!, y = 2!, z = 2 lesz cout << "LNKO: " << z << endl; PPKE ITK, Bevezetés a programozásba I 10:15 Cím szerinti átadással lehetőségünk van megspórolni a visszatérési értéket, hiszen az érték módosul, pl: void lnko(int &a, int b){ // itt a = 10, b = 8 while (a!= b) if (a > b) a -= b; else b -= a; // itt a = 2, b = 2 int x = 10; int y = 8; lnko(x,y); // itt x = 2, y = 8 lesz cout << "LNKO: " << x << endl; PPKE ITK, Bevezetés a programozásba I 10:16 Feladat: Olvassuk be 10 valós számot, és határozzuk meg a számok szinuszának átlagát. a beolvasást és az átlagszámítást helyezzük függvénybe ahhoz, hogy a beolvasást követően a tömb értékei visszakerüljenek a főprogramba, cím szerinti paraméterátadást kell használnunk a másik függvényben használhatunk érték szerinti átadást, és az eredményt visszaadhatjuk visszatérési értékben a szinuszhoz használjuk a sin függvényt (a math.h fájlból) #include <iostream> #include <math.h> using namespace std; /* beolvasás bemenet: 10 valós szám az inputon kimenet: 10 elemű valós tömb (szamok) */ void beolvas(double* szamok); /* a szinuszok átlaga bemenet: 10 elemű valós tömb (szamok) kimenet: a tömbelemek szinuszának átlaga */ double sin_atlag(double szamok[10]); PPKE ITK, Bevezetés a programozásba I 10:17 PPKE ITK, Bevezetés a programozásba I 10:18 3

/* főprogram bemenet: 10 szám az inputon kimenet: a számok szinuszának átlaga */ double t[10]; beolvas(t); // beolvasás cím szerinti átadással // t értékei módosultak cout << "Szinuszok átlaga: " << sin_atlag(t) << endl; // t értékei nem módosultak void beolvas(double* szamok){ // cím szerinti paraméterátadás cout << "Beolvasás: " << endl; for (int i = 0; i < 10; i++){ cout << i+1 << ". szám: "; cin >> szamok[i]; // a szamok értékei módosultan visszaadódnak double sin_atlag(double szamok[10]){ double s = 0; // összegzés for (int i = 0; i < 10; i++) s += sin(szamok[i]); return (s / 10); PPKE ITK, Bevezetés a programozásba I 10:19 PPKE ITK, Bevezetés a programozásba I 10:20 Eredmény szerinti paraméterátadás: megegyezik az érték szerinti átadással, de a formális paraméter értéke a hívás után visszakerül az aktuális paraméterbe (tehát ellentétben a cím szerinti átadással a függvény futása közben nem módosul az eredeti értéke, csak a végén) Név szerinti paraméterátadás: egy kifejezés pontosan átadódik, és a formális paraméter hívásakor mindig kiértékelődik a benne használt változók értékének függvényében A C++ ez utóbbi kettőt nem támogatja, ezért a következő lehetőségeink vannak: csak bemenő paraméter érték szerinti átadással be- és kimenő paraméter cím szerinti átadással PPKE ITK, Bevezetés a programozásba I 10:21 Nem csak az alprogramok, hanem a főprogram (main függvény) is kaphat paraméterezést a főprogramnak átadott aktuális paraméterek a parancssorban megadott, fájlnév utáni szavak lesznek bármennyi, bármilyen paramétert megadhatunk neki, amelyet a főprogrammal ki tudunk értékeltetni pl.:./a.out../szamok.txt 75 13 joprogi A főprogram formális paraméterei: int argc: ez mondja meg, hogy hány paraméterrel indították a programot char* argv[]: ez a tömb tartalmazza a paramétereket egymás után PPKE ITK, Bevezetés a programozásba I 10:22 A főprogramot ennek megfelelően a következőképpen írhatjuk: // itt használhatjuk argc-t, argv-t Az argv[<index>] elemet lekérdezve megtudhatjuk a valahányadik argumentumot (paramétert) a tömb argc hosszú, tehát a tömb 0...argc-1 elemeit kérdezhetjük le argc értéke minden esetben legalább egy, ugyanis az első argumentum maga a program neve (elérési úttal), utána következnek a tényleges paraméterek pl. ha a program futtatása./a.out, akkor argv[0] = "home/groberto/a.out" lehet PPKE ITK, Bevezetés a programozásba I 10:23 Tehát az argc-vel ellenőrizhetjük, megadtak-e paramétert a program indításakor a név mellett Így lehetőségünk van például fájlneveket megadnunk argumentumként, így nem kell a program futása közben bekérnünk őket: ifstream f; if (argc > 1) // ha van más paraméter a fájlnéven kívül f.open(argv[1]); // akkor nyissuk azt meg else // különben kérjük be a fájlnevet PPKE ITK, Bevezetés a programozásba I 10:24 4

Feladat: Olvassunk ki egy sort egy fájlból, amelyet paraméterként adtunk meg. Ha nem jó paramétert adunk meg, vagy egyáltalán nem adunk paramétert, akkor kérjük be billentyűzetről. Továbbá írjuk ki, hogy milyen néven fut a program. ha az első megnyitás nem sikerült, kérjük be billentyűzetről a fájlnevet, amíg sikertelen a megnyitás /* főprogram bemenet: egy fájlnév argumentumként kimenet: a fájl első sora */ PPKE ITK, Bevezetés a programozásba I 10:25 cout << argv[0] << program fut... ; ifstream f; string nev; if (argc > 1) { // van paraméter cout << "Megnyitás: " << argv[1] << endl; f.open(argv[1]); else { // nincs paraméter, bekérjük cout << "File neve: "; cin >> nev; f.open(nev.c_str()); while (f.fail()){ // ha nem sikerült az első megnyitás cout << "Hibás fájlnév!" << endl; PPKE ITK, Bevezetés a programozásba I 10:26 f.clear(); cout << "File neve: "; cin >> nev; f.open(nev.c_str()); // addig bekérjük, amíg nem sikerül megnyitni string sor; getline(f, sor); cout << "Az első sor: " << sor << endl; Alprogramok Feladatok Az alábbi feladatokban függvényt kell megvalósítani. Ha másképp nem rendelkezik a feladat, a main függvényben a megvalósított függvényt kell tesztelni az érdekes esetekre. VI. Függvények: 8. Valósítsd meg az int hanysor(ifstream &f) függvényt, ami egy paraméterül kapott fájlban levő maradék sorok számát adja vissza. 17. Valósítsd meg a skalárszorzat műveletet függvényként. 18. Valósítsd meg a mátrixszorzás műveletet függvényként. PPKE ITK, Bevezetés a programozásba I 10:27 PPKE ITK, Bevezetés a programozásba I 10:28 Alprogramok Feladatok VI. Függvények: 19. b) (*) Valósíts meg függvényt, ami megkap egy mátrixot, és kiszámítja az inverzét. A függvény adjon vissza egy állapot is, ami jelzi, ha hiba van: a mátrix nem négyzetes, vagy összefüggőek a vektorok. PPKE ITK, Bevezetés a programozásba I 10:29 5