Útmutató az 5. laborhoz

Ezen a laborgyakorlaton a korábban C nyelven elkészített dinamikus String adatstruktúránkból és az azon műveletet végző függvényekből C++ osztályt hozunk létre. A C és C++ nyelvű változatok összehasonlításával jól felismerhetőek azok a mechanizmusok, amelyeket a C++ nyelv elrejt, illetve automatikusan biztosít (pl. this, alapértelmezett metódusok, kódelszigetelés).

A laborfoglalkozás végén töltse fel az elkészített string5.h és string5.cpp fájlokat a Jporta rendszerbe (String5, önellenőrző feladat), hogy megkapja a labor elvégzéséért járó pontot!

Legalább az első hat tesztesetet (ELEKESZULT >= 6) hibátlanul meg kell oldania! A feladatok feltöltésére a laborgyakorlatot követő szombat 06:00-ig van lehetősége.

Felkészülés a laborra

  1. Ismételje át a 4. heti laborgyakorlat, valamint a 2. heti laborgyakorlat anyagát!
  2. Oldja meg a Cporta Cpp Vektor nevű feladatát!
  3. A laborgyakorlaton szüksége lehet a 2. laboron elkészített string2.cpp és sring2.h fájlokra. Ha feltöltötte a Jportara, akkor onnan ezek elérhetők.

Előkészítés (~10')

  1. Töltse le az előkészített projektet (https://git.ik.bme.hu/Prog2/labor_peldak/lab_05)!
  2. Mind a Visual C++, mind a CodeBlocks fejlesztőkörnyezethez elkészítettük a projektfájlokat (*.proj, *.cbp), illetve Makefile-t is készítettünk. Indítsa el megfelelő fejlesztőeszközt, és fordítsa le az előkészített programot!
  3. A C nyelven megvalósított String adatszerkezetet (string1) a 2. laboron a C++ nyelv nem OO eszközeivel átalakítottuk (string2_cpp). Vegye elő az akkor elkészített fájlokat (string2.cpp, string2.h), mert segíthet a további feladatok megoldásában! Most továbblépünk, a String adatszerkezetet igazi osztállyá alakítjuk:
    • Az adatokon műveletet végző függvényeket összezárjuk az adatokkal, így ezek a függvények tagfüggvényekké válnak és
      formálisan eltűnik az első paraméterük (s0) (ezt this-ként azért megkapják).
    • A nevük is megváltozik, mert most már az összetartozást, és a paraméterek típusára való utalást már nem a név hordozza, hanem az osztály.
    • A createString... alakú függvényekből konstruktorok keletkeznek.
    • A disposeString destruktorrá alakul át.
    • Egyes műveletvégző függvényekből (pl. addString) operátor függvény lesz.
    • Mivel dinamikusan tárolunk, biztosan nem felel meg néhány implicit deklarált tagfüggvény (másoló konstruktor, op=). Ezért ezeket felül kell definiálnunk.
  4. Figyelmesen olvassa el a string5.h fájlban található megjegyzéseket, mert segítenek a feladat megoldásában!
    A továbbiakban a deklarációkat és az inline függvényeket a string5.h állományba, míg a definíciókat a string5.cpp állományba írja!

Feladatok (~65')

Az string5.h fájlban definiált ELKESZULT makró felhasználásával lépésről lépésre haladva deklaráljon (string5.h) és implementáljon (string5.cpp) egy olyan sztring (String) osztályt C++ nyelven, ami dinamikusan tárol és rendelkezik az alábbi tulajdonságokkal!

A felsorolásban a feladatok sorszáma megegyezik azzal az értékkel, amire a teszteléshez az ELKESZULT makrót kell beállítani.
  1. A paraméter nélkül hívható konstruktora üres sztringet hozzon létre! Van olyan tagfüggvénye ( size() ), ami visszaadja a szring hosszát.
  2. Van olyan tagfüggvénye ( c_str() ), ami C-sztringgel, azaz nullával lezárt karaktersorozatra mutató pointerrel (const char *) tér vissza.
  3. Van olyan konstruktora, ami karakterből hoz létre sztringet.
  4. Van olyan konstruktora, ami C-sztringből (const char*) hoz létre sztringet.
  5. Az osztályból létrehozott objektum legyen átadható értékparaméterként, azaz van jól működő másoló konstruktora!
  6. Támogassa a többszörös értékadást (b = a = a), azaz van jól működő értékadó operátora!
  7. Legyenek olyan operátorai (operator+), amivel a sztring végéhez sztringet, és karaktert lehet fűzni!
  8. Lehessen karakterhez is sztringet fűzni a + operátorral!
  9. A tárolt a karakterek legyenek elérhetőek a szokásos módon indexeléssel! Az indexeléssel elért elem legyen használható balértékként is! A konstans objektumok is legyenek indexelhetők. Az indexelés operátor hiba esetén dobjon const char * kivételt!
  10. Készítsen olyan inserter (<<) operátort, amivel egy sztring kiírható egy ostream típusú objektumra!

Szorgalmi feladatok:

    Az istream wshite space kezelése a flags() tagfüggvénnyel szabályozható.
  1. Készítsen olyan fűzhető extraktor (>>) operátort, amivel be tud olvasni egy szót egy sztringbe! A beolvasó működjön úgy, mint a scanf %s, azaz a szó végét white space határolja! A szó eleji white space karaktereket pedig el kell dobni.
  2. Konzol ablak betűkészletének változtatása: ablak fejlécén jobb egérgomb -> Tulajdonságok -> Betűtípus
  3. Próbálja ki ékezetes szövegekkel is az elkészített String osztályt! Segítségül elkészítettünk egy egyszerű kódrészletet ami szavakat olvas be, majd qsort() függvénnyel rendezi azokat. Az ékezetes karakterek kódolásával kapcsolatban korábban már volt egy egyszerű szorgalmi feladat. Most a rendezésen van a hangsúly. Értse meg a rendez.cpp fájlban levő kód működését és futtassa a programot! A magyar ékezetes karakterek Windows alatt akkor jelennek meg helyesen ha a konzol ablakban Lucida Console betűkészlet van kiválasztva és a nyelvi környezet magyar!
  4. A setlocale függvényhívás beállítja a karakterek és sztringek összehasonlításához szükséges nyelvi környezetet (LC_COLLATE) próbálja ki! Változott a rendezési sorrend?

Az string2_test.cpp állományban magyar ékezetes szövegeket is használtunk. A különféle karakterkódolások miatt sajnos nem magától értetődő, hogy hogyan kell konzolos C/C++ programból ékezetes szövegeket megjeleníteni.

Jó munkát!

Szeberényi Imre

Utolsó frissítés: 2021-03-03 21.02