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

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

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

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

Bevezetés a programozásba I.

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

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

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

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

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

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

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

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

Maximum kiválasztás tömbben

Bevezetés a programozásba I.

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

Programozás C++ -ban

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

1. Alapok. Programozás II

Bevezetés a programozásba I.

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

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

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

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

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

Pénzügyi algoritmusok

Programozás C és C++ -ban

Programozás C++ -ban 2007/7

C++ programozási nyelv Konstruktorok-destruktorok

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

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

- 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]++;

1. Jelölje meg az összes igaz állítást a következők közül!

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

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

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

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

Programozás C++ -ban 2007/1

Pénzügyi algoritmusok

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

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.

Alprogramok, paraméterátadás

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

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozás C++ -ban

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

Informatika terméktervezőknek

Programozás C++ -ban 2007/4

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

és az instanceof operátor

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

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

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

500. AA Megoldó Alfréd AA 500.

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

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.

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

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

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

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

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

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

117. AA Megoldó Alfréd AA 117.

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

Programozási alapismeretek 1. előadás

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Objektumorientált Programozás VI.

Készítette: Nagy Tibor István

500. CC Megoldó Alfréd CC 500.

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

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

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

Bevezetés a programozásba 2

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

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

Körkörös listák. fej. utolsó. utolsó. fej

A C# programozási nyelv alapjai

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

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

Bevezetés a programozásba. 5. Előadás: Tömbök

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ási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

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

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

OAF Gregorics Tibor : Memória használat C++ szemmel (munkafüzet) 1

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

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Bevezetés a programozásba I.

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

3. Osztályok II. Programozás II

INFORMATIKA tétel 2019

Programozás C és C++ -ban

Átírás:

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

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

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 PLanG: STL vector C++ [semmi] VÁLTOZÓK : t:egész[10] t[0] := 1 [ilyet PLanG-ban nem lehet csinálni] #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)

ISMÉTLÉS É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 ISMÉTLÉ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

ISMÉTLÉS 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 most nézünk majd egy másik megközelítést

Típuskonstrukció Meglevő típusokból új típus létrehozása Eddigi példák: T v[10] : 10 darab T típusú változó alkot egy primitív vektort T m[10][10] : 10x10 méretű (primitív) mátrix vector<t> v(10,t) : 10 darab T típusú változó alkot egy STL vektort t kezdeti értékekkel vector<vector<t> > m(10, vector<t>(10, t)) : 10x10 méretű mátrix t kezdeti értékekkel

Típuskonstrukció A rekord: vegyes típusokból álló új típus struct Az elv: az összetartozó adatok összetartozása jelenjen meg, mint nyelvi elem Példa: kétdimenziós koordinátákat eddig két tömbben tároltunk: double x[100] és double y[100] Mostantól írhatjuk majd, hogy koord k[100]

struct #include <iostream> using using namespace std; std; struct koord koord { double x,y; x,y; ; ; int int main() { koord koord k; k; k.x=1.0; k.y=1.0; cout cout << << "[" "[" << << k.x k.x << << "," "," << << k.y k.y << << "]" "]" << << endl; endl; return 0; 0;

