moodlemoot 2019, debreceni egyetem, informatikai kar, június 24 … · 2019-06-25 · Óraszám:...
TRANSCRIPT
MoodleMoot 2019, Debreceni Egyetem, Informatikai Kar, június 24-25.
Óraszám: 2/hét (labor)
Nyelv: Python
Létszám: 100+
Szint: zömében teljesen kezdők
Cél
◦ A félév végére a hallgatók legyenek képesek egyszerű programok megírására, tesztelésére, a saját hibáinak javítására.
A siker kulcsa
◦ Gyakorlás, gyakorlás, gyakorlás
W3Schools
Codingbat
Codewars
Codeacademy
...
Egy kezdő szintű Codewars kata
ProgCont (DE-IK)◦ programozási versenyeken szokásos visszajelzés
(elfogadva, időtúllépés, hibás eredmény, futási hiba, fordítási hiba)
ProgContR (DE-IK)◦ ProgContra épülő játékosított alkalmazás
Programkódok futtatását lehetővé tevő Moodle kérdéstípus
Több programnyelvet is támogat
◦ Python
◦ Java
◦ C
◦ C++
◦ Pascal
◦ PHP
◦ SQL
◦ …
Open source
Testreszabható kiértékelési mód és visszajelzés
A Moodle-tól örökölt előnyök
◦ A hallgatónak nem kell külső oldalakra regisztrálni
◦ Tanulmányi rendszerrel való összeköttetés ( neptun beíratás )
◦ ZH íratás lehetősége
◦ Egy helyen elérhető az összes segédanyag, gyakorlóanyag
◦ Támogatja a hallgatói teljesítmény követését (egyéni és csoport szinten is)
◦ Támogatja a hallgatóval való kapcsolattartást
Csak rajtunk áll, hogy a gyakorló illeszkedjen a tematikához
A forráskódok futtatására
szolgáló szerver
Ubuntu 18.04.1 LTS
job engine
Python 3.7
Moodle szerver
CodeRunner plug-in
Beállítások◦ pl.: programnyelv, kiértékelés módja, kimenet megjelenítése
◦ meghatározza a kérdéshez tartozó alapértelmezett sablont
A kérdés
A válasz
Tesztesetek◦ Input adatok
◦ Tesztelő kódrészek
◦ Elvárt kimenet
A sablon
http://coderunner.org.nz/pluginfile.php/145/mod_page/content/2/coderunnerarchitecture.png
Az input-output kezelése a feladat része
Sablon: alapértelmezett
Kiértékelés: Pontos egyezés szerint (alapértelmezés)
Csak tökéletes megoldásra jár pont
Ha nagyon sok a teszteset, érdemes átállítani.
Csak hibátlan megoldásra jár pont.
A hallgató úgy fogja látni az eredményt, mintha ő maga
gépelte volna be az inputokat.
Legyenek pontos előírások az üzenetek formázására.
Javasolt az "Answer" mező kitöltése után generáltatni
A kérdés szövege alatt példaként megjelenik a teszteset.
A feladat része a standard inputról történő beolvasás, ezért kitöltjük.
Elrejthetünk teszteseteket (csalások megelőzése)
Ha megadjuk:◦ automatikusan generálható lesz az elvárt válasz a tesztekhez
◦ a diákok a teszt beállításától függően láthatják ezt a megoldást
Feladat mentése (a hiányzó válaszok miatt, sikertelen lesz)
A felugró táblázatban kattintsunk a << jelekre
Mentsük el. Kész a feladat.
A feladat szövege
A példaként megjelölt tesztesetekből automatikusan
generált táblázat
A hallgató a válasz mezőbe beírhatja a megoldását
Az Ellenőrzés gombra kattintva kérheti a kiértékelést
értesül arról, hogy legalább egy rejtett tesztesetre is hibás a válasza
kiemelheti az elvárt és a kapott kimenet közti különbséget
A korábban látott módon generáltathatjuk, ha nem akarjuk
kézzel megadni.
Nem vár el adatbekérést a feladat, ezért ez üresen marad.
Csak az n értékét kell átírni a különböző tesztesetek
előállításához.
A válasz egy részét előre megadható.
A beadott megoldás:
def sn(n):return n*(n+1)/2
Kiértékelés módja:"Exact match"
Megj.: A "Nearly exact match" is ugyanezt eredményezné.
Válasz mező tartalmának elemzésére◦ „Old meg while ciklussal...”,
◦ „A megoldás során ne használd a math modult…”
A kiértékelés megváltoztatására◦ részpontok osztása
◦ közelítő megoldások elfogadása abs(exp – got)<eps
Tesztestek generálására ◦ véletlen értékekkel való tesztelés
◦ …
Tesztesetenkénti
{{ STUDENT_ANSWER }}
{{ TEST.testcode }}
Kombinált
{{ STUDENT_ANSWER }}
SEPARATOR = "#<ab@17943918#@>#"
{% for TEST in TESTCASES %}
{{ TEST.testcode }}
{% if not loop.last %}
print(SEPARATOR)
{% endif %}
{% endfor %}
A válasz mező tartalma szövegszerűen
behelyettesítődik
Egy konkrét teszteset kerül be a programba
Az összes teszteset bekerül
a programba
A válasz
def sn(n):return n*(n+1)/2
Tesztesetenként egy-egy program Egyetlen program
A kérdés típusnál jelöljük be a "Customise" mezőt
Tesztesetenkénti sablon
Pontos egyezés szerinti értékelés
A szokott módon adjuk meg a◦ feladatleírást
◦ teszteseteket
◦ válasz mezők tartalmát
Írjuk felül az eredeti template-et:
__student_answer__ = """{{ STUDENT_ANSWER | e('py') }}"""
if " while " not in __student_answer__:
print("A feladatot while ciklussal kell megoldanod!")
exit(0)
{{ STUDENT_ANSWER }}
{{ TEST.testcode }}
A beadott megoldás:
def sn(n):return n*(n+1)//2
Minden tesztesethez külön program tartozik(per-test sabon)
A beadott megoldás:
def sn(n):return n*(n+1)//2
A kérdés típusnál jelöljük be a "Customise" mezőt
Vegyük ki a pipát az "All-or-nothing" grading elől
Tesztesetenkénti sablont fogunk használni◦ IsCombinator: False
Az általunk megadott sablon végzi majd a pontozást:
◦ Template grader
A korábban látott módon generáltathatjuk, ha nem akarjuk
kézzel megadni.
A sablon kialakításától függ. A sablonba most ez kerül:
n = {{ TEST.testcode }}
Meghívja a hallgató által írt függvényt
Összeveti az eredményt és az elvárt eredményt
Kiírja a visszajelzést tartalmazó táblázat egy sorát a standard outputra.
A táblázat szokásos oszlopai:
◦ Iscorrect: helyes, helytelen, részben helyes
◦ Input: a tesztadat
◦ Got: a diák megoldásának eredménye
◦ Expected: az elvárt eredmény
◦ Fraction: a tesztesre kapott pont
import json
{{ STUDENT_ANSWER }}
n = {{ TEST.testcode }}got = sn(n)exp = {{ TEST.expected }}
mark = 0if got == exp and type(got) is int:
mark = 1elif abs(got - exp) < 0.00001:
mark = 0.8
print(json.dumps({'iscorrect' : mark, 'input': n, 'got': str(got), 'expected': str(exp), 'fraction': mark}))
1: helyes0: helytelen0<mark<1: részben helyes
A saját pontozónk Az akutális tesztesetre
adott pontszám
a hallgató függvénye
az 1. teszteset
az 1. tesztesetre elvárt válasz
A feladat szövege kikötötte, hogy a válasz legyen egész típusú
Csak részpont jár
A kérdés típusnál jelöljük be a "Customise" mezőt
Adjuk meg a feladatleírást
Töltsük ki a "preload answer" és "answer" mezőket, ha akarjuk
Teszteseteken NE adjunk meg
Az általunk megadott sablon végzi majd a pontozást:
◦ Template grader
A sablont majd le kell cserélnünk
Létrehozza a visszajelzést tartalmazó táblázat fejlécét
Generálja a tesztesetet
Minden tesztesetre:◦ kiértékeli a hallgató megoldását
◦ kiszámolja a helyes eredményt
◦ összeveti az eredményt és az elvárt eredményt
◦ hozzáfűzi az adott tesztesetre vonatkozó sort a táblázathoz
Kiírja az összeredményt és a visszajelző táblázatot a standard outputra
import jsonimport random
header = ['iscorrect', 'got', 'expected', 'input']rows = [header]
{{ STUDENT_ANSWER }}
NUM_TEST = 100 mark = 0for i in range(NUM_TEST):
n = random.randint(0, 1000)exp = n*(n+1)//2got = sn(n)iscorrect = got == expif iscorrect: mark += 1row = [iscorrect, str(got), str(exp), 'n: '+str(n)]rows.append(row)
print(json.dumps({'fraction': mark / NUM_TEST, 'testresults': rows}))
a táblázat fejlécéneklétrehozása
A kapott és az elvárt eredmény hasonlítása
A pontozása tesztesetre
vonatkozó sor
a visszajelző táblázat kiírása
Beadandó feladatok
◦ 5-10 feladatot tartalmazó teszteket hoztunk létre
◦ Időzítés: kb. 2 hetente
◦ Határidő: 2-2,5 hét
◦ Sikeres ZH-k esetén javíthatott a jegyen
2. ZH
◦ 6 feladatból álló teszt (sikeres: 50%-tól)
◦ Részpontok: nem voltak
Vizsgaidőszaki javító
◦ 7 feladatból álló teszt (sikeres: 60%-tól)
◦ Részpontok: nincsenek
Teszt kiválasztása
Próbálkozások
Egy pontszámra kattintva a hozzá tartozó próbálkozás és előzményei is megtekinthető
témakör Tesztindítások száma ( x /121) pontok eloszlása (0-max)
alapvető I/O, aritmetikai operátorok, kifejezések
120 (0 üres)
elágaztató utasítások 118 (2 üres)
ciklusok 115 (0 üres)
sztringkezelés 112 (0 üres)
függvények 110 (0 üres)
listák 101 (33 üres)
szeptember október november december
1200
400
0
Fela
datb
eküld
ések s
zám
a
1. ZH
2. ZH
800
Önálló megoldás nyomokban fordult elő
Együttműködések:
◦ elakadás után kér segítséget „valahonnan”
◦ közös munka
On-line fórumokon megosztott megoldások
◦ copy + paste, illetve kismértékben átírt kódrészek
A „válasz előzménye” figyelésével
◦ elsőre megoldott bonyolultabb feladatok
◦ rossz irányba induló próbálkozás után elsőre hibátlan válasz
◦ jó megoldás utáni további beküldések
Plágium szűrés nincs
Kezdő szintű feladatoknál egyébként sem hatékony
Gyakorló feladatok: 8-14 feladat témakörönként
Időzítés: 1-2 hetente (miután gyakorlaton vettük a témát)
Határidő: -
A jegybe nem számított bele
témakör tesztindítások száma ( x /127) pontok eloszlása (0-max)
tömb 175 (8 üres)
mátrix, háromszögmátrix
172 (22 üres)
halmaz 159 (16 üres)
soros táblázat 169 (9 üres)
sor, verem 161 (14 üres)
láncolt lista 175 (13 üres)
binárisfa 173 (15 üres)
2. ZH
február március április május
800
600
400
200
0
vizsgaidőszakijavító
fela
datb
eküld
ések s
zám
a
1. ZH
+ A hallgatók használják, legalább a ZH-k előtt önként gyakorolnak
+ Követhettük a hallgatók tevékenységét => egyedi visszajelzést adhattunk
+ A ZH kijavítja önmagát
- A kérdések létrehozása és tesztelése időigényes
- A hallgatók követése időigényes
- A csalások szűrése nehéz
Köszönjük ◦ lelkes Moodle üzemeltetőnknek, Vágvölgyi Csabának a CodeRunner plug-in
telepítését és beállítását
◦ a DE IK-nak az erőforrások biztosítását
◦ a DE IK rendszergazdai csoportjának a kódok futtatására szolgáló virtuális szerver kialakítását, a szükséges telepítések elvégzését
Moodlehttps://moodle.org
CodeRunnerhttps://github.com/trampgeek/moodle-qtype_coderunner/blob/master/Readme.md
Codingbathttps://www.codecademy.com
Codewarshttps://www.codewars.com/
CodeAcademyhttps://www.codecademy.com
ProgCont feladatkiértékelő rendszerhttps://progcont.hu
W3Schools (python)https://www.w3schools.com/python/
A hivatkozások utolsó megtekintése: 2019.06.20.