Egyszerű C++ program szerkezete

Hasonló dokumentumok
Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Programozás I gyakorlat

EAF I C++ nyelvi elemek felsorolása 1. Alapvet típusok

2.3. A C nyelv utasításai

Tanácsok egyszerű programok készítéséhez

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Bevezetés a C++ programozásba

Minta programterv a 1. házi feladathoz

117. AA Megoldó Alfréd AA 117.

Érettségi feladatok Algoritmusok egydimenziós tömbökkel (vektorokkal) 1/6. Alapműveletek

Lineáris algebra gyakorlat

Fordítóprogramok Készítette: Nagy Krisztián

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

Maximum kiválasztás tömbben

Párhuzamos programozás

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Arany Dániel Matematikai Tanulóverseny 2011/2012-es tanév első (iskolai) forduló haladók I. kategória

3. Gyakorlat Ismerkedés a Java nyelvvel

INFORMATIKAI ALAPISMERETEK

Analízis elo adások. Vajda István október 3. Neumann János Informatika Kar Óbudai Egyetem. Vajda István (Óbudai Egyetem)

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

A táblázatkezelő felépítése

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Adatok ábrázolása, adattípusok. Összefoglalás

A döntő feladatai. valós számok!

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Bevezetés a C++ programozási nyelvbe

Prolog 1. Készítette: Szabó Éva

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Trigonometria

Géptermi zh-írás forgatókönyve

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

VHDL szimuláció. Tervezés. Labor II. Dr. Hidvégi Timót

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉPSZINT Függvények

AWP TELEPÍTÉSE- WINDOWS7 64 OPERÁCIÓS RENDSZEREN

Országzászlók (2015. május 27., Sz14)

Vektoros elemzés végrehajtása QGIS GRASS moduljával 1.7 dr. Siki Zoltán

EPER E-KATA integráció

Programozás. A programkészítés lépései. Program = egy feladat megoldására szolgáló, a számítógép számára értelmezhető utasítássorozat.

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Bevezetés a programozásba I.

Az éves statisztikai összegezés STATISZTIKAI ÖSSZEGEZÉS AZ ÉVES KÖZBESZERZÉSEKRŐL A KLASSZIKUS AJÁNLATKÉRŐK VONATKOZÁSÁBAN

Laborgyakorlat Windows 7 upgrade-je, felhasználói adatok költöztetése

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

KOVÁCS BÉLA, MATEMATIKA I.

Adatbázis-kezelés. 7. SQL Táblák összekapcsolása

Shared IMAP beállítása magyar nyelvű webmailes felületen

Vodafone ReadyPay. Használati útmutató

Tartalom. 1. A dokumentum célja... 2

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

1. forduló. MEGOLDÁSOK Pontszerző Matematikaverseny 2015/2016-os tanév

Dr. Schuster György február 21. Real-time operációs rendszerek RTOS

2011. március 9. Dr. Vincze Szilvia

Bevezetés a programozásba I.

C# gyorstalpaló. Készítette: Major Péter

Tartalomjegyzék. Tartalom 1/16

Széchenyi István Szakképző Iskola

Hálózati beállítások gyorsútmutatója

1. Metrótörténet. A feladat folytatása a következő oldalon található. Informatika emelt szint. m2_blaha.jpg, m3_nagyvaradter.jpg és m4_furopajzs.jpg.

KOVÁCS BÉLA, MATEMATIKA I.

Analízis elo adások. Vajda István szeptember 24. Neumann János Informatika Kar Óbudai Egyetem. Vajda István (Óbudai Egyetem)

Programozás II. 2. Dr. Iványi Péter

FORTE MAP 5.0 Felhasználói tájékoztató

Diszkrét matematika I. gyakorlat

Jelek tanulmányozása

IDE64 dokumentáció. A merevlemez előkészítése az első használatra. 1. Előkészítés. 2. Csatlakoztatás. 3. Segédprogram másolás

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Korszerű geodéziai adatfeldolgozás Kulcsár Attila

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Console I/O, Operátorok. Dr. Bécsi Tamás 2. Előadás

HENYIR felhasználói dokumentáció

A Hozzárendelési feladat megoldása Magyar-módszerrel

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

