8. Gyakorlat. Rövid elméleti összefoglaló: Fájlkezelés



Hasonló dokumentumok
Pénzügyi algoritmusok

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

Bevezetés a programozásba I.

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése

5. Gyakorlat. struct diak {

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

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

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.

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

A C programozási nyelv I. Bevezetés

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

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

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

MATLAB. 9. gyakorlat. Cellatömbök, struktúrák, fájlműveletek

A C programozási nyelv I. Bevezetés

Bevezetés a programozásba I.

Programozás C++ -ban 2007/1

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

1. Gyakorlat. Rövid elméleti összefoglaló. <tárolási osztály>típus <típus > változónév <= kezdőérték><, >;

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

6. A Pascal nyelv utasításai

7. gyakorlat Sorozatok, Fájlkezelés

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

ELTE SAP Excellence Center Oktatóanyag 1

1. Alapok. Programozás II

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás I gyakorlat

Programozás C nyelven 5. ELŐADÁS. Sapientia EMTE

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Bevezetés a C++ programozásba

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozási nyelvek Java

Programozás I gyakorlat

AWK programozás, minták, vezérlési szerkezetek

Alkalmazott modul: Programozás 2. előadás. Procedurális programozás: adatfolyamok, adatsorok kezelése. Adatfolyamok kezelése. Adatfolyamok kezelése

Bánsághi Anna 2014 Bánsághi Anna 1 of 35

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

2018, Funkcionális programozás

Bevezetés a programozásba I 7. gyakorlat. C++: szövegkezelés, szekvenciális fájlkezelés. Szövegkezelés Karakterkezelés

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

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Adatbázisrendszerek I. Fájlszintű adattárolás C-ben

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

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

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

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

Mintavételes szabályozás mikrovezérlő segítségével

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

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

AWK programozás, minták, vezérlési szerkezetek

INFORMATIKA tétel 2019

1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt:

Informatika terméktervezőknek

Adatbázisrendszerek I. File-szintű adattárolás C-ben. 1. gyakorlat

BASH script programozás II. Vezérlési szerkezetek

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás Minta programterv a 1. házi feladathoz 1.

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

Programozási nyelvek Java

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás alapjai 3.Gy: C elágazások, ciklusok P R O

Listák, szótárak, fájlok Listák, szótárak, fájlok

Webprogramozás szakkör

Felvételi tematika INFORMATIKA

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

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

Fájlkezelés. Szöveges fájlok kezelése

7/8. gyakorlat Karaktertömbök és sztringkezelés

Programozás C és C++ -ban

Algoritmizálás + kódolás C++ nyelven és Pascalban

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

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

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

INFORMATIKA javítókulcs 2016

Programozás 6. Dr. Iványi Péter

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

7. fejezet: Mutatók és tömbök

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

4. GYAKORLAT. Rövid elméleti összefoglaló. Írjunk függvényt a téglalap területének kiszámítására: Visual Basic függvény

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Szövegek C++ -ban, a string osztály

Vezérlési szerkezetek

1. Olvassuk be két pont koordinátáit: (x1, y1) és (x2, y2). Határozzuk meg a két pont távolságát és nyomtassuk ki.

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Fejlett programozási nyelvek C++ Iterátorok

A PROGRAMOZÁS ALAPJAI 3. Készítette: Vénné Meskó Katalin

Bevezetés a programozásba I.

Átírás:

Rövid elméleti összefoglaló: Fájlkezelés 8. Gyakorlat Karakter írása és olvasása szükséges a fájlkezelő függvények használatához. Állomány nyitása írásra, például: ofstream Fir; Fir.open("adatok.dat"); Egy karakter írása a megnyitott állományba, például: char kar = 'A'; Fir.put(kar); Állomány nyitása olvasásra, például: ifstream Folv; Folv.open("adatok.dat"); Hibavizsgálat: Ha a fájlművelet alatt nem volt hiba a fail() tagfüggvény 0-át ad vissza, különben 1-et. Egy karakter olvasása az olvasásra megnyitott állományból: Folv.get(kar); Az állomány végének vizsgálata: az eof (end of file - állomány vége) tagfüggvény 0-át ad vissza, ha van még adat, 1-et, ha vége van az állománynak. while(!folv.eof()) Ha csak vizsgálat miatt olvastunk be egy karaktert, azt visszatehetjük a kimenetre: Folv.putback(kar); Az állományok bezárása: Fir.close(); Folv.close(); //MINTA8_01 main() char kar; ifstream finp; ofstream fout; finp.open("szoveg.dat"); if (finp.fail()) cerr << "szoveg.dat input allomany nem letezik!\n"; exit(1); fout.open("masol.dat"); if (fout.fail()) // vizsgálat nyitási művelet írásra cerr << "masol.dat output allomany nyitasi hiba!\n"; exit(1); finp.get(kar); // egy karaktert olvasunk be while (kar!= '?') // vizsgálat a? karakterre fout.put(kar); // karakterenként olvasunk finp.get(kar); finp.putback(kar); fout.put('!'); finp.close(); fout.close(); finp.open("masol.dat"); // megnyitjuk a masol.dat if (finp.fail()) cerr << "masol.dat input allomany nem letezik!\n"; exit(1); finp.get(kar); //olvasunk egy karaktert az állományból while (!finp.eof()) cout << kar; // kiírjuk a karaktert a képernyőre finp.get(kar);// egy karaktert olvasunk az állományból finp.close(); // lezárjuk az állományt A szoveg.dat állomány tartalma: Konnyu a C++ programozasi nyelv? A feladat, hogy a? jel helyett a masol.dat állományba! jelet írjunk. Konnyu a C++ programozasi nyelv! A fail() tagfüggvénnyel megvizsgáljuk, hogy létezik-e az állomány. Ha nem létezik, akkor hibajelzést adunk, és kilépünk a programból. Karakterenként olvasunk. Ha nem?-t olvastunk, akkor a beolvasott karaktert a masol.dat állományba írjuk. Ha?-t olvastunk, a ciklus utáni utasítás, a putback a? karaktert visszahelyezi az input folyamra és! karaktert írunk a? helyett. A masol.dat állomány tartalmát kiíratjuk a képernyőre. 1

8. C++ GYAKORLAT Fájlkezelés különféle típusú adatokkal A különféle adatok be-, illetve kivitele az alábbi módon történik: A beszúrás műveleti jellel (<<) írhatunk ki információt a kimeneti adatfolyamba. A kiemelés műveleti jellel (>>) olvashatunk fájlban tárolt információt a bemeneti adatfolyamból.! Karaktersorozat (szöveg) fájlkezelése //MINTA8_02 char sor1[80], sor2[80], sor3[80]; ifstream inp; // bemeneti fájlfolyam ofstream out; // kimeneti fájlfolyam out.open("szoveg.txt"); //írás szoveg.txt állományba out << "elso sor a kezdet" << endl; out << "masodik sor a folytatas" << endl; out << "harmadik sor a vege" << endl; out.close(); // az állomány lezárása inp.open("szoveg.txt"); // szöveg visszaolvasása inp >> sor1; inp >> sor2; inp >> sor3; inp.close();// az állomány lezárása cout << sor1 << endl; cout << sor2 << endl; cout << sor3 << endl; ifstream inp; bemeneti fájlfolyam ofstream out; kimeneti fájlfolyam Szöveg írása a szoveg.txt állományba: elso sor a kezdet masodik sor a folytatas harmadik sor a vege Szöveg visszaolvasása a szoveg.txt állományból. elso sor a Megjegyzés: A bemeneti adatfolyam a cin-hez hasonlóan az elválasztó (jelen esetben a szóköz) karakterig olvasott, ezért a három sorban az első sor szóközzel elválasztott karaktersorozata jelenik meg.! Olvasás a sor végéig: getline() A getline() tagfüggvény a sor végéig ('\n') olvas, de a beolvasott karaktersorozat nem tartalmazza a sort lezáró ('\n') karaktert. A függvény második paramétere a sztring hossza, harmadik paraméter a sort záró karakter ('\n'). ifstream& getline(char*, int, char = '\n'); //MINTA8_03 char sor1[80], sor2[80], sor3[80]; ifstream inp; ofstream out; out.open("szoveg.txt"); out << "elso sor a kezdet" << endl; out << "masodik sor a folytatas" << endl; out << "harmadik sor a vege" << endl; out.close(); // állomány lezárása // szoveg.txt állomány megnyitása olvasásra inp.open("szoveg.txt"); inp.getline(sor1, sizeof(sor1)); // olvasás a sor végéig inp.getline(sor2, sizeof(sor2)); inp.getline(sor3, sizeof(sor3)); inp.close();// állomány lezárása cout << sor1 << endl; cout << sor2 << endl; cout << sor3 << endl; A szoveg.txt állományból a sor végéig olvas a getline(). elso sor a kezdet masodik sor a folytatas harmadik sor a vege 2

8. C++ GYAKORLAT Numerikus adatok írása, olvasása Bemeneti állomány esetén: Olvasás egy valós változóba: inp >> a; Kimeneti állomány esetén: Kiírás fixpontosan out.setf(ios::fixed); A tizedespont és a tizedespont utáni vezető nullák kiírásra kerülnek: out.setf(ios::showpoint); A értékes jegyek száma is beállítható out.precision(3); Valós számok kiírása soremeléssel: out << ossz << endl; out << atlag << endl; //MINTA8_04 int db = 0; double a, ossz = 0, atlag; ifstream inp; ofstream out; char InpFnev[20],OutFnev[20]; cout <<"Input fajlnev: "; cin >> InpFnev;// bemeneti állomány neve (adat.txt) inp.open(inpfnev); if (inp.fail()) // vizsgálat: létezik-e az állomány cout << InpFnev << " nem letezik!" << endl; cout << "Output fajlnev: "; cin >> OutFnev; //kimeneti állomány neve (ered.txt) out.setf(ios::fixed); // kiírási formátum beállítása out.setf(ios::showpoint); out.open(outfnev); // kimeneti állomány létrehozása if (out.fail()) cout << OutFnev << " letrehozas nem sikerult!" << endl; exit(1); out.precision(3); cout << "A beolvasott adatok " << endl; inp >> a; // egy valós típusú adatot olvas while (!inp.eof()) cout << a << " ";// kiírja az állományba ossz += a; // az adatok összegét képezi db++; // megszámlálja az adatok számát inp >> a; // olvas egy újabb adatot atlag = ossz/db; // kiszámítja az adatok átlagát //megjeleníti a képernyőn az összeget és az átlagot cout << endl << "Osszeg: " << ossz << endl; cout << "Atlag: " << atlag << endl; // kiírja az állományba is out << ossz << endl; out << atlag << endl; inp.close(); // lezárja a bemeneti állományt out.close(); // lezárja a kimeneti állományt Olvasás az adat.txt állományból: A adat.txt tartalma: 2.5 4.1 5.6 4.8 Input fajlnev: adat.txt Output fajlnev: ered.txt A beolvasott adatok 2.5 4.1 5.6 4.8 Osszeg: 17 Atlag: 4.25 Az ered.txt állomány tartalma: 17.000 4.250 A létrehozás sikerességének vizsgálata. Olvasás a bemeneti állományból az a változóba Az ossz és az atlag kiírása a kimeneti állományba soremeléssel. Az állományok lezárása. 3

8. C++ GYAKORLAT Az ios osztály használata Megnyitási mód Hatása ios::app Megnyitja az állományt (append) hozzáfűzési módba, és a fáljmutatót a fájl végére helyezi. ios::ate A fájlmutatót a fájl végére helyezi. ios::in A fájlt bevitelre (input) nyitja meg, ifstream esetén ez az alapértelmezés. ios::out A fájlt kivitelre (output) nyitja meg, ofstream esetén ez az alapértelmezés. ios::binary A fájlt bináris módban nyitja meg. ios::trunc Ha a fájl nem létezik, akkor létrehozza, ha létezik, megnyitja és felülírja. ios::nocreate Ha a megadott fájl nem létezik, akkor nyitási művelet hibát jelez. ios::noreplace Ha a fájl létezik, akkor nyitási művelet hibát jelez, kivéve ha az ate vagy app van beállítva. //MINTA8_05 ifstream inp; ofstream out; char fnev[20]; int db; double adat; cout <<"Az allomany neve: "; cin >> fnev; out.open(fnev); cout << "Adatok szama: "; cin >> db; for (int i = 1; i<=db; i++) cout << "Adat: "; cin >> adat; out << adat << endl; out.close(); out.open(fnev, ios::app); cout << "Uj adatok szama: "; cin >> db; for (int i = 1; i<=db; i++) cout << "Adat: "; cin >> adat; out << adat << endl; out.close(); // állomány lezárása. inp.open(fnev); cout << fnev <<" allomany tartalma:\n"; inp >> adat; while (!inp.eof()) cout << adat << " "; inp >> adat; inp.close(); // az állomány lezárása Az állományhoz való hozzáfűzés bemutatása (app). Állomány nevének beolvasása. Állomány megnyitása kivitelre. Adatok számának beolvasása. Adatok fájlba írása. Az állomány lezárása. Állomány megnyitása app, azaz hozzáfűzés módban. Új adatok darabszámának beolvasása, majd az új adatok beolvasása, és fájlba írása hozzáfűzéssel. A kimeneti állomány visszaolvasása és az adatok megjelenítése. Az allomany neve: adat.txt Adatok szama: 3 Adat: 2 Adat: 5 Adat: 4 Uj adatok szama: 2 Adat: 9 Adat: 12 adat.txt allomany tartalma: 2 5 4 9 12 Bináris fájlkezelés Az összetett adattípusokat (tömböt és struktúrákat) kényelmesebb binárisan fájlba írni (write), illetve onnan olvasni (read). Írás: ostream::write() tagfüggvénye ostream& write(const signed char*, int n); ostream& write(const unsigned char*, int n); Olvasás: istream::read() tagfüggvénye istream& read(signed char*, int); istream& read(unsigned char*, int); 4

Struktúra adatainak kiírása bináris állományba //MINTA8_06 struct aru char azonosito[15]; double sulya; int ara; ; aru r; int db; ofstream out_aru; out_aru.open("aruk.dat"); cout << "Arufajtak szama: "; cin >> db; for (int i=0; i<db; i++) cout << endl; cout << "Aru azonositoja: "; cin >> r.azonosito; cout << "Aru sulya: "; cin >> r.sulya; cout << "Aru ara: "; cin >> r.ara; out_aru.write((char*)&r, sizeof(aru)); out_aru.close(); // lezárjuk az állományt 8. C++ GYAKORLAT Struktúra adatainak visszaolvasása bináris állományból //MINTA8_07 typedef struct aru char azonosito[15]; double sulya; int ara; ; aru r; int db; double RaktarErteke = 0, OsszSuly = 0; ifstream inp_aru; inp_aru.open("aruk.dat"); inp_aru.read((char*)&r, sizeof(aru)); while (!inp_aru.eof()) cout << end << "Aru azonositoja: " << r.azonosito << endl; cout << "Aru sulya: " << r.sulya << endl; cout << "Aru ara: " << r.ara << endl; OsszSuly += r.sulya; RaktarErteke += r.sulya*r.ara; inp_aru.read((char*)&r, sizeof(aru)); inp_aru.close(); cout << "\naruk ossz sulya: " << OsszSuly<< endl; cout << "Aruk ossz erteke: " << RaktarErteke << endl; Struktúra kiírása bináris állományba. Rákérdezünk az árufajták számára (db). Beolvassuk az áruk azonosítóját, súlyát és árát. Kiírjuk a struktúra adatait a bináris aruk.dat állományba. Arufajtak szama: 3 Aru azonositoja: alma Aru sulya: 2 Aru ara: 100 Aru azonositoja: szilva Aru sulya: 3 Aru ara: 150 Aru azonositoja: banan Aru sulya: 4 Aru ara: 200 A program beolvassa a MINTA8_06 által írt aruk.dat állományt tartalmát. Az aruk.dat állományban binárisan tárolt aru struktúra adatainak visszaolvasása. Az állományból való olvasáskor összeadjuk az áruk súlyát, és kiszámítjuk az összértéküket. Aru azonositoja: alma Aru sulya: 2 Aru ara: 100 Aru azonositoja: szilva Aru sulya: 3 Aru ara: 150 Aru azonositoja: banan Aru sulya: 4 Aru ara: 200 Aruk ossz sulya: 9 Aruk ossz erteke: 1450 5

Feladatok 8. C++ GYAKORLAT 1. Olvassunk be egy karaktersorozatot a pontig a SZOVEG.DAT állományból! Számláljuk meg magánhangzók és az üres helyek számát. (GYAK8_1) Például a SZOVEG.DAT tartalma: A C++ programozasi nyelv megtanulhato. Használjuk az alábbi definíciót, valamint a SZOVEG.DAT beolvasása és kiértékelése: char kar; int osszkar=0, maganh=0, space=0; ifstream finp; finp.open("szoveg.dat"); if (finp.fail()) cerr << "szoveg.dat input allomany nem letezik!\n"; exit(1); finp.get(kar); cout << "A beolvasott mondat: " << endl; while (kar!= '.') cout << kar; osszkar++; switch (kar) case 'a': case 'e': case 'i': case 'u': case 'o': maganh++; break; case ' ': space++; break; finp.get(kar); cout << kar << endl; finp.close(); A beolvasott mondat: A C++ programozasi nyelv megtanulhato. Az osszes karakter szama: 37 Maganhangzok szama: 11 Ures helyek szama: 4 2. Generáljunk 10 véletlen számot 1 és 10 között, és írjuk ki azokat a VELETLEN.TXT állományba! A VELETLEN.TXT állományból olvassuk vissza, és jelenítsük meg a beolvasott adatokat! Számláljuk meg a páros, a páratlan és a 4-gyel osztható számokat. A párosakat adjuk össze, számítsuk ki a páratlanoknak összegét és átlagát. (GYAK8_2) szam = rand()%10+1; véletlenszám-generátor kezdőértéke: srand(unsigned(time(null))); #include <cstdlib> #include <ctime> int i, db = 10, vszam, parosdb= 0, paratlandb = 0, negyoszt = 0; int parosossz= 0, ptosszeg = 0; double ptatlag; ifstream inp; ofstream out; 6

srand((unsigned)time(null)); for(i = 0; i<db; i++) vszam = rand()%10+1; 8. C++ GYAKORLAT 3. Használjuk az alábbi definíciót! struct utazas char uticel[15]; int letszam; double ara; int napokszama; ; Az adatok feltöltésekor legyen az úti cél Berlin is! Írjuk ki az utazas struktúra adatait az UTAZAS.DAT bináris állományba! (GYAK8_3) 4. Olvassuk be az UTAZAS.DAT állomány tartalmát, és számláljuk meg az utak számát, az összes utasok számát, valamint azt, hogy hányan utaznak Berlin városába! Melyik a legdrágább és melyik a legolcsóbb út! (GYAK8_4) A struktúra azonos 3. feladatnál megadottal, használjuk az alábbi definíciókat! utazas ut; int i, utakszama =0, osszutas = 0, berlindb = 0; double dragajegy = 0, olcsout; ifstream inp; Az UTAZAS.DAT állományból táblázatosan írjuk vissza az adatokat: cout << " Uticel Ara Letszam" << endl; while (!inp.eof()) cout << setw(15) << ut.uticel; cout << setw(8) << ut.ara; cout << setw(7) << ut.letszam << endl; Példaként a program futásának eredménye, ha az UTAZAS.DAT állománynak ez a tartalma: Uticel Ara Letszam Berlin 15000 12 Praga 25000 22 Budapest 28000 12 Szofia 14000 13 Oszlo 2000 22 Osszes utas szama: 81 Utak szama: 5 Berlibe utazok szama: 12 Legdragabb jegy: 28000 Legolcsobb ut: 2000 7