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

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

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

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

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

Bevezetés a programozásba I.

Pénzügyi algoritmusok

Maximum kiválasztás tömbben

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.

1. Alapok. Programozás II

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

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

Bevezetés a programozásba I.

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

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

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

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

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

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!

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

INFORMATIKA javítókulcs 2016

INFORMATIKA tétel 2017

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

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

Programozási alapismeretek 2009/2010

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

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

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

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

5. Gyakorlat. struct diak {

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

INFORMATIKA tétel 2019

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

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

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

Bevezetés a programozásba 2

INFORMATIKA tétel 2018

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

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

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

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

Gyakorló feladatok az 1. nagy zárthelyire

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

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

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

Programozási nyelvek Java

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

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.

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

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

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

Programozás C++ -ban 2007/1

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

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

2018, Funkcionális programozás

Programozás C++ -ban

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

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

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

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

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

117. AA Megoldó Alfréd AA 117.

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

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.

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

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..

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

Programozás C és C++ -ban

Alkalmazott modul: Programozás

Bevezetés a programozásba I.

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

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

A félév során előkerülő témakörök

Készítette: Nagy Tibor István

Felvételi tematika INFORMATIKA

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

3. ZH-ban a minimum pontszám 15

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Egyszerű programozási tételek

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Algoritmusok és adatszerkezetek gyakorlat 07

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

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

Ö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.

Algoritmizálás, adatmodellezés tanítása 1. előadás

Á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 PPKE ITK, Bevezetés a programozásba I 8:3

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:4

Szövegfolyamok 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 Specifikáció: bemenet: egy szám (szam) kimenet: a szám rákövetkezője, vagy a hiba jelzése PPKE ITK, Bevezetés a programozásba I 8:5

Szövegfolyamok Megoldás: #include <iostream> int main(){ 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!"; return 0; PPKE ITK, Bevezetés a programozásba I 8:6

Szövegfolyamok 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; PPKE ITK, Bevezetés a programozásba I 8:7

Szövegfolyamok 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:8

Szövegfolyamok 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

Szövegfolyamok 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ó Specifikáció: 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

Szövegfolyamok Megoldás: #include <iostream> #include <string> #include <sstream> // kell a stringstream-hez int main(){ string szoveg; int szam; stringstream szfolyam; // szövegfolyam cout << "Kérek egy számot: "; cin >> szoveg; szfolyam << szoveg; // beírjuk a szöveget szfolyam >> szam; // kiolvasunk egy számot PPKE ITK, Bevezetés a programozásba I 8:11

Szövegfolyamok Megoldás: if (szfolyam.fail()) // ha nem lehetett konvertálni cout << szfolyam.str() << " nem szám!"; else // ha lehetett konvertálni cout << ++szam << endl; return 0; } PPKE ITK, Bevezetés a programozásba I 8:12

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 Specifikáció: 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

Megoldás: #include <vector> // használjuk a vector-t int main(){ 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); */ PPKE ITK, Bevezetés a programozásba I 8:17

Megoldás: 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; return 0; PPKE ITK, Bevezetés a programozásba I 8:18

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 Specifikáció: 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

Megoldás: #include <iostream> #include <fstream> #include <sstream> #include <vector> using namespace std; int main(){ 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

Megoldás: 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 PPKE ITK, Bevezetés a programozásba I 8:21

Megoldás: 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:22

Megoldás: 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); PPKE ITK, Bevezetés a programozásba I 8:23

Megoldás: // 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; } return 0; } PPKE ITK, Bevezetés a programozásba I 8:24

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] PPKE ITK, Bevezetés a programozásba I 8:25

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 Specifikáció: bemenet: hallgatók jegyei egy mátrixban (m) kimenet: a legjobb átlagú hallgató indexe (max) PPKE ITK, Bevezetés a programozásba I 8:26

Megoldás: int main(){ 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 } PPKE ITK, Bevezetés a programozásba I 8:27

Megoldás: 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:28

Megoldás: 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; return 0; PPKE ITK, Bevezetés a programozásba I 8:29

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:30

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