Upload
others
View
5
Download
2
Embed Size (px)
Citation preview
Programozási nyelvek I.
5. előadás (Gregorics Tibor anyagának felhasználásával)
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
I. A nyelv története
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
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
A program szerkezete
#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
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
Deklaráció 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
Zsakó László: Programozási nyelvek I.
C++
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
Egész típus
típusnév: int
értékhalmaz: -231…231-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: -215…215-1 (gyakran)
long értékhalmaz: -231…231-1 (gyakran)
long long értékhalmaz: -263…263-1 (gyakran)
unsigned értékhalmaz: 0…232-1 (gyakran)
8/42
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
Valós típus
típusnév: double 8 byte-os, kb. 3.4*10308 (gyakran)
értékhalmaz: -…
műveletek: + - * / == != < <= > >= += -= *= /=
További valós típusok (módosítók)
float értékhalmaz: 4 byte-os, kb. 1.7*1038
long double értékhalmaz: 12 byte (gyakran)
10/42
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
Rekord típus
típusnév: struct Nev { tipus1 mező1;
tipus2 mező2;
...
};
hivatkozás: változónév.mezőnév
18/42
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
Speciális műveletek
& - bitenkénti ÉS | - bitenkénti VAGY
^ - bitenkénti KIZÁRÓ 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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − típusok
2014.11.24. 12:03
Ú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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
É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és1 : kifejezés2
27/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Elágazás
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; igaz0.
28/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Elágazás sokfelé
if(feltétel1){
első ág
}
else if(feltétel2){
második ág
}
else{
utolsó ág
}
29/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Elágazás kifejezés szerint
switch (kifejezés) {
case konstans1 : utasítássorozat1 ; break;
case konstans2 : utasítássorozat2 ; break;
case konstans3 :
case konstans4 : utasítássorozat4 ; break;
default : utasítássorozat5 ;
}
Az egyéb esetben végrehajtandó ág elhagyható.
(A break elhagyható – jelentés ilyenkor módosul!)
30/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Feltételes ciklus (elöltesztelős)
while(feltétel){
ciklusmag
}
Feltételes ciklus (hátultesztelős)
do{
ciklusmag
}while(feltétel)
31/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:10
Speciális vezérlésátadások
continue folytatás
break abbahagyás
Példák
while(){
i++;
if(i<=5) continue;
if(i==n) break;
ciklusmag
}
33/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Beolvasás és kiírás
#include <iostream>
cin >> változó1 >> változó2;
cout << kifejezés1 << kifejezés2;
cout << endl;
cout << ‘\n’;
getline(cin,str);
34/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Beolvasás ellenőrzéssel
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
Megjegyzés
Egy soros megjegyzés esetén:
// megjegyzés
Több soros megjegyzés esetén:
/*
megjegyzés
*/
36/42
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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
Zsakó László: Programozási nyelvek I.
C++ − utasítások
2014.11.24. 12:03
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