Professional Documents
Culture Documents
Deklarci
A vltozk deklarcija a tpus nevnek s utna legalbb egy szkzt kveten a vltoz
nevnek megadsbl ll. A deklarcik vgrehajtsakor megfelel mret hely foglaldik le
a memriban, ahol bizonyos esetekben (a vltoz tpustl fggen) a vltoz rtke
troldik, mskor viszont csak az rtk elrshez szksges segdinformci. Tbb azonos
tpus vltoz egyszerre is deklarlhat ha a tpus nv utn a vltozneveket vesszvel
elvlasztva felsoroljuk. Egy vltoz deklarcija sszevonhat a kezdeti rtkadsval.
tpusnv vltoz;
tpusnv vltoz1, vltoz2, vltoz3;
tpusnv vltoz = rtk;
tpusnv vltoz = kifejezs;
Gregorics Tibor Egyszer programok C++ nyelvi elemei 2
Alapvet tpusok
A C++ nyelvben leggyakrabban hasznlt alaptpusok az albbiak:
tpusnv: int
rtkek: 83, -1320
mveletek: + - * / % == != < <= > >=
megjegyzs: az oszts eredmnye egsz
tpusnv: double
rtkek: 83.0, -1320.345
mveletek: + - * / == != < <= > >=
megjegyzs: az oszts eredmnye vals
Logikai tpus
tpusnv: bool
rtkek: false, true
mveletek: && || ! == !=
Karakterek tpusa
tpusnv: char
rtkek: a, 3, \
mveletek: == !=
Karakterlnc tpusa
tpusnv: string
rtkek: "valami", " "
Karakterlnc-konstans sortrse:
"Ez itt egy nagyon hossz \
msik sorba is tnyl szveg"
mveletek: size(length) + [] c_str() substr() == !=
string str esetn:
str.size() az str hossza (karaktreinek szma)
str[i] az str i-edik karaktere
str + "vge" kt karakterlnc sszefzse
str.c_str() str talaktsa C stlus lncc
str.substr(i,j) str rsznek kivgsa
atoi(str.c_str())szmm konvertlsa
megjegyzs: Alkalmazshoz szksges az #include <string> direktrva.
A string az std nvtr eleme.
Gregorics Tibor Egyszer programok C++ nyelvi elemei 3
Elemi programok
rtkads
A C++ nyelv rtkadsnak, mint utastsnak, rtke is van, mgpedig az rtkl adott
kifejezs rtke. Ms szval egy rtkads egyszerre utasts is, s kifejezs is. Ezrt lehet
pldul olyan rtkadsokat rni, mint
vltoz1 = vltoz2 = kifejezs;
amely mindkt vltoznak a kifejezs rtkt adja. Ezt olyan szimultn rtkadsok
kdolsnl hasznljuk, ahol minden vltoz ugyanazt az rtket kapja meg.
Gyakori hiba, hogy a vltoz == kifejezs egyenlsg-vizsglat helyett vltoz =
kifejezs formt runk. Sajnos mivel az rtkadsnak is van rtke, s egy tetszleges
rtk knnyen konvertldik logikai rtkk ezt a fordtprogram nem jelzi hibaknt. Ha
pldul az i==1 kifejezs helyett rosszul az i = 1 rtkadst hasznljuk, akkor ennek az
rtkadsnak az rtke 1, amit a C++ true logikai rtknek tekint. Ez a logikai kifejezsnek
sznt rtkads mindig igaz lesz, mikzben az i vltoz j rtket kap.
Specilis rtkadsok
++i, i++ i = i+1
--i, i-- i = i-1
Programszerkezetek
Szekvencia
Elgazs
Az elgazs az a program, amely egy felttel aktulis logikai rtktl fggen ms-ms
rszprogramot hajt vgre. Tbbfle rsmdot is szoktak alkalmazni:
Egyszerbb esetben
if(felttel) ut_1;
else ut_2;
Sokg elgazs
Ciklus
Ciklusrl akkor beszlnk, amikor egy programot (ciklusmag) mindannyiszor jra s jra
vgrehajtunk, valahnyszor egy megadott felttel (ciklusfelttel) aktulis logikai rtke igaz.
while(felttel){
mag
}
Ciklust tartalmaz nevezetes sszetett utastsok
A do-while utasts a
A for utasts a
mag;
prog_1;
while ( felt ){
while(felt){
mag
mag;
}
prog_2;
} kd egyszerbb rsra hasznlhat.
kd egyszerbb rsra hasznlhat. Formja:
Formja: do{
mag
for(prog_1;felt;prog_2){
}while ( felt )
mag
} Egyrszt adatbevitel ellenrzsnl
ltalban az gynevezett szmlls hasznljuk:
ciklusokhoz, illetve az iteratv szerkezet do{
adatok feldolgozshoz hasznljuk. adatbevitel
if(kritrium) zenet
for(i=0;i<n;++i){ }while ( kritrium )
mag
} msrszt amikor a programot alkalmass
Az i az gynevezett ciklus szmll. tesszk arra, hogy tetszleges sokszor
futtathassuk:
Ha a ciklusmag egyetlen utastsbl ll,
akkor hasznlhat az albbi forma: do{
program
for(i=0;i<n;++i) utasts; cout << "Folytatja? (I/N)";
char ch; cin >> ch;
}while (ch!=N && ch!=n);
Gregorics Tibor Egyszer programok C++ nyelvi elemei 6
Sokszor van olyan kdra szksgnk, amellyel egy egsz szmot kell beolvasnunk.
int i;
cin >> i;
Az albbi programrszlet egy pozitv egsz szmot olvas be. Mindaddig jra s jra
prblkozik a beolvasssal, amg nem kap helyes adatot:
int n;
bool hiba = false;
do{
cout << "Adjon meg egy pozitv egsz szmot ";
cin >> n;
hiba = cin.fail();
if(hiba) cin.clear();
string tmp = "";
getline(cin,tmp);
hiba = hiba || tmp.size()!=0 || n<0;
if(hiba) cout << "Hibs adat!" << endl;
}while(hiba);
Karakter beolvassa
A >> opertorral egyetlen karaktert is be lehet olvasni, feltve, hogy az nem elvlaszt jel.
Ha elvlaszt jeleket is be szeretnnk olvasni, akkor vagy kikapcsoljuk a whitespace-eket
tugr mechanizmust: cin.unsetf(ios::skipws), vagy a get() fggvnnyel olvasunk.
char ch;
cin.get(ch);
A get() fggvny prja a put(), amivel egyetlen karaktert lehet kirni.
Sor beolvassa
Szkzzel elvlasztott vagy res karakterlncot nem tudunk a >> opertorral beolvasni.
Ilyenkor a beolvassnak msik formjt kell hasznlni:
getline(cin,str);
gyeljnk azonban arra, hogy ha vegyesen hasznljuk a ktfle olvassi mdot, akkor a
getline() alkalmazsa eltt rtsk ki a billentyzet puffert.
Tmb
A tmb tbb azonos tpus elem trolsra hasznlt adatszerkezet, amelyben megengedett az
adott index elemre val hivatkozs.
A C++ nyelven tbbflekppen is hasznlhatunk tmbket. Ezek nmelyike tl mutat a tmb
hasznlatn, mert olyan mveleteket is megenged (pldul tmbhz j elem hozzfzse vagy
utols elemnek elhagysa), amelyeket egy tmbre nem szoks megengedni.
Struktra
struct Nev {
tipus1 mezo1;
tipus2 mezo2;
...
};
Nev d;
d.mezo1 = ;
= d.mezo1;
A d.mezo1 kifejezs (a mezo1 a szelektor fggvny) llhat rtkads jobb- illetve
baloldaln. Az egyik esetben felhasznljuk d.mezo1 kifejezs ltal kpviselt rtket, a msik
esetben megvltoztathatjuk azt.
Szveges llomnyok
Az
ifstream f;
ofstream f;
definil egy gynevezett bementi illetve kimeneti adatfolyam objektumot (f az objektum
neve), amelyek segtsgvel a szveges llomny adatait olvashatjuk vagy hozzjuk rhatunk.
Szksgnk van mg az albbi sorra is:
#include <fstream>
Az
f.open(fnev.c_str());
megnyitja az adatfolyamot. Az adatfolyam forrsnak, azaz a szveges llomnynak a nevt
archaikus karakterlnc formban kell megadnunk. Az archaikus karakterlncokrl elg annyit
tudni, hogy egy string tpus vltozban (legyen a neve: str) trolt sztringnek az
str.c_str() adja meg az archaikus alakjt. Az adatfolyam defincija s megnyitsa
sszevonhat egy lpsbe:
ifstream f(fnev.c_str());
ofstream f(fnev.c_str());
Az adatfolyam az
f.close();
utastssal zrhat le, amelyre azonban automatikusan sor kerl akkor, amikor a vezrls elri
az adatfolyam deklarcijt tartalmaz blokk vgt.
Egy adatfolyam megnyitsakor (akr kzvetlenl, akr az open() utastssal trtnik)
klnfle hibk fordulhatnak el. A leggyakoribb az, hogy a megnevezett szveges llomnyt
nem talljuk meg, mert elfelejtettk ltrehozni, vagy nem abban a knyvtrban van, ahol
keressk. A hibra a fail() fggvny lekrdezsvel krdezhetnk r. Hiba esetn
rtesthetjk a felhasznlt a szabvnyos kimentre kldtt zenettel, s egy alkalmas
hibakddal ami nem nulla lelltjuk a program futst: exit(1).
ifstream f(fnev.c_str());
if (f.fail())
{
cout << "Hinyzik az llomny" << endl;
char ch; cin>>ch;
exit(1);
}
Ha egy adatfolyamot egy sikertelen ksrlet utn jra meg akarunk nyitni, akkor elbb az
f.clear() utastst ki kell adnunk.
ifstream f;
string fnev;
bool hiba;
Gregorics Tibor Egyszer programok C++ nyelvi elemei 11
do
{
cout << "Az llomny neve: "; cin >> fnev;
f.open(fnev.c_str());
if(hiba = f.fail()){
cout << "Fjl nyitsi hiba!\n";
f.clear();
}
}while(hiba)
f >> valtozo;
Kirsnl:
f << kifejezes;
Az
ifstream f;
char df;
f >> df;
olvass alaprtelmezs szerint tlpi az elvlaszt jeleket. Ha az sszes karaktert akarjuk
egyms utn beolvasni, akkor az olvass megkezdse eltt ki kell kapcsolni ezt a
tulajdonsgot. Ehhez az
#include <iomanip>
ifstream f;
f.unsetf(ios::skipws)
vagy a
f.get(df);
A getline() fggvnnyel lehetsgnk van egy teljes sort, vagy egy megadott elvlaszt
jelig tart karakterlncot beolvasni egy szveges llomnybl. Az albbi kt megolds
egyenrtk: mindkett egy teljes sort olvas, hiszen a sorok vgt a \n sorvge karakter jelzi.
Gregorics Tibor Egyszer programok C++ nyelvi elemei 12
ifstream f( );
string sor;
getline(f, sor);
getline(f, sor, \n );
Vrakoz utasts
Elegns ltalnos vrakoz utasts nincs a C++-ban. A char ch; cin >> ch; egy
kevsb elegns, de opercis rendszerektl fggetlen vrakoz utasts, amely feloldshoz
nem elg egy <enter> letni, az eltt meg kell adni egy tetszleges karaktert:
/*
// megjegyzs megjegyzs
*/
Sztringek kezelse
A find() fggvnycsald (sok vltozata van) egy sztringben keres karaktert vagy rsz-
sztringet, annak sztringbeli pozcijt adja vissza, ha nem tall, akkor a string::npos
extremlis rtket. Lehet a sztring adott pozcijtl kezdden keresni az els vagy az utols
elfordulst.
istringstream is;
is.str(str);
string word;
while(is >> word) { cout << word << endl;}
Az output-sztringfolyam segtsgvel tetszleges sztring llthat ssze gy, hogy kzben a
sztringbe fztt adatelemek konverzijra is sor kerl:
ostringstream os;
os << "A " << 3.2 << " egy vals szm ";
str = os.str();
cout << str << endl;