Gyakorló feladatok (8. hét)
Fontosabb kulcsszavak, fogalmak
- Generikus adatszerkezetek
- Sablonparaméterek
- Generikus algoritmusok
Feladatok megoldásokkal
- Az előadáson bemutatott, fix méretű generikus tömb mintájára hozzunk létre egy fix méretű generikus Stack osztályt!
- Az osztálynak a következő metódusai (tagfüggvényei) legyenek:
- size()- megadja a veremben levő adatok számát,
- empty() - igaz értékkel tér vissza, ha a verem üres
- void push(int) - betesz a verembe egy adatot
- void pop() - eldobja a verem legfelső elemét (ha van),
- top() - visszaadja a verem legfelső elemének referenciáját,
Példa a Stack használatára:
using std::cout; using std::endl; Stack<int, 20> st; // max 20 int elemeket tartalmazó stack try { st.push(12); // beteszünk 12-t st.push(8); // beteszünk 8-at if (st.empty()) std::cout << "ures"; // nem ír ki semmit cout << st.top() << endl; // kiír: 8 st.pop(); // eldobja a felső elemet cout << st.top() << endl; // kiír: 12 st.pop(); st.pop(); // kivételt generál } catch (const char *p) { cout << "Hiba:" << p << endl; }
- Az osztálynak a következő metódusai (tagfüggvényei) legyenek:
- Először oldjuk meg a feladatot úgy, hogy az adatokat egy fix méretű int tömbben (int data[20]) tároljuk!
- Jók-e az implicit függvények (copy, op=, ~)!
- Alakítsuk át sablonná! A méretet sablonparaméterként vegye át!
- Készítsünk generikus algoritmust, ami megfordítja az elemek sorrendjét egy Stack-ben! Példa az algoritmus használatára: Olvassunk be maximum 100 valós számot egy verembe, fordítsuk meg sz elemek sorrendjét, és írjuk ki a verem tartalmát!
using std::cout; using std::endl; Stack<double, 100> st2; double d; cout << "Kerek max 100 valos szamot:\n"; while (st2.size() < 100 && std::cin >> d) st2.push(d); stackFordit(st2); while(!st2.empty()) { std::cout << st2.top() << std::endl; st2.pop(); }
- Készítsünk generikus kiír függvényt, ami kiírja stack elemeit a paraméterként kapott stream-re! Az egyes elemek közé szeparátorként tegyen ',' -t, a legutolsó elem után pedig soremelést! A kiírás ne törölje az eredeti stack-et! (Ez könnynen biztosítható, ha értékparaméterként adjuk át!) A használatára egy példa:
Stack<int, 10> s1; s1.push(1), s1.push(2), s1.push(3); stackKiir(std::cout, s1); // a kiírás ne törölje a stack-et ! stackKiir(std::cerr, s1);
- Csiszoljuk a kiír függvényt: az utolsó kiírás után ne tegyen szeparátort, és a szeparátor legyen paraméterként megadható!
A fenti feladatok megoldását tartalmazó teljes program itt érhető el
Ajánlom mindenki figyelmébe Izsó Tamás összefoglalóját: http://www.hit.bme.hu/~izso/sablon.pdf. A rafinált trükkökre nem fogunk ZH-n rámenni, de tudni kell sablonnal dolgozni! A legutolsó fejezetet (template paraméterek típusának eldöntése) kapcsán lesz laboron egy példa, de ezt csak felismerni kell. A legfontosabb a generikusság értelmének, hasznának megértetése.
Utolsó frissítés: 2018-03-30 10.51