Útmutató a 3. laborhoz
A laborgyakorlaton egyszerű osztályokat hozunk létre a 3. heti előadás anyagához kapcsolódóan. A bemelegítő példát (Téglalap) követően az előadáson bemutatott Komplex osztályt építjük fel lépésenként. Az elkészített osztály működését a már megismert a gtest_lite keretrendszerrel felépített tesztprogrammal ellenőrizzük.
Felkészülés a laborra
- Nézze át a 3. előadás anyagát, és példaanyagát!
- Ismételje át a 2. heti laborgyakorlat anyagát!
- Oldja meg a Jporta NEM_OO feladatát!
Laborfeladatok megoldásokkal
- Töltse le a 3. laborhoz előkészített projektet a tantárgy Git tárolójából https://git.ik.bme.hu/Prog2/labor_peldak/lab_03! A labor anyaga több katalógusba van szervezve. Fájlkezelővel ellenőrizze, hogy mi töltődött le! Sikeres letöltés esetén 2 db katalógust (Teglalap, Komplex) kell látnia.
- Gyakorló feladat (megoldására tervezett idő max. 10 perc)!
- A Teglalap könyvtárban levő teglalap.cpp fájlban egy nagyon egyszerű osztály (
Teglalap
) deklarációja, valamint az osztályt példányosító főprogram található. Az Ön feladata a hiányzó tagfüggvények elkészítése. Az osztály teszteléséhez a főprogram néhány objektumpéldányt hoz létre és azokkal meghívja a tagfüggvényeket. Az ELKESZULT makróval vezérelhető, hogy csak a már elkészült tagfüggvényeket hívja meg a főprogram. - Elemezze az előkészített programot, majd készítse el a hiányzó függvényeket. Fordítsa le a programot és futtassa!
Ne feledje, hogy a tagfüggvények az objektum adatát közvetlenül elérik, ezért nincs paramétere sem a kerület, sem a terület tagfüggvénynek! - A Teglalap könyvtárban levő teglalap.cpp fájlban egy nagyon egyszerű osztály (
"Komplex" feladat továbbfejlesztése
A továbbiakban az előadáson bemutatott Komplex osztályt kell kiegészítenie. A Komplex alkatalógusban előkészítettük a munkához szükséges fájlokat:
- komplex.h
- Komplex osztály deklarációja.
- komplex.cpp
- Komplex osztály tagfüggvényinek definíciója (megvalósítása).
- elkeszult.h
- A teszteseteket engedélyező ELKESZULT makró definíciója.
- komplex_teszt.cpp
- KomplexAz osztályból példányosított objektumok helyes működését ellenőrző egyszerű tesztprogram.
- gtest_lite.h
- Google gtest csomagjához hasonló, de lényegesen szerényebb teszteszköz
Feladatok
A laborfoglalkozás végén ne felejtse el feltölteni megoldásait a Jporta rendszerbe, hogy megkapja a labor elvégzéséért járó pontot! Az alábbi feladatokból legalább az első négy feladatot hibátlanul meg kell oldania! A feladatok feltöltésére a laborgyakorlatot követő szombat 06:00-ig van lehetősége.
- Nyissa meg az előkészített CodeBlocks vagy Visual C++ projektet a megfelelő projektfájl segítségével!
- Elemezze (a kommenteket is olvassa el) a projekthez tartozó állományokat! A teszteseteket a korábban megismert gtest_lite makrók segítségével alakítottuk ki. Nézzük példaként a konstruktorok létezését és a paraméter nélkül hívható konstruktor helyes működését ellenőrző tesztesetet:
// Konstruktorok létezésének és a paraméter nélküli konstruktor működésének tesztje TEST(Komplex000, Letezik) { // Testeset neve: Komplex000, a teszt neve: Letezik Komplex k, k1(1), k2(1,2); // Ezek az objektumok a teszteset lokális objektumai. // Ha nincs fordítási hiba akkor az objektumok létrejöttek. EXPECT_EQ(0, k.getRe()); // Megvizsgáljuk, hogy a paraméter nélküli konstruktor 0-val inicializál-e. EXPECT_EQ(0, k.getIm()); // Ha nem, akkor baj van } END << "Hiba esetén még ez a szöveg is kiíródik" << endl;
Minden testesetet elkészítettünk. Önnek csupán a Komplex osztály megfelelő tagfüggvényeit kell elkészítenie.
- Első feladatként valósítsa meg a konstans objektumra is alkalmazható
getRe()
ésgetIm()
metódusokat akomplex.cpp
állományban! Emlékezzen rá, hogy konstans objektumra csak olyan tagfüggvény alkalmazható, ami nem változtatja az objektum állapotát (const tagfüggvény). Ilyen szerepelt az előző (Teglalap) feladatban is, illetve az előre elkészített abs() tagfüggvény is ilyen.
A korábbi feladatokhoz hasonlóan az ELKESZULT makróval szabályozhatja, hogy a tesztprogram mely tagfüggvényeket tesztelje. A get... metódusok teszteléséhez állítsa az EKLESZULT értékét 1-re az elkeszult.h fájlban, majd fordítsa és futtassa a programot!Célszerű akomplex.h
fájl megfelelő sorait átmásolni akomplex.cpp
-be, és azt módosítva megvalósítani a függvényeket. Ügyeljen arra, hogy a kívül definiált tagfüggvények előtt helyesen használja a scope operátort! - A komplex.h állományban a feladatoknak megfelelő sorrendben deklaráltuk a továbbiakban elkészítendő függvényeket. Figyelje meg, hogy azoknál a függvényeknél, ahol paraméterként csak értéket kellene átadni (Komplex), ott hatékonysági okokból konstans referenciát adunk át! A Komplex osztálynak ugyan nincs nagy adatterülete, így csak néhány byte verembe másolását spóroljuk meg, de érdemes "rászokni" a konstans referenciára ilyen esetekben.
- Készítse el valós és képzetes rész beállítására szolgáló beállító függvényeket(
setRe(double)
,setIm(double)
)! Fordítson, teszteljen (ELKESZULT=2
)! - Készítse el az egyenlőségvizsgáló (
==
) operátort! A != operátort már elkészítettük, ami az == -re vezeti vissza a feladatot. Fordítson, teszteljen (ELKESZULT=3
)! - Készítse el a
+
(összeadás) operátorokat! Működjön a komplex összeadás valós számokkal is (először csak jobbról) Fordítson, teszteljen (ELKESZULT=4
)! - Készítsen összeadó operátort, ami alkalmas valós + komplex összeadására! Ebben az esetben a bal oldali operandus nem objektum, így globális operátorfüggvénnyel kell megvalósítani a feladatot. Fordítson, teszteljen (
ELKESZULT=5
)! - Készítsen
+=
operátort! (A valós változatot már előre elkészítettük.) Fordítson, teszteljen (ELKESZULT=6
)!
A keretrendszer megvalósításánál igyekeztünk kompatibilis megoldást találni a Google által fejlesztett és több Google projektben is alkalmazott gtest egységtesztelő (Unit Test) keretrendszerrel. Az ehhez hasonló Unit Test rendszereket gyakran úgy alkalmaznak nagy projektekben, hogy a projekt verziókezelő rendszere csak akkor enged új változatot betölteni, ha előtte a unit tesztek hibátlanul lefutottak.
Szorgalmi feladatok:
- Legyen kiírható a komplex adat egy
ostream
típusú objektumra a<<
operátorral 1+34j ill. 1-34j alakban!
Be lehessen olvasni egyistream
típusú objektumból a>>
operatorral ugyanilyen 1+34j alakban! Fordítson, teszteljen (ELKESZULT=7
)! - Valósítsa meg a
~
operátort, amely a Komplex konjugáltját képzi! Fordítson, teszteljen (ELKESZULT=8
)! - Készítsen
*=
operátort. Működjön valóssal (double) is!
Legyen*
operátora is az osztálynak! Működjön valóssal balról és jobbról is! Fordítson, teszteljen (ELKESZULT=9
)!
(a+bj)·(c+dj) = (ac-bd) + (ad+bc)j.
a+bj.
Jó munkát!