Gyakorló feladatok (8. hét)

Fontosabb kulcsszavak, fogalmak

  • Generikus adatszerkezetek
  • Sablonparaméterek
  • Generikus algoritmusok

Feladatok megoldásokkal

  1. 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;
    }  
    
  2. Először oldjuk meg a feladatot úgy, hogy az adatokat egy fix méretű int tömbben (int data[20]) tároljuk!
  3. Jók-e az implicit függvények (copy, op=, ~)!
  4. Alakítsuk át sablonná! A méretet sablonparaméterként vegye át!
  5. 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();
    }
    

  6. 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);
    

  7. 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ó!
  8. 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