Útmutató az 1. laborhoz
Laborfeladatok:
A laborfoglalkozás végén töltse fel az elkészített fuggvenyeim.cpp és fuggvenyeim.h fájlokat Jporta rendszerbe (1. önellenőrző feladat), hogy megkapja a labor elvégzéséért járó pontot! A laborgyakorlatokon elvégzett feladatok feltöltésére a minden esetben laborgyakorlatot követő szombat 06:00-ig van lehetősége.
JPORTA Feladat
- Jelentkezzen be a Jporta rendszerbe az egyetemi eduID azonosítójával, és oldja meg az első kötelező feladatot (Neptun kód)! Az első héten ez az apró feladat megoldása helyettesíti a laborgyakorlatra felkészítő ellenőrző feladatot. A továbbiakban a laborgyakorlatokra felkészítő feladatokat mindig a laborgyakorlat hetén kedd reggel 6 óráig kell megoldani.
- Programoknak, dokumentumoknak rendszerint több változatát tároljuk. A változatok közötti eligazodást, a változatok kezelését ún. verziókövető (verziókezelő) rendszerek segítik. Ezek lényege, hogy tárolóban (repository) együtt tárolnak több változatot melyek közül kiválaszthatjuk, hogy melyikkel szeretnénk dolgozni. Ehhez a tárgyhoz kapcsolódó anyagokat, forrásprogramokat is egy ilyen verziókezelő rendszerben kezeljük, melynek a neve Git. Ebben a rendszerben az összetartozó fájlokat, könyvtárakat ún. projektekbe kell szervezni. A tárolt dokumentumok, forráskódok egy egyszerű böngészővel is elérhetők, de speciális klienssel könnyebb az anyagok elérése. A HSZK-ban telepített TortoiseGit kliens beépül a Windows fájlkezelőjébe. Segítségével könnyű egy teljes projekteket letölteni a tárolóból. Ebben a félévben a laborok nagy részénél előkészített fájlokon kell dolgozni, melyek a tantárgy Git tárolójából tölthetők le. Minden laboranyagot külön projektbe, a projekteket pedig a labor_peldak nevű csoportba szerveztük.
Kérje le az első laborhoz előkészített fájlokat a tantárgy Git tárolójából, melynek elérési útvonala:
https://git.ik.bme.hu/Prog2/labor_peldak/lab_01.git!- Másolja ki vágólapra a feladat URL-jét! Ezt a Gitlab webes felületén is elvégezheti.
- A Hozzon létre a munkához egy üres katalógust!
- A létrehozott (pl. labor) katalóguson jobb egérgombbal kattintva a feljövő menüből válassza ki a Git Klónozás...(Git Clone...) menüpontot, majd a feljövő panelen a tároló (Repository) elérési útjaként (URL) állítsa be a vágólapra másolt URL-t, majd indítsa el a letöltést (OK gomb)!Az URL-t a TortoiseGit kliens a vágólapról automatikusan bemásolja, így azt csak el kell fogadnia.
A kliens nyelvi beállítását a TortoiseGit menupont Beállítások (Settings) almenüjében lehet változtatni. - A fájlkezelővel nézze meg, hogy mi töltődött le a kijelölt katalógusba. Sikeres letöltés esetén egy szövegfájlt (README.TXT) és egy alkatalógust (nagyobb) kell látnia.
- Lépjen be a nagyobb alkatalógusba! Ebben az előadáson bemutatott egyszerű program fájljait találja, valamint a programokhoz tartozó CodeBlocks projektfájlt, illetve egy Makefile-t egyéb könyezetekhez pl. Linux/MacOS, Clion, stb. Ha projektfájlra kattintva nem indul a CodeBlocks, indítsa azt el, majd húzza rá a megnyíló ablak fejlécére a projektfájlt!
- Röviden tekintse át a kódot, fordítson és futtasson!
- Tervezzen egy olyan függvényt (először csak a deklarációját/prototípusát kell megadnia), ami kiszámolja egy n-ed fokú valós polinom helyettesítési értékét. A függvény paraméterként kapja egy valós tömbben a polinom együtthatóit (0. fokú a 0. indexű helyen). Szintén paraméterként kapja a polinom fokszámát és a független változót.
- Laborvezetőjével beszélje meg a függvény paramétereit és azok típusát (pointer? konstans? referencia?) és írja be a függvény prototípusát (deklarációját) a fuggvenyeim.h fájlba.
- Tegye alkalmassá a főprogramot (nagyobb_main) a függvény kipróbálásához! pl:
... double an[] = { 3, 2, 1 }; // együtthatók: a0=3, a1=2, a2=1 cout << "polinom(x=1)(x^2+2x+3):" << polinom(1.0, an, 2) << endl; ...
- Készítse el (definiálja) a függvényt a fuggvenyeim.cpp fájlban! Az n. hatvány kiszámolása helyett alakítsa a polinomot szorzattá! (Horner elrendezés)
- Próbálja ki a függvényt: fordítson, futtasson, majd cserélje le a főprogramot az alábbi kezdetleges tesztprogrammal!
... int main() { double an[] = { 3, 2, 1 }; // együtthatók: a0=3, a1=2, a3=1 double res[] = { 3, 6, 11, 18, 27, 38, 51 }; int hibak = 0; for (int i = 0; i < 7; i++) { double x = i; double fx = polinom(x, an, 2); if (res[i] != fx) { // Helyes ez így? cout << "Hibas: " << res[i] << "!=" << fx << endl; hibak++; } } if (hibak == 0) cout << "Nem volt elteres" << endl; }
Ha hibátlanul fut a fenti teszt, akkor biztosak lehetünk a függvényük helyességében? Beszélje ezt meg a laborvezetőjével!
- Cserélje le a
for
cilusban adouble x = i;
utasítást az alábbi utasításokkal, majd fordítson, futtasson!const double Z = 3.141e2; double x = i / Z - 1; x++; x = x * Z;
Mit tapasztal?
- Módosítsa a kódot, hogy 20 tizedesjegyre írja ki az értékeket! Ezt a setprecision manipulátorral a legegyszerűbb elérni:
... cout << "Hibas: " << setprecision(20) << res[i] << "!=" << fx << endl; ...
A módosított kód futtatásával egyértelművé válik, hogy a valós számokkal végzett műveletek eredménye a számábrázolásból fakadó pontatlanságok miatt nem pontos. Ezért az eredmények összehasonlításakor óvatosan kell eljárni.
- Módisítsa a főprogramot úgy, hogy az almostEQ függvényt használja összehasonlításra (ld. függvényeim.h)!.
- Fordítsa le az állományokat manuálisan is az előző gyakorlaton tanultak szerint! Milyen parancsokat adott ki?
- Ne felejtse el a következő feladat után feltölteni az elkészített fuggvenyeim.cpp és fuggvenyeim.h fájlokat a Jporta rendszerbe (1. önellenőrző feladat)! A feltöltött fájlokat a Jporta csak lefordítja. A megoldás helyességét a laborvezető ellenőrzi.
GTest és Ellenőrző feladat
A programfejlesztés során az elvárt funkciókat kódból ellenőrizhetjük. Ez nem csak a kezdeti fázisban hasznos, hanem akkor is, ha később belenyúlunk a programba és ellenőrizni akarjuk, hogy semmi olyat nem csináltunk, ami megtörné a funkcionalitást.
Készítsen egy új C++ projektet és töltse le a gtest_lite headert majd adja hozzá a projekthez! A gtest_lite-ról bővebben itt olvashat.
Másolja be ezt a kezdetleges kódot a main.cpp-be!
#include <iostream> #include "gtest_lite.h" int abs_osszeg(const int* ptr, size_t m) { if (ptr == nullptr) return 0; int ossz = 0; for(size_t i = 0; i < m; i++) { if(ptr[i] > 0) ossz += ptr[i]; else ossz += -1 * ptr[i]; } return ossz; } int main() { TEST(osszeg, csak_pozitiv) { // Teszt eset kezdete. A paraméterekből csak kiírás lesz int t[] = { 2, 4, 1, 9 }; int res = abs_osszeg(t, 4); EXPECT_EQ(16, res); // a két paraméter azonosságát várjuk } END return 0; }
Az eddig implementált teszt nagyon egyszerű esetet vizsgál, azt nem ellenőrzi hogy helyesen működik-e a függvény akkor is, ha negatív szám van a tömbben, vagy a pointer null-e! Késztse el ezeket a teszteket is! Beszélje meg a laborvezetővel, milyen további tesztek szükségesek (és kell-e)!
A kibővített teszteket adja le a jporta portálon a többi megoldással együtt, ehhez az egész main.cpp állományt töltse fel. (Ott test.cpp néven szerepel)
Ellenőrző feladat:
Ha maradt ideje, készítse el a CPPswap ellenőrző feladatot, majd töltse fel azt a JPorta portálra, a feladat leírását szintén a portálon találja! Nézze át milyen teszteket használ a program a függvény funkcionalitásának ellenőrzésére!
A félév további részében az ellenőrző feladatokat önállóan, otthon kell elkészíteni, általában a laborfoglalkozást megelőző kedd reggelig!
Ha még maradt idő:
Fakultatív feladatok:
- Indítson egy virtuális gépet a kari felhőben linux operációs rendszerrel! Ehhez egy később megoldandó fakultatív feladat leírásában talál segítséget (Virtuális gép indítása az IK-IIT felhőben című feladat első 5 lépése). Parancsokhoz segítség: unix alapok
Lépjen be a gépre, majd hajtsa végre a következő parancsokat: - Most nézzünk egy másik feladatot:
git clone https://git.ik.bme.hu/Prog2/labor_peldak/lab_01.git # a lab_01 katalógusba másolódik az első labor anyaga cd lab_01/nagyobb # belépünk a lab_01 könyvtárba ls -l # kilistázzuk annak tartalmát
- Fordítsa le az előadás példáját a g++ nagyobb_main.cpp fuggvenyeim.cpp -o nagyobb paranccsal!, majd
Futtassa a programot a ./nagyobb paranccsal! Az input végén nem CTRL-Z, hanem CTRL-D kell! - Próbálja ki a make parancsot is:
make # Ha ez előző fordítás sikeres volt, nem csinál semmit make clean # a clean szabályt hajtja végre, ami törli a eredményfájlokat ls -l make # most újból előállítja az a programot ls -l
- Próbálja ki a gdb debuggert! Ez egy parancssoros egyszerű program, ami alfanumerikus környezetben is működik: gdb -tui nagyobb A parancs elindítja a debuggert. A megnyíló kvázi grafikus ablakban láthatóvá válik a forráskód. Alatta pedig a gdb parancsra vár. A teljesség igénye nélkül az alábbiakban áttekintünk néhány gdb parancsot, melyeket bátran próbáljon ki!
- b 9 - a 9. sorba tesz egy töréspontot
- r - elindítja a programot, ami meg fog állni a 9. sornál
- s - végrehajtja az aktuális C utasítást
- s - ismét végrehajt, de mivel input utasítás következik, várni fog a két egész számra, amit echon nélkül, vakon kell begépelnie (pl: 4 5 ENTER).
- p i - kiírja az i változó értékét
- q - kilép a programból
- Önálló munkához a következő feladatokat ajánlom: feladat1.html
A védelmi rendszer mélyebb gyakorlati áttekintéséhez egy olyan számítógépre van szükség, ahol két különböző felhasználónévvel is rendelkezik, vagy van egy másik kolléga, akinek szintén van hozzáférése a géphez. Ilyen központi gép jelenleg nincs HSzK-ban. Ha van VIK felhőben gépe, akkor abban (Gyakorló feladat a védelmi rendszer bemutatásához.)
Jó munkát!