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

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

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

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

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

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

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

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)

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

Bevezetés a C++ programozási nyelvbe

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

1. Alapok. Programozás II

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

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

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

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

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

Alprogramok, paraméterátadás

Pénzügyi algoritmusok

Bevezetés a C++ programozási nyelvbe

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

Programozás C és C++ -ban

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

C++ programozási nyelv Konstruktorok-destruktorok

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

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

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

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

Programozás. C++ típusok, operátorok. Fodor Attila

Programozás 5. Dr. Iványi Péter

Informatika terméktervezőknek

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás C++ -ban

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Programozas 1. Strukturak, mutatok

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

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

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

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:

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

Programozás C++ -ban

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

Programozás II gyakorlat. 6. Polimorfizmus

Pénzügyi algoritmusok

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

5. Gyakorlat. struct diak {

A C programozási nyelv I. Bevezetés

Java II. I A Java programozási nyelv alapelemei

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

3. Osztályok II. Programozás II

Programozás C++ -ban

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

Kivételek, kivételkezelés a C++ nyelvben

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

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

1. Bevezetés A C++ nem objektumorientált újdonságai 3

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

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

A C programozási nyelv I. Bevezetés

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

Maximum kiválasztás tömbben

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

8. gyakorlat Pointerek, dinamikus memóriakezelés

OOP #14 (referencia-elv)

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

Információs Technológia

117. AA Megoldó Alfréd AA 117.

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

Információs Technológia

C++ programozási nyelv Konstruktorok Gyakorlat

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

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

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

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

Programozás 1. Dr. Iványi Péter

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

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

Programozás 6. Dr. Iványi Péter

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Globális operátor overloading

Programozás C++ -ban 2007/4

Szoftvertechnológia alapjai Java előadások

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.

1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;

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

Mintavételes szabályozás mikrovezérlő segítségével

A programozás alapjai

Java II. I A Java programozási nyelv alapelemei

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

Programozási Nyelvek: C++

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

Átírás:

Programozás alapjai II. (2. ea) C++ C++ kialakulása, nem OOP újdonságok: Szeberényi Imre BME IIT <szebi@iit.bme.hu> Veszélyforrások csökkentése C + javítások C++ kialakulása C++ Objektum orientált szemlélet OOP elemek M Ű E G Y T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -1- Javítások egy része átkerült az ANSI C-be. C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -2- C és C++ viszonya C és C++változatai preprocesszor preprocesszor C w. classes C++ 1979 C++03 C++98 1985 1990 1998 2003 C++0x 2010 buta C C könyvtár C könyvtár okos C C++ könyvtár 1972 1978 1983 1989 1999 2007 C C90 C99 C1X K&R C ANSI C C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -3- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -4- C99 változók és a kód keverése (for fejében is) for (int i = 1; i < 12; i++). // comment, const, enum, inline változó hosszúságú tömb (függvényben) void f(int b) int c[b]; // változó méretű tömb új típusok (pl. long long, double _Complex) Pontosabb specifikáció pl: -3/5 = 0-3%5= -3 // C89-ben lehetne -1 és +2 C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -5- C99 támogatottság Wikipedia alapján C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -6-

Általános kódolási tanácsok Olvasható legyen a kód, ne trükkös! Mellékhatásoktól tartózkodni! Nem triviális szintaxist kerülni, akkor is, ha a C nyelv szerint az egyértelmű (a+++b) Nem feltétlenül kell haragudni a break-re és a continue-re! Óra végén látni fogjuk, hogy C++-ban még a goto -t is gyakran használjuk (bár nem így hívjuk). Mi történik, ha x > 2.3? while (i < 12 && q!= 1 && k > 87 && u < 3).. if (x > 2.3) q = 0; else C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -7- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -8- és itt? while (i < 12 && k > 87 && u < 3).. if (x > 2.3) break; Általános kódolási tanácsok/2 Makrókat kerüljük, ha lehet #define max(a,b) a > b? a : b int a1 = 1; int x = max(a1&7, 3); // x =??? #define max(a,b) (a) > (b)? a : b C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -9- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -10- Általános kódolási tanácsok/2 Memória foglalás: ki foglal és ki szabadít? char *valami(char *); // lefoglal? Mit csinál? Ha foglal, kinek kell felszabadítani? Oda kell írni kommentbe! Összetartozó adatok struktúrába Konstansok, enum Style guide (pl. google-styleguide) elnevezéstől a formázásig minden le van írva C++ újdonságok, bővítések Struktúranév típussá válik Csak preprocesszorral megoldható dolgok nyelvi szintre emelése (const, enum, inline) Kötelező prototípus, névterek Referencia, cím szerinti paraméterátadás Többarcú függvények (overload) Alapértelmezésű (default) argumentumok Dinamikus memória nyelvi szint. (new, delete) Változó definíció bárhol C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -11- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -12-

logikai char egész felsorolás valós mutató referencia void Típusok integrális aritmetikai skalár összetett adatszerkezetek (tömb struktúra) és osztályok Változók mérete (ism.) sizeof kifejezés, vagy sizeof(típus) sizeof(char) --> 1 byte (>= 8 bit) sizeof(char) <= sizeof(short) sizeof(short) <= sizeof(int) sizeof(int) <= sizeof(long) sizeof(float) <= sizeof(double) sizeof(short) >= 16 bit sizeof(long) >= 32 bit Az int mindig az adott architektúra legoptimálisabb egésze. C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -13- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -14- sizeof operátor (ism.) int a[100]; int s = sizeof a; // s =???... void f(int a[], int b) int s = sizeof a; // s =??? int c[b]; // változó méretű tömb (C99!) a = sizeof c ; // futási időben értékelődik ki // sizeof: leginkább a malloc-hoz! Logikai típus bool false true aritmetikai bool automatikus típuskonverzió, ahogyan a C-ben megszoktuk. C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -15- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -16- Aritmetikai és logikai konverzió Aritmetikai típus értékkészlete 0 vagy 1 C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -17- bool bool b1, b2, b3; int i; b1 = true; b2 = 3; i = b2; b3 = false; (b2 == true, i == 1) 0 = hamis, a többi = igaz struct komplex float re; float im; ; srtruct lista_elem int i; lista_elem *kov; ; struct és rokonai c++-ban a név típus értékű önhivatkozó struktúránál kényelmes C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -18-

Konstans Két trükkös próbálkozás #define PI 3.14 helyett const float PI = 3.14; const: Típusmódosító amely megtiltja az objektum átírását (fordító nem engedi, hogy balértékként szerepeljen) Mutatók esetén: const char * p; //p által címzett terület nem módosítható char * const q; //q-t nem lehet megváltoztatni const int x = 3; int *px = &x; *px = 4; void f(int *i) *i = 4; const int x = 3; f(&x); C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -19- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -20- Felsorolás típus Prototípus enum szinek típus piros, sarga, zold = 4 ; Szigorúbb ellenőrzés, mint az ANSI C-ben. Pl: fordítási hiba szinek jelzo; jelzo = 4; jelzo = szinek(8); nincs hiba, de meghatározatlan érték létrehozása Előrehivatkozáskor kötelező Tipikus C hiba: double z = sqrt(2); C feltételezi, hogy int (double) kellene C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -21- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -22- Miért okoz problémát? a függvényt hívó rész a hívott függvény double z=sqrt(2); double sqrt(double x) int int verem regiszter double double... x.. return res; Mutatók és címek (ism.) Minden változó és függvény memóriában levő helye (címe) képezhető. (pl: &valtozo) Ez a cím ún. pointerben vagy mutatóban tárolható. A pointer egy olyan típus, amelynek az értékkészlete cím, és mindig egy meghatározott típusú objektumra mutat. int i, *ip; float f, *fp; int-re mutató pointer float-ra mutató pointer ip = &i; fp = &f; C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -23- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -24-

Indirekció (ism.) Értékparaméter (ism.) int i; int *ip; ip = &i *ip = 13; 13 i cime Memória float f; float *fp; változó v. konstans érték függvény fv.érték A paraméterek nem változhatnak meg, mivel azok értéke adódik át. Azok eredeti tartalma az eredeti helyen megmarad. A függvény csak a függvényértéken keresztül tud a külvilágnak eredményt szolgáltatni. (Ez sokszor kevés.) C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -25- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -26- Változóparaméter (ism.) Referencia változó fv.érték cím függvény A paraméter címe adódik át, így annak tartalma felhasználható, de meg is változtatható. A magas szintű nyelvek elfedik ezt a trükköt. Sem az aktuális paraméterek átadásakor, sem a formális paraméterekre való hivatkozáskor nem kell jelölni. Csupán a paraméter jellegét (változó) kell megadni. Referencia: alternatív név tipus& int i = 1; int& r = i; // kötelező inicializálni, mert // valójában egy cím int x = r; // x = 1; r = 2; // i = 2; C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -27- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -28- Változó paraméter referenciával Paraméterátadás C: void inc(int *a) (*a)++; int x = 2; inc( &x); könnyen lemarad C++: void inc(int &a) a++; int x = 2; inc(x); nem kell jelölni a címképzést híváskor érték szerint skalár struct cím szerint (tömb, változtatni kell, hatékonyság) típus& típus* Pointer paraméter és a változtatandó paraméter szétválik. C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -29- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -30-

Paraméterátadás /2 Pointer, referencia + const használatával a hozzáférés jól szabályozható: struct Data double dx[1000]; int px[2000]; void f1(data); // értékparaméter! void f1(const Data* ); void f2(const Data&); void f3(data*); void f4(data&); Függvényhívás mint balérték int x; int& f( ) return x; main( ) f( ) = 5; f( )++; f( ) = f( ) + 2; C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -31- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -32- Inline Függvény overload #define max(a,b) (a) > (b)? a : b x = 8, y = 1; x = max(x++, y++); x,y =? inline int max(int a, int b) return(a > b? a: b); Nincs trükk. Pontosan úgy viselkedik, mint a függvény, de a hívás helyére kell beilleszteni a kódot (lehetőleg). int max(int a, int b) return(a > b? a: b); double max(double a, double b) return(a > b? a: b); int x = max(1, 2); double f = max(1.2, 0.2); C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -33- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -34- Függvény argumentumok Konvertert írunk, ami tetszőleges számrendszerbe tud konvertálni. A számrendszer alapját paraméterként kapja. char *int2ascii(int i, int base = 10); Csak az argumentumlista végén lehetnek default argumentumok, akár több is. f(), f(void) - nincs paraméter f(...) - nem kell ellenőrizni f(int a, int) - nem fogjuk használni Deklaráció és definíció A deklarációs pont továbbra is legtöbbször definició is: int a; float alma; de: int fv(int x); - nem definició A típus nem hagyható el! Több deklaráció is lehet, extern int error; extern int error; Definició csak egy! C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -35- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -36-

Ott deklaráljunk, ahol használjuk Deklarációk feltételben és ciklusban y = 12; int z = 3; for (int i = 0; i < 10; i++) z += i; int k = i 1; y *= k; élettartam, hatókör u.a, mint a C-ben i, és k itt már nem létezik! (sajnos vannak eltérések) if (double d = fx(y)) cout << d; else d = 21.2; cout << d; for (int i = 10; i--;) cout << i; while (char ch = get()) cout << ch; C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -37- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -38- Névterek, scope operátor A moduláris programozás támogatására külön névterületeket definiálhatunk. Ezek neveire (azonosítóira) a hatókör (scope) operátorral (::), vagy a using namespace direktívával hivatkozhatunk. namespace Proba int alma; float fv(int i); char *nev; Proba::alma = 12; float f = Proba::fv(3); using namespace Proba; alma = 8; float f = fv(3); using direktíva A using namespace direktívával a teljes névteret, vagy annak egy részét láthatóvá tehetjük: using namespace Proba; alma = 8; float f = fv(3); using Proba::alma; using Proba::fv; alma = 8; float f = fv(3); Proba::nev = "Dr. Bubo"; C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -39- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -40- standard I/O Miért iostream? cin cout cerr iostream, iostream.h cout << "i = " << i << '\n'; cin >> i; Az "új" változatot illik használni! (névtér, wchar_t,...) C-ben ezt írtuk: printf("i=%d j=%d\n", i, j); C++-ban ezt kell: cout << "i = " << i << " j=" << j << endl; Kinek jó ez? A printf, scanf nem biztonságos! Nem lehet ellenőrizni a paraméterek típusát. A printf, scanf nem bővíthető új típussal. Lehet vegyesen? (sync_with_stdio()) C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -41- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -42-

Dinamikus memória Dinamikus memória /2 #include <malloc.h>... struct Lanc *p; p = malloc(sizeof(lanc)); if (p == NULL)... free( p ); Lanc *p; p = new Lanc;... delete p; Tömb: int *p; p = new int[10]; delete[] p; C: malloc(), free(), realloc() C++-ban is használható de csak nagyon körültekintően, ugyanis nem hívódik meg a megfelelő konstruktor ill. destruktor. Ezért inkább ne is használjuk. C++ (operátor): new, delete, new[], delete[] Figyeljünk oda, hogy a tömböket mindig a delete[] operátorral szabadítsuk fel. C++: nincs realloc()-nak megfelelő. C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -43- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -44- Mi van, ha elfogy a memória? void OutOfMem() cerr << "Gáz van\n"; exit(1); int main() set_new_handler(outofmem); double p* = new double;... Kivételkezelés Hibák kezelése gyakran nem a hiba keletkezésének helyén történik. (Legtöbbször nem tudjuk, hogy mit kell tenni. megállni, kiírni valami csúnyát, stb.) C++ típusorientát kivételkezelése: figyelendő kódrészlet kijelölése (try) kivétel továbbítása (throw) esemény lekezelése (catch) C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -45- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -46- Kivételkezelés = globális goto Kivétel2 C: setjmp( ) longjmp( ) Kritikus műveletek További műv. Kivétel1 Kivételkezelés/2 try... Kritikus művelet1 if (hiba) throw kifejezés_tip1;... Kritikus művelet2 if (hiba) throw kifejezés_tip2; catch (típus1 param)... Kivételkezelés1 catch (típus2 param)... Kivételkezelés2... további utasítások C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -47- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -48-

Hiba észlelése Kritikus szakasz Kivételkezelés példa double osztas(int y) if (y == 0) A típus azonosít throw "Osztas nullaval"; return((5.0/y); int main() try cout << "5/2 =" << osztas(2) << '\n'; cout << "5/0 =" << osztas(0) << '\n'; catch (const char *p) cout << p << '\n'; Kivétel kez. Kivételkezelés a memóriára #include <iostream.h> #include <iostream> using namespace std; int main() // set_new_handler(0); try while(true) double *p = new double; catch (bad_alloc) cerr << "Gaz van\n"; cerr << Vege\n ; return(0); C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -49- C++ programozási nyelv BME-IIT Sz.I. 2011.02.15. -50-