Erste MobilBank Felhasználói kézikönyv

Ismerkedés a powershellel 2. rész

Programozás alapjai Bevezetés

Programozás C++ -ban 2007/4

Linux fájlrendszerek.

Bevezetés a programozásba I 5. gyakorlat. C++ alapismeretek Giachetta Roberto groberto@inf.elte.hu

Objektumorientált programozás C# nyelven

Programozás alapjai 1. (BMEVIEEA100)

Üresként jelölt CRF visszaállítása

Elıírt lépésszámú ciklusok

DLookup függvény 1. (5)

Elektronikus öltözőszekrényzárak

Tisztítószerek és tisztító eszközök beszerzése (14669/2014.)- módosítás

Ablakok használata. 1. ábra Programablak

A szerzõrõl... xi Bevezetés... xiii

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

1. Alapok. Programozás II

Körkörös listák. fej. utolsó. utolsó. fej

Útmutató a vízumkérő lap kitöltéséhez

Az első lépések. A Start menüből válasszuk ki a Minden program parancsot. A megjelenő listában kattintsunk rá az indítandó program nevére.

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.

Házi dolgozat. Minta a házi dolgozat formai és tartalmi követelményeihez. Készítette: (név+osztály) Iskola: (az iskola teljes neve)

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Vegyes tételek könyvelése felhasználói dokumentum Lezárva:

JÁRÁST SEGÍTŐ ESZKÖZÖK

Átírás:

Egyszerű C++ program szerkezete A konzol alkalmazás projektjébe egyetlen cpp kiterjesztésű (alapértelmezésben main.cpp) forrásállomány tartozik. Az állomány elején a kódrészben használt utasításokhoz szükséges könyvtárakat nevezhetjük meg az #include kezdetű sorok segítségével. Ezek között a leggyakrabbak az #include <iostream> (szabványos beolvasáshoz és kiíráshoz), az #include <fstream> (szöveges állományok kezeléséhez), az #include <string> (karakterláncok kezeléséhez) és az #include <math> (matematikai függvények használatához). Az #include kezdetű sorokat mindig a using namespace std utasítás kövesse! Ezután következzen az úgynevezett main() függvény, amelyben programkódunkat helyezzük el. A végrehajtható utasításokból és deklarációkból álló programkód többnyire hármas tagozódású: beolvasás, számítás és kiírás részekből áll, de nem ritka, hogy a beolvasás vagy a kiírás összekeveredik a számítás résszel. A végrehajtható utasítások strukturált szerkezetben helyezkednek el, amelyet tabulátorok elhelyezésével emelünk ki. A deklaráció megnevezi a programban használt változókat, megadnia azok típusát. Azokat a változókat, amelyek a feladat tervében szerepelnek, a programkód elején deklaráljuk, a többi változót pedig abban a blokkban, ahol szükség van rájuk. A kód végén mindig egy úgynevezett kilépő utasításnak (return 0) kell állnia. Az itt szereplő nulla érték a programot futtató környezethez, az operációs rendszerhez jut el, és azt jelzi, hogy a program rendben lefutott. A hibás működés miatti leálláskor ettől eltérő hibakód keletkezik. A kódban magunk is elhelyezhetünk olyan kilépő utasítást, amely hibakóddal áll le. Erre az egyszerű programokban egyformán használható a return 1 és az exit(1), de az összetettebb programok esetén az utóbbi az általánosabb megoldás. A konzolos alkalmazások végrehajtása során egy úgynevezett konzol-ablak nyílik a képernyőn, amelyben a billentyűzet keresztül bevitt jeleket, illetve a képernyőre kiírt értékeket olvashatjuk. A leállás után ez az ablak megszűnik. Ha egy fejlesztő eszköz keretében futtatunk egy programot, akkor annak befejeződése után többnyire csak egy külön <enter> leütésre szűnik meg ez a konzol-ablak. Ha azonban programot önállóan futtatjuk, akkor a program leállásakor ez az ablak azonnal megszűnik, így nincs lehetőségünk a konzolablakba írt eredmények elolvasására. Ennek kivédésére a leállási pontok elé várakozási utasítást helyezhetünk el. A char ch; cin >> ch; ugyan nem túl elegáns, de operációs rendszerektől független várakozó utasítás, amely feloldásához előbb tetszőleges karaktert, majd az <enter> billentyűt kell leütni. 1

