Feladatok


A modularizációról

A félév során számos modularizációs eszközzel dolgoztunk, függvényekkel és különböző objektumokkal (osztály, struktúra, felsorolás), melyek átláthatóbb programkódot eredményeztek, valamint segítettek a programozási tételek, transzformációk és algoritmusok alaposabb megértésében. Amikor a fenti fogalmakat bevezettük, hangsúlyoztuk az újrafelhasználhatóság fontosságát. Sejthető, hogy az általunk eddig implementált osztályok és függvények nehézkes újrahasznosíthatósága (kimásolom, beillesztem) nem bevett módszer. A hiányzó láncszem még egy, sokkal lényegesebb igénnyel kapcsolatban is felmerül, ez pedig a modularizáció egyik legfontosabb célja: a csapatmunka lehetővé tétele! Világos, hogy az általunk eddig használt módszer pontosan egy fejlesztő hatékony munkáját teszi lehetővé, hiszen nem kódolhat több programozó ugyanabba a fájlba! Az egyetlen járható út tehát a fenti problémák megoldásával kapcsolatban a programkódunk feldarabolása és külön fájlokban való elhelyezése! Gyakorlatban egy tapasztalt programozó minden általa használt osztályt, esetleg azok funkció tekintetében összefüggő csoportját külön-külön fájlban tárol, így az azokat használó project csapatmunkában fejleszthetővé válik és a használt osztályok időt és energiát kímélő újrahasznosítását egyetlen, már jól ismer paranccsal elvégezhetjük, ez pedig az include preprocesszor-utasítás! Alább az első feladat példaként szolgál a különböző, a tantárgy keretein belül előforduló kódtagolási eljárásokra!

1.  Implementáljunk egy egyszerű veremmegvalósító osztályt! (megoldás (zip))

Implementáljunk osztályt, amely standard egész-tömbök segítségével megvalósítja a verem nevű adatszerkezetet! A verem típusműveletei a Push (érték elhelyezése a verem „tetején”) és a Pop (érték levétele a verem tetejéről). Mutassuk meg, hogy az így készült osztály alkalmas egész számsorozatok sorrendjének megfordítására!

Szükséges utasítások:

#ifndef VALAMI_H       „If not definied…” (Ha nem definiált…) rövidítése, egy preprocesszor (előfeldolgozó) – utasítás, hogy az utána következő kódot csak akkor fordítsa le a fordító, ha ’VALAMI_H’ még nem lett definiálva, így védekezhetünk az újradefiniálás ellen. Erre szükség van, mivel a c++ érzékeny az újrainklúdolásra, ezzel azonban biztosíthatjuk, hogy legfeljebb egyszer forduljon le! A preprocesszor utasításai nem tartoznak a tantárgy törzsanyagához, aki kedvet érez, bőven talál ezzel kapcsolatban olvasnivalót!

#define VALAMI_H       Szintén preprocesszor utasítás, definiálja a ’VALAMI_H’ modulunkat.

#endif                                Az ifndef (és egyéb preprocesszor – elágazások) záróeleme.

Osztálytagolási megoldások:

1. megoldás                      A main() függvényt tartalmazó fájlban, együtt a specifikáció és a definíció

2. megoldás                      A main() függvényt tartalmazó fájlban, elválasztva a specifikációt a definíciótól

3. megoldás                      Külön, inklúdolható fájlban, együtt a specifikáció és a definíció (.hpp).

4. megoldás                      Külön, inklúdolható fájlban, elválasztva a specifikációt a definíciótól (.hpp).

5. megoldás                      Külön, inklúdolható fájlban a specifikáció (.h) és külön fájlban a definíció (.cpp).

Template –et használó megoldás (a második félévhez tartozó anyag): innen letöltehető

Pointeres megoldás (a második félévhez tartozó anyag): innen letöltehető

2.  Extra feladat: készítsünk alkalmazást, amely megadja, hogy hányas lett a gyakorlati jegyünk! (megoldás (zip))

Készítsünk minél modularizáltabb alkalmazást, amely egy neveket és érdemjegyeket tartalmazó szekvenciális bemeneti fájlból kiszámítja, hogy ki hányas jegyet szerez az adott tárgyból (a kerekítés matematikai szabályai szerint)! A megoldás tegye lehetővé az egyenkénti keresést és az eredmények kilistázását standard kimenetre és fájlba is! A lehetőségek közül parancssori paraméterezéssel lehessen választani!