A legfontosabb megfigyelésem, hogy a hallgatók zöme (tisztelet a kivételnek; a jelenleg laboronként néhány főnek) sajnos egyáltalán nem készül a laborra. Ennek egyértelmű jelei:
- néhány hallgató a márc. 4-i héten nem tudta, hogy melyik könyv a kötelező olvasmány (annak ellenére, hogy előadáson már vetítettünk belőle, laborokon minden poszton ebből van a feladatok zöme, elküldtem Neptunban stb.)
- az előző csoportnál egy hajszállal jobb, akik azon pironkodtak, hogy még nem szerezték be a K&R könyvet; mert lényegében Ők sem tudják, mi a kötelező olvasmány, tehát tekinthetőek az előző csoportba tartozónak
- ezen a héten már előfordult, hogy akár 6 fekete pontot is "zsebelt be hallgató"...
- minden laboromon előfordul egy hallgató, akinek ki sincs nyitva szövegszerkesztője, amikor pedig programot kellene írni ugye
- még mindig sok hallgatót megfog az, hogy "mit ír ki?", "hol állok?", "hol a fájl, amelyet szerkesztek?" stb. a programozással nem kapcsolatos, hanem az általános számítógéphasználathoz köthető amatőr probléma
- néhány hallgató passzivításának oka a laboron, hogy nem volt előadáson, így "nincs képben" a feladatot illetően - ez a tipikusan "nem érti, miért nem érti" esete
A 6-os esetben egyszerűen el kell jönni az előadásra. Az 5-ös pontot az otthoni Linux és CLI (parancssor) használat pikk-pakk meg fogja oldani. A 4-es esetben a szóbeli ráhatásom szokott segíteni, de nem győzöm hangsúlyozni, hogy a feladatokkal már előre foglalkozva kellene a laborra jönni! Nyilván nem véletlenül tettem ki az első 5 hetet előre... Az 1-3 pontok orvoslására sajnos katonásan be kell vasalnom mindenkitől - tételesen - a binomos munkát, a laborkártyákat (itt is rögzítem, hogy a legtöbb esetben a hallgatónak azt kell bemutatnia, hogy kiróbálta a kártyát, tehát a legyen nálatok a progi; mert ha valakinek azt elfogadom, hogy becsszóra otthon kipróbáltam, akkor ezt mindenkinek el kellene fogadnom, ezért nyilván csak azt fogadom el, ha van valami "megfogható bizonyíték").
Labormunka
A fenti "legfontosabb" észrevétel mellett a laborokon kialakulhat a megfelelő hozzáállás, de ehhez felkészülten kell érkezni. Jó irányba mutat, hogy történik tömeges pontszerzés a foglalkozásokon (leszámítva a heti két "tömeggyilkos" labort, ahol nem sikerült megtörni a rendhagyó II. Világháborús történelemórán a német tengeralattjárók titkosított parancsait...)
Sokan nem értik, miért "nem segítek" a laboron előjövő tipikus problémák esetén. (Itt nyilván nem a "hol kell bakapcsolni a gépet", "hogy kell bejelentkezni" jellegű amatőr kérdésekre gondolok, hanem például a fordítási gondokra). Lássuk hát a "didaktikát": a PageRank és EXOR törés feladatoknál ugye a kód zömét adtam, de képekben, hogy be kelljen gépelni. Miért? Mert biztosan gépelési hibát vétesz, amire a fordító azt mondja, hogy a programod nem "eleme a C++ nyelv nyelvtana által generált nyelvnek"... azaz fordítási hiba lesz. S éppen ez volt a célom, hogy láss ilyen hibákat, olvasd el az fordító üzenetét, nézd meg melyik sorból jön az első hiba, azt próbáld meg javítani... stb. s közben épül ki a heurisztikád, attól az alaptól kezdve, hogy olyan editorral, amely nem képes a sorra ugrani, nem fogsz boldogulni a hibajavítás során vagy éppen ráérezz, hogy indentálással a blokkzárójelezési gondok azonnal látszanak stb. De ha ilyen esetben engem hívsz, hogy segítsek, akkor láthatod, hogy éppen a feladat lényegének jótékony hatásától fogod magadat távol tartani. Arról nem is beszélve, hogy ha ott kezded el begépelni, az külön bosszantó, mert egyben azt is jelenti, hogy nem készültél előre... pedig nyilván nem a magam szórakoztatására írom ezeket a posztokat! Ez azért különösen fájdalmas, mert persze forrásban is kint vannak a Prog1 MEGA PACK-ban a kódok, pl. a két említett:
- http://www.inf.unideb.hu/%7Enbatfai/p1/forrasok-SVN/bevezetes/C/exor/
- http://www.inf.unideb.hu/%7Enbatfai/p1/forrasok-SVN/bevezetes/C/pr/
Előadás
Az előadáson megfelelő a létszám, íme szép számban gyülekezünk az előadás előtt:
Otthoni munka - felkészülés a laborra
Az önálló munkával vagyok a hallgatók zöme kapcsán elégedetlen. (Az a néhány hallgató, aki máris 200 pont felett teljesített, nyilván a kivétel, Ők lesznek az évfolyam krémje.) Ezt az otthoni munkát, ezt kell mindenkinek erősítenie. Mondjuk a katonás számonkéréssel rá is fogjuk szorítani a rászoruló hallgatókat, hiszen a kapott feketéiket ki kell egyenlíteniük. Lássunk egy példát, a márc. 4-i laboron egy hallgató társunktól elhangzott a tömbök bejárása (teljesen precízen a KÖNYV 123. oldala mintájára) s említettem, hogy talán nem szerencsés a KÖNYV könyv alábbi példája, hiszen a 123. oldal két ciklusa egy karakterláncot jár be, amelynek végén ott a 0 kódú '\0' karakter. Ám ehhez a 123. oldalhoz hozzá kell olvasni a 124. oldal alját, sőt még a 197. oldal kapcsolódó részét is, melyek éppen azt mondják, hogy a tömb mellett a méretre is szükség van, mert ezt a tömb "nem tudja magáról" (gondolj az EXOR töréses példánkra, ott is adogattuk a függvényeknek a tömb neve - mint mutató - mellett a méretét is). De ebben is lehet "didaktika": összezavarodik a hallgató, ezért többször el kell olvasnia a most is kiemelt részeket, s végül, amikor egyébként már biztos a tudásában, megkoronázza azt majd egy kis példa kipróbálásával, például ezzel:
#include <iostream> void use ( char v ) { std::cout << v; } void use ( int i ) { std::cout << i << ", "; } void fic ( char v[ ] ) { for ( int i = 0; v[i]!=0; i++ ) use ( v[i] ); } void fpc ( char v[ ] ) { for ( char* p = v; *p!=0; p++ ) use ( *p ); } void fii ( int v[ ] ) { // BUG-OS! for ( int i = 0; v[i]!=0; i++ ) use ( v[i] ); } void fpi ( int v[ ] ) { // BUG-OS! for ( int* p = v; *p!=0; p++ ) use ( *p ); } int main() { char c_tip_karlanc[] = "Bus duledekeiden, Husztnak romvara, megallek"; fic ( c_tip_karlanc ); std::cout << std::endl; fpc ( c_tip_karlanc ); std::cout << std::endl; char kartomb[] = {'a', 'b', 'c', 'd'}; // BUG-OS! fic ( kartomb ); std::cout << std::endl; // BUG-OS! fpc ( kartomb ); std::cout << std::endl; int egesztomb[] = {1, 2}; // BUG-OS! fii ( egesztomb ); std::cout << std::endl; // BUG-OS! fpi ( egesztomb ); std::cout << std::endl; return 0; }
amely futtatva is jól mutatja, hogy az említett bejárás csak a nulla kódú karakterrel lezárt karakterláncok esetén működik:
norbi@colossus:~/Documents/P1$ g++ betomb.cpp -o betomb norbi@colossus:~/Documents/P1$ ./betomb Bus duledekeiden, Husztnak romvara, megallek Bus duledekeiden, Husztnak romvara, megallek abcd� abcd� 1, 2, 65535, 1, 1684234849, 32767, 4197741, 1, 2, 65535, 1, 1684234849, 32767, 4197741, norbi@colossus:~/Documents/P1$
Inspiráció
C++-ban lehet beküldeni ehhez a poszthoz a korábbi félév alábbi feladatait is, lehet csemegézni:
- http://progpater.blog.hu/2011/02/14/kisbajnoksagok
- http://progpater.blog.hu/2011/03/12/hey_mikey_he_likes_it_ready_for_more_3
Frissítés, márc. 31
A poszt elején már értékeltük az első néhány hetet, most az azóta eltelt, a tavasziszünet kezdetével bezáródó időszakra térünk ki. Mivel a szünet egy fontos mérföldkő, mert talán az utolsó olyan nyugodtabb időszak, amikor a lemaradó hallgató ledolgozhatja a felhalmozódott hátrányát.
Mert bizony ez a hátrány már megjelent a kurzusban! Vitathatatlan és örömteli, hogy vannak a kurzusban olyan hallgatók, akik hardcore szoftverfejlesztővé fognak válni néhány féléven belül és a legjobb fejlesztői állásokra aspirálhatnak majd, ebben teljesen biztos vagyok. Ám sajnos (és sajnálatos szokás szerint) most nem a legjobbakkal kell foglalkoznunk, hanem a lemaradódni látszókkal.
Mik a lemaradás jelei? Vegyünk 2 friss élményt az e heti laborgyakorlatról, amely két esetben is megismételte magát:
- a hallgató jelzi, hogy "valami baj van" de szerinte jó lenne a programja (az egyik Qt-s Mandelbrotos) módosítása
- már gyanús, hogy a hallgató nem tudja szakmaibb módon megfogalmazni a problémát, egyetlen megoldási javaslata, hogy "nézzem meg" (még olyan szinten sem, tudja megfogalmazni, hogy "nem fordul le") - ezért odamegyek megnézni
- mielőtt még nem mentem oda, arra gondoltam, hogy nyilván a gyengén bekonfigolt gépterem, valami gond van a Qt-vel stb. lehet a probléma
- odamenve azonnal látszik a "probléma", mivel a hallgató szimpla parancsa: gcc forrasnév.h
- mit jelent ez nekem? Azt, hogy a hallgató nem tudja a korábbi laborkártyát, ahol ugye fel kellett éleszteni Qt-s progit (ott nyilván megkapta a felkészületlen laborra érkezésért a feketéjét, de a hiányosságát azóta sem pótolta) illetve a laborposztokat sem olvasta el, ahol ez egy az egyben le van írva (gyakorlatilag "mit kell beírni" képernyőképekkel), azaz a hallgató teljesen felkészületlenül ült be a laborra, s ez egyértelműen nem az első ilyen laborja
De legyünk pozitívak: itt ez a bónusz hét, próbálják meg a leszakadni látszók bepótolni a hiányosságaikat! például az alábbi erősorrendben, kicsiben reprodukálva a félév eddigi részét
- próbáld ki, olvasd el és értelmezd ezeket a bevezető szösszeneteket: http://www.inf.unideb.hu/~nbatfai/p1/forrasok-SVN/bevezetes/elsoC/
- a posztok sorrendjének logikájában pótold be az informatikai olvasókönyv (K&R) ajánlott irodalomból feladott részeket és a kötelezőket méginkább a Stroustrup könyvből
- a posztok főfeladatait old meg: PR, Exor, stb. (hiszen ezek köszönnek vissza a vizsgán is) Nyilván már nincs időd mindent begépelni, játszani a fordítási hibák javításával, ezért használd konzervből, miközben a kódokat értelmezd: http://www.inf.unideb.hu/~nbatfai/p1/forrasok-SVN/bevezetes/C/
- végül készülj fel az első védésre, ami egy igazi értékmérő!
Ennek kapcsán jöjjenek a héten történt első védések tapasztalatai. Elégedett voltam zömében a védőkkel, hiszen Ők a legjobbjaink, akik ezen a héten bele mertek vágni. Most ezért csak a héten elhangzott kérdésekre szorítkozok:
- a z3a7.ccp-ből a 200. sor barát függvényét "vegyük ki az osztályból"
- a kiir() fgv.-ben szereplő inorder, posztorder vagy preorder fabajárást írd át egy másikra, tehát, ha preorder, akkor legyen posztorder (ugye az ajánlott "mesekönyvből" meséltem a sztorit, hogy K&R szerint ez a legjobban érthető rekurzív kód - ez egy nehéz feladat volt azért egyfelől, másfelől alig pár billentyű nyomással elintézhető :)
- a végén a main()-től kezd el lerajzolni a "./z3a7 bemenet -o kimenet" parancsor alapján a *++argv és az if (*((*++argv) + 1) != 'o') sorokban lévő kifejezések kiértékelését (ez ugye laborkártya is és előadáson is sokat boncolgattuk)
- világítsd meg a
while (beFile.read ((char *) &b, sizeof (unsigned char)))
if (b == 0x0a)
break;
sorok szerepét (s sok esetben ezekre a kérdésekre kis ellenőrző kódmódosításokat, futtatásokat is kértem, illetve szoktam kérni).
Frissítés, május 5
Két hét van hátra, s immár a második védések szezonját éljük. Nagyon sokan fizikai laborhiányzás (>3) miatt nem fognak aláírást kapni a laboron. Az első védések tekintetében az alábbi eredményekről tudok beszámolni a saját laborjaimon:
- péntek 8, 2 fő
- csütörtök 16, 5 fő
- szerda 12, 7 fő
- szerda 10, 10 fő
az első védéseknél sikerült tartani azt az ígéretet, hogy egyre nehezebbeket kérdezünk az idő előrehaladtával. Sokszor tűnik nehéznek hallgatói szempontból a védendő program kapcsáni kérdés, ezért talán érdekes lehet áttekinteni, hiszen 5-8 hallgatótársunk még próbálkozik, nem adta fel:
- a parancssorargumentumok kapcsán a tárkezelésre kérdeztünk
- a program "faépítési" logikájára kérdeztünk rá, a bejárást variáltuk, pre|in|post-order átírással
- a kompozícióban lévő csomópont objektumot sima aggregációra írtuk át (tagból -> pointer vagy referencia)
- előző pont kapcsán aki nem szabadított a dtor-ben, az a valgrind-es memóriaszivárgás detektálás után megszüntette azt
- az "aggregált átiratban" játszottunk a nem-másolható osztály mároló ctor-ával, majd a másoló értékadással (pl. reprodukálni kellett egy olyan hibát, amely a privát ctor vagy másoló értékadás meghívása miatt jelentkezik, vagy függvénynek tagként kellett átadni csomópont objektumot)
- STL vektorba kellett bepakolni a csomópont objektumokat
Frissítés, május 24
Lezárult a szorgalmi időszak, vége a pontvadászatnak, kialakult a laborokat sikeresen teljesítők halmaza, amely a saját laborjaim tekintetében így fest:
- péntek 8-as labor, 2 fő
- csütörtök 16-os labor, 4 fő
- szerda 12-es labor, 4 fő
- szerda 10-es labor, 11 fő
összesen 21 hallgató.
Személyes észrevételem, hogy átléptük azt a mágikus határt, ami teljesíteni fogja egy oktatói álmomat, miszerint: valódi önszervező prog-kurzust hozunk létre, ahol a hallgatók egymást űzve-hajszolva emelik egyrészt a saját tudásukat, s ezzel párhuzamosan a DEIK programozó-képzésének színvonalát, hogy idővel az évfolyam legjobbjaiért sorban álljanak a szoftver-fejlesztő cégek! De mi is ez a mágikus határ az én olvasatomban?
A félév teljesítésének alapja: amely a jövőben az legyen, hogy a 16 fős laborközösségben mindenki nevez a PLB bajnokságra (ami - robotfoci - hardcore programozás nemcsak az MI kutatásban, hanem az oktatásban is). S a két kiesőnek nincs meg az aláírása! Veszélyes feltételek, de a jelen félév megmutatta, mi az a kiskapu, amikor ez az ijesztő feltétel is szimpatikus lehet. Az, hogy az én oktatói csapataim (a Ti kiindulási csapataitok) lesznek a kiesők, ahogyan ebben a félévben ezt ELÉRTÉTEK!!!!!!!!!!!!! Köszönöm ezt, nagy élmény nekem.