1 Rev 1. A C++ programozás alapjai - segédlet
|
|
- Endre Király
- 8 évvel ezelőtt
- Látták:
Átírás
1 1 A C++ programozás alapjai - segédlet
2 Tartalomjegyzék 1 Bevezetés POSIX specifikáció Fordítók és fejlesztői környezetek...7 GNU-LINUX GCC...8 Windows Cygwin...8 Windows: MinGW...8 Az Eclipse IDE...8 Telepítés Windows alat...9 Az Eclipse használatának alapjai Egy egyszerű példa...10 Hello World forrás Megjegyzések, kommentek Egyszerű input / output Kimeneti formátum módosítása: Fordítási lépések Elemi adatipusok...15 Adatípusok, változók, és jellemzőik Beépítet alaptípusok Egész számok Lebegőpontos számok Karakterek Logikai típus Stringek Típuskonverzió Implicit konverzió elemi tipusokon Változó nevek Szimbolikus konstansok Kifejezések Aritmetikai operátorok Relációs operátorok Logikai operátorok Bitenkénti operátorok Auto inkrement - auto dekrement Értékadó operátorok Feltételes operátorok Vessző operátor sizeof operátor Pointerek Bővebben az elemi stringekről Precedencia Utasítások, vezérlési szerkezetek Utasítások Egyszerű feltételvizsgálat Egymásba ágyazot, többszintű feltételvizsgálat Elágazásos feltételvizsgálat Ciklusszervezés while utasítással Ciklusszervezés do-while utasítással
3 3.7 Ciklusszervezés for utasítással Ciklusszervezés tartományra for utasítással A continue utasítás A break utasítás A goto utasítás A return utasítás Függvények A függvények részei: Függvény deklaráció Függvény paraméterek és argumentumok Hatókör Argumentumok alapértelmezet értéke Parancssori argumentumok Függvények túlterhelése Függvény pointerek Összetet adatípusok Tömbök...63 Tömbök létrehozása, és hozzáférése...64 Tömbök mint függvényparaméterek Egy dimenziós tömb átadása Több dimenziós tömbök átadása Struktúrák Az osztályokról általában Tagfüggvények, vagy metódusok Adatagok, vagy tagváltozók Hozzáférési engedélyek Konstruktorok Destruktorok Osztálytagok - osztályváltozók A this változó Inicializációs lista Operátor túlterhelés Öröklődés (származtatás, bővítés) Barátosztályok (friendship) Többszörös öröklődés Polimorfizmus Absztrakt osztály: Osztály template-ek Implicit típuskonverzió inline Függvények További ismeretek az adatipusokról Union-ok Enumeráció A fájlkezelés alapjai Típusdefiníció Dinamikus memória kezelés Tárolási osztályok és típusminősítők Egyéb osztálytulajdonságok Bináris operátor túlterhelésről részletesen Konstans objektumváltozók
4 9.3 Konstans osztályváltozók Statikus tagfüggvények Tagobjektumok Objektum tömbök Osztály láthatóság Egyéb, fontosabb osztályok String osztály Preprocesszor Lépései: Direktívák:
5 1 Bevezetés 5
6 1.1 POSIX specifikáció Portable Operating System Interface olyan specifikáció, amely leírja egy általános Unix szerű operációs rendszer paramétereit. Alapvetően két témakörből áll: 1. POSIX Alapdefiníciók: System interfészek és parancsok Real-time szolgáltatások Thread szolgáltatások Biztonsági interfészek Hálózatkezelés Védelmi és vezérlő parancsok Batch kezelő programok 2. POSIX megfelelőségi tesztek 6
7 1.2 Fordítók és fejlesztői környezetek GNU-LINUX GCC Debian / Ubuntu disztribúciók esetén: cli:sudo apt-get install gcc g++ synaptic package manager software centre Windows Cygwin Eredeti fejlesztője a Cygnus Solutions. Feladata: Teljes POSIX réteg megvalósítása könyvtárak és rendszerhívások emulálására. Ennél a megoldásnál a POSIX réteg folyamatosan fut a Windowsban, ami többlet CPU kapacitást igényel. A Cygwin segítségével lefordítot programokhoz a kompatibilitási réteget biztosító lib-et is mellékelni célszerű, hogy futathatók legyenek. Felépítése: Library, ami a Unix (POSIX) rendszerhívásokat Win32-nek megfelelő rendszerhívásokat (API) valósítja meg GNU development toolchain nay számú, Unix-ra jellemző parancsot megvalósító alkalmazás (mount, sshd, Apache, grep, emacs, vi, sed, stb). Windows: MinGW Minimalist GNU for Windows a Cygwin első változatából ágazot le. A kompatibilitást direkt Windows hívásokra fordítja le. Nem biztosít teljes POSIX kompatibilitást, a teljes Unix programkínálat nem fordítható le a segítségével. Erőforrás igénye kisebb, nem igényli a kompatibilitási réteg folyamatos jelenlétét. Az Eclipse IDE Eredeti fejlesző: IBM Canada Kezelője 2004 óta az Eclipse Foundation. Java alapú fejlesztő környezet. Licence: EPL (Eclipse Public Licence) FSF szerint free licence, de nem GPL kompatibilis. Felépítés: 7
8 Workspace Plugin rendszer Az Eclipse IDE Telepítés Windows alatt 1. Java runtime install Download html 2. MinGW (Minimal GCC for Windows) letöltés Downloads Installer: mingw32-base mingw32-gcc-g++ PATH_ba beírni a MINGW/bin-t: 5. file explorer-ben ráálni a c:mingw/bin-re, jobb gomb és copy 2. control panel: system and security -> system ->advanced fül, és environment variable. 3. PATH után beírni ; után a bemásolt útvonalat! 3. Eclipse CDT letöltés Átnevezés a hosszú filenév elkerülése miatt eclipse.zip-re Eclipse indítás. New project -> C++ -> Hello world Project properties -> c/c++ build -> Tool Chain Editor-ban MINGW-t beállítani Cross GCC helyett Ha internal build helyett make-re állítjuk, a Project Properties -> C/C++ Build-ben a make-et migw32-make -re kell módosítani. Az Eclipse használatának alapjai 8
9 1.3 Egy egyszerű példa Hello World forrás #include <iostream> // preprocesszor direktíva int main(void) // főprogram, függvény neve { // utasításblokk kezdete std::cout << Hello World\n ; //kiíratás } // utasításblokk vége #include preprocesszor direktíva A fordítás előtt bevágja a megadott fájlt mint szövegállományt a forrásba. Az iostream.h ey u.n. header fájl, amely az iostream-mel kapcsolatos deklarációkat és definíciókat tartalmazza. Régebbi környezetekben iostream.h, újabban iostream. Int main() - a program legmagasabb szintű végrehajtandó függvénye A függvényeknek lehet 0, vagy több paramétere. A void azt jelöli, hoy nincs paraméter. Jelen esetben a függvény visszatérő értékének típusa integer. Minden C++ programnak ey, és csak ey main() függvénye van. A programvégrehajtás a main()-en kezdődik. { - a függvény testének a kezdete (utasításblokk kezdete) A következő sor a main()-t alkotó utasítások sora. Minden utasítást ;-vel kell lezárni. Hello World\n string kiíratása a cout output stream-re. \n - újsor karakter jelölése. std:: - Standard IO névtere. cout - Standard output stream. << - túltelített operátor. Balértékként az output stream-et, jobbértékként ey kifejezéstkell megadni. } - A függvény testének a vége (utasításblokk vége) A kiterjesztés a UNIX szerű környezetben.cc, Windows környezetben cpp. (Helloworld.cc vagy Helloworld.cpp) Fordítás: g++ HelloWorld.cc A kimenő fájl jelen esetben a.out, de a -o fordítási opcióval tetszőleges kimenő fájlnév megadható. 9
10 1.3.1 Megjegyzések, kommentek // általában tört soros megjegyzés /* általában hosszabb, akár több soros megjegyzés */ Alapvető szabályok: A megjeyzések nem eymásba áyazhatóak. A megjeyzés leyen érthetőbb, mint a programrészlet, amit leír! Túl sok megjeyzés csökkenti a program olvashatóságát. Beszélő szimbólumok használata csökkenti a megjeyzések számát. A megjeyzéseket általában angolul írjuk! "Mérőszám: WTF/minute" 10
11 1.3.2 Egyszerű input / output Operátorok: << kiírás stream-be >> beolvasás stream-ből A stream-ek az <iostream.h> vagy az <iostream> include fájlok segítségével érhetők el. A std:: névtérben vannak elkülönítve, tehát vagy a std:: névtér hivatkozással kell őket használni, vagy using namespace std; paranccsal. cout kiviteli stream cin beviteli stream 11
12 1.4 Fordítási lépések 12
13 2 Elemi adattipusok 13
14 2.1 Adattípusok, változók, és jellemzőik A változók adatok átmeneti tárolására szolgálnak. A fordító a RAM-ban foglalt memóriatartományban helyezi el őket. Ez természetesen nem áll a const előtagú szimbólumokra. (Lásd később.) A változókat két atríbútummal jellemezzük. Típus - a változó definiálásakor adandó meg, a továbbiakban nem lehet megváltoztatni. Érték - tetszőleges időpontban újraírható. Definíció és értékadás A változó első értékadása az inicializálás. A példában a definíció és az értékadás elkülönül, de inicializáláskor ez eyüttesen is elvégezhető. Inicializálás nélkül elvileg lehetséges használni a változókat, de ilyenkor az értékük véletlenszerű. Értékadás Ennek során a válozóhoz konkrét értéket rendelünk. A = 3; int a (3); int a {3}; // -std=c++11 vagy -std=gnu++11 Beépített alaptípusok Alaptípusok int egész float lebegőpontos double dupla pontosságú lebegőpontos bool logikai char karakter wchar_t széles karakter void típus nélküli Módosítók: signed előjeles unsigned előjeltelen short rövid tárolási mód long hosszú tárolási mód Egész számok Típusok: (Alapértelmezés: signed) 14
15 short int vagy short tárolási eységre kell optimalizálni, de legalább 2byte int legalább 2 byte long int vagy long legalább 4byte long long int vagy long long legalább 8byte unsigned... signed... Literalok: Számérték valamilyen számrendszerben kifejezet alakja int (alapértelmezés) 19L long 19LL long long 19U unsigned 19LU long unsigned Lebegőpontos számok Típusok: (Alapértelmezés: signed) float 4byte double legalább annyi, vagy több byte, mint a float 8byte long double legalább annyi, vagy több byte, mint a double 8 vagy 10 byte Literalok: 0.06F- float szimpla pontosság 0.06 double dupla pontosság 0.06L long long double 2.132E-3 exponenciális alak Számrendszerek ábrázolása 45 decimális 045 oktális 0X45 hexa Karakterek A karakter kódja numerikus érték, a kódrendszertől függ. Legelterjedtebb: ASCII. Pl 'A' = 65, 'a' = 97 Alapértelmezet a signed, de lehet unsigned is. Típusok: (Alapértelmezés: signed) 15
16 char 1byte. de legalább annyi helyiérték, hoy 256 érték tárolására alkalmas leyen! Ez alapján tárolhat ASCII vay UTF-8 kódot is. wchar_t 2 vagy 4 byte Előfordulhatnak még: char8_t char16_t char32_t uchar Példák: Signed char leter = 'A'; unsigned char row = 2, column = 4; Literalok: 'A' '\r' carriage return '\n' new line '\t' vízszintes tabulator '\v' függőleges tabulator '\b' backspace '\f' formfeed '\\' - backslash '\'' - aposztróf '\ ' - idézőjel '\ooo' oktális számmal ábrázolt ascii kód '\0' null kódú karakter '\a' alert '\?' - kérdőjel Logikai típus Valójában int-tel egyenértékű típus. Értéke 0, vagy nem 0, de a jobb olvashatóság érdekében használható helyete a vele egyenértékű bool. Típusok: bool - 1 byte Literalok: true false Stringek A string változó értéke az a memória cím, ahol a string kezdődik. A stringet mindig \0 karakter 16
17 zárja le: H E L L O \0 Típusok: (Alapértelmezés: signed) char* A hossz tetszőleges. Literalok: "Hello World\n" "Name\tAddress\tPhone" Több soros literal: "This is an example \ of a multi line literal" Figyelem! A nem azonos 'A'-val! valójában egy \0, de a típusa nem azonos a karakter típussal. String osztály. Létezik egy standard string osztály is, ami a std névtérben a <string> header segítségével érhető el. Típuskonverzió C stílusú típusmódosítás lehetséges bármikor, a kívánt új típust a változó, vagy érték neve elé írva zárójelben, vagy a típus után írva zárójelben a kifejezést. Példa:... int i; float f = 3.14; i = (int) f; // eredmény: 3 i = int (f); // C++-ban ez is elfogadot Ez a fajta C típusú típusmódosítás több lehetséges eljárást is tartalmaz. A C++ ezeket explicit módon el tudtja különíteni: i = static_cast<int> (f); Implicit konverzió elemi tipusokon Példa: short a=2000; int b; b=a; Az automatikus konverzió helyes adatot hoz létre, ha nagyobb pontosságú típusba konvertálunk. Figyelem! Előjelesség esetén, ha előjeleset konvertálunk előjeltelenné, a ketes komplemens érték jelenik 17
18 meg. Változó nevek A változó névnek a következő követelményeknek kell eleget tenne: Tartalmazhat betűket 'A'-'Z' és 'a'-'z' tartományban. Tartalmazhat számjeyeket '0'-'9' tartományban, de nem az első helyen. Tartalmazhat '_' karaktert. Nem tartalmazhat kulcsszavakat és műveleti jeleket. Hossza elvileg nem limitált, de yakorlatban általában 255 karakter. Szimbolikus konstansok Const double PI = ; Definíciókor inicializálni! Ismételten már nem kaphat új értéket. Érvényes a const SIZE = 500; is, ekkor az alapértelmezett típus int. A konstanst a fordító több módszerrel kezelheti fordításidőben: immediate értékként, vay regiszterben tartott változatlan értékként (pl. 0 értékű regiszter az avr-g++ esetén) Függvényekkel kapcsolatos megjegyzések: függvény bármelyik paramétere lehet konstans: int power (const int base, const int exponent); Stilisztikai megjegyzés: A konstansokat általába a header fájl-okban definiáljuk, hogy az értékük ismert legyen. 18
19 2.2 Karakteres input / output, bővebben További csatornák: cerr - standard kiviteli stream hibaüzenetek számára clog - standard log output Kimeneti formátum módosítása Manipulátorok segítségével lehetséges, melyeket az #include <iomanip> segítségével vehetünk igénybe. Ezek: setw(n): cout << setw(5) << << endl; // a nyomtatási oszlop szélessége Ez az egyetlen olyan manipulátor, amely csak a következő paraméterre érvényes. Az összes többi perzisztens, tehát mindaddig érvényben marad, amíg felül nem írjuk. Setprecision(n) cout << setprecision(2) << << endl; // a nyomtatot számjegyek száma Ebben az esetben az eredmény: 3.6 Ha csak a tizedes jegyek számát akarjuk állítani, előbb aktiválni kell a fixed flag-et. Ez NEM függvény! Cout << fixed << setprecision(2) << << endl; // a nyomtatot számjegyek száma setbase(n) cout << setbase(16) << 245; // hexadecimális kimenet left és right Flag-ek. Hasonlóan a fixed-hez, ezek sem függvények! Cout << left << setw(6) << 3; // a 6 széles oszlop bal oldalára igazít. Showpoint és noshowpoint Flag-ek. A lebegőpontos szám végét feltölti nullákkal a megkívánt pontosságig. Cout << fixed << setprecision(4) <<showpoint << 3.2; // eredménye:
20 3 Kifejezések Bármilyen számítási sorozat, aminek kiértékelhető eredménye van. 20
21 3.1 Aritmetikai operátorok Operátorok: + összeadás - kivonás * szorzás / osztás % maradék Figyelem! %-ot kivéve minden operátor int és real tetszőleges kombinációját elfogadja. % mindkét paramétere int. Ha mindkét operandus int, az eredmény int. Az egész osztás hozhat nem várt eredményt: 9 / 2 eredménye 4 (NEM 4.5)! -9 / 2 eredménye -5 (NEM -4)! Ha legalább az eyik operandus real, az eredmény is real (pontosabban double). Ha real eredményt akarunk: type cast (típusmódosítás), ellenkező esetben egészosztás történik. int dist = 500; int time = 50; double speed = dist / (double) time; Ügyelni kell a túlcsordulásra! A következő művelet rossz eredményt ad unsigned char a = 64 * 4 // az eredmény 0 lesz. 0-val osztás: fordítási időben az operandusokat nem ellenőrzi a fordító, 0-val osztás futásidejű hibát, és általában leállást eredményez. 21
22 3.2 Relációs operátorok A relációs operátor operandusai számértékkel kell, hogy rendelkezzenek. Kiértékelés után egy bool értékkel ekvivalens. Operátorok: == eyenlőség!!!!= nem eyenlőség <= kisebb eyenlő (sorrend!) >= nayobb eyenlő (sorrend!) < kisebb > nayobb Példa: 'A' < 'F' // helyes "HELLO" < "WORLD" // nem helyes 22
23 3.3 Logikai operátorok Nincs valódi beépítet bool típus, eléggé elterjedt, hogy int-et használnak helyete. Operátorok:!!!! negálás (unáris operátor) && Logikai ÉS Logikai VAGY Figyelem! Értéke valójában 0 vay nem 0 lehet. Kiértékelés balról: ha a && baloldali feltétel nem teljesül, vay a bal oldali feltétel teljesül, nem folytatódik a kiértékelés. Tehát a jobb oldali kifejezésnek ne szánjunk mellékhatást, mert nem biztos, hoy végre lesz hajtva! Példák:!130 // értéke && 3200 // értéke // értéke 1 (0xaa & 0x55) && 255 // értéke 0 (false) if ( (i<10) && (++i<n) ) { /*...*/ } // note that the condition increments i 23
24 3.4 Bitenkénti operátorok Operátorok: ~ bitenkénti negálás & bitenkénti ÉS bitenkénti vay ^ kizáró vay << léptetés balra >> léptetés jobbra Mivel a léptetés az implementáció függő előjelet nem tudja egységesen kezelni, célszerű eleve előjeltelen vátozókon használni. Példák: unsigned char x = '\011'; unsigned char y = '\045'; x: y: ~x: x & y: x & y: x ^ y: x << 1: x >> 1:
25 3.5 Auto inkrement - auto dekrement Prefix-ként: először műveletvégzés, majd az így nyert változót értékadáshoz használjuk Postfixként, elöször értékadás, majd művelet a változón. ++ inkrement (prefix / postfix) -- dekrement (prefix / postfix) Példák: int k = 10; int j = ++k; // j: 11, k: 11 int j = k++ // j: 10, k: 11 25
26 3.6 Értékadó operátorok Érték letárolása valamilyen módon megadot memória címre. Az értékadó operátor egy olyan kifejezés, melynek értékét a bal oltali operandusban tárolni kívánjuk. lvalue írhatónak kell lennie, memória cím - eyelőre csak változó nevet láttunk példának. rvalue lehet változó, de lehet konstans (literal) is Tehát (lvalue = rvalue) hatására: 1. rvalue átmásolódik lvalue-be 2. visszatés az átmásolt értékkel, ami ismét használható rvalue-ként. Így lehetséges többszörös értékadás is. Az értékadást megelőzheti egy művelet (mellékhatással). = eyszerű értékadás += hozzáadás...ennek mintájára valamennyi bináris operátor használható az = jel bal oldalán! Példa: // a többszörös értékadás alapja, hogy az értékadés mellékhatásán kívül // visszatérő értéke is van. int j, k, l; j = k = l =10; // ( j = (k = (l = 10))); j += k = l = 10 // j = j + (k = l = 10); 26
27 3.7 Feltételes operátorok Operátorok: operandus1? Operandus2 :::: operandus3 ha op5 nem 0: op2 kifejezést kell kiértékelni, és ez lesz a visszatérő érték, ha op5 nulla: op3 kifejezést kell kiértékelni. és ez lesz a visszatérő érték. Példák: int j = 1, k = 2; int min = j < k? j : k; // Mivel a feltételes operátorok végül egy kifejezést képeznek, // több is egymásba ágyazható. Int j = 1, k = 2, l = 3; int min = j < k? (j < l? j : l) : (k < l? k : l); 27
28 3.8 Vessző operátor Több kifejezés kiértékelése egyszerre. Visszatérő érték a legutolsó kif. Értéke. Azoknak a kifejezéseknek, melyek nem visszatérő értékek, természetesen csak akkor van értelmük, ha van mellékhatásuk. Példa: int j, k, min; int jctr = 0, kctr = 0; min = j < k? jctr++, j : kctr++, k; 28
29 3.9 sizeof operátor Operandusa egy típusnév, vagy egy kifejezés. A visszatérő érték implementáció függő. 29
30 3.10 Pointerek Egy bizonyos memória hely címe. Értékére ritkán vagyunk kiváncsiak, többnyire hivatkozásként használjuk. Operátorok: * operátor jelentése: "point to" & operátor jelentése "address of" Példa: int* ptr; char* ptrchar; int num; ptr = # Figyelem! A * mint dereferencia operátor: argumentuma ey pointer, ami feloldja a hivatkozást, tehát *ptr ekvivalens lesz a num-mal. A pointer definiálásakor meg kell adni, hoy milyen típusra mutat. A pointer típusától függetlenül lehet neki 0 értéket adni. (neve: null pointer) A pointer típusát lehet módosítani (type cast) pl. ptrchar = (char*) ptr; (csak indokolt esetben) típusfüggetlen pointer: void* anyptr; Pointerekkel kapcsolatos megjegyzések: const int* size = 38 // integer konstansra mutató pointer változó int* const age = 42 // konstans pointer, ami integer változóra mutat *size = 40; // Hibás age = 0L; // Hibás age = size; // Hibás *age = 40; // Helyes size = 0L; // Helyes size = age;// Helyes 30
31 3.11 Mellékhatás és visszatérő érték Rendszerint a lényeg a kiértékelés során kapot eredmény, de a kiértékelés során más is történik: 1. kiszámítódik a számítási sorozat eredménye, 2. mellékhatások: néhány operátor a rendszer állapotában is változást idéz elő (pl. értékadás, inkrementálás, dekrementálás. Példa: cout << Hello << World ; Balról jobbra lesz végrehajtva. Cout << Hello mellékhatása nyomtatás, visszatérő értéke a cout stream címe. Így a (cout << Hello ) << World második lépésben már egyenértékű lesz ezzel: cout << World 31
32 3.12 Bővebben az elemi stringekről Hozzunk létre két stringet: char* str1 = "firstname ; char* str2 = "lastname ; A műveletet a következő módon lehet értelmezni: az (idézőjel) operátor mellékhatása, hogy a memóriában elhelyezi a megadot karakterláncot, és '\0' karakterrel lezárja. Ugyanakkor a visszatérő értéke az a memóriacím, ahová a stringet elhelyezte. Tehát az eredmény: két '\0'-val lezárt karakterlánc a memóriában, és két pointer típusú változó, amely a karakterláncok kezdőcímét tartalmazza. A C++11 óta azt is jelezni kell, hogy a stringet csak olvasható memóriaterületre kell elhelyezni, tehát: const char* str1 = "firstname ; const char* str2 = "lastname ; Ebből ugyanakkor az is következik, hogy a: str1 = str2; nem a string tartalmát tölti át, csak egyik pointert a másikba. Ugyanakkor: str1 = "middlename ; Memóriában létrehoz egy stringet middlename és a címét str1-be tölti. A memóriában levő string átírása elvileg a következő függvénnyel végezhető el: <string.h> strcpy(char* dest, char* source) Azonban a dest csak olvasható memóriaterületre mutat, így ez a függvény nem működhet. A megoldás: 32
33 3.13 Precedencia 33
34 4 Utasítások, vezérlési szerkezetek 34
35 4.1 Utasítások Szekvenciális műveletek mellékhatással. 1. Egyszerű utasítás: egyetlen utasítás :::--vel lezárva. Példa: int i; // egyszerú utasítás: vált definíció ++i; // művelet (mellékhatással) i + 8; // ; -vel lezárt kifejezés művelet (mellékhatás nélkül) ;;;; // null utasítás 2. Összetet utasítás, vagy blokk: {} közé zért egyszerű utasítások. Lehetővé teszik, hoy több utasítás írjunk oda, ahová eyébként csak eyet lehetne Korlátozzák az érvényességi kört (scope) Típusok: deklarációk hozzárendelés (értékadás) műveletek feltételes elágazások ciklusszervező utasítások végrehajtás vezérlők 35
36 4.2 Egyszerű feltételvizsgálat If (kifejezés) utasításblokk1; else utasításblokk2; Példa: if (account > 0) { interest = account * debitpercentage; account = account + interest; // kiemelhető } else { interest = account * creditpercentage; account = account + interest; } Példa feltételes kifejezéssel egyszerűsítve: account += account? ( account * debitpercentage : account * creditpercentage); Példa további egyszerűsítéssel: account += account * (account? debitpercentage : creditpercentage); 36
37 4.3 Egymásba ágyazott, többszintű feltételvizsgálat if (kifejezés1) { utasítás1; } else if (kifejezés2) { utasítás2; } Vagy: if (kifejezés1) utasítás1; else if (kifejezés2) utasítás2; 37
38 4.4 Elágazásos feltételvizsgálat Valójában használható lenne helyete az if else if szerkezet, de a switch olvashatóbb. switch (kifejezés) { case constant1: utasítások1; break; case constant2: utasítások2; break;... default: utasításokn; break; } Példa: A, S, K, L mint kurzormozgató billentyűk: switch (key) { case 'a': ++y; break; case 's': --y; break; case 'k': ++x; break; case 'l'; --x; break; default: cout << "Error\n"; break; } Viyázat! A break elhayása nehezen ellenőrízhető hibát okoz. Az utolsó break után beírt utasítást nem jelzi hibának - de nem is hajtja végre. 38
39 4.5 Ciklusszervezés while utasítással while (kifejezés) { utasítások; } kifejezés: ciklusfeltétel utasítások: ciklus törzs Figyelem! Végtelen ciklust a rendszer nem ellenőrzi 39
40 4.6 Ciklusszervezés do-while utasítással do { utasítások; } while (kifejezés); ritkábban használt akkor célszerű, ha mindenképp le kell eyszer futtatni a ciklust Figyelem! Végtelen ciklust a rendszer nem ellenőrzi 40
41 4.7 Ciklusszervezés for utasítással Leggyakoribb felhasználás: lépéses ciklus ilyenkor inkább javasolt, mint while for (kifejezés1; kifejezés2; kifejezés3) { utasítások; } kifejezés1 kiértékelésre kerül 3. Minden futási ciklusban ha kifejezés2 kiértékelésre kerül, 4. ha kifejezés2 nem 0, kifejezés3 és utasítások végrehajtása. Példa: long sum; // hatóköre kívül van a for ciklus törzsön. for (short i = 1; i < n; ++i) { // i hatóköre kívü a cilustörzsön. sum += i; } ciklusváltozó hatóköre nem a ciklusmag, hanem maga a ciklus. bármelyik kifejezés lehet üres for utasítások eymásba áyazhatóak minden kifejezés helyére több is beírható, ha használjuk a, (vessző) operátort. Természetesen csak az utolsó ad vissza értéket, de pl. több ciklusváltozót íy lehet eyszerre inicializálni. Példák: for ( ; i!= 0; ) // megfelel: while (i!= 0) for (;;) // megfelel: végtelen ciklus (üres feltétel = true) for (i = 0, j = 0; i + j < n; ++i, ++j) { utasítások; } Vigyázat, gyakori hiba: for (...); // a ";" miatt a ciklus további része csak egyszer fut le. {... } CycleDemo.cc Sum.cc 41
42 4.8 Ciklusszervezés tartományra for utasítással Megadható egy halmaz, amin elemenként megy végig. For ( declaration : range ) statement; Példa: string str { Hello! }; for (char c : str) { std::cout << c; } std::cout << '\n';;;; 42
43 4.9 A continue utasítás Kihagyja a ciklusmag további végrehajtását és új ciklusfejet kezd. Példa: // Páros számok összeadása n-ig for (i = 0; i < n; ++i) { if ((n % 2)!= 0) // elég lenne if (n % 2) is, de így olvashatóbb continue; sum += i; } 43
44 4.10 A break utasítás Megszakítja a ciklus, vagy a switch futását. Példa: gondoltam egy számot 3 kisérlet for (i = 0; i < 3; ++i) { cin >> i; if (i == n) { break; } cout << "Wrong!\n"; } if (i == n) cout << "gotja\n"; else cout << "looser\"; 44
45 4.11 A goto utasítás Alacson szintű ugró utasítás. Példa: for (i = 0; i < try; ++i) { cout << Enter password: ; cin >> pw; if (Verify(pw)) // check password for correctness goto out; // drop out of the loop cout << Wrong!\n ; } out: 45
46 4.12 A return utasítás Visszatérő érték generálása. Eddig csak a main() ben használtuk. Return kifejezés; 46
47 5 Függvények Műveletszekvenciák csoportosítása. 47
48 5.1 A függvények részei: prototípus, vay interfész (visszatérő típus, név, paraméterek vay aláírás) törzs (utasítások) Használat: hívás. argumentumok kiértékelése (minden argumentum ey a megfelelő paraméterrel azonos típusú kifejezés) a fenti kifejezések eredményeinek hozzárendelése a megfelelő paraméterekhez függvénytörzs végrehajtása visszatérő érték átadása a hívónak Figyelem! nem-void függvény: kifejezés void függvény: utasítás. Példa int power (int base, unsigned int exp) // prototype: base és exp lokális változók { int result = 1; // lokális változó for (int i = 0; i < exp; ++i) // végrehajtás result *= base; return result; // visszatérő érték } int main (void) { cout << "2 on the power of 3 is" power (2, 3); // függvényhívás } 48
49 5.2 Függvény deklaráció A függvényt mindíg csak akkor szabad használni, ha már deklarálva volt. Definíció maga is deklaráció, ha elől van, de javasolt kiyűjtött deklarációk használata. Deklaráció - prototype-pal. Deklaráció interfészébe konkrét változó nevek nem kellenek, de javasoltak. A paraméter listában minden paraméternek kell típus, vesszővel nem lehet több azonos típusú paramétert felsorolni. 49
50 5.3 Függvény paraméterek és argumentumok Két paraméter típus C++ -ban (vegyesen is használható egy paraméter listában): Érték szerinti átadás: a függvény lemásolja az argumentumot (változások nem hatnak vissza). Referencia szerinti átadás: pointerrel, vay referenciával. A függvény hozzáférést kap a paraméterhez, és változtathat rajta. Az alábbi példákban az increment függvény feladata, hogy a neki átadot változó értékét megnövelje. Erre a célra érték szerinti paraméterátadást nem használhatunk, mert az inkrementálás a függvénytörzsben csak az argumentum másolatán történik meg. Példa átadás érték szerint változóban ROSSZ! void increment (int number); int main() { int num = 4; increment(num); cout << num << '\n'; // kiíratás: 4 } void increment (int number) // rossz, mert itt number másolatán fog dolgozni { + +(number); } Példa pointer szerinti átadás void increment (int* nptr); int main() { int num = 4; int* numptr = # increment(numptr); cout << num << '\n'; } void increment (int* nptr) { ++(*nptr); } Példa referencia szerinti átadás void increment(int& number); int main() { int num = 4; increment(num); cout << num << '\n'; } void increment(int& number) { ++number; } 50
51 5.4 Hatókör Globális: Élettartamuk a program teljes futási ideje. Minden ami a program hatókörében van definiálva (tehát nem függvényben, vay osztályban, vay szeparált blokkban. Inicializálatlan globális változók értéke 0-ra van automatikusan beállítva. Mivel a teljes programból láthatók, névadás leyen eyedi! Lokális: Élettartamuk csak a blokk elejétől a végéig tart. Minden, ami utasításblokkon belül van. Függvényparaméterek a függvénytörzsön belül lokálisak. Névadásnak csak a blokkon belül kell eyedinek lenni. Ha a hatókörök eymásba áyazódnak, a belső névadása felülírja a külsőt. Ha felülírt globálisra akarunk hivatkozni, azt a :::nnnév jelöléssel lehet. Példa: { } int xyz; void fnc (int xyz) if (xyz > 0) { double xyz; // xyz globális // xyz lokális a fnc-n belül // xyz lokális a blokkon belül //... } ;;;::xyz = 0; // hívatkozás a globális változóra 51
52 5.5 Argumentumok alapértelmezett értéke A default argumentumokat mindíg a paraméterlista végén kell felsorolni! Célszerű meghatározás a deklarációban. Lehet a definícióban is, de soha nem mindkét helyen! { } { } Példa: int main() int a = 4; int b = 5; cout << add(a, b) <<, ; // teljes paraméterlista cout << add(a) << endl; int add(int number1, int number2) return number1 + number2; // második argumentum elhagyva 52
53 5.6 Parancssori argumentumok Parancssori konzol segítségével indítot programnak szüksége lehet paraméterekre. A main() függvénynek két -féle definíciója létezik: int main(void); int main(int argcj, char* argv[]); Az argc azt adja meg, hogy hány paramétert kapot a program a parancssorban. A második paraméter egy string tömb, aminek első, tehát 0 indexű eleme magának a programnak a neve, a többi pedig a parancssorban beérkezet paraméterek. Például a sum parancs: argc = 3; argv[0] értéke: sum, argv[1] értéke: 2 stb. Példa: int main(int argc, int *argv[]) { int sum = 0; for (int i = 1, i < argc; ++i) sum += argv[i]; cout << sum << '\n'; return 0; } 53
54 5.7 Függvények túlterhelése A programot ovashatóbbá teszi, ha az azonos feladatot ellátó függvények azonos nevet kapnak. A C++ megengedi a függvények túlterhelését, azaz ugyanazon függvénynéven több függvény definiálását. A feltétel, hogy a függvényeket az argumentumok és a visszatérő érték típusai, tehát az u.n "aláírás" egyértelműen megkülönböztessék. Példák: long gettime(); void gettime(long* time); void gettime(int* hours, int* minutes); void gettime(int& hours, int& minutes); 54
55 5.8 Függvény pointerek Lehetséges a függvény címét letárolni és hívatkozni rá. 1. Legyen több olyan függvényünk, aminek két int paramétere van és int-tel tér vissza: int f1 (int a, int b) {...} int f2 (int c, int d) {...} 2. Definiáljunk egy pointer típusú változót, ami egy ilyen függvényre mutat: int ( * fptr) (int, int) 3. Adjunk az fptr-nek értéket: fptr = &f1; De elegendő: fptr = f1; 4. Hívás: int result = fptr(5, 7); Példa: { } int increment(int a) {return a+1;} int main() int (*fncptr)(int); // fncptr = &increment; helyet elegendő: fncptr = increment; cout << fncptr(3) << endl; // eredmény: 4 return 0; 55
56 6 Összetett adattípusok 56
57 6.1 Tömbök Tömbök létrehozása, és hozzáférése Azonos típusú elemek halmaza. Hivatkozás sorrend alapján: tomb[index] Index 0...size-5 Neve csak a tömbnek van, az elemeknek nincs. Elemek összes lehetséges száma: dimenzió - nem keverendő össze a dimenziók számával. A dimenzió futás közben nem változtatható, mert fordításidőben kerül a memória lefoglalásra. Dimenzió túllépés eredménye: jó esetben futásidejű hiba generálódik, rossz esetben kiszámíthatatlan. Definíció: int a[3]; Figyelem! Dimenzióban ugyanaz, mint int* a; de ezt nem lehet definícióként használni, mert nem tudni, hogy mennyi memóriát kell foglalni. Inicializáció int a[3] = {2, 4, 6}; int a[3] = {2, 4}; // a[2] értéke 0 int a[] = {2, 4, 6}; // a[] mérete 3 Hivatkozás A tömb neve index nélkül egy pointert ad vissza, ami a tömb első elemére mutat, de csak ha ez az egyszerűsítés nem egy olyan elemre mutat, ami maga is pointer (pl. két dimenziós tömb). Példa: int a[] = {2, 4, 6, 8}; int* aptr = a; cout << a[0] << ',' << *aptr << endl; cout << a[1] << ',' << *++aptr << endl; // a két kiíratás ugyanazt adja cout << a[1] << ','<< aptr + 1 << endl; // nem ugyanaz, mert prioritásosabb, mint + cout << a[1] << ',' << *(aptr + 1) << '\n'; // így már ugyanazt adja Stringek A string egy karaktertömb. Lehetséges inicializálás: char name[] = {'H', 'E', 'L', 'L', 'O'}; // mérete 5 - nem string!!!! char name[] = {"HELLO"} // mérete 6, mert a '/0' is a végére kerül. Ez a tényleges string. Többdimenziós tömb A több dimenziós tömb tárolása valójában sorfolytonosan történik. int a[2][3] = { 2, 4, 6, 8, 10, 12, }; Sorfolytonos tárolás int a[2][3] = {2, 4, 6, 8, 10, 12}; Pointer aritmetika 57
58 A pointerhez lehet egész számot hozzáadni, vagy abból elvenni. Tömbök mint függvényparaméterek 58
59 6.1.1 Egy dimenziós tömb átadása Pointer segítségével Mivel az egy dimenziós tömb neve a [] nélkül egyenértékű egy a 0. elemére mutató pointerrel, használhatjuk ezt paraméter átadásra. { } Void f1(int *a)... Átadhatjuk a tömböt a pontos méretével együtt: { } Void f2(int a[10])... A tömb méret nélkül is átadható: Void f3(int a[]) {... } Mindhárom fenti példa egyenértékű, mert a C++ a tömböket alapértelmezés szerint a pointerükkel adja át, és nem az értékükkel. FIGYELEM! A tömbök kezelésénél nincs index határ figyelés, tehát ezt magunknak kell megoldani! A fenti függvények használata ezután mindhárom esetre: int main() { int b[10] = {10, 11, 12, 13, 14}; cout << f1(b); } 59
60 6.1.1 Több dimenziós tömbök átadása int f1(int *a, int b[3][4]) { return a[0] + b[0][0]; } vagy az első paraméter elhagyható: int f1(int *a, int b[][4]) { return a[0] + b[0][0]; } Használata: int main(int argc, char *argv[]) { int x[10] = {1, 2, 3}; int y[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; cout << "f1: " << f1(x, y) << endl; } return 0; 60
61 6.2 Struktúrák Valójában hagyaték a C nyelvből. Struct típusnév { típus1 vátozónév1; típus2 változónév2;... } objektumnév ; A struktúra létrehoz ey új típusnév típust. Ha csak ey példányt akarunk, nem kell típusnév, az objektum azonnal létrehozható (objektumnév). Ekkor természetesen nem kapunk típusnevet, ami a továbbiakban használható lenne újabb uyanilyen típusú objektum létrehozására. Példa: Person postman = { Robert, 55}; // hívatkozás struktúra mezőre struktúrán keresztül: cout << postman.name << endl; // hívatkozás struktúra mezőre pointeren keresztül: Person *ptrpostman = &postman; cout << (*ptrpostman).name <<, << ptrpostman age << endl; 61
62 7 Az osztályokról általában Objektum: az OOP alapeszköze. Az OOP egyik alapelve a becsomagolás vagy encapsulation. Lényege: egy objektumot alkozó összes tulajdonságot egy egységbe tömörítjük. Az objektumokat nem egyenként hozzuk létre, hanem egy előre definiált osztály példányosításával. Az osztály egy típust hoz létre, ami a beépítet típusokkal azonos módon használható. A struktúra és a union lényegében speciális osztályok. C++-ban osztály a struct és a class kulcsszóval egyaránt létrehozható. Alkotóelemei: tagfüggvények, vay metódusok adattagok, vay tagváltozók. Felépítés: Fejléc (header): Osztálynév és alaposztályok (ezekből származtathatjuk az új osztályt). Törzs (body): Az osztály tagjainak (members) felsorolása Példa: class Point { private: // a default értelmezés: private int xcoord, int ycoord; bool active; public: void set(int, int); void move(int, int) }; Az osztályokat rendszerint a header file-ok tartalmazzák. A változóktól eltérően az extern minősítő használata osztályoknál nem szükséges. A jó olvashatóságot segíti, ha a deklarációk az osztályban (.h modulban), de a definíció a.cc modulban van. Nem kötelező, de eyre elterjedtebb yakorlat az ey osztály - ey modul elv. 62
63 7.1 Tagfüggvények, vagy metódusok Az osztályra jellemző műveletek. Alkalmazhatók default argumentumok, és túlterhelhetőek, de viyázni kell, hoy a híváskor a default argumentumok elhayásával ne álljon elő olyan forma, ami az eyik túlterhelt változatot is kielégíti. A tagfüggvényeket az osztályban deklaráljuk. A definíció történhet ekkor is, vay később, az osztályon kívül. Példa osztályon kívüli definícióra: void Point::set(int x, int y) { xcoord = x; ycoord = y; } void Point::move(int x, int y) { xcoord += x; ycoord += y; } // hívatkozás Point pt; pt.set( 15, 20); pt.move(10, 10); // azonban pt.xcoord = 10; // nem szabályos, mert xcoord privát változó Egyszerűbb metódusokat célszerű inline-nak definiálni! // Osztály a header (.h) fájlban: class Point { private: // a default értelmezés: private int xcoord, ycoord; bool active; public: inline void set(int x, int y) // inline függvény definiálható az osztályban { xcoord = x; ycoord = y; } void move(int, int); inline int getx() {return xcoord;} // osztálydeklarációban definiálva inline int gety() {return ycoord;} // osztálydeklarációban definiálva }; // osztályon kívüli definíció a forrás (.cpp) fájlban { void Point::move(int x, int y) xcoord += x; ycoord += y; } 63
64 7.2 Adattagok, vagy tagváltozók A változó definíciókkal azonos szintaxis. 64
65 7.3 Hozzáférési engedélyek public: bárki által hozzáférhető private: csak az osztályon belül hozzáférhető protected: csak az osztályon, és a belőle származtatott osztályokon belül hozzáférhető Ha az osztályt a class kulcsszóval hozzuk létre, az alapértelmezés: private, ha struct kulcsszóval, akkor az alapértelmezés public. 65
66 7.4 Konstruktorok Az objektumpéldány létrejötekor automatikusan lefut. Neve uyanaz, mint az osztályé. Paraméterlistája lehet változó (túlterhelt). Visszatérő értéke nincs Hozzáférés: public Példa: Point::Point(int x, int y) { xcoord = x; ycoord = y; } Point::Point() { xcoord = 0; ycoord = 0; } // hívatkozás: Point p(10, 25); Point p(); 66
67 7.5 Destruktorok Jellemzően akkor használjuk őket, ha az objektumnak a megszűnése előt meg kell szüntetnie az objektumon belül végzet memóriafoglalásokat (new delete operátorok), vagy le kell zárni az objektum által megnyitot erőforrásokat. Destruktorból csak egy van. 67
68 7.6 Osztálytagok - osztályváltozók Az osztály tagjai deklarálhatók úgy is, mint static. Ebben az esetben az osztály példányosítása előt, a definíció pillanatában létrejön egyetlen példány ezekből a tagokból. A továbbiakban minden létrejöt példány ugyanazon egy osztályváltozót fogja használni. Hívatkozás: mivel nem példányhoz (objektumhoz) kötött, nem lehet rá objektumon keresztül hívatkozni, ezért az osztály nevén keresztül kell :: operátorral. Tagfüggvényre is megadható, de ennek csak akkor van értelme, ha az osztályt eyáltalán nem akarjuk példányosítani, hanem csak enkapszulációt akarunk. Eyetlen előnye, hoy a példányosítás esetenként néhány bájttal több memóriát igényel. 8 bites mikrokontrollereknél elterjedt vélemény hoy memóriát takarít meg - nem feltétlenül igaz. Akkor célszerű alkalmazni, ha kimondotan az osztályhoz kapcsolódóan akarjuk használni. Pl. példányok számlálása: Példa: class Point { public: static int objctr; // példány számláló int xcoord, ycoord; Point(int x, int y) // objctr-t it nem szabad inicializálni!!! { objctr++; // számláljuk a példányt xcoord = x; ycoord = y; } } // A static változót külön meg kell definiálni, mert a példányosításból kimarad. // Ez ugyanabban a szkópban lehetséges, ahol a tagfüggvények definíciója. Int Point::objCtr = 0; // automatikusan is erre van beállítva // példányosítás: Point p1; Point p2; Point*ptrP2 = &p2; cout << p1.xcoord << '\n'; // objektumváltozó közvetlen hívatkozás cout << ptrp2 xcoord << '\n'; // objektumváltozó indirekt hívatkozás cout << Point::objctr << '\n'; // osztályváltozó hívatkozás 68
69 7.7 A this változó Az adot objektumon belül használható private változó. Típusa: pointer, ami olyan konkrét típusú, mint maga az objektum. Az adott példányra mutat. Csak tagfüggvényekben érhető el. 69
70 7.8 Inicializációs lista Class Point { private: int xcoord, ycoord; public: Point (int x, int y) { // Konstruktor xcoord = x; ycoord = y; } } Helyete célszerűbb: class Point { private: int xcoord; int ycoord; public: Point(int x, int y) : xcoord(x), ycoord(y) {} } Az inicializációs listát meg lehet adni az osztály deklarációban, vay a konstruktor osztályon kívüli definíciójában is. 70
71 7.9 Operátor túlterhelés Az elemi operátorok kibővíthetők, hogy osztályokon végezzenek műveletet: Unáris operátor esetén az újradefiniált operátor nem kap argumentumot, hanem a tagváltozókat értékeli ki. Ha ey operátornak csak unáris vay, csak bináris formája van, akkor nem terhelhető túl, a másik formában. Példa ex66_class_operator: class Point { public: int xcoord, ycoord; // public, hogy ki lehessen íratni Point(int x, int y): xcoord(x), ycoord(y) {} // összeadás operátor Point operator + (Point &point) { return Point(xCoord + point.xcoord, ycoord + point.ycoord);} // negálás (unáris) operátor túlterhelése // az unáris operátor nem kap argumentumot, csak az osztálytagokon dolgozik Point operator - () { return Point(-xCoord, -ycoord);} }; int main() { Point p1(2, 2); Point p2(4, 4); Point p3 = p1 + p2; cout << p3.xcoord <<, << p3.ycoord << endl; p3 = -p3; cout << p3.xcoord <<, << p3.ycoord << endl; return 0; } 71
72 8 Öröklődés (származtatás, bővítés) Új osztályok hozhatók létre egy kiválasztot alaposztály tagjainak a bővítésével. Ehhez megadjuk az alaposztályt, és a hozzáadandó új tagokat. Ezenközben az alaposztályhoz történő hozzáférést lehet korlátozni. Class új_osztály : public/protected/private alap_osztály { } Az alaposztály legmagasabb szintű hozzáférései a megadot szintre lesznek bekorlátozva. public: Az alaposztály public tagjai public lesznek. protected: Az alaposztály public tagjai protected lesznek. private: Az alaposztály minden tagja private lesz. Példa ex64_class_inheritence: class Polygon { protected: int width, height; public: void set(int w, int h) {width=w; height=h;} }; class Rectangle: public Polygon { public: int area () {return width * height;} }; class Triangle: public Polygon { public: int area () {return width * height / 2;} }; int main () { Rectangle rect; Triangle trgl; rect.set(4, 5); trgl.set(4, 5); cout << rect.area() << '\n'; cout << trgl.area() << '\n'; return 0; } A származtatot osztály nem örökli az alaposztálytól: a konstruktorokat, destruktorokat, a túlterhelt operátorokat, a barát osztályokat. Bár a konstruktorok nem öröklődnek, azok mégis meghívódnak legalábbis az alapértelmezés szerinti, vagyis paraméter nélküli változat. Ha más konstruktorra van szükség, azt külön inicializáló listával kell hívni. Példa ex65_class_inher_initlist: { }; { class Polygon protected: int width, height; public: Polygon(int w, int h): width(w), height(h) {} // konstruktor void set(int w, int h) {width=w; height=h;} class Rectangle: public Polygon public: 72
73 }; { }; { } Rectangle(int w, int h): Polygon(w, h) {} int area () {return width * height;} class Triangle: public Polygon public: Triangle(int w, int h): Polygon(w, h) {} int area () {return width * height / 2;} int main () Rectangle rect(4, 5); Triangle trgl(4, 5); cout << rect.area() << '\n'; cout << trgl.area() << '\n'; return 0; 73
74 8.1 Barátosztályok (friendship) A barátosztály olyan egyébként teljesen független osztály, melynek hozzáférése van a private vagy protected szintű tagokhoz. { }; Class Square; // kell, mert a Rectangle mindjárt hivatkozik rá // Téglalap osztály class Rectangle private: int width, height; public: int area () {return (width * height);} void convert (Square square); // a téglalapot egy megadot négyzetel azonos méretűre változtatja { }; { } // Négyzet osztály class Square friend class Rectangle; private: int side; public: Square (int a) : side(a) {} void Rectangle::convert(Square square) width = square.side; // side-hoz csak azért férhet hozzá, mert friend height = square.side; int main () { Rectangle rect; Square sqr (5); rect.convert(sqr); cout << rect.area() << endl; return 0; 74
75 } A példában a rect.convert-nek megadható egy square objektum, minek hatására a rect-et egy ugyanilyen oldalhosszúságú négyzeté konvertálja. A négyzet (square) oldala ugyan private, de a friendship miat a rect.convert hozzáférhet. 75
76 8.2 Többszörös öröklődés A C++ lehetővé teszi több osztály tulajdonságainak az átszármaztatását is: class új_osztály : public/protected/private alapo1, public/protected/private alapo2 {... } Figyelem! Amennyiben a két alaposztályban uyanaz a tag előfordul, mindenütt az alapo1::tag illetve alapo2::tag módon kell rá hivatkozni! 76
77 8.3 Polimorfizmus Ha egy osztály metódusa a virtual kulcsszóval kerül definiálásra, akkor a származtatot osztályokban ez a metódus újradefiniálható. class Polygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area () { return (0); } }; // származtatott osztály: class Rectangle: public Polygon { public: int area () // úradefiniálva { return (width * height); } }; 77
78 8.4 Absztrakt osztály: Megtehetjük, hogy area()-t a Polygon-ban egyáltalán nem definiáljuk. Ekkor ezt jelölni kell: virtual int area () =0; // tisztán virtuális függvény Ez esetben Polygon u.n. absztrakt osztály, a származtatot osztályokban pedig mindenképp kell definiálni a metódust. 78
79 8.5 Osztály template-ek Az osztályok generálását automatikusan is elvégezhetjük olyan módon, hogy ehhez típusnevet adunk meg paraméternek. Template definíció: { }; template <class T> class Coordinate public: T xcoord, ycoord; // a nyomtatás érdekében public Coordinate (T xarg, T yarg) // konstruktor { xcoord = xarg; // fontos, hogy = legyen definiálva T-re! XCoord = yarg; } void stepup () {++xcoord;} // fontos, hogy ++ legyen definiálva T-re! Hivatkozás: Coordinate<int> intcoord (5, 5); intcoord.stepup(); cout << intcoord.xcoord << endl; Megtehetjük azt is, hogy bizonyos típusokra másképp definiáljuk az osztálytemplate-et. Pl. double típusú paraméter esetén stepup() helyet legyen jumpup(): { }; template <> class Coordinate <double> public: double xcoord, ycoord; Coordinate(double xarg, double yarg ) { xcoord = xarg; ycoord = yarg; } void jumpup() { xcoord += 10.0;} Hivatkozás: Coordinate<double> doublecoord(5.0, 5.0); doublecoord.jumpup(); cout << doublecoord.xcoord << endl; 79
80 8.6 Implicit típuskonverzió Publikus öröklés esetén implicit típuskonverzió megy végbe, tehát: class Ember {}; class Benzinkutas: public Ember {}; // a benzinkutas ember class Parkoloor: protected Ember {}; // a parkolóőr nem ember Nem publikus öröklés esetén lehetséges az explicit típuskonverzió, de ekkor a programozó felelőssége, hoy ezt helyesen teye. 80
81 8.7 inline Függvények Abszolutérték számításra a (n > 0? n : -n) kifejezés használható. Ha ezt többször használjuk, célszerű ezt egy függvényben definiálni: int Abs (int n) { return n > 0? n : -n; } A fenti megoldás helyet célszerűbb az inline int Abs (int n) { return n > 0? n : -n; } Ha a függvény inline-ként van definiálva, a fordító megpróbálja befordítani minden egyes előforduláshoz a függvényt, tehát bemásolni annak végrehajtható kódját, és nem hívással intézni. Ezáltal a hívással járó adminisztráció megtakarítható. Figyelem! C++-ban az osztályon belül deklarált és definiált függvény alapértelmezése inline. A compiler fiyelmen kívül hayhatja az inline kulcsszót, ha túl nay függvényről van szó. inline függvényt csak akkor érdemes definiálni, ha az nayon rövid végrehajtható kódot eredményez, ellenkező esetben a hívással járó adminisztrációt uyan megtakarítjuk, de a hosszabb végrehajtható kódot sokszorosítjuk. az inline függvény minden hívást megelőzően kell, hoy definiálva leyen. Ennek legjobb helye a header fájl, ami viszont rontja a program szerkezetét, és sérti az encapsulation elvet. 81
82 9 További ismeretek az adattipusokról 82
83 9.1 Union-ok Speciális struktúra, melyben a tagok ugyarra a memória címre vannak elhelyezve. Union DataField{ int data; unsigned char d[4]; } mydata; mydata.data = 2014; // használat int ként cout << mydata.d[0]; // hozzáférés byteonként Létrehoz ey új DataField tipust Ha csak ey példányt akarunk, nem kell típusnév, az objektum azonnal létrehozható (mydata). Ekkor természetesen nem kapunk típusnevet, ami a továbbiakban használható lenne újabb uyanilyen típusú objektum létrehozására. 83
84 9.2 Enumeráció Szimbolikus konstansok elfogadandó halmazának a definíciója. Az enumerációs konstansoknak nincs memória allokálva, fordítás időben léteznek. Értékek rendre: 0, 5, 2, 3, 4 enum {north, south, east, west}; Default értékek felülírhatók: enum {north = 360, south = 180, west = 90, east = 15}; Létrehozható típus és változó is enumeráció alapján: enum Direction {north, south, west, east} mydir; Létrehoz ey új Direction tipust Ha csak ey példányt akarunk, nem kell típusnév, az objektum azonnal létrehozható (mydir). Ekkor természetesen nem kapunk típusnevet, ami a továbbiakban használható lenne újabb uyanilyen típusú objektum létrehozására. Switch szerkezetben célszerű enumerációt használni: switch(d) { case north:.. break; case south:.. break; } 84
85 9.3 A fájlkezelés alapjai A fájlműveletek a következő headereken keresztül érhetők el: ifstream stream osztály olvasási műveletekhez ofstream stream osztály írási műveletekhez fstream stream osztály irás/olvasás műveletekhez Használata: { } #include <iostream> #include <fstream> using namespace std; int main() ofstream myoutfile( hello.txt ); if( myoutfile.is_open()) { myoutfile << Hello World << endl; myoutfile << Hello World Again << endl; myoutfile.close(); } char buffer[100]; ifstream myinfile( hello.txt ); if( myinfile.is_open()) { while( myinfile.getline(buffer, 100)) { // getline() a stream ref-t adja vissza, // vagy 0-t, ha vége cout << buffer << endl; } myinfile.close(); } else cout << Cannot open input file << endl; 85
1 Rev 4. A C++ programozás alapjai- segédlet
1 A C++ programozás alapjai- segédlet Tartalomjegyzék 1 Bevezetés...5 1.1 POSIX specifikáció...6 1.2 Fordítók és fejlesztői környezetek...7 1.2.1 GNU-LINUX GCC...8 1.2.2 Windows Cygwin...8 1.2.3 Windows:
Programozás II. 2. Dr. Iványi Péter
Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c
Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás A tárgy órái Előadás hetente (St101) csüt. 8:15 Bécsi Tamás C elmélet Ajánlott irodalom Dennis Ritchie: A C programozási nyelv Gyakorlat hetente
Java II. I A Java programozási nyelv alapelemei
Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Az Integrált Fejlesztői Környezet C++ alapok Az Integrált Fejlesztői Környezet Visual Studio 2013 Community Edition Kitekintés: fordítás Preprocesszor Fordító
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozá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?
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? 3. Ismertesse a névtér fogalmát! 4. Mit értünk a "változó hatóköre"
Készítette: Nagy Tibor István
Készítette: Nagy Tibor István A változó Egy memóriában elhelyezkedő rekesz Egy értéket tárol Van azonosítója (vagyis neve) Van típusa (milyen értéket tárolhat) Az értéke értékadással módosítható Az értéke
1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3
Darvay Zsolt Típusok és nevek a forráskódban Állandók és változók Hatókörök és az előfeldolgozó Bevitel és kivitel Kifejezések Utasítások Mutatók Függvények Struktúrák és típusok Állománykezelés C programozás
Java II. I A Java programozási nyelv alapelemei
Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve
Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék
Speciális adattagok és tagfüek Miskolci Egyetem Általános Informatikai Tanszék CPP7 / 1 Statikus adattagok Bármely adattag lehet static tárolási osztályú A statikus adattag az osztály valamennyi objektuma
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 4. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.10.. -1- Mit tudunk már? Típus fogalma char, int, float,
Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás
Programozás BMEKOKAA146 Dr. Bécsi Tamás 2. előadás Szintaktikai alapok Alapvető típusok, ismétlés C# típus.net típus Méret (byte) Leírás byte System.Byte 1Előjel nélküli 8 bites egész szám (0..255) char
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 alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Mit tudunk már? Típus fogalma char, int, float, double változók deklarációja operátorok (aritmetikai, relációs, logikai,
1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon
1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (
Programozás II. 4. Dr. Iványi Péter
Programozás II. 4. Dr. Iványi Péter 1 inline függvények Bizonyos függvények annyira rövidek, hogy nem biztos hogy a fordító függvényhívást fordít, hanem inkább az adott sorba beilleszti a kódot. #include
Programozás II. 2. gyakorlat Áttérés C-ről C++-ra
Programozás II. 2. gyakorlat Áttérés C-ről C++-ra Tartalom Új kommentelési lehetőség Változók deklarációjának helye Alapértelmezett függvényparaméterek Névterek I/O műveletek egyszerűsödése Logikai adattípus,
Globális operátor overloading
Programozás II. 9. gyakorlat Operátor overloading 2: Unáris operátorok, globálisan megvalósított operátorok, > operátorok Kivételkezelés, IO library Globális operátor overloading Előző alkalommal
C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem
C# nyelv alapjai Krizsán Zoltán 1 Általános Informatikai Tanszék Miskolci Egyetem Objektumorientált programozás C# alapokon tananyag Tartalom Bevezetés Lokális változó Utasítások Szójáték Why do all real
OOP #14 (referencia-elv)
OOP #14 (referencia-elv) v1.0 2003.03.19. 21:22:00 Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj. e-mail: aroan@ektf.hu web: http://aries.ektf.hu/~aroan OOP OOP_14-1 - E jegyzet
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
C++ I/O Bevezetés Izsó Tamás 2014. február 20. Izsó Tamás C++ I/O / 1 Section 1 Bevezetés Izsó Tamás C++ I/O / 2 Irodalom Izsó Tamás C++ I/O / 3 Paraméter illesztés függvénynév túlterhelés esetén 1 Pontos
A C# programozási nyelv alapjai
A C# programozási nyelv alapjai Tisztán objektum-orientált Kis- és nagybetűket megkülönbözteti Ötvözi a C++, Delphi, Java programozási nyelvek pozitívumait.net futtatókörnyezet Visual Studio fejlesztőkörnyezet
Bevezetés a C++ programozási nyelvbe
Bevezetés a C++ programozási nyelvbe Miskolci Egyetem Általános Informatikai Tanszék CPP0 / 1 Története A C++ programozási nyelv a C programozási nyelv objektum orientált kiterjesztése. Az ANSI-C nyelvet
Programozás 1. Dr. Iványi Péter
Programozás 1. Dr. Iványi Péter 1 C nyelv B.W. Kernighan és D.M. Ritchie, 1978 The C Programming language 2 C nyelv Amerikai Szabványügy Hivatal (ANSI), 1983 X3J11 bizottság a C nyelv szabványosítására
1. Alapok. Programozás II
1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph
Szoftvertechnológia alapjai Java előadások
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz e-mail: fandrew@mit.bme.hu tárgy honlap: http://home.mit.bme.hu/~fandrew/szofttech_hu.html A mai előadás tartalma: Miért pont Java?
Informatika terméktervezőknek
Informatika terméktervezőknek C# alapok Névterület (namespace) using Osztály (class) és Obejtumok Metódus (function, procedure, method) main() static void string[] arg Szintaxis // /* */ \n \t Névadások
C programozás. 1 óra Bevezetés
C programozás 1 óra Bevezetés A C nyelv eredete, fő tulajdonságai 1. Bevezető C nyelv alapelemei többsége a BCPL (Basic Combined Programming Language {1963}) Martin Richards B nyelv Ken Thompson {1970}
Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)
Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával) I. A nyelv története C++ C (ős: B???) 1972 Ritchie AT&T Bell laboratórium UNIX 1978 Kernighan & Ritchie az első tankönyv,
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606 Dr. Bécsi Tamás 2. előadás Console I/O bővebben Lásd mintaprogram 2015.09.21. Számítástechnika I. 2. Előadás 2 Számábrázolásról
Programozás C és C++ -ban
Programozás C és C++ -ban 2. További különbségek a C és C++ között 2.1 Igaz és hamis A C++ programozási nyelv a C-hez hasonlóan definiál néhány alap adattípust: char int float double Ugyanakkor egy új
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
Pázmány Péter Katolikus Egyetem Információs Technológiai és Bionikai Kar Bevezetés a Programozásba II 2. előadás Adattípusok megvalósítása egységbe zárással 2014.02.17. Giachetta Roberto groberto@inf.elte.hu
Algoritmizálás + kódolás C++ nyelven és Pascalban
Algoritmizálás + kódolás nyelven és ban Motiváció A Programozási alapismeretek tárgyban az algoritmizáláshoz struktogramot, a kódoláshoz nyelvet használunk, a Közismereti informatikában (a közoktatásban
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Sztringek Osztályok alapjai Sztringek Szöveges adatok kezelése Sztring Karakterlánc (string): Szöveges adat Karaktertömbként tárolva A szöveg végét a speciális
C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat
C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. szeptember A C++ programozási nyelv Soós Sándor 1/12 Input-output
C programozási nyelv Pointerek, tömbök, pointer aritmetika
C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek
és az instanceof operátor
Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában
Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás
Programozás BMEKOKAA146 Dr. Bécsi Tamás 1. Előadás Bemutatkozás Előadó: Dr. Bécsi Tamás St.106, (1)463-1044, becsi.tamas@mail.bme.hu Közlekedés-, és Járműirányítási Tanszék www.kjit.bme.hu Programozás
Bevezetés a programozásba I.
Bevezetés a programozásba I. 5. gyakorlat Surányi Márton PPKE-ITK 2010.10.05. C++ A C++ egy magas szint programozási nyelv. A legels változatot Bjarne Stroutstrup dolgozta ki 1973 és 1985 között, a C nyelvb
Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás 5.3. Mutatók,tömbök A mutató vagy pointer olyan változó, amely egy másik változó címét tartalmazza. A C nyelvű programokban gyakran használják a
Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán
Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában
1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;
Rövid elméleti összefoglaló 1. Gyakorlat A C++ nyelv hatékony, általános célú programozási nyelv, amely hagyományos fejlesztőeszközként és objektum-orientált programozási nyelvként egyaránt használható.
Szoftvertervezés és -fejlesztés I.
Szoftvertervezés és -fejlesztés I. Operátorok Vezérlési szerkezetek Gyakorlás 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik.
Osztályok. 4. gyakorlat
Osztályok 4. gyakorlat Az osztály fogalma Az objektumok formai leírása, melyek azonos tulajdonsággal és operációkkal rendelkeznek. Osztályból objektum készítését példányosításnak nevezzük. Minden objektum
OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek
OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN vizsgatételek 1. Az objektumorientált programozás szemlélete, az objektum fogalma 2. Az objektumorientált programozás alapelvei 3. A Java nyelv története, alapvető
Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r
Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29. Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e i n t main ( v o i d ) { p r
Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban
Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban Tartalom OOP ismétlés Osztályok létrehozása Adattagok láthatóságai, elnevezési ajánlások Konstruktor, destruktor this pointer Statikus és dinamikus
Programozási Nyelvek (C++) Összefoglaló
Programozási Nyelvek (C++) Összefoglaló Somogyi Krisztián gondozásában 2009-12-22 1. tétel: Fordítás [fordítási egység; warning; error; g++ kapcsolók] A teljes programot általában lehetetlen egy fájlban
Objektumok inicializálása
Objektumok inicializálása Miskolci Egyetem Általános Informatikai Tanszék Objektumok inicializálása CPP4 / 1 Tartalom public adattagok inicializálása felsorolással konstruktor objektum tömbök osztály típusú
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.
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. Az osztály egy olyan típus leíró struktúra, amely tartalmaz adattagokat
Programozás módszertan
Programozás módszertan p. Programozás módszertan Operátorok túlterhelése a C++ nyelvben Pere László (pipas@linux.pte.hu) PÉCSI TUDOMÁNYEGYETEM TERMÉSZETTUDOMÁNYI KAR INFORMATIKA TANSZÉK Bevezetés Programozás
Mintavételes szabályozás mikrovezérlő segítségével
Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés
A C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.
1. Motiváció C nyelvben a printf és a scanf függvények használata a programozótól nagy körültekintést igényel. A változó számú argumentum miatt a fordító nem tudja ellenőrizni, hogy a formátum mezőben
Programozás C++ -ban
Programozás C++ -ban 4. Bevezetés az osztályokba 4.1 Az adatokhoz való hozzáférés ellenőrzése Egy C programban a struktúrák minden része mindig elérhető. Ugyanakkor ez nem a legkedvezőbb helyzet. Több
Apple Swift kurzus 3. gyakorlat
Készítette: Jánki Zoltán Richárd Dátum: 2016.09.20. Apple Swift kurzus 3. gyakorlat Kollekciók: Tömb: - let array = [] - üres konstans tömb - var array = [] - üres változó tömb - var array = [String]()
Programozási nyelvek (ADA)
Programozási nyelvek (ADA) Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 1. előadás Hasznos weboldal http://kto.web.elte.hu Program felépítése Programegységek (program unit) eljárások (procedure)
Programozási nyelvek JAVA EA+GY 1. gyakolat
Programozási nyelvek JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2018/2019. tavaszi félév Tartalom 1 A Java alapjai 2 Java program
A C# PROGRAMOZÁSI NYELV
A C# PROGRAMOZÁSI NYELV 2010.02.23. Bevezetés C# nyelv jellemzői 2 Kis és NAGY betű érzékeny Minden utasítást pontos vessző zár. Utasítás zárójel a:,. .NET Framework keretrendszerek 3 Microsoft.NET Framework
Osztály és objektum fogalma
Osztály és objektum fogalma A C++ programozási nyelv I. CPP1/ 1 Az osztály (class) class: adatok és módszerek (method) (függvények) együttese, amely absztrakt adattípusként működik. objektum: egy osztály
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezés versus utasítás C/C++: kifejezés plusz pontosvessző: utasítás kiértékeli a kifejezést jellemzően: mellékhatása is van például: értékadás Ada: n = 5;
C++ programozási nyelv Konstruktorok-destruktorok
C++ programozási nyelv Konstruktorok-destruktorok Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. szeptember A C++ programozási nyelv Soós Sándor 1/20 Tartalomjegyzék
Programozás C++ -ban 2007/1
Programozás C++ -ban 2007/1 1. Különbségek a C nyelvhez képest Több alapvető különbség van a C és a C++ programozási nyelvek szintaxisában. A programozó szempontjából ezek a különbségek könnyítik a programozó
Már megismert fogalmak áttekintése
Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése Eseménykezelési módszerek 2 Már megismert fogalmak
OOP: Java 8.Gy: Abstract osztályok, interfészek
OOP: Java 8.Gy: Abstract osztályok, interfészek 26/1 B ITv: MAN 2019.04.03 Abszrakt metódus és absztrakt osztály. Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus
Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés
Bevezetés a programozásba 2 7. Előadás: Objektumszű és osztályszű elemek, hibakezelés ISMÉTLÉS Osztály class Particle { public: Particle( X, X, Y); virtual void mozog( ); ); virtual void rajzol( ) const;
Imperatív és procedurális programozás a Javában
Imperatív és procedurális programozás a Javában Kozsik Tamás kto@elte.hu http://kto.web.elte.hu/ Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék 2008. Kozsik Tamás (ELTE)
A programozás alapjai előadás. A C nyelv típusai. Egész típusok. C típusok. Előjeles egészek kettes komplemens kódú ábrázolása
A programozás alapjai 1 A C nyelv típusai 4. előadás Híradástechnikai Tanszék C típusok -void - skalár: - aritmetikai: - egész: - eger - karakter - felsorolás - lebegőpontos - mutató - függvény - union
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) {} };
A C++ kódokban lévő makrókat melyik egység dolgozza fel az alábbiak közül? preprocessor A szabványos C++-ban nem is írhatunk makrókat (csak C-ben) assembler linker Az alábbi példában a Foo f(5); konstruktor
Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek
Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Tömbök (3. rész) Konstansok Kivételkezelés Tömbök 3. Többdimenziós tömbök Többdimenziós tömbök int a; Többdimenziós tömbök int a[5]; Többdimenziós tömbök
Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok
Bevezetés a programozásba II 5. Előadás: Másoló konstruktor, túlterhelés, operátorok Emlékeztető struct Vektor { int meret, *mut; Vektor(int meret); int szamlal(int mit); }; int Vektor::szamlal(int mit)
Occam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
1. Egyszerű (primitív) típusok. 2. Referencia típusok
II. A Java nyelv eszközei 1. Milyen eszközöket nyújt a Java a programozóknak Korábban már említettük, hogy a Java a C nyelvből alakult ki, ezért a C, C++ nyelvben járatos programozóknak nem fog nehézséget
Programozás alapjai II. (1. ea) C++
Programozás alapjai II. (1. ea) C++ C++ kialakulása, nem OO újdonságok: Szeberényi Imre, Somogyi Péter BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2019.02.05.
Programozás alapjai II. (1. ea) C++
Programozás alapjai II. (1. ea) C++ C++ kialakulása, nem OO újdonságok: Szeberényi Imre, Somogyi Péter BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2019.02.05.
Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe
Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével
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 Szeberényi Imre BME IIT Függvények C program egymás mellé rendelt függvényekből áll. A függvény (alprogram) jó absztrakciós eszköz a programok
Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)
Programozás alapjai C nyelv 7. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.05. -1- Függvények C program egymás mellé rendelt függvényekből
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606 Dr. Bécsi Tamás Bemutatkozás Előadó: Dr. Bécsi Tamás St.106, (1)463-1044, becsi.tamas@mail.bme.hu Közlekedés-, és Járműirányítási
Bevezetés a programozásba Előadás: A const
Bevezetés a programozásba 2 6. Előadás: A const ISMÉTLÉS Interface - Implementation struct Particle { int x,y; unsigned char r,g,b; void rajzol(); }; }; void Particle::rajzol() { gout
A C programozási nyelv III. Pointerek és tömbök.
A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó,
Bevezetés a programozásba. 8. Előadás: Függvények 2.
Bevezetés a programozásba 8. Előadás: Függvények 2. ISMÉTLÉS Helló #include using namespace std; int main() cout
Programozás II gyakorlat. 6. Polimorfizmus
Programozás II gyakorlat 6. Polimorfizmus Típuskonverziók C-ben: void * ptr; int * ptr_i = (int*)ptr; Ez működik C++-ban is. Használjuk inkább ezt: int * ptr_i = static_cast(ptr); Csak egymással
Szövegek C++ -ban, a string osztály
Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string
Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;
Java 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. ( Előfeltétel 12. Tétel ) Az osztály egy olyan típus leíró struktúra, amely
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezések Lexika Szintaktika Szemantika Lexika azonosítók (változó-, metódus-, típus- és csomagnevek) literálok operátorok, pl. + zárójelek: (), [], {},
Programozási Nyelvek: C++
Programozási Nyelvek: C++ Gyakorló feladatkönyv Umann Kristóf #include "CppStudent.h" int main() { CppStudent *reader = new CppStudent(); reader->readbook(); while(!reader->doesunderstand()) { reader->exercise();
Programozási nyelvek II. JAVA EA+GY 1. gyakolat
Programozási nyelvek II. JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2017/2018. őszi félév Tartalom 1 Amit tudni kell a félévről
Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r
Programozás I. Széchenyi István Egyetem, Gy r 2014. november 16. Áttekintés kel kapcsolatos fogalmak deklaráció Több, kompatibilis változat is elképzelhet. Meg kell el znie a fv. hívását. Mindenképp rögzíti
Programozás C és C++ -ban
Programozás C és C++ -ban 1. Különbségek a C nyelvhez képest Több alapvető különbség van a C és a C++ programozási nyelvek szintaxisában. A programozó szempontjából ezek a különbségek könnyítik a programozó
Bevezetés a programozásba I.
Bevezetés a programozásba I. 9. gyakorlat Intelligens tömbök, mátrixok, függvények Surányi Márton PPKE-ITK 2010.11.09. C++-ban van lehetőség (statikus) tömbök használatára ezeknek a méretét fordítási időben
Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE
Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE 2015-16 Classic Empire - A turn Based Wargame Classic Empire is a real time, multiplayer, Internet-based game, featuring military, diplomatic, and economic
Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r
Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. március 3. Függvények Mi az a függvény (function)? Programkód egy konkrét, azonosítható, paraméterezhet, újrahasznosítható blokkja Miért
1. Bevezetés A C++ nem objektumorientált újdonságai 3
Előszó xiii 1. Bevezetés 1 2. A C++ nem objektumorientált újdonságai 3 2.1. A C és a C++ nyelv 3 2.1.1. Függvényparaméterek és visszatérési érték 3 2.1.2. A main függvény 4 2.1.3. A bool típus 4 2.1.4.
Programozás I. Első ZH segédlet
Programozás I. Első ZH segédlet Ezen az oldalon: kiírás az alapértelmezett (hiba) kimenetre, sztring konkatenáció, primitív típusok, osztály létrehozás, példányosítás, adattagok, metódusok Kiíratás alapértelmezett
Programozás alapjai gyakorlat. 2. gyakorlat C alapok
Programozás alapjai gyakorlat 2. gyakorlat C alapok 2016-2017 Bordé Sándor 2 Forráskód, fordító, futtatható állomány Először megírjuk a programunk kódját (forráskód) Egyszerű szövegszerkesztőben vagy fejlesztőkörnyezettel
A C programozási nyelv III. Pointerek és tömbök.
A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó,
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
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 2) Hány byte-on tárol a C++ egy float-ot? implementáció-függő 6 4 8 3) Hány byte-on tárol a C++