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

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

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

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

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

Bevezetés a programozásba I.

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

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

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Pénzügyi algoritmusok

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

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

Bevezetés a programozásba I.

Bevezetés a programozásba I.

Maximum kiválasztás tömbben

1. Alapok. Programozás II

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

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Bevezetés a programozásba I.

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

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

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

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

INFORMATIKA tétel 2017

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

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Bevezetés a programozásba. 11. Előadás: Esettanulmány

10. gyakorlat Struktúrák, uniók, típusdefiníciók

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

INFORMATIKA javítókulcs 2016

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

5. Gyakorlat. struct diak {

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

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

Programozási alapismeretek 2009/2010

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

Programozás II gyakorlat. 8. Operátor túlterhelés

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

INFORMATIKA tétel 2019

Gyakorló feladatok az 1. nagy zárthelyire

Programozási nyelvek Java

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Amortizációs költségelemzés

A C++ Standard Template Library rövid összefoglalás

INFORMATIKA tétel 2018

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

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

Bevezetés a programozásba 2

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

Programozás alapjai 9.Gy: Struktúra 2.

Bevezetés a programozásba. 9. Előadás: Rekordok

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

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Fejlett programozási nyelvek C++ Iterátorok

Bevezetés a C++ programozásba

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

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás C++ -ban 2007/1

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

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Programozás C++ -ban

2018, Funkcionális programozás

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Bevezetés a programozásba. 5. Előadás: Tömbök

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Készítette: Nagy Tibor István

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

Felvételi tematika INFORMATIKA

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.

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

117. AA Megoldó Alfréd AA 117.

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

Számítógép és programozás 2

Egyszerű programozási tételek

Programozás C és C++ -ban

Alkalmazott modul: Programozás 2. fejezet. C++ alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Bevezetés a programozásba I.

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Alkalmazott modul: Programozás

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

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

10. gyakorlat Tömb, mint függvény argumentum

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

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

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

3. ZH-ban a minimum pontszám 15

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 8. gyakorlat C++: szövegfolyamok, intelligens tömbök 2011.11.08. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Adatfolyamok Hibalehetőségek Adatfolyamnak nevezzünk azt, ahol sorban tetszőleges számú adat megjelenhet a bemeneten, vagy a kimeneten, pl. konzol képernyő, fájl Bemenő adatok esetén sok esetben előfordulhat, hogy a bemenő adatfolyam nem a várt adatot, vagy adattípust tartalmazza pl. pozitív helyett negatív szám, szám helyett szöveg, hibás fájlnév, stb. bizonyos hibák kezelhetőek a beolvasás után, ám amennyiben a beolvasandó elem típusa nem megfelelő, akkor a beolvasás sem történik meg (pl. szám helyett szöveget ad meg a felhasználó) PPKE ITK, Bevezetés a programozásba I 8:2 Adatfolyamok Hibakezelése Minden adatfolyam esetén lehetőségünk van az állapot lekérdezésére a good() művelet megadja, hogy az adatfolyam konzisztens állapotban van-e és elérhető a fail() művelet megadja, hogy a legutolsó művelet sikertelen volt-e az eof() művelet megadja, hogy az adatfolyamnak vége van-e a clear() művelet helyreállítja az elromlott állapotot továbbá minden beolvasás (>>, getline) esetén a művelet visszaadja, hogy sikeresen megtörtént-e a beolvasás az adott típusú változóba Adatfolyamok Hibakezelése Pl.: int num; cin >> num; // megpróbálunk számot beolvasni if (cin.fail()) // ha sikertelen volt a művelet cout << "A megadott érték nem szám!"; else cout << "A beolvasás sikeres!"; // ugyanez: if (cin >> num) // sikeres volt a beolvasás cout << "A beolvasás sikeres!"; else cout << "A megadott érték nem szám!"; PPKE ITK, Bevezetés a programozásba I 8:3 PPKE ITK, Bevezetés a programozásba I 8:4 Feladat: Írjuk ki egy számnak a rákövetkezőjét, de ellenőrizzük azt is, hogy számot adott-e meg a felhasználó. ellenőrizzük a bemeneten, hogy sikeres volt-e a beolvasás bemenet: egy szám (szam) kimenet: a szám rákövetkezője, vagy a hiba jelzése #include <iostream> int szam; cout << "Kérek egy számot: "; if (cin >> szam) // ha be tudtuk olvasni cout << ++szam << endl; else // ha nem tudtuk beolvasni cout << "A megadott érték nem szám!"; PPKE ITK, Bevezetés a programozásba I 8:5 PPKE ITK, Bevezetés a programozásba I 8:6 1

Használata A szövegfolyamok olyan folyamok, ahol az írás és olvasás szövegen keresztül történik, így nem íródik ki fájlba, vagy a konzolra tetszőleges típusú változót írhatunk be és olvashatunk ki alkalmas olyan típuskonverziókat elvégezni, amik automatikusan nem történnek meg (pl. szöveg-szám) A szövegfolyam típusa a stringstream, használatához szükséges az sstream fájl és az std névtér pl. #include <sstream> std::stringstream sstr; Műveletei A szövegfolyamba tetszőleges értéket a << operátorral, vagy a getline művelettel helyezhetünk, az egymás után bekerült értékek egymás után kerülnek A szövegfolyamból tetszőleges értéket a >> operátorral vehetünk ki (a behelyezés sorrendjének megfelelően) amennyiben sikertelen a kivétel (az érték nem konvertálható az adott típusba, vagy üres a folyam), akkor a fail() művelettel lekérdezhető, hogy hiba történt-e a szövegfolyam végét az eof() művelettel ellenőrizhetjük Az str() művelet kiírja, vagy átalakítja string formátumúvá a teljes tartalmát, míg az str(<szöveg>) kitörli a korábbi tartalmat, és beírja az újat PPKE ITK, Bevezetés a programozásba I 8:7 PPKE ITK, Bevezetés a programozásba I 8:8 Műveletei Pl átalakítás szöveggé: int num; cin >> num; stringstream converter; // az átalakítást szövegfolyammal végezzük converter << num; // behelyezzük a számot string output = converter.str(); // szövegként kapjuk meg a tartalmat Pl. átalakítás számmá: stringstream converter; string input; cin >> input; converter << input; int num; converter >> num; // kiolvasás számként if (converter.fail()) // sikertelen átalakítás cout << converter.str() << " nem szám!"; PPKE ITK, Bevezetés a programozásba I 8:9 Feladat: Írjuk ki egy számnak a rákövetkezőjét, de ellenőrizzük azt is, hogy számot adott-e meg a felhasználó. a bemenetet nem rögtön számként, hanem szövegként olvassuk be használjunk szövegfolyamot a konverzió elvégzésére, csak akkor végezzük el a növelést, ha sikeres a konverzió bemenet: egy szám szövegként (szoveg) kimenet: a szám rákövetkezője, vagy a hiba jelzése PPKE ITK, Bevezetés a programozásba I 8:10 #include <iostream> #include <string> #include <sstream> // kell a stringstream-hez string szoveg; int szam; stringstream szfolyam; // szövegfolyam cout << "Kérek egy számot: "; cin >> szoveg; if (szfolyam.fail()) // ha nem lehetett konvertálni cout << szfolyam.str() << " nem szám!"; else // ha lehetett konvertálni cout << ++szam << endl; szfolyam << szoveg; // beírjuk a szöveget szfolyam >> szam; // kiolvasunk egy számot PPKE ITK, Bevezetés a programozásba I 8:11 PPKE ITK, Bevezetés a programozásba I 8:12 2

Egyszerű tömbök Használata A C++ biztosít számunkra egy beépített tömb típust, amelyen az egyedüli értelmezett művelet az indexelő operátor használata pl.: int t[10]; cin >> t[0]; lehetőségünk van ezzel a tömbbel mátrixot alkotni több index használatával, pl.: int m[10][5]; // 10*5-ös mátrix cin >> m[0][0]; // 1. sor 1. eleme ezzel a tömbbel több probléma is felmerül: nincs tisztában a saját méretével, csak konstans adható meg méretként, nem lehet a méretét futás közben megváltoztatni jó lenne, ha olyan tömböket is használhatnánk, amelyek a fenti tulajdonságokkal rendelkeznek PPKE ITK, Bevezetés a programozásba I 8:13 Használata A C++ ezért biztosít egy olyan tömb adatszerkezetet, amely a korábbi hiányosságokat pótolja, a neve vector használatához: #include <vector> using namespace std; létrehozásához speciálisan kell megadnunk a típust, illetve a méretet (amely lehet 0 is), pl.: vector<int> t1(10); // 10 elemű egész tömb vector<string> t2(5); // 5 elemű szövegtömb létrehozáskor a méretet nem kötelező megadni, ekkor egy 0 méretű tömböt hoz létre (ezt persze később módosíthatjuk), pl.: vector<int> t3; // 0 elemű egész tömb PPKE ITK, Bevezetés a programozásba I 8:14 Műveletei A vector leggyakoribb műveletei: elem lekérdezés, felülírás: <változónév>[<index>] méret lekérdezése: <változónév>.size(); kiürítés: <változónév>.clear(); átméretezés: <változónév>.resize(<új méret>); új elem behelyezése a tömb végére: <változónév>.push_back(<érték>); utolsó elem kivétele: <változónév>.pop_back(); A tömb méretének tehát változó is megadható, pl.: int size; cout << "Tömb mérete: "; cin >> size; vector<double> v(size); PPKE ITK, Bevezetés a programozásba I 8:15 Feladat: Olvassunk be valós számokat a bemenetről amíg 0-t nem írunk, majd adjuk meg az átlagnál nagyobb elemek számát. kénytelenek vagyunk eltárolni az elemeket, ahogy az összegzés és számlálás tételét is alkalmazni tudjuk mivel nem tudjuk az elemek számát, olyan adatszerkezet kell, amelynek mérete növelhető futás közben, tehát vector-t kell használnunk, és annak a push_back függvényét bemenet: valós számok sorozata (v) kimenet: az átlagnál (atlag) nagyobb elemek száma (c) PPKE ITK, Bevezetés a programozásba I 8:16 #include <vector> // használjuk a vector-t vector<float> v; // float típusú vector, alapból 0 hosszú lesz float akt; cin >> akt; // előreolvasás while (akt!= 0) { v.push_back(akt); // berakjuk a végére cin >> akt; /* ugyanez hibaellenőrzéssel: while (cin >> akt && akt!= 0) v.push_back(akt); */ float atlag = 0; // összegzés for (int i = 0; i < v.size(); i++) atlag += v[i]; // kiolvasunk minden elemet atlag /= v.size(); // mérettel osztunk int c = 0; // számlálás for (int i = 0; i < v.size(); i++) if (v[i] > atlag) c++; cout << "Az átlagnál " << c << " elem nagyobb." << endl; PPKE ITK, Bevezetés a programozásba I 8:17 PPKE ITK, Bevezetés a programozásba I 8:18 3

Feladat: Olvassunk be valós számokat tartalmazó sorokat egy fájlból és írjuk ki a sorok átlagának minimumát. mivel soronként akarunk feldolgozni, a beolvasást getline segítségével végezzük, amelyből a számokat egy szövegfolyam közbeiktatásával vesszük ki az így kapott számokat átlagoljuk (ehhez összegzés és számlálás szükséges), az átlagot eltároljuk egy vektorban, amelyre lefuttatjuk a minimumkeresés bemenet: valós számok sorozata egy fájlban (f) kimenet: a sorok átlagának minimuma (min) PPKE ITK, Bevezetés a programozásba I 8:19 #include <iostream> #include <fstream> #include <sstream> #include <vector> using namespace std; ifstream f; string fname, line; stringstream converter; // fájlnév bekérése és fájl megnyitása cout << "Kérem a beolvasandó fájl nevét: "; PPKE ITK, Bevezetés a programozásba I 8:20 cin >> fname; f.open(fname.c_str()); while (f.fail()){ cout << "Hibás fájlnév!" << endl; f.clear(); cout << "Kérem a beolvasandó fájl nevét: "; cin >> fname; f.open(fname.c_str()); f.close(); double number; // számok, amiket kiolvasunk a sorból double sum; // összegzéshez int count; // számláláshoz vector<double> avgs; // átlagokat tároló vektor // fájl kiolvasása getline(f, line); // előreolvasási technika while (!f.eof()) { sum = 0; count = 0; converter.str(line); // beállítjuk a tartalmat a sorra converter.clear(); // a korábbi hibát is kitöröljük PPKE ITK, Bevezetés a programozásba I 8:21 PPKE ITK, Bevezetés a programozásba I 8:22 while (converter >> number) { // konvertálás és hibaellenőrzés sum += number; count++; if (count > 0) // ha sikerült beolvasnunk legalább egy // számot avgs.push_back(sum / count); // az átlagot behelyezzük a vektorba getline(f, line); // minimum megállapítása if (avgs.size() > 0) { double min = avgs[0]; for (int i = 1; i < avgs.size(); i++) if (avgs[i] < min) min = avgs[i]; cout << "A legkisebb sorátlag: " << min << endl; else { cout << "Nem sikerült egy számot se kiolvasni a fájlból." << endl; PPKE ITK, Bevezetés a programozásba I 8:23 PPKE ITK, Bevezetés a programozásba I 8:24 4

Mátrixok kezelése Lehetőségünk van mátrixot létrehozni a tömbök tömbje koncepció alapján ekkor a mátrix minden sora maga is egy vector a típus helyére egy tömbtípust adunk meg ilyenkor csak a külső tömb méretét adhatjuk meg, a belső tömbök 0 méretűek lesznek, így át kell őket később méretezni pl. egy 10*5-ös egészmátrix létrehozása: vector<vector<int> > m(10); for (int i = 0; i < m.size(); i++) m[i].resize(5); ezután az indexelés a megszokott módon, pl.: m[0][0] Feladat: Adott 10 tanuló egyenként 5 jeggyel, állapítsuk meg a legjobb átlaggal rendelkező tanulót. ehhez használjunk egy mátrixot, kérjük be a jegyeket egyenként határozzuk meg minden hallgatóra az átlagot, majd abból keressük meg a maximumot bemenet: hallgatók jegyei egy mátrixban (m) kimenet: a legjobb átlagú hallgató indexe (max) PPKE ITK, Bevezetés a programozásba I 8:25 PPKE ITK, Bevezetés a programozásba I 8:26 vector<vector<int> > m(10); // sorok létrehozása for (int i = 0; i < m.size(); i++){ m[i].resize(5); // oszlopok létrehozása for (int j = 0; j < m[i].size(); j++){ cout << i+1 << ". tanuló " << j+1 << ". jegye: "; cin >> m[i][j]; // jegyek beolvasása vector<float> avg(m.size()); // az átlagokat egy vektorba helyezzük for (int i = 0; i < m.size(); i++){ // összegzés végrehajtása minden sorra a // mátrixban avg[i] = 0; for (int j = 0; j < m[i].size(); j++) avg[i] += m[i][j]; avg[i] /= m[i].size(); // átlagot számítunk PPKE ITK, Bevezetés a programozásba I 8:27 PPKE ITK, Bevezetés a programozásba I 8:28 int max = 0; // maximumkeresés az átlagok vektorán for (int i = 1; i < avg.size(); i++){ if (avg[i] > avg[max]) max = i; cout << "Legjobban a(z) " << max+1 << ". tanuló teljesített." << endl; Feladatok Az alábbi feladatok megoldásához használjunk hibaellenőrzést, valamint intelligens tömböket! III. Programozási tételek: 10. Add meg egy tetszőleges egész számsorról, hogy hány eleme nagyobb ill. kisebb az átlagánál. (A számsorozat végét q jelöli.) 11. Számítsd ki két N dimenziós vektor skaláris szorzatát. (A felhasználótól kérjük be N értékét.) 12. Add meg egy tetszőleges egész számsorban a szomszédos elemek átlagos különbségét. PPKE ITK, Bevezetés a programozásba I 8:29 PPKE ITK, Bevezetés a programozásba I 8:30 5

Feladatok IV. Tömbös feladatok: 6. (*) Vektor permutálása, hogy végül monoton növekedő sorrendben legyenek az elemek a vektorban. 7. c) Mátrixban tároljuk egy osztály adatait, minden sora egy diák, minden oszlopa egy tantárgy, a mátrix értékei a jegyek. Melyik a legnehezebb tantárgy (legtöbb bukás). 8. a) Adott méretű mátrix feltöltése fájlból, majd (megfelelő méretek esetén) döntsd el, hogy szimmetrikus-e. (A fájl első két adata a mátrix mérete, majd utána jönnek az értékek sorfolytonosan). PPKE ITK, Bevezetés a programozásba I 8:31 6