Követelmények, értékelés

2017.07.26.

Követelmények a Programozás alapjai I. tárgyban. Osztályzás, pontozás, néhány szó az elvi hibákról.

A programozás témakör oktatása az első félévben heti háromszor két órában történik: előadás és táblás gyakorlat, továbbá géptermi, laboratóriumi órák. A különféle órák számonkérései egy egységes rendszert alkotnak, együttesen határozzák meg a hét kredites tárgy végleges, félévközi jegyét.

1. A tárgy követelményei

A tárgy adatlapja: https://www.vik.bme.hu/kepzes/targyak/VIEEAA00/.

Követelmények:

  • 70% jelenlét az előadásokon, gyakorlatokon és laborokon külön-külön. Ez maximum 4 hiányzást jelent az egyes óratípusokon. A notórius késők hiányzónak számítanak.
  • Röp-ZH-k a laboron. A laboron az elégséges felkészültséget ellenőrizzük. Az ellenőrzés formája lehet egy pár perces dolgozat az óra elején, vagy az órai feladatok egy részének megkövetelése az óra végén.
  • Kis ZH-k a gyakorlatokon. A hat darab kis ZH három párt jelent (1–2, 3–4 és 5–6). Minden párban a jobban sikerült ZH pontszáma el kell érje a 40%-ot. A rosszabbul sikerült nem számít.
  • Nagy ZH-k a ZH sávban. A két nagy ZH összegzett pontszáma kell elérje az 50%-ot. A nagy ZH-kra jelentkezni kell az adminisztrációs portálon.
  • Nagy HF a laboron – erről külön oldalon lehet olvasni. Leadási határideje a 13. hét vége.

A jegy kiszámítsa:

Pontszám = NZH1 + NZH2
           + max(KZH1, KZH2) + max(KZH3, KZH4) + max(KZH5, KZH6)
           + NHF
           + EXTRA
elégtelenelégségesközepesjeles
0–5152–7273–9394–114115–

A nagy házi feladat részfeladatainak időben történő leadása beleszámít annak pontozásába. Extra pontokat lehet szerezni a félév közben beadott és elfogadott szorgalmi feladatokkal. A szorgalmi feladatok pontjai csak 80 pont fölött számítanak.

2. Pótlási lehetőségek

  • A jelenlétek és a röp-zh-k nem pótolhatóak. A megengedett hiányzás / bukási lehetőség magában foglalja a pótlást.
  • A nagy HF különeljárási díj ellenében leadható a 14. héten is, péntekig (pontosan az ehhez kiírt feladat határidejéig). A részfeladatok nem pótolhatóak (a késés a TVSz szerint a pontok 20%-ának elvesztését jelenti).
  • A kis ZH-k pótlása: a pótlási héten a három pár közül legfeljebb az egyik pótolható, különeljárási díj ellenében. (Amelyik a legrosszabbul sikerült, vagy a későbbi.) A pótlás jelentkezéshez kötött, a félév végén, alkalmas időpontban látszik a jelentkezési lehetőség itt, a portálon. Rontani is lehet; aki a pótláson beül a terembe, az ott elért eredménye felülírja az addigit.
  • A nagy ZH-k egybekötötten pótolhatóak vagy javíthatóak: a pótlási héten írt pót ZH pontszáma felülírja az addig megírt nagy ZH-k pontszámát, és így értelemszerűen duplázva számít. A feladatsor a teljes félév tananyagát lefedi. A pót ZH megírása jelentkezéshez kötött. Aki a pótláson beül a terembe, az ott elért eredménye felülírja az addigit. Pót-pót nagy ZH már nincs.

A különeljárási díjakat a NEPTUN-ban írják ki központilag a KTH-ból, de csak jóval a félév után (általában január végén).

3. Nulladik ZH

A félév elején lehetőség van egy ún. nulladik, szintfelmérő zárthelyit írni. Ennek témája a félév teljes tananyaga. A legalább jó (négyes) szintű teljesítésével mentességet lehet szerezni a jelenlét követelmények és a kis zárthelyik alól.

A nulladik zárthelyire jelentkezni kell, és pótolni, javítani nem lehet. A ZH megírása után a megkapott kedvezményt elfogadni szintén a portálra bejelentkezés után lehet. Az elfogadás a félévre nézve végleges. Elfogadás esetén az alábbi eredményeket írjuk jóvá:

  • gyakorlat jelenlét a teljes félévre,
  • labor jelenlét és röp-zh a teljes félévre,
  • kis ZH-k pontszámai arányosan, kerekítve (pl. ha 35/40 pontos lett a 0. ZH, akkor 35/4 = 8.75 → 9 pontosnak tekintjük a kis ZH-kat).

A többi tárgykövetelményt (a két nagy zárthelyi, nagy házi feladat) ilyenkor is teljesíteni kell.

Minta feladatsor elérhető itt.

4. IMSc képzés, IMSc ZH

Tematika

Az IMSc-s hallgatók számára külön gyakorlati és labor csoportokat indítunk. (Az előadás a teljes évfolyam számára közös.) Ezekben a csoportokban ugyanazon tananyag és tematika mellett mélyebb, összetettebb feladatok gyakoroltatják ugyanazokat a témaköröket.

Az érdeklődők számára a tárgyon tanultak alkalmazását bemutató, illetve a tárgy tananyagán túlmutató szakmai írásokat teszünk közzé a tárgy honlapján. Ezek egyéni elmélyülésre adnak lehetőséget. Feldolgozásukhoz konzultációk keretében segítséget nyújtunk.

A számonkéréseken alkalmazott pontozás és jegyszámítás mindenkinél egységes. Az IMSc pontok megszerzése a programban nem résztvevő hallgatók számára is biztosított, azonban a tárgy kreditjének megszerzéséhez kötött.

Pontozás

A jeles alsó ponthatára feletti összes többlet pontszámot IMSc pontszámnak számolunk, a tárgy kreditértékének megfelelően összesen legfeljebb 35 pontot (5×7).

A fent említett nagy és kis zárthelyik, illetve szorgalmi és nagy házi feladat pontszámok ugyanolyan módon történő számítása mellett 2×10 pontot lehet szerezni a nagy zárthelyiken választható kiegészítő feladatokkal is. A kiegészítő feladatot tartalmazó ZH-ra előzetesen jelentkezni kell. A kiegészítő feladatot csak az alap feladatok 75%-os teljesítése mellett pontozzuk, és az itt megszerzett pontok az aláírás megszerzésére nem használhatóak fel (tehát a NZH-k minimum pontszáma ezek nélkül is meg kell legyen).

Az IMSc ZH-n megszerzett extra pontok az összes többi ponthoz (KZH + NZH + NHF + szorgalmi) hozzáadódnak (+ IMSc), a jegyet is javíthatják.

5. Konzultációk

Rendszeresen tartunk személyes konzultációkat, ahol mindenkinek igyekszünk segíteni a programozási és tanulási problémáiban. Ezekre bárki eljöhet, a kérésünk csak az, hogy a kiírt időpontokra (ha épp vannak) jelentkezzetek az admin portálon, a jelentkezések menüpont alatt. Így tudjuk, hogy melyik alkalommal hány emberre számítsunk. Ha épp nem jelentkezik senki, akkor a konzultáció elmarad.

Kérdéseket feltenni az admin portálon az előadóknak, illetve az infoc KUKAC eet.bme.hu címen is tudtok. Természetesen mindenki fordulhat a saját gyakorlat- és laborvezetőjéhez is a programozással, házi feladatokkal kapcsolatos kérdéseivel!

6. A számonkérésekről általában

A nagy HF leadásához egy olyan programot kell elkészíteni, amely a félévben tanult ismereteket, algoritmusokat és adatszerkezeteket használva valósítja meg a kiírt feladatot. A programot forráskód formájában kell beadni, teljes dokumentációval, és be is kell mutatni a laborvezetőnek.

A kis ZH-k 15–20 percesek. Ezeken egy A/5-ös lapon kell megoldani egy egyszerű feladatot. A feladatgyűjtemény rengeteg régi kis ZH feladatot tartalmaz, ott látható, hogy néz ki egy ilyen. A nagy ZH-k három-négy nagyfeladatból állnak (4×10=40 vagy 2×10+1×20=40 pont). Jegy erre sem jár, csak pontszám. A honlapon régebbi feladatsorok is elérhetőek. A nagy ZH-kon használható a két oldalas C puska. Ezt egy A4-es lap két oldalára kell kinyomtatni.

A nagy ZH-k feladatai ún. beugró feladatokkal kezdődnek. Ezt azt jelenti, hogy minden feladatnak van egy minimális, alapvető, a feladat szövegében jelölt része – egy olyan gondolat, ami nélkül az egész megoldás értelmetlen lenne. Ezt meg kell tudni elfogadhatóan oldani, különben a szóban forgó feladat többi része 0 pontosnak számít.

A számonkéréseken alapvetően a programok működőképességét ellenőrizzük, de ez nem jelenti azt, hogy bármilyen működő megoldás maximum pontot ér. Az ésszerűtlen, durván hatékonytalan megoldások kevesebb pontot kapnak. Pontlevonás jár az átgondolatlan, „macskakörmözött”, kipontozott, „a másik fele ugyanígy” megjegyzéssel ellátott részekért, sormintákért, lásd a elvi hibák listáját.

Pontlevonás jár a nem megfelelő nyelvi eszközök használatáért is. Ha valaki nem ismeri az indexelő vagy a nyíl operátort, esetleg meg akarja nehezíteni a javító dolgát, szándékos obfuszkációval is sok bosszúságot okozhat. Léteznek továbbá karakter, felsorolt, és egyéb típusok a nyelvben, amelyek helyes használatáért a ZH-ban pont jár. Összefoglalva: legjobb értékelést csak olyan programkódok kapnak, amelyek nem csak helyesek, hanem jók is.

*(p+3) = 17;

(*(*q).kov).kov = NULL;

char c = 65;

felesleges zavarkeltés

p[3] = 17;

q->kov->kov = NULL;

char c = 'A';

tiszta, olvasható

Különös tekintettel vagyunk a függvények mellékhatásaira, paramétereikkel kapcsolatos előfeltételezésekre. A függvények lényege, hogy többször felhasználhatóak, ezért akkor is helyesen kell tudniuk működni, ha többször meghívják őket. „A feladatban csak egyszer kellett meghívni” – ez nem lehet hivatkozási alap egy pontvesztés reklamációjánál. Ahogy az sem, ha a függvényből bizonyos dolgok kifelejtődtek, esetleg máshol történtek meg (pl. ha a függvény dolga lenne egy tömböt nullával feltölteni a használat előtt).

A nagy ZH feladatokra egy megoldást kell adni. Ha több megoldást kapunk ugyanarra a feladatra, akkor találomra az egyiket javítjuk, vagy levonjuk a pontot az összesben lévő hibákért. A kommentek nem számítanak a feladat megoldásának, ugyanakkor részei a kódnak; a bennük lévő szakmai tévedésekért vagy inkonzisztenciáért pontlevonás jár.

A fentieken kívül, a félév végén már pontlevonás jár az alapvető sztringkezelő függvények nem ismeretéért, újraimplementálásáért (kivétel természetesen, ha kifejezetten ez volt a feladat). Ezek: strlen, strcpy, strcmp és printf %s.

7. Megtekintés, reklamáció, +2 pont

A nagy ZH-k megtekintését is központilag szervezzük. Itt lehetősége van mindenkinek megnézni, hogy milyen hibái voltak, mire kapott pontot. A megtekintésekre a nagy létszám miatt a portálon jelentkezni kell. Reklamálni helyben nem lehet; az esetleges reklamációt másnap reggelig kell leadni elektronikusan, mint egy házi feladatot. A reklamáció formai követelményei az alábbiak:

  • A reklamáció tartalmazza a hibásan pontozott rész helyét, tartalmát (kép a megoldásról csatolva / beszúrva, releváns rész kivágva), az értékelést és a reklamáció szakmai indoklását.
  • Amennyiben a szöveg formai hibás (lásd az előző pontot), szakmai tévedést vagy szakmához nem tartozó érvet tartalmaz, esetleg a lapra írt megoldásra vonatkozik, a reklamáció automatikusan eredménytelen.

A nagy ZH-kon a javítási hibák kompenzálására mindenkinek adunk +2 pontot ajándékba. Ez a két pont azonban csak akkor jár, ha nincsen reklamáció; ugyanis reklamáció esetén újra megnézzük a ZH-t, a tulajával egyeztetve, tehát onnantól elvileg javítási hiba már nem lehet, amit kompenzálni kellene. A +2 pontot az alábbiakkal lehet elveszíteni:

  • Reklamációval.
  • Utólagos ZH jelentkezéssel.

A reklamáció nem a ZH megtekintését jelenti; megtekintésért, kérdésért nem veszik el az ajándék pont. Az ajándék ponttal a ZH-kban szükséges minimum pontszám is elérhető.

A pót ZH-n már csak +1 ajándék pont van, és csak az duplázódik, úgy lesz belőle +2 pont, amelyik a jegybe számít. Ez a portálra bevitt pontszámokhoz már hozzá van adva.

8. Elvi hibák

Vannak olyan jellegzetes hibák, melyek egyértelműen az alapvető ismeretek hiányáról tanúskodnak. Ezzel együtt valószínűleg arról is, hogy elkövetőjük még soha nem írt számítógépen C programot. Az ilyen hibákat elvi hibáknak, néha „halálfejes hibáknak” nevezzük. Ezekért a nagy ZH-kon és a kis ZH pótlásokon 5 pontos levonások járnak. Ilyen hibák a következők:

A) Sorminták, „copy paste”-ek, macskakörmözések
... amelyek helyett triviálisan ciklus, tömb, függvény lenne használható:
int a, b, c, d, …;
scanf("%d", &a);
  –||– ("%d", &b);
         –||–    c);
…
printf("%d", c);
  –||–   ("%d", b);
  –||–   ("%d", a);

sorminta

int sz[10];
int i;

for (i = 0; i < 10; ++i)
    scanf("%d", &sz[i]);

for (i = 9; i >= 0; --i)
    printf("%d", sz[i]);

tömb, ciklus ismeretében

Ellenpélda. Ez nem azt jelenti, hogy bármit tömbben kell tárolni, amiből egynél több van:

  • Másodfokú egyenlet együtthatói: double a, b, c rendben van – ez a matematikai jelölés is.
  • Szülők adatai:
    struct Szulok {
        char papa[100+1];
        char mama[100+1];
    };
B) Függvényparaméterek és visszatérési érték helyett I/O
A feladatkiírás által kért függvényparaméterek és visszatérési értékek helyetti I/O művelet. Pl. „írj függvényt, amely megadja, hogy egy szám páros-e”:
void paros_e(int szam) {
    if (szam % 2 == 0) printf("paros"); // ?!
}

nem ez a feladat

bool paros_e(int szam) {
    return szam % 2 == 0;
}

hanem ez

Ellenpélda. A fenti elvi hiba abban az esetben érvényes, ha a kiírás vagy beolvasás a függvény paraméterezését próbálja helyettesíteni. Például egy hibakeresési célú kiírás, esetleg hibajelzés nem ilyen:

ListaElem * lista_beolvas(void) {
    FILE *fp;
    fp = fopen("nevek.txt", "rt");
    if (fp == NULL) {
        printf("Nem lehet megnyitni a fájlt!"); // nem elvi hiba
        return NULL;
    }
}
C) Bitműveletek és lebegőpontos aritmetika
Bitműveletes feladatban pow() függvény használata. A pow() függvény double számokkal dolgozik, nem egészekkel. Emiatt szinte minden egyéb elvégzett művelet, az ilyen kódban, lebegőpontos értékekhez fog vezetni, amiken a többi ilyenkor használatos operátor (pl. |, %) már nem is értelmezett. A lebegőpontos műveletvégzés miatt pontatlan lehet az eredmény.
D) Tömb és pointer fogalmának keverése
Definiálatlan méretű tömb létrehozása; tömbök és pointerek fogalmának, kapcsolatuknak nem ismerete, pl.
char sztring[]; // mekkora?
gets(sztring);

char *sztring;  // hova mutat?
gets(sztring);

1. ellenpélda. Ez nem azt jelenti, hogy a memóriaterület nem lett felszabadítva, vagy hogy felszabadítás után megpróbáljuk elérni az adatot. A fenti kódokban kísérlet sincs a foglalásra. A sztring[]-es sor azt mutatja, hogy a ZH írója nem tudja: a tömb nem foglalódik le magától, nem nő meg magától. A char *sztring-es pedig azt, hogy nem tudja, hogy a pointer létrehozása által nem fog tömb is keletkezni.

2. ellenpélda. Nem az inicializálatlan változó az elvi hiba! A fenti char *sztring-es kód nem ezt mondja. Hibának számít az inicializálatlan változó, de közel sem akkora gond, mint a pointer működésének nem ismerete.

E) Pointer, mint fura lokális változó
Annak hite, hogy a pointer egy körülményes lokális változó, amely által mutatott típushoz minden esetben memóriaterületet kell foglalni. Mintha a pointer csak malloc()-kal együtt működne:
ListaElem *iter;
iter = (ListaElem*) malloc(sizeof(ListaElem)); // ?!
for (iter = lista; iter != NULL; iter = iter->kov) {
    ...;
}
free(iter);
F) Adatszerkezetek, azok jellegzetes műveleteinek keverése

Tömböt vagy tömbre mutató pointert indexelünk, láncolt listán a next pointerekkel ugrálunk, bináris fa összes csomópontját rekurzióval érjük el.

Ha valaki egy láncolt lista elejére mutató pointert megindexel, esetleg egy bináris fát úgy próbál bejárni, hogy két ciklust ír, amelyek szerinte feldolgoznák a bal és a jobb részfát – valószínű nem érti, hogyan működnek ezek az adatszerkezetek. Ezek, és hasonló mértékű félreértések elvi hibának számítanak.