Deklaráció A változók deklarációja a típus nevének és utána legalább egy szóközt követően a változó nevének megadásából áll. A deklarációk végrehajtásakor megfelelő méretű hely foglalódik le a memóriában, ahol bizonyos esetekben (a változó típusától függően) a változó értéke tárolódik, máskor viszont csak az érték eléréséhez szükséges segédinformáció. Több azonos típusú változó egyszerre is deklarálható, ha a típus név után a változóneveket vesszővel elválasztva felsoroljuk. Egy változó deklarációja összevonható a kezdeti értékadásával. típusnév változó; típusnév változó1, változó2, változó3; típusnév változó = érték; típusnév változó = kifejezés; 2

Alapvető típusok A C++ nyelvben leggyakrabban használt alaptípusok az alábbiak: Egész illetve természetes számok típusa típusnév: int értékek: 83, -1320 műveletek: + - * / % ==!= < <= > >= megjegyzés: az osztás eredménye egész Valós számok típusa típusnév: double értékek: 83.0, -1320.345 műveletek: + - * / % ==!= < <= > >= megjegyzés: az osztás eredménye valós Logikai típus típusnév: bool értékek: false, true műveletek: &&! ==!= Karakterek típusa típusnév: char értékek: a, 3, \ műveletek: ==!= Karakterlánc típusa típusnév: string értékek: valami, Karakterlánc-konstans sortörése: Ez itt egy nagyon hosszú \ másik sorba is átnyúló szöveg műveletek: size(length) + [] c_str() substr() ==!= string str esetén: str.size() az str hossza (karaktreinek száma) str[i] az str i-edik karaktere str + vége két karakterlánc összefűzése 3

megjegyzés: str.c_str() str átalakítása C stílusú lánccá str.substr(i,j) str részének kivágása atoi(str.c_str()) számmá konvertálása Alkalmazásához szükséges az #include <string> direktríva. A string az std névtér eleme. 4

Elemi programok Értékadás A változó := kifejezés értékadást a C++ nyelvben változó = kifejezés alakban írjuk. Szimultán értékadások A szimultán értékadásokat közönséges (rendszerint egy sorba írt) értékadások szekvenciájaként (lásd szekvencia) lehet leírni. Értékadás értéke A C++ nyelv értékadásának, mint utasításnak, értéke is van, mégpedig az értékül adott kifejezés értéke. Más szóval egy értékadás egyszerre utasítás is, és kifejezés is. Ezért lehet például olyan értékadásokat írni, mint változó1 = változó2 = kifejezés; amely mindkét változónak a kifejezés értékét adja. Ezt olyan szimultán értékadások kódolásánál használjuk, ahol minden változó ugyanazt az értéket kapja meg. Gyakori hiba, hogy a változó == kifejezés egyenlőség-vizsgálat helyett változó = kifejezés formát írunk. Sajnos mivel az értékadásnak is van értéke, és egy tetszőleges érték könnyen konvertálódik logikai értékké ezt a fordítóprogram nem jelzi hibaként. Ha például az i==1 kifejezés helyett rosszul az i = 1 értékadást használjuk, akkor ennek az értékadásnak az értéke 1, amit a C++ true logikai értéknek tekint. Ez a logikai kifejezésnek szánt értékadás mindig igaz lesz, miközben az i változó új értéket kap. Speciális értékadások ++i, i++ i = i+1 --i, i-- i = i-1 Vigyázat! Kifejezésként használva az i++ az i kezdeti értékét a ++i az i megnövelt érékét képviseli. 5

