Pár éve volt egy álmom, nevezetesen az, hogy eljön az idő, amikor az informatikus hallgatók gépeikkel felvértezve vizsgáznak... volt fejlődés eddig is, de ma megvolt az áttörés: szinte mindenki a gépével dolgozott, vállvetve gép és ember. (Persze azt nem értem, hogy a néhány Windows hogyan keveredett a vizsgára, de a hallgatók azzal kivágták magukat, hogy Nekik virtuálisan van ez az...)
A jegymegajánlóval ellentétben nem névre szóló tesztlapokat adtunk ki (hiszen ez esetben aggályos lehetne, hogy nem részrehajló-e adott hallgatóval az összeállító szoftver) hanem 8 csoportba rendezett feladatlapokat osztottunk ki előre, majd a hallgató választott helyet. (Nyugalom, a javítás sem telefonnal megy, hanem kézzel csinálom :)
Lássunk egy tesztet: pdf, odt.
Érkeznek a hallgatók:

Vállvetve gép és ember:

A jobb oldali hajóban 2 fő soronként:

A bal oldaliban 4:

Eredmények
El is készültem a javítással. Időközben a jegymegajánlón résztvevők jelezték, hogy ott kicsit barátságosabb volt a pontozás... és igazuk volt, hiszen az akkori egész határok alapján osztályoztam, de most adtam fél pontot is. Ezért néhány hallgató jegyét módosítottam (az elégtelent és az elégségeseket kapókat érinthette ez)
% pontszám korábban új -> jegy
- 50% 5.5 6 5.5 -> 2
- 65% 7.15 8 7.5 -> 3
- 80% 8.8 9 9 -> 4
- 90% 9.9 10 10 -> 5
így az eredmények:
- 51 elégtelen
- 24 elégséges
- 14 közepes
- 6 jó
- 3 jeles
a 2011.6.24 írásbeli (itt van maga a teszt) eredményei:
- 11 elégtelen
- 16 elégséges
- 7 közepes
- 0 jó
- 1 jeles
Akinek sikerült és elégedett a jegyével, annak gratulálok, akit elszomorít az eredmény, annak fel a fejjel: a szóbeli vizsga témái jóval irányítottabbak.
Lássunk egy tesztet, hogy könnyebb legyen kommentelni róla:
Magasszintű programozási nyelvek I (prog1)
Programozó Páternoszter
DE IK mérnök informatikus szak béta vizsga
A „kocka teszt” változat: a “bátrak – a 2. hullám” kódjelű változat 4. mutációjának mutációja
A teszten a másokkal való verbális kommunikáción kívül tetszőleges segédeszköz (elektronikus vagy hagyományos könyv, jegyzet vagy akár laptop, mobil) használható! Sőt, erősen ajánlott!
Hallgató neve, Neptun kódja: …...................................................., …....................
[trófeák száma: ….................... vadász nick: …....................]
[előadás-látogatási 5%-ra jogosult:
igen
nem
Előtte ülő szomszédja neve: …..........................................
jobbra: …..........................................
mögötte: …..........................................
balra: …..........................................
Minden kérdésnél az igazat, vagy a “legigazabbat” jelöld meg! (Ahol maximalizáltuk a karakterek vagy szavak számát, ott a limitet átlépő megoldásokat nem értékeljük.)
Kérdések az informatikai kultúra témakörből 2
GPL 2
Kérdések a C/C++ programozás témakörből 2
Bevinfó 2
Hatáskör kérdés, mit ír ki? 3
Mit ír ki? 4
Függvénymutató, mit ír ki? 5
Tárkezelés 5
OO, mi történik? 6
Öröklődés 8
Kérdések a Linux kernel hacking témakörből 9
Kernelmodul 1 9
Kérdések a Linux rendszerprogramozás témakörből 10
Nem lokális ugrások 10
Kérdések a Java platform témakörből 10
API doksi 10
Dokumentum verzió: 0.0.4, vizsga.odt Debrecen, 2011. június 5. E közlemény felhatalmazást ad önnek jelen dokumentum sokszorosítására, terjesztésére és/vagy módosítására a Szabad Szoftver Alapítvány által kiadott GNU Szabad Dokumentációs Licenc 1.2-es, vagy bármely azt követő verziójának feltételei alapján. Nem változtatható szakaszok: A szerzőről. Címlap szövegek: Programozó Páternoszter, Bátfai Norbert, Gép melletti fogyasztásra. Hátlap szövegek: Belépés a gépek mesés birodalmába. | Bátfai Norbert nbatfai@inf.unideb.hu http://www.inf.unideb.hu/~nbatfai Debreceni Egyetem Informatikai Kar (DE IK), Információ Technológia Tanszék egyetemi tanársegéd |
Kérdések az informatikai kultúra témakörből
GPL
Ez a kódcsipet az Oracle-től letöltött „Sun-os JDK” src.zip állományából kicsomagolt java/util/Random.java forrásából származik. Lehet-e teljesen ugyanez a csipet része (így változatlanul, betűről-betűre) az OpenJDK java.util.Random osztályának?

Nem tudhatjuk, hiszen ez a java.util.Random osztály bájtkódban áll rendelkezésre, ami nem olvasható!
Nem tudjuk megnézni, mert a „Sun-os JDK” csomaghoz az Oracle természetesen nem adja a forrásokat, csak a bájtkódot. Tehát ez a Random.java forrás nem is lehet elérhető!
Nem tudhatjuk, mert csak az Open JDK adja a bájtkódokat forrásban is (a GNU GPL licenc miatt).
Igen, ugyanez van mindkettőben.
Igen, de a GNU GPL licenc miatt semmilyen ráépülő munkát nem lehet értékesíteni.
Nem, mert ez a licenc (Oracle ) durva megsértése lenne.
Nem, mert ez a licenc ( BSD GPL v2 ) durva megsértése lenne.
Nem, mert ez a licenc ( BSD GPL v3) durva megsértése lenne.
Nem, mert az Oracle-nek semmi köze az OpenJDK-hoz (szoftverlopás lenne az Open JDK részéről).
Nem, mert hiába vette meg az Oracle a Sun-t, a Java maradt BSD licences.
Igen, a BSD GPL v2 változat használata miatt (a BSD módosító azért kell, mert az Oracle kereskedelmit is kiad) ez ugyanaz, mint a Linux kernelét védő licenc.
Kérdések a C/C++ programozás témakörből
Bevinfó
Egészítsd ki úgy a következő kódcsipetet, hogy az „e” 2., 5. és 10. bitjét komplementálja (az eredményt nem kell beletenni „e”-be, csak kiíratni)! Azaz ezt adja a kimenetén:
1001010101010101
0000010000100100
1001000101110001

Konkrétan: mit kell a ???-helyére írni? Maximum 6 karakter!
..............................................................................................................................................................
Hatáskör kérdés, mit ír ki?

Nem fordul le, hiszen hibás a zárójelezés!
Nem fordul le, mert „a”-t több helyen is újradefiniálná...
55
-555
5
555
-555 ,5, 55 (egymás alatt, vessző nélkül)
55 ,5, 555 (egymás alatt, vessző nélkül)
Nem fordul le, mert a függvényen kívül definiált második int (4. sor) után lemaradt a változó neve...
Mit ír ki?

Nem fordul le, mert a külső stat-ot nem lehet felüldefiniálni.
Nem fordul le, mert a külső stat-ot nem lehet az eredetitől (most -100) eltérő értékkel újradefiniálni sehol sem!
Nem fordul le, mert a külső stat-ot nem lehet az eredetitől (most -100) eltérő értékkel újradefiniálni valamely függvényen belül!
-97
-103
103
3
97
-100, -99, -98 (egymás alatt, vessző nélkül)
0, 1, 2 (egymás alatt, vessző nélkül)
0, 1, 2, 3 (egymás alatt, vessző nélkül)
Függvénymutató, mit ír ki?

Nem fordul le sem...
0, a felüldefiniálás miatt
0, a túlterhelés miatt
az első és a második is igaz
le sem fordul, mert függvényt nem adhatunk értékül, csak a címét (hiányzik az & operátor)
42, 0 (vessző nélkül, külön sorokba)
42
Fordítási hiba, mert a double aktuális paraméteres hívás miatt az „int (*fgv)(double) = fgv1;” sor kellene
Fordítási hiba, mert a double aktuális paraméteres hívás miatt az „int (*fgv)(double) = fgv2;” sor kellene
0
Nem fordul, mert hiányzik a typedef
0-t, mert típusegyeztetés van
0 42 (vessző nélkül, külön sorokba)
Tárkezelés

Egészítsd ki úgy a következő kódcsipetet, hogy az első printf mutatóaritmetikával pontosan azt a tömbelemet írja ki, mint a második! (Nyilván az “m” mutatót használnod kell és max. 11 karaktert írhatsz a ??? helyére, illetve nem használhatsz '[' és ']' betűket.)
Konkrétan tehát: mit kell a ???-helyére írni? Maximum 11 karakter!
..............................................................................................................................................................
OO, mi történik?
Az alábbi csipetek az SVN-ben is fent lévő saját Int osztályunkból vannak kivágva. Ha lefut a main, mi történik és milyen sorrendben? Mondjuk így fordítanám, futtatnám:
$ g++ main.cpp -o main
$ ./main
main.cpp:

int.h:

le sem fordul, mert hiányzik a saját int.cpp...
ctor, masoló ctor, ctor, másoló értékadás, dtor, dtor
másoló ctor, ctor, másoló értékadás, dtor, dtor
ctor, ctor, másoló értékadás, dtor, dtor
ctor, ctor, dtor, másoló értékadás, dtor, dtor
másoló ctor, ctor, dtor, másoló értékadás, dtor, dtor
ctor, ctor, ctor, dtor, dtor, dtor
ctor, ctor, ctor, dtor, dtor, dtor (hiszen nincsenek dinamikus tagok az osztályban, ezért a másoló értékadás helyett alapértelmezett ctor van)
le sem fordul, mert az int eleve védett név...
le sem fordul, mert az int kulcsszó, nem használható...
a main nem használható, mert kulcsszó, így le sem fordul!

Öröklődés
a Liskov elv miatt: ahol Szulo lehet, ott lehet leszármazottja is, azaz semmi gond az fgv függvénnyel , 10-et ír ki
5-öt ír ki, mert a Gyermek setParam metódusa, előtt nem szerepel a virtual kulcsszó
nem fordul le, csak ha típuskényszerítjük a paraméterként átadott Gyermek-et Szulo-re
a Gyerek osztálybeli átadása ősét várónak nem probléma (Liskov elv), de a Szulo nem hívhatja a Gyermek setParam metódusát, mert az előtt nem szerepel a virtual, így 5-öt ír ki
futási idejű hiba, mert sérül a Liskov elv a main függvényben
futási idejű hiba, mert sérül a Liskov elv az fgv függvényben
futási idejű hibával leáll, mert sérül a Liskov elv a fordításkor
fordítási hiba, mert a Szulo-nek nincs ujParam tagfüggvénye
fordítási hiba, mert az ujParam nem virtuális
fordítási hiba, mert szp nem lehet polimorf mutató, hiszen a Gyermek setParam, ujParam metódusa előtt nem szerepel a virtual kulcsszó
Kérdések a Linux kernel hacking témakörből
Kernelmodul 1
Mit csinál a következő modul?

Egyetlen mondatban: (maximum 15 szó!)
..............................................................................................................................................................
..............................................................................................................................................................
Kérdések a Linux rendszerprogramozás témakörből
Nem lokális ugrások
Mi történik, ha elindítod az alábbi kis progit (csak a lényegi kódcsipet szerepel itt) és három Ctrl+C-t nyomsz?

1 alma és leáll az első Ctrl+C-re
2 alma és leáll a 2. Ctrl+C-re (mert a jelkezelést a kezelő nem állítja be újra)
3 alma és leáll
3 alma és nem áll le
4 alma és leáll
4 alma és nem áll le
1 alma és 3 korte és leáll
1 alma és 4 korte és leáll
1 alma és 3 korte és nem áll le
1 alma és 4 korte és nem áll le
Kérdések a Java platform témakörből
API doksi
Nevezz meg egy-egy osztályt (teljes csomagnévvel minősített formában) az alábbi Java kiadásokból!
Java SE: .........................................................................
Java ME: .........................................................................
Android: .........................................................................
leJOS: .........................................................................
Kommentekben már kifejtettem a hallgatói "megoldó kulcs" kérések kapcsán:
Jól kell érteni a témát, használni a gépet: EZ A KULCS, amivel bármilyen ilyen tesztet kinyittok majd sikerrel, ezért beszéljünk a feladatokról és arról, mi volt a helyes megoldás!
de mivel ilyen párbeszéd nem indult be a tesztek előtt, így utólag nem valószínű, hogy ez bekövetkezne, így jöjjön néhány gondolat, amit a személyes átnézéskor szoktam említeni:
- 1.: kommenteltük a vizsga előtt, hogy a licenc milyen a "Sun-os JDK"-ban, az OpenJDK-ban, a korábbi teszt kérdése alapján. Itt az volt a királyi út, hogy a hallgató a felkészülése során feltette ezt a két JDK-t és egyszerűen megnézte (akár a helyszínen) a kérdezett csipetet. A kérdést a nehogy.fw.hu/wp-content/uploads/Prog1_9.pdf előadás 26. diája sugallta.
- 2.: a maszkban a komplementálandó bitek helyén 1-van, ezért ezen helyeken az e-beli 0-ból 1 kell, 1-ből 0, azaz
e-0 varázslat m-1 = 1
e-1 varázslat m-1 = 0
e-0 varázslat m-0 = 0
e-1 varázslat m-0 = 1
mi legyen a varázslat? Jól látszik: kizáró vagy, azaz e EXOR m, persze C-ben leírva. Maga a kód jóideje használatunkban van, így rögtön ki is lehetett próbálni. Azt is elfogadtam, ha valaki kicsit bőségesen zárójelezett, de ennyit vártam: a ??? helyére: e^m. - 3.: van egy külső a, másik 3 külön blokkban, elég szimpla: 55.
- 4.: itt az csaphat be, hogy amikor végigjátszod, akkor a statikus belsőt a belépésekkor inicializálod... pedig csak az első esetében történik ez, neki ez a lényege :) az, hogy több számot is kiír, fel sem merülhet, vizsgázók adták ezt a tippet :) Ennek a mindenkori inicializálásnak a "feloldására" hallottam már szóban azt is, hogy a program misztikusan, a kiíratáskor összeadogatja a belépések számát, ezért adja a kipróbáláskor a 3-at. De arra a kérdésre, hogy a forrásban mutassuk már meg az a "rejtett szummázást" nyilván nem kaptam választ...
- 5.: itt is sok a dezinformáció, de láthatóan az fgv1 címét adjuk meg, így az fog lefutni: 42.
- 6.: már lerágott csontnak kell lennie a laborkártyák miatt, sőt a tömbök és mutatók kapcsán számos fólián ezt le is rajzoltuk:
m double *-okra mutat
m+3 a 4.-re
*(m+3) az ott lévő érték, ami ugye egy double *, ami ugyancsak mutat valahova, double-okra
*(m+3)+2 a 3. double-ra
*(*(m+3)+2) pedig ezt a double értéket állítja elő. Ennyi. - 7.: Ezt a példát még csak begépelni sem kellett, mert fent van az SVN-ben, ha futtatjuk, kiírta volna simán, de ránézésre is megy, mert direkt egy szimpla példát adtam: két ctor, aztán a másoló értékadás, blokk/progi végén a két dtor.
- 8.: Ugyancsak régi ismerősünk a forrás, a kérdést a nehogy.fw.hu/wp-content/uploads/Prog1_7.pdf előadás 14. fóliája inspirálta. (S magam is csak későn láttam, hogy maga a KDevelop-ból készített képen látszik is, hogy az IDE auto compile-ja megjelöli a hibát... :)
- 9: már ez a kérdés is lerágott, szakállas (külön poszt, korábbi hasonló teszt kérdés) csontnak nevezhető: annyit foragtuk, hogy az egyik legnagyobb következő állományleírójú processzt (név, pid, szám) írja ki.
- 10.: egy az egyben szerepel a példa két előadásban is:
az ismétlő nehogy.fw.hu/wp-content/uploads/Prog1_7.pdf 41-en, illetve a nehogy.fw.hu/wp-content/uploads/Prog1_3.pdf 78-on. Aki ki akarta próbálni, csak a 3 include kellett pluszban az elejért, man alapján, vagy az említett fóliákról... (Ja, és ha az a mondat igaz, hogy "Szókratész, Norbi, az előadó ember", akkor a "Norbi ember" is igaz, nem beszélve arról, a hamis részeket is tartalmazók közül biztos a "legigazabb" :) - 11.: ezt lehetett fejből, posztokban, előadás fóliákon mindig minősített neveket használtam, de itt azt vártam (előtte "szivárogtatva" is volt kommentben), hogy a hallgató tudja, hogy hol a platformok API doksija és egyszerűen beír egyet hastaütésre.