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, szabvány 1989 első szabvány 2007 legújabb szabvány 2/42
C++ I. A nyelv története C++ 1983 Bjarne Stroustrup 1998 első szabvány 2011, 2014 legújabb szabvány Fejlesztő eszközök Dev C++ Code::Blocks Visual C++ Windows KDevelop Linux 3/42
C++ II. A nyelv jellemzői Program = több fordítási egység Nagybetű kisbetű Függvényorientált A változók kezdőértéke nem definiált Utasításlezáró jel a ; Védett azonosítók 4/42
A program szerkezete C++ #include <iostream> (szabványos beolvasás és kiírás) #include <fstream> (szöveges állományok kezelése) #include <string> (karakterláncok kezelése) using namespace std; int main(){ } 5/42
Deklaráció C++ típusnév változó; típusnév változó 1, változó 2, változó 3 ; Kezdőérték típusnév változó = érték; típusnév változó = kifejezés; Konstans deklaráció const típus név=érték; 6/42
C++ A program szerkezete... globális változók deklarációi int main(){ lokális változók deklarációi return 0; } 7/42
C++ típusok Egész típus típusnév: int értékhalmaz: -2 31 2 31-1 (gyakran) műveletek: + - * / % ==!= < <= > >= += -= *= %= További egész típusok (típusmódosítók) Ami biztos: short<int<long<long long short értékhalmaz: -2 15 2 15-1 (gyakran) long értékhalmaz: -2 31 2 31-1 (gyakran) long long értékhalmaz: -2 63 2 63-1 (gyakran) unsigned értékhalmaz: 0 2 32-1 (gyakran) 8/42
C++ típusok Relációk kifejezés==kifejezés /* azonos? */ kifejezés!=kifejezés /* nem azonos? */ kifejezés<=kifejezés /* kisebb-egyenlő? */ kifejezés<kifejezés /* kisebb? */ kifejezés>=kifejezés /* nagyobb-egyenlő? */ kifejezés>kifejezés /* nagyobb? */ 9/42
C++ típusok Valós típus típusnév: double 8 byte-os, kb. 3.4*10 308 (gyakran) értékhalmaz: - műveletek: + - * / ==!= < <= > >= += -= *= /= További valós típusok (módosítók) float értékhalmaz: 4 byte-os, kb. 1.7*10 38 long double értékhalmaz: 12 byte (gyakran) 10/42
C++ típusok Karakter típus típusnév: char értékhalmaz: karakterek, \, kódok műveletek: ==!= < <= > >= Logikai típus típusnév: bool értékhalmaz: false, true műveletek: &&! ==!= 11/42
C++ típusok Szöveg típus (#include <string>) típusnév: string értékhalmaz: valami műveletek: size() + [] c_str() substr() ==!= s.size() az s hossza (karaktereinek száma) s[i] az s i-edik karaktere s + vége két karakterlánc összefűzése s.c_str() s átalakítása C stílusú lánccá s.substr(i,j) s részének kivágása atoi(s.c_str()) s számmá konvertálása 12/42
C++ típusok Szöveg típus (#include <string>) s.find(mit) a mit helye az s szövegben, string::npos. s.replace(tól,db,mivel); //s-ben tól-tól kezdődően db jelet helyettesít mivel-lel. (Több változata van.) s.length() az s hossza (karaktereinek száma) s.at(i) az s i-edik karaktere ellenőrzötten 13/42
C++ típusok Tömb típus típusnév: típus változó[elemszám] Az elemszám lehet konstans (statikus tömb) vagy változó (dinamikus tömb). indexelés: 0..elemszám-1 hivatkozás: változó[index] Mátrix típus típusnév: típus változó[sorok száma][oszlopok száma] hivatkozás: változó[sorindex][oszlopindex] 14/42
C++ típusok Tömb típus példa int t[100]; // 100 elemű tömb int n; // tényleges méret: n<=100 cin >> n; for(int i=0;i<n;++i){ // tömb feltöltése cin >> t[i]; } 15/42
C++ típusok Tömb típus int n; cin >> n; int t[n]; // n elemű tömb for(int i=0;i<n;++i){ // tömb feltöltése cin >> t[i]; } 16/42
C++ típusok Tömb kezdőértékkel int t[3]={1,3,5}; // 3 elemű tömb int u[]={1,3,5,7}; // 4 elemű tömb char v[]= abc // 4 elemű tömb, utolsó eleme a 0 kódú karakter Konstans tömb const string Szinek[5]={"zöld","piros", "sárga","fehér","fekete"}; 17/42
C++ típusok Rekord típus típusnév: struct Nev { tipus 1 mező 1 ; tipus 2 mező 2 ;... }; hivatkozás: változónév.mezőnév 18/42
C++ típusok Szöveges állomány (#include <fstream>) típusnév: ifstream, ofstreem nyitás: f.open(fnev.c_str()); zárás: f.close(); hibafüggvény: f.fail(); igaz, ha hiba történt hibaállapot megszüntetése: f.clear(); olvasás: f >> valtozo; getline(f,sor); f.get(kar); írás: f << kifejezes; vége?: f.eof() 19/42
C++ típusok Speciális műveletek & - bitenkénti ÉS ^ - bitenkénti KIZÁRÓ VAGY - bitenkénti VAGY ~ - bitenkénti TAGADÁS << - bitek BALRA léptetése >> - bitek JOBBRA léptetése Példa: int a = 5; // bináris: 0000000000000101 int b = a << 3; // bináris: 0000000000101000, // vagy 40 tizes számrendszerben int c = b >> 3; // bináris: 0000000000000101, // vagy 3 bittel vissza, a kezdőértékhez 20/42
C++ típusok Speciális műveletek (típusnév) változónév típuskonverzió sizeof(típusnév) típus mérete byte-okban sizeof(változó) a változó mérete byte-okban Felsorolás enum név {értékek} Példa: enum szin {piros,feher,zold}; enum szin {piros=3,feher=5,zold=7}; 21/42
C++ típusok További hasznos típusok stringstream állományszerűen kezelt szöveg #include <sstream> Példa: szövegből egész szám konvertálása string s("1204"); int i; stringstream(s) >> i; 22/42
C++ típusok További hasznos típusok vector változtatható méretű tömb #include <vector> Példa: vector <int> a; vector int b(10); a.resize(n); for(int i=0;i<(int)a.size();++i) {a[i]=i;} a.push_back(n); //növeli az elemszámot b.pop_back(); //csökkenti az elemszámot b.clear(); //minden elemet töröl a.back()=a.front() //utolsó is legyen az első 23/42
C++ típusok Mutató típus &változó a változó címe *változó a változó címen levő érték Mutató típus deklarálása típusnév *változó a változó típusnév típusú értékre mutat Mutató típushoz memóriafoglalás változó=new típusnév //egy elemnek változó=new típusnév[elemszám] //tömbnek Mutató típushoz memóriafelszabadítás delete változónév vagy delete []változónév 24/42
C++ típusok Mutatóval megadott rekord mezőinek elérése ekvivalens leírások rekordmutató->mezőnév (*rekordmutató).mezőnév de nem ekvivalens ezzel: *rekordmutató.mezőnév Mutató és tömb int *q; q=new int[db]; for (int i=0;i<db;i++){q[i]=i;} delete[] q; 25/42
C++ típusok Új típus typedef struktúra újtípusnév Példák: typedef int egesz; typedef int kistomb[5]; typedef struct{int x; int y;} pont; kistomb x; for (int i=0;i<5;++i) x[i]=i; pont p; p.x=5; p.y=6; 26/42
C++ utasítások Értékadás változó=kifejezés Az értékadásnak értéke is van, azaz továbbadható újabb változónak: v1=v2=v3=kifejezés Speciális értékadások: i++, ++i i=i+1 i++ i kezdeti értéke, ++i i megnövelt értéke i--, --i i=i-1 i-- i kezdeti értéke, --i i csökkentett értéke a=++i vagy a=i++ Mi a különbség? v+=kifejezés v=v+kifejezés v-=kifejezés v=v-kifejezés feltétel? kifejezés 1 : kifejezés 2 27/42
Elágazás C++ utasítások if(feltétel) if(feltétel) utasítás; { else utasítás; akkor ág } else { különben ág } A különben ág elhagyható. A feltétel bármi lehet, ami feltételként kiértékelhető: hamis=0; igaz 0. 28/42
C++ utasítások Elágazás sokfelé if(feltétel 1 ){ első ág } else if(feltétel 2 ){ második ág } else{ utolsó ág } 29/42
C++ utasítások Elágazás kifejezés szerint switch (kifejezés) { case konstans 1 : utasítássorozat 1 ; break; case konstans 2 : utasítássorozat 2 ; break; case konstans 3 : case konstans 4 : utasítássorozat 4 ; break; default : utasítássorozat 5 ; } Az egyéb esetben végrehajtandó ág elhagyható. (A break elhagyható jelentés ilyenkor módosul!) 30/42
C++ utasítások Feltételes ciklus (elöltesztelős) while(feltétel){ ciklusmag } Feltételes ciklus (hátultesztelős) do{ ciklusmag }while(feltétel) 31/42
C++ utasítások Számlálós ciklus for(kezdet;feltétel;növelés){ ciklusmag } Példák for(int i=0;i<n;++i){ int i=0; ciklusmag for(;i<n;){ } ciklusmag; ++i; for(i=0,j=n;j>0;++i,--j){ } ciklusmag } for(i=1;i<=n;i+=2){ ciklusmag } 32/42
Speciális vezérlésátadások continue folytatás break Példák C++ utasítások abbahagyás while(){ i++; if(i<=5) continue; if(i==n) break; ciklusmag } 2014.11.24. 12:10 33/42
C++ utasítások Beolvasás és kiírás #include <iostream> cin >> változó 1 >> változó 2 ; cout << kifejezés 1 << kifejezés 2 ; cout << endl; cout << \n ; getline(cin,str); 34/42
Beolvasás ellenőrzéssel C++ utasítások do{ cout << "kérdés:"; cin >> x; bool hiba=cin.fail(); if (hiba!helyes(x)) { cout << "hibaüzenet" << endl; cin.clear(); getline(cin,tmp, \n ) }; }while (hiba!helyes(x)); 35/42
C++ utasítások Megjegyzés Egy soros megjegyzés esetén: // megjegyzés Több soros megjegyzés esetén: /* */ megjegyzés 36/42
C++ utasítások Függvények típusnév függvénynév(formális paraméterek) { utasítások; return függvényérték; } A típusnév lehet void, ekkor nincs függvényérték. Lehet két függvénynek azonos neve, ha a paramétereik különbözőek. exit(kód) a programot fejezi be, ezzel a kóddal Függvények hívása függvénynév(aktuális paraméterek) 37/42
C++ utasítások Paraméter érték szerint int negyzet(int i){ int j=i*i; return j; } int k=negyzet(6); int n=negyzet(k+2); Paraméter cím (hivatkozás) szerint void negyzet(int i, int &j){ j=i*i; } negyzet(6,k); negyzet(k+2,n); 38/42
C++ utasítások Alapelv: a tömbök mindig hivatkozás szerint adódnak át! Bemenő paraméter int negyzet(const int x[], int n){...} int negyzet(const int x[maxn], int n){...} Kimenő paraméter int x[maxn] vagy int* x=new int[n]; //már definiált méretű int negyzet(int x[], int &n){...} int negyzet(int x[maxn], int &n){...} 39/42
C++ utasítások Paraméter feltételezett értéke int hatvany(int i, int k=2){ int h=1 for(int j=0;j<k;++j) h*=i; return (h); } int k=hatvany(6,2); int n=hatvany(6); 40/42
C++ utasítások Speciális, kódba behelyettesítendő függvény inline típus név(paraméterek){ utasítások } Függvény előredefiniálás típus név(paraméterek); Példák: int negyzet(int i); 41/42
Programozási nyelvek I. 5. előadás vége