struct A struct kulcsszó jelentése: most egy új típust fogok leírni struct név { T1 mező1, mező2..; T2 mezőx,..;... ; A típus neve bármi lehet, ami nem foglalt még T1, T2,.. típusoknak már ismert típusúak legyenek A mezőnevek különbözőek legyenek

A mezők A rekord mezőkből áll ( tag, angolul member ) Minden mező egy már ismert típusba sorolható, és változóként használható: kaphat értéket, olvasható, referálható, stb. A mezők használatakor a struct típusú változók után '.' karakterrel elválasztva a mezőnevet kell írni Tehát az előző példában a 'k.x' jelentése: a k változó koord típusú, annak az x mezője, tehát egy double típusú érték

Mező vs változó Változónak szokás nevezni mindent, amit külön deklaráltunk Mezőt a többi mező nélkül nem lehet deklarálni Egy struct egy mezőjét külön nem deklaráltuk, de mégis úgy használjuk, mint egy változót: adunk neki értéket, kiolvassuk, stb A szóhasználat tehát nem a képességeket, hanem a szerepet fedi: önállóan használandó, vagy egy nagyobb adatcsoport része?

Mi legyen mező, és mi ne? A mezők összessége mindig a rekord szerepét teljesen töltse ki, és ne legyen benne felesleg Reprezentáció : egy absztrakt fogalom ábrázolása meglevő típusokkal pl. 2D koordináta két valós számmal, racionális szám két egész számmal, mint számláló és nevező A ciklusváltozó például nincs a mezők között: nem tartozik a fontos adatokhoz Az viszont nem nagy baj, ha a teljes értékkészletek nincsenek kihasználva, pl. tanuló jegye int mező. Ez csak kis baj.

struct és a típusok Az adott struct leírása után a megadott név már egy kész típus, használható deklarációkban, paraméterlistákban Akár egy következő struct mezőjénél is, vektorban, primitív tömbben, stb.. A rekord mezője is lehet vektor, vagy primitív tömb Fontos, hogy a forráskód fentről lefelé olvasva ezt a sorrendet betartsa

struct structban struct ember { string nev; string lakcim; int szuletesi_ev; ; ; struct diak { ember e; e; vector<int> jegyek; ; ;

struct structban struct pixel { char r,g,b; ; ; struct kep { int x, x, y; y; vector<vector<pixel> > p; p; ; ;

struct és függvények Az új típusaink használhatóak függvény paraméterekként Itt esetleg számítani kezd a hatékonyság, egy double[1000] mezővel is rendelkező struct érték szerint átadva lemásolódik, ami lassú Visszatérési értékként is használható, vagyis így lehet ismét több eredményt egyszerre visszaadni: több, összetartozó, és ezért egy típusba összefogható adatot

struct és függvények: előtte struct struct pont pont { double double x,y; x,y; string string nev; nev; ; ; void void kiir(double x, x, double double y, y, string string nev) nev) { cout cout << << "[" "[" << << x << << "," "," << << y << << "," "," << << nev nev << << "]" "]" << << endl; endl; int int main(){ main(){ pont pont p; p;...... kiir(p.x, p.y, p.y, p.nev); p.nev); return return 0; 0;

struct és függvények: utána struct struct pont pont { double double x,y; x,y; string string nev; nev; ; ; void void kiir(pont p) p) { cout cout << << "[" "[" << << p.x p.x << << "," "," << << p.y p.y << << "," "," << << p.nev p.nev << << "]" "]" << << endl; endl; int int main(){ main(){ pont pont p; p;...... kiir(p); kiir(p); return return 0; 0;

struct visszatérési típusként struct struct koord koord { double double x,y; x,y; ; ; koord koord olvas(istream &be) &be) { koord koord a; a; be be >> >> a.x a.x >> >> a.y; a.y; return return a; a; int int main() main() { koord koord a; a; a = olvas(cin); cout cout << << a.x a.x << << "," "," << << a.y a.y <<endl; <<endl; return return 0; 0;

Intermezzo pesszimistáknak Az elégséges jegyhez szükséges anyag immár teljes mértékben elhangzott*. *a hirdetés nem minősül ajánlatnak

Inicializálás Figyelem: az értékadás és az inicializálás két különböző dolog, csak mindkettő jele a = int a=0; inicializálás: deklarálással együtt adunk kezdeti értéket int a; a=0; értékadás, a deklaráció után, bármikor máskor adunk új értéket. A struct esetében értéket adni mezőnként lehet, vagy másik struct-tal Inicializálni viszont lehet egyben is: koord k={0.0, 0.0; // mezők sorrendjében!

struct inicializálás struct struct pont pont { double double x,y; x,y; string string nev; nev; ; ; void void kiir(pont p) p) { cout cout << << "[" "[" << << p.x p.x << << "," "," << << p.y p.y << << "," "," << << p.nev p.nev << << "]" "]" << << endl; endl; int int main(){ main(){ pont pont p = {1.0,1.0, "a"; "a"; kiir(p); kiir(p); return return 0; 0;

struct a structban inicializálás struct struct ember ember { string string nev; nev; string string lakcim; lakcim; int int szuletesi_ev; ; ; struct struct diak diak { ember ember e; e; vector<int> jegyek; jegyek; ; ; int int main() main() { diak diak d = {{"Jani","Bp",1989, vector<int>(10,5); cout cout << << d.e.nev d.e.nev << << " " << << d.e.lakcim; return return 0; 0;

struct inicializálása Ez egy extra lehetőség, érdemes a használatát minimálisra csökkenteni Hátrányok: ha változik a struct összetétele, mert bekerül egy új mező, akkor az összes inicializálás sérül, ki kell javítani ha változik a mezők sorrendje, akár csendes hiba is keletkezhet, pl. összekeverhető a magasság a születési évvel, mert mindkettő int Ugyanakkor egyszerű esetekben hatékony