Programszerkezetek Szekvencia Az utasítások végrehajtási sorrendje (szekvenciája) az utasítások egymás utáni elhelyezésével fejezhető ki. Mivel az utasítások végét általában pontosvessző jelzi, ezért a pontosvessző egyfajta szekvencia-határolónak (szekvencia pontnak) számít. Több utasítás szekvenciája befoglalható egy úgynevezett utasításblokkba, amelyet a fordító egyetlen bár összetett utasításként kezel. Az utasításblokk elejét a nyitó kapcsos zárójel, végét a csukó kapcsos zárójel jelzi. Mivel az utasításblokk egy utasítás, utasításblokkok szekvenciájáról is beszélhetünk, ahol a szekvencia-határolók a csukó kapcsos zárójelek. Összetett utasításnak, azaz szekvenciának tekinthető az alábbi értékadás is. Ez először megnöveli a k értékét, utána ezt a megnövelt értéket adja j-nek, majd i-nek. Elágazás i = j = ++k; Az elágazás az a program, amely egy feltétel aktuális logikai értékétől függően más-más részprogramot hajt végre. Többféle írásmódot is szoktak alkalmazni: if(feltétel) if(feltétel){ if(feltétel){ { ág_1 ág_1 ág_1 else{ else{ ág_2 else ág_2 { ág_2 Egyszerűbb esetben if(feltétel) else ut_1; ut_2; A ki nem írt else ág üres utasítású ágat jelent: if(feltétel)ut_1; Sokágú elágazás A sokágú elágazást egymásba ágyazott if-else elágazásokkal kódolhatjuk. Tudni kell azonban, hogy így az absztrakt elágazással ellentétben, amelyik nem-determinisztikus és ha egyik feltétel sem teljesül, akkor abortál ez determinisztikus és ha egyik feltétel sem teljesül, akkor üres programként működő kódot kapunk. Ez azonban nem baj, mert ha az absztrakt elágazás helyes volt, akkor annak valamelyik feltétele biztosan teljesül, és bármelyik determinisztikus változat is helyes. A kódban használhatunk sok ág után egy külön else ágat is, amely az absztrakt változathoz képest egy extra lehetőséget biztosít. 6

if(feltétel_1){ ág_1 else if(feltétel_2){ ág_2 else if(feltétel_3) else{ ág_n+1 Speciális sokágú elágazás switch (kifejezés) { case konstans1 : utasítássorozat1 ; break; case konstans2 : utasítássorozat2 ; break; case konstans3 : case konstans4 : utasítássorozat34 ; break; default : utasítássorozat5 ; Ciklus Ciklusról akkor beszélünk, amikor egy programot (ciklusmag) mindannyiszor újra és újra végrehajtunk, valahányszor egy megadott feltétel (ciklusfeltétel) aktuális logikai értéke igaz. while (feltétel){ mag Ciklust tartalmazó nevezetes összetett utasítások A for utasítás a for utasítás prog_1; while ( felt ){ mag; prog_2; kód egyszerűbb írására használható. Formája: for (prog_1;felt;prog_2){ mag Általában az úgynevezett számlálós ciklusokhoz, illetve az iteratív szerkezetű adatok feldol- A do-while utasítás a do-while utasítás mag; while ( felt ){ mag kód egyszerűbb írására használható. Formája: do{ mag while ( felt ) Egyrészt adatbevitel ellenőrzésénél használjuk: do{ adatbevitel if(kritérium) üzenet 7

gozásához használjuk. for (i=0;i<n;++i){ mag Az i az úgynevezett ciklusszámláló. Ha a ciklusmag egyetlen utasításból áll, akkor használható az alábbi forma: for (i=0;i<n;++i) utasítás; while ( kritérium ) másrészt amikor a programot alkalmassá tesszük arra, hogy tetszőleges sokszor futtathassuk: do{ program cout << Folytatja? (I/N) ; char ch; cin >> ch; while (ch!= N && ch!= n ); 8

Szabványos be- és kimenet Az alábbi kódrészlet a szabványos beolvasás, illetve kiírás legfontosabb utasításait mutatja be. #include <iostream> cin >> változó1 >> változó2; cout << kifejezés1 << kifejezés2; cout << endl; Szám ellenőrzött beolvasása Sokszor van olyan kódra szükségünk, amellyel egy egész számot kell beolvasnunk. int i; cin >> i; Ez a beolvasás elszáll, ha nem számformájú karaktereket adunk meg. Ezt a hibát a cin.fail() függvényhívással kérdezhetjük le: ha ez igazat ad vissza, akkor nem sikerült az olvasás. Jó tudni, hogy ezután csak akkor lehet újra olvasni, ha egyrészt töröljük a hibaesetet (cin.clear()), másrészt egy speciális utasítással kiürítjük a billentyűzet-puffert (getline(cin,tmp, \n ), ebben a tmp egy string típusú változó). Az alábbi programrészlet egy pozitív egész számot olvas be. Mindaddig újra és újra próbálkozik a beolvasással, amíg nem kap helyes adatot: int i; bool hiba = false; do{ cout << Adjon meg egy pozitív egész számot ; cin >> i; hiba = cin.fail() && i<=0; if(hiba){ cout << Hibás adat! << endl; cin.clear(); string tmp; getline(cin,tmp, \n ); while(hiba); Szerkesztett formátumú beolvasás, kiírás A formátumjelző flageket a cin.setf(), cout.setf(), cin.unsetf(), cout.unsetf() függvények paramétereként kell felsorolni a jellel elválasztva.. A setf() beállítja, az unsetf() kikapcsolja őket, a kettő között érvényben vannak. Némelyikük alapértelmezett módon be van kapcsolva. Minden flag elé az ios:: minősítést kell írni. 9

Formátumjelző flagek: scientific, fixed, right, left, dec, hex, oct, showpoint, showpos skipws lebegőpontos alak fixpontos alak jobbra ill. balra tömörítés, szám megjelenítésének számrendszere előjel látszódjon-e elválasztó jelek átlépése olvasáskor A manipulátorok csak az adott adat mozgatásra vonatkoznak. Őket a << operátorral kell a standard kimenetre küldeni. Manipulátorok: setw(int w), width(int w) mezőszélesség megadása setprecision(int p), precision(int p) számábrázolás pontossága setfill(char c)... endl Karakter beolvasása kitöltő karakter definiálása sorvége A >> operátorral egyetlen karaktert is be lehet olvasni, feltéve, hogy az nem elválasztó jel. Ha elválasztó jeleket is be szeretnénk olvasni, akkor vagy kikapcsoljuk a whitespace-eket átugró mechanizmust: cin.unsetf(ios::skipws), vagy a get() függvénnyel olvasunk. char ch; cin.get(ch); A get() függvény párja a put(), amivel egyetlen karaktert lehet kiírni. Sor beolvasása Szóközzel elválasztott vagy üres karakterláncot nem tudunk a >> operátorral beolvasni. Ilyenkor a beolvasásnak másik formáját kell használni: getline(cin,str); Ügyeljünk azonban arra, hogy ha vegyesen használjuk a kétféle olvasási módot, akkor a getline() alkalmazása előtt ürítsük ki a billentyűzet puffert. 10

Összetett szerkezetű típusok A típusszerkezetekkel egyszerűbb típusokból építhetünk fel összetett szerkezetű típusokat. Tömb A tömb több azonos típusú elem tárolására használt adatszerkezet, amelyben megengedett az adott indexű elemre való hivatkozás. A C++ nyelven többféleképpen is használhatunk tömböket. Ezek némelyike túl mutat a tömb használatán, mert olyan műveleteket is megenged (például tömbhöz új elem hozzáfűzése vagy utolsó elemének elhagyása), amelyeket egy tömbre nem szokás megengedni. Fordítási időben rögzített méretű, automatikus helyfoglalású egydimenziós tömb (vektor) 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]; Futási időben rögzített méretű, automatikus helyfoglalású egydimenziós tömb (vektor) 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]; Futási időben rögzített méretű, dinamikus helyfoglalású egydimenziós tömb (vektor) int* t; // véges méretű tömb deklarálása int n; // tényleges méret cin >> n; t = new int[n]; // tömb lefoglalása futás közben for(int i=0;i<n;++i){ // tömb feltöltése cin >> t[i]; delete[] t; // tömb felszabadítása Változtatható méretű egydimenziós vector<> int n; cin >> n; vector<int> t(n); t.size() // tömb deklarálása a méretével együtt // tömb elemeinek száma 11

vector<int> t; // véges méretű tömb deklarálása t.resize(n); // tömb méretének megváltoztatása for(int i=0;(int)i<t.size();++i) // tömb feltöltése cin >> t[i]; t.push_back(új); // tömb végére új elemet illeszt Fordítási időben rögzített méretű, automatikus helyfoglalású kétdimenziós tömb (mátrix) Elem t[10][20]; // lefoglalt mátrix int n,m; // tényleges méret cin >> n >> m; for (int i=0;i<n;++i) // t feltöltése for (int j=0;j<m;++j) cin>>t[i][j]; Futási időben rögzített méretű, automatikus helyfoglalású kétdimenziós tömb (mátrix) int n,m; // méret cin >> n >> m; Elem t[n][m]; // lefoglalt mátrix for (int i=0;i<n;++i) // t feltöltése for (int j=0;j<m;++j) cin>>t[i][j]; Futási időben rögzített méretű, dinamikus helyfoglalású kétdimenziós tömb (mátrix) Elem** t; int n,m; cin >> n >> m; t=new Elem*[n]; // véges méretű mátrix // tényleges méret for (int i=0;i<n;++i){ // t feltöltése t[i]=new Elem[m]; for (int j=0;j<m;++j) cin>>t[i][j]; for (int i=0;i<n;++i) delete[] t[i]; delete[] t; // t felszabadítása Változtatható méretű kétdimenziós vector<vector<> > int n, m; cin >> n >> m; vector<vector<int> > t(n, m); // téglalap mátrix deklarálása t.size() // mátrix sorainak száma t[0] // mátrix első sora t[0].size() // első sor elemeinek száma 12

t[0][0] // első sor első eleme vector<vector<int> > t; // mátrix deklarálása t.resize(n); // mátrix sorai számának megváltoztatása t[0].resize(m) // sor méretének megváltoztatása for(int i=0;(int)i<t.size();++i) // téglalap mátrix feltöltése for(int j=0;(int)j<t.size();++j) cin >> t[i][j]; Struktúra A rekord típusnak megfeleltetett szerkezet: struct Nev { tipus1 mezo1; tipus2 mezo2;... ; Nev d; d.mezo1 = ; = d.mezo1; A d.mezo1 kifejezés (a mezo1 a szelektor függvény) állhat értékadás jobb- illetve baloldalán. Az egyik esetben felhasználjuk d.mezo1 kifejezés által képviselt értéket, a másik esetben megváltoztathatjuk azt. 13

Szöveges állományok A szöveges állományok olyan karakteres állományok, amelyekben bizonyos nem látható karakterek a szöveg tördeléséért felelősek. Ezeket az állományokat kétféleképpen használhatjuk: olvasásra vagy írásra. Mindkét művelet sorban, egymás után történik. Nemcsak karakterenként, hanem nagyobb szintaktikai egységenként is, például soronként, szavanként, stb. olvashatunk illetve írhatunk. Az Szöveges állomány deklarálása, nyitása, ellenőrzése, zárása ifstream f; ofstream f; definiál egy úgynevezett bementi illetve kimeneti adatfolyam objektumot (f az objektum neve), amelyek segítségével a szöveges állomány adatait olvashatjuk vagy hozzájuk írhatunk. Szükségünk van még az alábbi sorra is: Az #include <fstream> f.open(fnev.c_str()); megnyitja az adatfolyamot. Az adatfolyam forrásának, azaz a szöveges állománynak a nevét archaikus karakterlánc formában kell megadnunk. Az archaikus karakterláncokról elég annyit tudni, hogy egy string típusú változóban (legyen a neve: str) tárolt sztringnek az str.c_str() adja meg az archaikus alakját. Az adatfolyam az f.close(); utasítással zárható le. Az adatfolyam definíciója és megnyitása összevonható egy lépésbe: ifstream f(fnev.c_str()); ofstream f(fnev.c_str()); Ilyenkor nem kell az adatfolyamot a close() utasítással külön lezárni. Egy adatfolyam megnyitásakor (akár közvetlenül, akár az open() utasítással történik) különféle hibák fordulhatnak elő. A leggyakoribb az, hogy a megnevezett szöveges állományt nem találjuk meg, mert elfelejtettük létrehozni, vagy nem abban a könyvtárban van, ahol keressük. A hibára a fail() függvény lekérdezésével kérdezhetünk rá. Hiba esetén értesíthetjük a felhasználót a szabványos kimentre küldött üzenettel, és egy alkalmas hibakóddal ami nem nulla leállítjuk a program futását: exit(1). ifstream f(fnev.c_str()); if (f.fail()) { 14

cout << "Hiányzik az állomány" << endl; char ch; cin>>ch; exit(1); Ha egy adatfolyamot egy sikertelen kísérlet után újra meg akarunk nyitni, akkor előbb az f.clear() utasítást ki kell adnunk. ifstream f; string fnev; bool hiba; do { cout << "Az állomány neve: "; cin >> fnev; f.open(fnev.c_str()); if(hiba = f.fail()){ cout << "Fájl nyitási hiba!\n"; f.clear(); while(hiba) Olvasás, írás szöveges állománnyal Az olvasásra, írásra majdnem ugyanazok a szabályok érvényesek, mint a szabványos bemenetre illetve kimenetre. Lényeges különbség az, hogy itt egy olvasás a soron következő szintaktikai egységre, azaz elválasztó jelekkel (szóköz, tabulátor, sorvége) határolt részre vonatkozik. Általános formája beolvasásnál: Kiírásnál: f >> valtozo; f << kifejezes; Az Karakterek beolvasása szöveges állományból ifstream f; char df; f >> df; olvasás alapértelmezés szerint átlépi az elválasztó jeleket. Ha az összes karaktert akarjuk egymás után beolvasni, akkor az olvasás megkezdése előtt ki kell kapcsolni ezt a tulajdonságot. Ehhez az #include <iomanip> ifstream f; 15

vagy a f.unsetf(ios::skipws) f.get(df); kódot kell alkalmazni. A kiírás egyformán működik a f<<df illetve az f.put(df) utasítással. Sorok beolvasása szöveges állományból A getline() függvénnyel lehetőségünk van egy teljes sort, vagy egy megadott elválasztó jelig tartó karakterláncot beolvasni egy szöveges állományból. Az alábbi két megoldás egyenértékű: mindkettő egy teljes sort olvas, hiszen a sorok végét a \n sorvége karakter jelzi. ifstream f( ); string sor; getline(f, sor); getline(f, sor, \n ); 16

Egyéb nyelvi elemek Program leállítása 1-es hibakóddal Az exit(1) utasítás hatására programunk azonnal befejeződik, és az 1-es értéket (hibakódot) adja vissza a futtatási környezetnek (operációs rendszernek). Várakozó utasítás Elegáns általános várakozó utasítás nincs a C++-ban. A char ch; cin >> ch; egy kevésbé elegáns, de operációs rendszerektől független várakozó utasítás, amely feloldásához nem elég egy <enter> leütni, az előtt meg kell adni egy tetszőleges karaktert: char ch; cin >> ch; Megjegyzések kódba illesztése Írhatunk egy- illetve többsoros megjegyzéseket a programkódba, amiket a fordító figyelmen kívül hagy. Egy soros megjegyzés esetén: Sztringek kezelése Több soros megjegyzés esetén: // megjegyzés megjegyzés /* Egy sztringre számos hasznos előredefiniált függvény használható. A find() függvénycsalád (sok változata van) egy sztringben keres karaktert vagy rész-sztringet, annak sztringbeli pozícióját adja vissza, ha nem talál, akkor a string::npos extremális értéket. Lehet a sztring adott pozíciójától kezdődően keresni az első vagy az utolsó előfordulást. A sztringet megváltoztató függvények között találjuk a karaktert vagy rész-sztringet adott pozícióra beszúró ( insert), adott pozícióról törlő (erase), adott pozíción helyettesítő (replace) műveleteket. Hasznos lehetőséget rejt a sztringek feldolgozásában a stringstream-ek (#include <sstream>) alkalmazása. Egy input-sztringfolyamba helyezett sztringet úgy tudunk feldolgozni, mintha azt egy szöveges állományból olvastuk volna: string str = "Alma a fa alatt"; istringstream is; is.str(str); string word; while(is >> word) { cout << word << endl; /* 17

Az output-sztringfolyam segítségével tetszőleges sztring állítható össze úgy, hogy közben a sztringbe fűzött adatelemek konverziójára is sor kerül: ostringstream os; os << "A " << 3.2 << " egy valós szám "; str = os.str(); cout << str << endl; 18