Vill c++ kisHF

Múlt heti házihoz:

Miért nem jó a char c tároló a szűrő programokban?
  1. Mert az integrális típusok közül egyedül a char típusnál nincs definiálva, hogy alapértelmezésben előjeles, vagy előjel nélküli, így az aktuális fordításnál a compiler szabadon választhat. Ha netán unsigned char lett a változónk, akkor a while((c=getchar())!=EOF) ... végtelen ciklust eredményez, hisz az EOF konstans értéke −1!
  2. Ha signed char c lett a tárolónk, akkor nem ennyire durva a fellépő hiba. A kiterjesztett ASCII tábla 255-ös kódú karakterét beolvasva és eltárolva c-ben, mennyi lesz c értéke? (Csupa egyes bitminta előjeles ábrázolásban.) Hát −1. Így a program a 255-ös kódú szabályos feldolgozandó karaktert is file vége jelként értelmezi, tehát hibásan működik.
Megoldás: legyen int c a tároló!

3. Házi feladat.

  1. Alakítsuk át az órai C programot (illetve fejezzük be az átalakítását): könnyítsük meg a paraméterátadást! Cseréljük ki a pointereket referenciával!
    Ehhez át kell térnünk C++ fordítóra.
  2. Alakítsuk át a fenti programot (már C++-os referenciával) úgy, hogy ne foglaljon helyet minden egyes új elemnek.
    • Be lehessen állítani egy alapméretet, és legalább annyi helyet mindig tartson lefoglalva (még üres tároló esetén is!). Ha egy push műveletnél az elemek száma meghaladja a tároló aktuális méretét, akkor végezzen újrafoglalást alapméretnyivel nagyobb területre. Ha a push számára van még hely a tárolóban, akkor nem szabad újrafoglalnia. Hasonlóképp a pop is figyeljen, és ha lehet, alapméretnyivel kisebb dinamikus tömbbe kell átpakolnia. (Ezzel a lefoglalt terület mérete mindenkor az alapméret egész számú többszöröse lesz.)
      Természetesen a struktúrában az alapméretet is el kell tárolni, és a stack_init függvényt egy további int paraméterrel kell hívni, ami beállítja az alapméretet. Az új init függvény le is kell foglaljon ennyi helyet az üres stacknek.
      Fogalmak:
      • alapméret : ennyi a lefoglalt dinamikus tömb mérete üres tárolónál, és ennyivel növelhetjük/csökkenthetjük a lefoglalt memória nagyságát
      • kapacitás : ennyi elem számára van tárolóhely lefoglalva
      • elemszám : pillanatnyilag ennyi elem van a tárolóban.
      Inicializált tárolónál mindig igaz kell legyen, hogy
      • alapméret != 0
      • kapacitás % alapméret==0 && kapacitás / alapméret != 0
      • elemszám <= kapacitás, valamint a 0 elemszámot leszámítva kapacitás − alapméret < elemszám
    • Szorgalmi részfeladat, ezt nem kötelező beadni, de remek gyakorlási lehetőség, akinek még döcögősen megy a C vagy a tárolósdi.
      Szeretnénk a verem adatstuktúránkat egy másik verem alapján is inicializálni. Erre egy újabb void stack_init(struct stack& s, const struct stack& theOther) függvényre lesz szükségünk. Vigyázzunk, hogy az elemszám és az alapméret függvényében kell döntenünk, mekkora dinamikus tömböt gyártsunk a másolatban.
      C nyelven itt nehéz lenne jó nevet kitalálni, mert nem lehet két ugyanolyan nevű függvény. De a C++-ban van függvénynév túlterhelés, ami megoldja a problémánkat.
Nem várok el semmilyen szempontból sem optimalizált kódot, de a szükségtelen és felesleges erőforráspazarlást kerüljük.

Gyakorlás: