HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

Az kurzus tapasztalatai

2013.03.09. 13:18 nb

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:

  1. 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.)
  2. 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
  3. ezen a héten már előfordult, hogy akár 6 fekete pontot is "zsebelt be hallgató"...
  4. minden laboromon előfordul egy hallgató, akinek ki sincs nyitva szövegszerkesztője, amikor pedig programot kellene írni ugye
  5. 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
  6. 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:

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:

prog1oraelott.png

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:

obivan3.jpg

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
  • csütörtök 16, 5
  • szerda 12, 7
  • szerda 10, 10

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:

  1. a parancssorargumentumok kapcsán a tárkezelésre kérdeztünk
  2. 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
  3. a kompozícióban lévő csomópont objektumot sima aggregációra írtuk át (tagból -> pointer vagy referencia)
  4. 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
  5. 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)
  6. 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
  • csütörtök 16-os labor, 4
  • szerda 12-es labor, 4
  • szerda 10-es labor, 11

ö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.

16 komment

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr135124333

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

B.Norbi93 2013.04.01. 14:34:12

@Shuffle02: Csak tipp, de nem lehet, hogy egyszerűen csak túlságosan rövid időn belül akarsz több üzenetet is küldeni, és spamnek veszi a kommentjeidet a blog.hu? (nem tudom, hogy milyen időközönként próbálkoztál, de látom elég aktív vagy :) )

smajdam 2013.04.04. 23:12:47

@Cvanger: én nem sajnálom tőled a pontokat, meg nem akarok kötekedni, de :
" minden feladatnál legyen legalább pár mondatos magyarázat a feladathoz"
szerintem ennek a docbooknak pont ez a lényege.

Cvanger 2013.04.05. 08:24:17

@smajdam: rendben, akkor írok még hozzá.

B.Norbi93 2013.04.14. 11:53:51

@Shuffle02: Közben már én is próbálkoztam 3x, sikertelenül, tehát ez a spam-szűrős megoldás nem jött be :)

Feladatok:
KÖNYV 5.9.1 (4 pont)
imagerz.com/QE8TC0tvAwMBXw4fFwVQ

KÖNYV 5.9.4 (4 pont)
imagerz.com/QE8TC0tvAwMBXw4fEAVQ

KÖNYV 5.9.5 (6,5 pont)
imagerz.com/QE8TC0tvAwMBXw4fGQVQ

KÖNYV 5.9.7 (6,5 pont)
imagerz.com/QE8TC0tvAwMBXw4fGAVQ

KÖNYV 5.9.10 (4 pont)
imagerz.com/QE8TC0tvAwMBXw4fQAVQ

KÖNYV 5.9.11 (9 pont)
imagerz.com/QE8TC0tvAwMBXw4fQgVQ
imagerz.com/QE8TC0tvAwMBXw4fRQVQ

KÖNYV 5.9.13 (6,5 pont)
imagerz.com/QE8TC0tvAwMBXw4fRAVQ

B.Norbi93 2013.04.14. 12:42:10

@nb: Hol maradtak le a források?

Közben látom, hogy a blog.hu most küldte el még egy párszor az 5.9-es feladatos próbálkozásaimat (...), tehát akkor ezúton megkérném tanár urat, hogy ha van rá lehetőség, akkor a felesleges kommentjeimet törölje :)

nb · http://fersml.blog.hu 2013.04.14. 13:33:47

@B.Norbi93: nem gond a duplikálás, javítja a statisztikát :)

A források emlékeim szerint csak képen vannak, így nehéz őket mehnézni, kipróbálni.

B.Norbi93 2013.04.14. 17:52:02

@nb: Létrehoztam egy pastebin accountot, ide akkor már feltöltöttem a Könyv 6.6.x feladatait (ha jól számoltam, ezek még nem lettek beszámítva)

pastebin.com/u/Norbi930523

A képi "bizonyítékok":
progpater.blog.hu/2013/02/24/a_harmadik_labor_anyaga_-/fullcommentlist/1#c19474213

Továbbá ezt egészíteném még ki a 6.6.3 + 6.6.12 kombinációjával, ill. a 6.6.9-es feladattal:
imagerz.com/QE8QX0tvAwMBBw9PEwVQ
pastebin.com/0XFwrGsp

Valamint a binfával kapcsolatban lenne olyan kérdésem, hogy erre:
progpater.blog.hu/2013/03/10/kozos_feladatok_allamvizsga_beugro/fullcommentlist/1#c19353942
akkor jár-e pont, vagy még C++-osítani kellene rajta? :)

A végére pedig egy robotfocis kérdés:
az Aranycsapat felállását a Db Round Forest C++-ra kell beállítani?

Smajdam 2013.04.18. 22:33:19

@B.Norbi93: a bajnokság generátorod hogy kell használni? nem olvastam el a kódod, csak úgy nagyjából, de nekem ez az eredmény:
www.kepfeltoltes.hu/view/130418/erdekes_www.kepfeltoltes.hu_.png

B.Norbi93 2013.04.19. 12:40:59

@Smajdam: a kód szigorúan NB1-re van írva (vagy legalábbis 16 csapatos bajnokságokra), szóval parancssorban 16 csapatot kell megadni

B.Norbi93 2013.04.19. 15:41:58

@B.Norbi93: Készítettem egy módosított változatot is a bajnokság-generátorról, mostmár ha minden igaz tetszőleges (páros!) számú csapattal működik:
pastebin.com/Lb4X5qiV

Plusz gyorsan, még a forduló előtt :)
Alternatív tabella frissítve:
hu.wikipedia.org/wiki/Alternat%C3%ADv_tabella

B.Norbi93 2013.04.19. 15:57:43

@B.Norbi93: Illetve szerkesztettem a tabellát, egyelőre ellenőrzés alatt :)
süti beállítások módosítása