Hirdető tanszék: Informatikai Kar, Programozás Elméleti és Szoftvertechnológiai tanszék
Előadó: dr. Gregorics Tibor (gt@inf.elte.hu, D:2-611)
Kreditérték: 2 kredit
Hivatalos honlap: people.inf.elte.hu/gt/eaf/eaf2/eaf2.html
Erős előfeltétel: (Elemi) Alkalmazások Fejlesztése 1
A gyakorlat és az előadás csak együtt vehető fel!
A házifeladatok bemutatásának végső határideje a szorgalmi időszak vége. Aki nem mutatja be a négy beadandó feladat megoldását az említett határidő lejártáig, az nem kaphat gyakorlati jegyet! Ne hagyjátok az utolsó pillanatra!
A tantárgy első félévétől eltérően a többi félévben nincsen negyedévi géptermi zárthelyi, de a félév végi összevont géptermi zárthelyi feladatának értékelhető megoldása továbbra is szükséges feltétele a gyakorlati jegynek!
Az (Elemi) Alkalmazások Fejlesztése tantárgy második féléve erősen épít az első félévben elsajátított ismeretekre, a tanultak alkalmazásával bonyolultabb, elsősorban osztályalapú, modularizált konzolos alkalmazások implementálásával foglalkozik. A leglényegesebb különbség a beadandó feladatok elkészítésével kapcsolatban az, hogy míg az első félévben elsősorban specifikációs megkötéseket tettünk a megoldásra és azt minden esetben elfogadtuk, ha a program megfelelt annak, de a második félévben az eddigi megkötések mellett komoly implementációs kikötéseket is teszünk. Tehát egyáltalán nem elégséges, ha a program megoldja a feladatot, az is számít, hogy úgy oldjuk meg, ahogy a feladat kiírásában szerepel. Például ha halmazkezelést kell implementálni, akkor pontosan meghatározza a feladat, hogy a halmaz osztály a halmaz elemeit milyen módon reprezentálja! Dokumentáció továbbra is szükséges, nem várom, hogy terjengős legyen, de az alapvető algoritmusok és szerkezetek működését írja le úgy, hogy a kódot és a dokumentációt együtt olvasva érthető legyen a program működése! A forráskód (különösen mivel egyre modularizáltabb megoldásokra törekszünk) legyen jól tagolt és olvasható. Az egyes osztályokat, metódusokat, eljárásokat, függvényeket és elkülöníthető blokkokat értelmesen definiáljuk és igyekezzünk a "nekiesek és lesz valami" hozzáállás helyett inkább elméletben megkeresni a lehető legoptimálisabb és legelegánsabb megoldást, ezzel könnyítve a tényleges implementációt!
Vegyétek figyelembe, hogy a tárgyat teljesítők általában a tantárgy négy féléve közül ezt a félévet szokták a "legnehezebbnek" tartani, személyes tapasztalataim alapján ennek két alapvető oka szokott lenni. Az egyik, hogy ha valaki nem veszi a fáradtságot, hogy alaposan elsajátítsa a pointerkezelés mikéntjét és így a relatíve egyszerű programok is végeláthatatlan (futási idejű) debugolásba folynak át a helytelen címzések miatt (ez leggyakrabban a láncolásoknál szokott gondokat okozni), illetve ez a félév feltételez alapos algoritmusok és adatszerkezetek, esetenként számelméleti és egyéb ismereteket. Ne vegyétek félvállról, még akkor sem, ha az első félév könnyen ment, hagyjatok magatoknak időt az esetleges hibák kijavítására és a szükséges előismeretek elsajátítására/felidézésére is!
Konzolos alkalmazások implementálása: memóriacímzések, pointer-aritmetika, dinamikus memóriafoglalás, statikus és dinamikus osztályok (láthatóság, öröklés, operátorok, template -ek), valamint különböző adatszerkezetek és nevezetes algoritmusok implementálása.
A pointerezés megértése szemlélet kérdése. Meg kell érteni, hogy hogyan is működik a memória címzése, hogy hatékonyan programozhassuk azt. Ez mindennek az alapja. Egy program, amely ennek megértését segíti, letölthető ide kattintva!
Az osztályöröklődés témájából egy nagyon egyszerű kis mintaprogram letölthető ide kattintva!
A harmadik beadandó feladatokhoz egy kis gondolatébresztő, egy program, amely egy tetszőleges konvex síkidomot beolvasva meghatározza, hogy mely pontokat tartalmazza és melyeket nem. Ehhez a félsíkok metszetének módszerét használja (a sokszög oldalait egyenesekként kezelve meghatározzuk, hogy a kiválasztott pont az egyenesek által határolt félsíkok közül ugyanabba tartozi -e, mint a sokszög többi csúcsa)!Konkáv esetben ez az algoritmus hibás eredményt adhat, egy módszer, amely mindkét esetben célravezető, ha az adott pontból egy félegyenest indítunk olyan irányban, hogy ne metszen csúcsot, csupán oldalakat és megszámoljuk, hogy hány oldalt metszett összesen. Ezt az algoritmust nem implementáltam, lehet vele próbálkozni!És végül egy szigorú megkötés: akinek a feladata ehhez hasonló, annak TILOS a programkódom bármely részletét a beadandójában felhasználnia! Kezeljétek segítségként, ne éljetek vissza vele!A program a következő forrásokból áll: sokszog.h, sokszog.cpp és készítettem hozzá teszelőprogramot: sik.cpp a hozzá tartozó tesztfájllal: input.txt!