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

Hasonló dokumentumok
Alprogramok, paraméterátadás

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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) {} };

1. Alapok. Programozás II

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

C++ programok fordítása

C programozás. 6 óra Függvények, függvényszerű makrók, globális é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ás II. 2. Dr. Iványi Péter

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

Programozás C és C++ -ban

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

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

3. Osztályok II. Programozás II

Java II. I A Java programozási nyelv alapelemei

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

Pénzügyi algoritmusok

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Információs Technológia

Programozási Nyelvek: C++

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

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ás C++ -ban

Osztály és objektum fogalma

Java II. I A Java programozási nyelv alapelemei

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

OOP #14 (referencia-elv)

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

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

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

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

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

Memóriakezelés, dinamikus memóriakezelés

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

Bevezetés a C++ programozási nyelvbe

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

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

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

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

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

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

Programozás C++ -ban 2007/4

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

Programozási nyelvek Java

C++ Gyakorlat jegyzet 7. óra

Objektumok inicializálása

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

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

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

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

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

Programozás C++ -ban 2007/7

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Információs Technológia

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

C++ programozási nyelv Konstruktorok-destruktorok

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

Osztályok. 4. gyakorlat

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

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

Dr. Schuster György október 14.

Bevezetés a programozásba I.

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

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

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

5. Gyakorlat. struct diak {

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

A C# programozási nyelv alapjai

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

Kifejezések. Kozsik Tamás. December 11, 2016

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

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

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 alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozás módszertan

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

C programozási nyelv

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

Pénzügyi algoritmusok

Bevezetés a programozásba I.

Programozás C++ -ban

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

Készítette: Nagy Tibor István

117. AA Megoldó Alfréd AA 117.

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

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.

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

Maximum kiválasztás tömbben

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

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

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

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

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

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 II. (4. ea) C++

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Átírás:

PROGRAMOZÁSI NYELVEK - CPP ELŐADÁS JEGYZET Szerkesztette: Balogh Tamás 2013 április 12 Ha hibát találsz, kérlek jelezd a info@baloghtamashu e-mail címen! Ez a Mű a Creative Commons Nevezd meg! - Ne add el! - Így add tovább! 30 Unported Licenc feltételeinek megfelelően szabadon felhasználható 1

Előszó A jegyzet nem teljes és nem hibátlan Az esetlegesen előforduló hibákért, és kimaradt részekért felelőséget nem vállalok A jegyzet megtanulása nem biztos, hogy elég a sikeres vizsgához Az előadás sorszáma a hetek sorszámával egyezik meg A szünetek, ünnepnapok miatt elmaradt órákat is számítom Így számomra könyebb összehangolni a többi előadással, gyakorlattal Előadó adatai: Név: Pataki Norbert E-mail: patakino@eltehu Követelmények: Vizsga Konzultációk: PC3-as terem, hétfőn, csütörtökön 18:00-20:00 Vizsgák: 05 21 06 04 06 11 06 18 06 25 UV 07 02 UV 1 Előadás Programozási paradigma: paradigma: Milyen absztrakció mentén képezzük a részfeladatokat? - Imperatív programozás - Procedurális programozás (Fortran) - Generikus programozás - Objektum-orientált programozás - Logikai programozás (Prolog) - Funkcionális programozás - Dekleratív programozás (SQL, HTML) Milyen eredményt szeretnénk elérni? C++ A C++ multiparadigmás programnyelv, azaz több programozási paradigrmát is támogat: procedurális, objektum-orientált, generikus illetve (?) Szabványai: 1998: C++ első szabványa 2003: Első szabvány módosítása 2011: Jelenlegi szabvány ("C++11") 2 Előadás Fordítás: 1 Preprocesszálási fázis (előfordítás) 2 Nyeli fordítás 3 Öszeszerkesztés //Linker 2

Preprocesszálás Preprocesszor: Szövegátalakító szoftver, search & replace, file-ok másolása, szövegrészek kivágása/bemutatása, direktívák feldolgozása (#) Pl: #include <iostream> //Előre bekonfigurált include path-ban keresi a filet #include "complexh"//relatív az aktuális fileokhoz képest A következő két kódrészlet eredménye ugyanaz: int v [20]; for ( int i =0; i < 20; ++i) v[i] = i; # define N 20 int v[n]; for ( int i = 0; i < N; ++i) v[i] = i; Ha módosítani akarunk a tömbünk méretén,az első esetben több helyen is át kell írni a kódot, viszont a második esetben elég csak a direktíva értéket megváltoztatni Makrók A makrók preprocesszálási fázisban értékelődnek ki Példák makrókra: Abszolútérték # define ABS (x) x <0? -1* x:x std :: cout << ABS ( -3); // -3 <0? -1 * -3: -3 => 3 int b = -2; std :: cout << ABS (b -3) ; //b -3 < 0? => -1*b (:= c), c -3:b -3 => -1, 5 helyett A megoldás helytelensége a zárójelezés hiányából fakad Javítsuk át a makrót: #define ABS(x)((x)<0?-1*(x):(x)) # define MAX (a,b) (a) <(b)? (b) : (a) Maximum érték két szám között int i = 6; std :: cout << MAX (++i, 2); // i = - 8 lesz 3

Include-guard complexh class Complex double re, im; // ; unitsh # include " complex h" maincpp # include " complex h" # include " units h" int main () complex x; A probléma, hogy a maincpp includeolja a complexh-t és a unitsh-t is, ami szintén includeolja a complexh-t, így ützközés történik A megoldás, hogy úgynevezett include-guard-okat helyezünk el a forrásfájlainkban # ifndef COMPLEX_H # define COMPLEX_H # endif Include guard használata Linker A linkelési fázisban a fordító összefésüli/összeszerkeszti a forrásfájlokat, és egy, futtatható állományt készít Létezik statikus, illetve dinamikus linkelés Statikus linkelés során mindent feloldunk, míg dinamikus linkelés során (?) 3 előadás Nyelvi fordítás Tokenizálás - Azonosítók: std, cout - Kulcsszavak: int, return - Konstans literálok: 0 - Szöveg konstans literálok: "Hello world" - Operátorok: <<, :: - Szeparátorok: ;,, Azonosítók Betűvel kell kezdeni(vagy _ jellel), és betűvel, vagy számmal folytatni Nem lehet kulcsszó Pl:_auto, If, if, labda47 helyes azonosítok, viszont 47labda, if nem Egyes azonosítók fentartottak egy-egy szabványkönyvtárbeli azonosítónak Mivel nem ismerjük az összes szabványkönyvtárbeli nevet, figyelni kell az azonosítóink megadásakor, mert könnyen névütközéshez vezethet, különösen ha _név formátumot adunk meg Kulcsszavak: Pl: if, return, double, class, auto, while Nem lehet használni őket azonosítóként, és kisbetűvel írjuk őket 4

Konstans szövegiterál "Hello" : const char[6] H e l l o \0 const char * s = "Hell"; //Tömbök mindig konvertálódnak elsőelemre mutatópointerré Konstansok: Van egy típusa, és egy értéke 4 (int, 4) absztrakció(0,1 sorozat) De hány elemű? Nem definiált, implementációfüggő Lényeg, hogy optimális legyen 16 bites rendszer: Legnagyobb beírható int: 2 15 1 = 32767 int x; 20000 + x; //túlcsordul-e? 20000L: long típus kikényszerítése sizeof(short) sizeof(int) sizeof(long) sizeof(float) sizeof(double) sizeof(longdouble) 4 Előadás Lebegőpontos konstans 14 - double 139L - longd 11 - float 43e 1 == 4, 3 == 43 10 1 ) Karakter konstansok a, T, \u Előjel nem definiált(signed char / unsigned char), ezért sizeof(t)== sizeof(signed T)== sizeof(unsigned T) FOLYTKÖV!!! Operátorok +, /, ==, =, &&,, ++, --, +=, -= Szokásos aritmetikai konvenciók a * b, ahol * egy bináris operátor, az operandusok különböző típusúak: 1 Ha az egyik long típusú, akkor a másik is longgá konvertálódik 2 Különben ha az egyik double, akkor a másik is double-lé konvertálódik 3 Különben, ha az egyik float, akkor a másik is float-tá konvertálódik 4 Különben ha az egyik unsigned int, akkor a másik is unsigned int-té konvertálódik 5 5 Előadás Kiértékelési sorrend szekvenciapontok: ; &&, int i = 1; int v [3]; v[i] = i ++; v[1] = 1 vagy v[2] = 1 5

Élettartam, láthatóség Láthatóság acpp int i; static int j; // hasonl ó a const fogalomhoz extern int k; // namsespace //né vtelen névtér int y; namespace X int i; // x::i; void f() int i = k; if(i < j) // itt a j még nincs elfedve int i = j; void g(); void f() int j = i; // itt az i a glob á lis i, hisz nem vagyunk az X- ben j = x::i; // itt a j már az f fv- ben bel ül deklar ált j j = k; // itt is void X::g() ++i; //X::i, mivel X-ben vagyunk ::i = ::k; A :: operátorral lehet hivatkozni a globális i-re Ha nem fedem el, akkor tudok hivatkozni a globális változóra a nevükkel, mint pl az f függvényben a k-val hivatkozok az extern int k-ra static: extern: extern int k; Másik fordítási egységben kell definiálni Élettartam Hol, mikor jön létre a változó, mikor szűnik meg? Hol: memórián belül Memória: - Stack - Statikus tárterület - Heap 6

Mikor: Melyik az az időszak a program futásában, amikor a változó konstruktora lefut? Változók: - Automatikus változók - Globális / névtérbeli / osztály statikus tag - Lokális statikusok - Dinamikus változók - Temporálisak - Osztály adattag - Tömbelem Automatikus változók: runtime stacken jönnek létre Stack frame(aktivációs rekord) void f() int i = 3; // auto int i = 3; Névtérbeli / globális / osztály statikus tag: Statikusok a statikus tárterületen jönnek létre Létrejönnek a program indulásakor, és megszünnek a program futásának végén class directory static const char separator = : ; ; Lokális statikusok: Létrejön ha a vezérlés eléri a def-t, és megszűnik a program futásának végén A statikus tárterületen létre void f() static int i; Dinamikus változók: Heap memóriában jönnek létre Létrejön a new kiértékelésénél, és megszűnik a delete kiértékelésénél void f() int k; std :: cin >> k; int *v = new int [k]; delete []v; A következőkre érdemes figyelni int *p = new int [k]; delete []p; p = new int (k); delete p; delete p; // fut ási idej ű hiba ( nem lehet ké tszer felszabad í tani ) p = 0; delete p; // skippeli a NULL pointer törlését 7

6 Előadás Élettartam Osztályok nem statikus tagja: Létrejön, amikor a tartalmazó objektumot létrehozzuk, megszűnik, amikor a tartalmazó objektum megszűnik Class student double avg ; // nem statikus tag Tömbelem: Létrejön a tartalmazó tömb létrejöttekor, és megszűnik a tartalmazó tömb megszűnésekor Temporális objektumok: Létrejönnek a részkifejezés kiértékelésekor, megszűnnek kifejezés kiértékelésének a végén std :: string s,t,u; std :: string conc = s + t + u; //s+t és s+t+u is tempor á lis char * answer ( char * q) std :: cout << q; char ans [80]; std :: cin >> arg ; return ans ; Kódrészlet 1??? char ans [ 80] char * answer ( char * q) std :: cout << q; std :: cin getline (ans, 80) ; return ans ; char * answer ( char * q) std :: cout << q; static char ans [ 80]; std :: cin getline (ans, 80) ; return ans ; char * answer ( char * q) std :: cout << q; char * ans = new char [ 80]; Kódrészlet 2 Kódrészlet 3 Kódrészlet 4 8

std :: cin getline (ans,80) ; return ans ; char * p = answer (" Hogy vagy?"); std :: cout << p; delete []p; std :: string answer ( char * q) std :: cout << q; std :: string answ ; std :: getline ( std :: cin, ans ); return ans ; Kódrészlet 5 Deklarációk, definíciók int fac ( int ); // deklar áció int x; // defin íció extern int x; // deklar áció class student ; // deklar áció //A student oszt ály defin íciója: class student double avg ; Pointerek definíciói int * p, q; //p pointer, q sima int int *s [10]; // 10 elem ű int *- okat tartalmaz ó tömb int (*e) [10]; // pointer 10 elem ű int tö mbre double *a( int ) // deklar áció double (*b)( int ) //fü ggv é nypointer defin íciója( olyan fü ggv ény ahol int param éter, és double -t ad vissza 7 Előadás Alprogramok(függvények, eljárások) int max ( int a, int b) return a < b? b : a; std :: cout << max (8, max (2,4) ); Rekurzív függvények int fac ( int n) n faktoriálisát számláló rekurzív függvény 9

if (0 == n) return 1; else return n * fac ( n - 1); Paraméter átadás void f( int x) // form á lis param é ter f (4) ; // aktu á lis param é ter Paraméter átadás fajtái: - Érték szerinti - Cím szerinti - Eredmény illetve érték/eredmény szerinti - Név szerinti Érték szerinti paraméter átadás Függvényhíváskor új lokális változó jön létre, belemásolódik az aktuális paraméter értéke Függvény irányába közvetít információt Másolás: copy konstruktor Érték szerinti (tipikusan C) void f( int x) ++x; // nem vá ltozik meg az aktu á lis param é ter int y = 6; f(y); f (4) ; f(y / 7); Tömb típusú paraméter átadása int v[] = 3, 8, 2; fv(v) // Ami val ójá ban : fv (&v [0]), azaz az els ő elemre mutat ó pointerr é konvert áló dik Cím szerinti paraméter átadás y ténylegesen ugyanaz, mint az x a függvényen belül Mindkét irányba közvetít információt Nincs másolás, így gyorsabb void f( int x) Cím szerinti paraméter átadás (fiktív nyelvű kódrészlet) 10

++x; int y = 2; f(y); //y értéke 3 Eredmény szerinti paraméterátadás A függvényhívás végén az x lokális változó értéke bemásolódik az aktuális paraméterbe Hívó irányába közvetít információt void f( int x) x = 0; ++x; Eredmény szerinti paraméter átadás int y; f(y); Érték-eredmény szerinti paraméterátadás 2 másolás is történiik: x-be bemásolódik y értéke a függvény hívásakor, és a végén visszamásolódik Mindkét irányba közvetít információt void f( int x) x = 0; ++x; Érték/eredmény szerinti paraméter átadás int y = 4; f(y); Név szerinti paraméterátadás void f( int x) x = 0; ++x; Név szerinti paraméter átadás f (3) ; // Mintha érték szerint f(y); // Mintha cím szerint f(y + 2); // Mindig kiértékel ő dnek (??) t[y] + k); 11

C/C++ C-ben érték szerinti paraméterek vannak C++ érték szerinti és cím szerinti Cím szerinti paraméter átadást a & operátorral jelöljük void f( int &p) // referencia álnév ++p; Pointerek Memóriacím Megváltozhat, hogy hova mutat Nem kötelező inicializálni NULL pointer Referenciák Álnév Mindig ugyanannak az álneve Kötelező inicializálni Nincs null ref int v[] = 3,2,8,6; int i = 1; int &p = v[i]; // int &p egy álnév v ++; ++p; const int &cr = v[i]; ++ cr; / nem lehets é ges Ha nem cím szerint adjuk át, vagyis nem írjuk ki a & operátort a paraméterek elé, akkor érték szerint adjuk át, ezáltlal csak egy másolatot adunk a függvénynek, így az eredeti változókat nem módosítjuk void swap ( int &a, int &b) int temp = a; a = b; b = temp ; Két szám cseréje cím szerinti átadással int main () int x = 4, y = 6; swap (x,y); std :: cout << x << ", " << y; // eredm ény: 6, 4 void swap ( int a, int b) int temp = a; a = b; b = temp ; int main () Két szám cseréje érték szerinti átadással 12

int x = 4, y = 6; swap (x,y); std :: cout << x << ", " << y; // eredm ény: 4, 6 9 Előadás Az előadáson következő linkeken elérhető forrás- és fejállományokat mutatta az előadó: datecpp, dateh, datemaincpp Forrás - ELTE IK programtervezői informatikus szak 2013 tavaszi féléves Programozási nyelvek - CPP előadás alapján írt órai jegyzetem - Bjarne Stroustrup: A C++ programozási nyelv, 2001 13