C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek Be- és kimenet Adatstruktúrák Függvények Main függvény
Alapvető típusok Az adatoknak típusuk van, így védekezik a rendszer például az ellen a hiba ellen, hogy a programozó számot próbáljon összeadni egy szöveggel Ha két típus egymásba alakítható (például egész és valós szám csonkolással), akkor explicit vagy implicit konverzió lehetséges A következő típusok többsége beépített típusa a C++ nyelvnek
Változók deklarálása Minden általunk használt változót az első használata előtt deklarálnunk kell ( és ezt csak egyszer tehetjük meg) Deklaráció: „típusnév változónév;” Speciálisan a deklarációban adhatunk neki egy kezdőértéket is, de ez csakis konstans lehet „int i=4;”
Egész számok ( int ) Egész számok 4 bájton ábrázolva Pl: „int x=56;” Műveletek: +,-,* / - eredmény mindig egész % - maradék képzése (mod) Relációk: ==, !=, <=, >=
Valós számok ( float ) Pl. „float f=13.766;” Műveletek: Relációk: +,-,*,/ Relációk: A szokásosak...
Logikai értékek ( bool ) Változók és konstansok, amik igazak és hamisak lehetnek. Pl. „bool L=true; L=false;” Műveletek: ==,!= ! – tagadás pl. „!L” && - és pl. „L1&&L2” || - vagy pl. „L1||L2”
Karakterek ( char ) ASCII-es karakterek, konvertálható integerré (0..255 lehet az értéke) Pl. „char c=‘A’;” Relációk: ==, !=
Karakterláncok ( string ) Régen (C-ben) „char*”-gal kezelték. Pl: „string str=‘’alma‘’;” Használatához valamelyik őt használó fejállományt is includolni kell (pl. iostream) Műveletek: str.size() – az str-ben tárolt szöveg hossza str1+str2 – a két string összefűzése str[i] – a zárójelek közé írva egy i egészet, a szöveg i-edik karakterét adja vissza
Stringek2 str.c_str() – az str-nek megfelelő char* értéket adja vissza str.substr(i,j) – str i-edik poziciójától j db karakter alkotta szöveg
Elemi utasítások A C++-ban minden utasítást „;” zár Értékadás: „változó = érték;” Pl. „x = 0; c = ‘A’;” Spec: „x = y = 5;” <-> „x=5; y=5;” „x++;”, „++x;”, „x--;”, „--x;” (növelés, illetve csökkentés eggyel) A különbség a visszatérési értékükben van...
Elemi utasítások 2 Program leállítása: „exit(szám);”, ahol a szám egy nemnegatív egész és 0, ha nem volt hiba >0, ha volt hiba és ekkor a szám a hiba kódja Megjegyzések: C++ stílusú: „// megjegyzés” -> az adott sor végéig tart C stílusú: „/*megjegyzés...Akár több sor */”
Logikai feltételek Bármilyen egyszerű vagy összetett kifejezés, ami bool-t ad vissza bool típusú változók bool visszatérési értékű függvények a relációk segítségével felépített kifejezések Pl. (4==2*2)&&(!L||ps(3)) Ahol: bool ps(int i) {return i%2==0;}
Vezérlési szerkezetek Szekvencia: parancsok egymásutáni végrehajtása... Pl. „ x = 5; y = x/2; x = y+1;”
Elágazás Közönséges elágazás: if(feltétel) { ág1 } else ág2 Egyszerűbb eset (ha az ágak csak egy utasításból állnak): if(feltétel) ut1; else ut2;
Többágú elágazás Több feltétel, a legelső utasításait hajtjuk végre, ami teljesül: if(feltétel1) { ág1 } else if(feltétel2) { ág2 } ... else { utolsó_ág }
Adott változó értéke szerinti elágazás Ha egy adott változó értékei szerint akarunk elágaztatni a következőt is használhatjuk: switch(v) { case konstans1: utasítások... break; case konstans2: utasítások... break; ... default: utasítások... break; }
Ciklus A ciklus egy speciális szerkezet, ami egy adott utasítás sorozatot addig hajt végre, amíg egy adott feltétel teljesül Az utasítás sorozatot ilyenkor a ciklus magjának nevezzük
While-ciklus Ez egy előltesztelős ciklus, azaz minden lépésben ellenőrzi a feltételt, ha az igaz, akkor végrehajtja a ciklusmagot, ha pedig hamis, akkor a ciklus befejeződik és a ciklus utáni utasítások következnek. while(feltétel) { utasítások sorozata... }
For-ciklus A következő ciklus egyszerűbben is felírható a for utasítás segítségével: utasítás1; while(feltétel) { mag.. utasítás2; } for(utasítás1; feltétel; utasítás2) mag
Egyszerű példa a for használatára Írjuk ki az egész számokat 0-tól 100-ig! for(int i=0; i<101; i++) { cout << i << endl; }
Do-while ciklus Ez a hátultesztelős ciklus do{ mag... }while(feltétel);
A do-while ciklus egyik hasznos alkalmazása char c; do{ //programunk... cout << ” Futtassuk újra?(I/N) ”; cin >> c; }while(c!=‘n’&&c!=‘N’);
Be- és kimenetkezelés Szabványos be- és kimenet kezelése (billentyűzet, illetve képernyő): #include <iostream> //ez kell using namespace std; //a fájl elejére cout << kifejezés1 << kif2 << endl; //kiírás+soremelés cin >> változó1 >> változó2; //beolvasás cout << ”\n”; //a \n a soremelésnek megfelelő karakter
Bemenet-Kimenet példa #include <iostream> using namespace std; void main() { int n; cout << ”Kérek egy egész számot! ”; cin >> n; cout << ”A(z) ” << n << ” szám négyzete: ” << n*n << endl; }
Karakterláncok beolvasása A << operátorral például az üres string nem olvasható be Másik módszer erre: getline(cin,str); Megjegyzés: a puffert esetleg üríteni kell...
Egyszerű adatstruktúrák Néhány egyszerűbb adatstruktúra: tömb: fix dimenziójú vektor, az indextartomány: 0,1,...,méret-1 struct: különböző adatmezőkből álló rekordtípus
Tömbök használata Tömb típusú változó deklarálása: típus változónév[méret]; Tömb adott indexű elemének elérése: változónév[index] Ezzel a módszerrel csak konstans méretű tömbök hozhatóak létre (un. Statikus foglalású tömbök)
Példa a tömbök használatára 8 dimenziós vektor hosszának kiszámítása: //így is lehet értéket adni, nem muszáj indexenként //de csak és kizárólag deklaráláskor: float v[]={3,6,7,1,0,0,9,12}; float f=0; for(int i=0; i<8; i++) f=f+(v[i]*v[i]); f=sqrt(f); //#include <math.h> kell hozzá
Struct A struct kulcsszó segítségével létrehozhatunk egy új típust (mielőtt ilyen típusú változót létrehoznánk, a típust is meg kell adni) Módja: struct Típusnév { típus1 mezőnév1 //mező megadása ... }; Változó: Típusnév változónév; Mezők elérése: változónév.mezőnév
Példa a struct használatára Hallgató típus megadása: struct Hallgato{ int id; char eha[7]; string vnev; string knev; }; Hallgato h; h.id=123; h.eha=”aaabbbb”; h.vnev=”Kiss”; h.knev=”Pisti”; cout << h.vnev << ” ” << h.knev << endl;
Függvényhívások Függvény deklarálása és definiálása: A deklarációnak meg kell előznie az első felhasználást „void myFuggveny();” Definiálás: „void myFuggveny() { //utasítások }” Deklaráció és definiálás együtt csak ha a deklaráció megelőzi a definiálást A definiálás önmagában is deklaráció értékű.
Függvény visszatérési értéke A függvénynek lehet visszatérési értéke Ennek típusa van és ezt is fel kell tüntetni a deklaráláskor/definiáláskor a neve előtt void = nincs visszatérési érték A return utasítással lehet visszatérési értéket adni, ekkor a függvény utasításainak végrehajtása meg is áll „int Nulla() { return 0; }”
Függvény paraméterei Definiáláskor/deklaráláskor fel kell sorolni a függvény paramétereit, ha vannak, a név után zárójelek között. A paramétereknek nevet és típust kell adni és ekkor a függvény törzsében ilyen néven használhatjuk őket. „int Osszeg(int a, int b) { return a+b; }”
Paraméterfajták A paraméterek lehetnek érték- és címszerintiek Értékszerinti paraméterátadás esetén létrejön egy új változó és ez megkapja kezdőértékül a bemenő értéket void f(int a,....); Címszerinti átadás esetén az aktuális paraméternek balértéknek kell lennie (változó) és ekkor ennek a címe adódik át (következmény: a változó értékét megváltoztathatja a függvény void f(int& a,....);
Függvény meghívása A függvény a nevével és az aktuális paraméterek megadásával hívható meg Pl. int i; i=Osszeg(Nulla(),1); myFuggveny();
Megjegyzések void függvény esetében a „return;” utasítással is vissza lehet térni A függvényeket a nevük és a paramétereik száma+típusuk sorrendje (nevük és a visszatérési érték típusa nem számít) Pl: int f(int a, int b); int f(int c);
Megjegyzés2 Tömbök mint paraméterek: void fv(tipus t[][20]){... t[i][j] ... } void fv(tipus** &t) {... t[i][j] ... }
Egy egyszerű program szerkezete #include <iostream> using namespace std; //fv deklarációk int main(int argc, char* argv[]) { //program return 0; } //fv definíciók
Main függvény Kitüntetett függvény, ő indul el a program futtatásakor. Csak egy lehet belőle... Visszatérési értéke: void/int Paraméterek: nincsenek vagy az alábbi kettő
Programparaméterek argc -> a parancssori paraméterek száma argv -> a parancssori paraméterek tömbje, elemei char* típusúak Az első paraméter mindig a futtatási név pl. „C:\Dev-Cpp\bevinfo1\cpp1.exe”
Ami még hátra van... Szöveges fájlok használata Programozási tételek implementálása
Egyéb DevC++ ingyenes fordító http://www.bloodshed.net/dev/devcpp.html (itt az elsőt kell letölteni, a többi a fordító forráskódja...) A letöltött fájl egy setup exe lesz, ezt futtatva telepítjük a programot... használat: Project: Console Application (new projektnél ezt kell keresni) Parancssori fordítás linux alatt 1. Megírjuk a forrásfájlt -> elso.cpp 2. „g++ elso.cpp –o proba.exe” ekkor az elso.cpp-ből fordul egy proba.exe nevű fájl, ami már futtatható is
Gyakorló Feladatok Soroljuk fel az 1 és 100 közötti négyzetszámokat! Soroljuk fel az 1 és 10000 közötti 17-tel vagy 19-cel osztható számokat (egyetlen ciklust használva csak) Készítsünk egy programot, ami bekér a billentyűzetről egy n egész számot. Ha n<=0 akkor küldjünk hibaüzenetet és termináljunk, különben számoljuk meg, hogy 0 és n között hány olyan szám van, ami 3-at ad maradékul 7-tel osztva! Készítsünk egy struct típust, ami a 3 dimenziós tér pontjainak koordinátáit(x,y,z valósak) és címkéit(tetszőleges string) tartja számon, majd hozzunk létre egy ilyen változót és tegyük bele a P(0.5;1;3.5) pontot. Ezután hozzunk létre még egy ilyen változót és annak tartalmát kérjük be a billentyűzetről. Ezután számoljuk ki a két pont távolságának a négyzetét! ( d(P1,P2)^2=(x1-x2)^2+(y1-y2)^2+(z1-z2)^2 )