• Rezultati Niso Bili Najdeni

ANALIZA KODE IN ODKRIVANJE TIPIČNIH NAPAK PRI UČENJU PROGRAMIRANJA

N/A
N/A
Protected

Academic year: 2022

Share "ANALIZA KODE IN ODKRIVANJE TIPIČNIH NAPAK PRI UČENJU PROGRAMIRANJA "

Copied!
77
0
0

Celotno besedilo

(1)

PEDAGOŠKA FAKULTETA

Drugostopenjski magistrski študijski program Poučevanje, smer Predmetno poučevanje

Anže Rozman

ANALIZA KODE IN ODKRIVANJE TIPIČNIH NAPAK PRI UČENJU PROGRAMIRANJA

Magistrsko delo

Ljubljana, 2019

(2)
(3)

PEDAGOŠKA FAKULTETA

Drugostopenjski magistrski študijski program Poučevanje, smer Predmetno poučevanje

Anže Rozman

ANALIZA KODE IN ODKRIVANJE TIPIČNIH NAPAK PRI UČENJU PROGRAMIRANJA

Magistrsko delo

Mentor: doc. dr. Jure Žabkar

Ljubljana, 2019

(4)
(5)

Zahvala

Za mentorstvo, vodenje in strokovno pomoč pri nastajanju magistrskega dela se iskreno zahvaljujem doc. dr. Juretu Žabkarju. Zahvaljujem se tudi dr. Timoteju Lazarju in dr.

Martinu Možini za pomoč pri analizi podatkov.

Zahvalil bi se rad sodelavcem in najbližjim za spodbudne besede ter podporo med pisanjem magistrskega dela, s katerim zaključujem pomembno poglavje v mojem življenju.

(6)
(7)

Učenje programiranja je za učence lahko zahtevno zaradi razvijanja specifičnega algoritmičnega načina razmišljanja. Učitelji pri reševanju nalog po navadi pomagajo s sprotnimi namigi, pri čemer je smiselno stremeti k temu, da namigi učence uspešno usmerijo in ne razkrijejo končne rešitve. Nesmiselno bi bilo učencem prezgodaj predstaviti pravilen program, saj pri tem ne bi dosegli željenega učnega učinka. Problem poučevanja postane še večji, ko učitelji poučujejo programiranje v večji skupini učencev in sprotno nudenje pomoči že predstavlja velik časovni zalogaj. Bloomov 2-sigma problem predpostavlja, da je individualno poučevanje, kjer učitelj nudi pomoč le enemu učencu, najučinkovitejša oblika poučevanja, zato je dobro razmišljati v smeri, da se pri načrtovanju pouka ta pristop upošteva. Inteligentni tutorski sistem (ITS), ki izhaja s področja avtomatskega poučevanja (angl. automated tutorial), omogoča učenje v programskem okolju, ki nudi pomoč namesto učitelja, pri tem pa ohranja nekatere prvine individualnega poučevanja kot so npr. sprotni namigi in takojšnja povratna informacija.

V magistrskem delu sem se osredotočil na avtomatsko poučevanje v sistemu CodeQ, ki se uporablja pri poučevanju programiranja v programskih jezikih Python in Prolog na Fakulteti za računalništvo in informatiko in Fakulteti za kemijo in kemijsko tehnologijo Univerze v Ljubljani. Na zbirki oddanih programov študentov sem analiziral, katere so tipične (semantične) napake pri izbranih nalogah. Programi so preoblikovani v abstraktna sintaktična drevesa (ASD), iz katerih so bili nato ustvarjeni atributi za izdelavo odločitvenih dreves. Z odločitvenimi drevesi je možno ugotoviti razloge za napačno delovanje programov in tudi pogoste oz. tipične napake. Zbirka tipičnih napak lahko pripomore k izgradnji knjižnice z napakami ter izdelavi namigov v ITS, ki se prikazujejo pri reševanju nalog.

Ključne besede

učenje programiranja, avtomatsko poučevanje, inteligentni tutorski sistem, CodeQ, programski jezik Python, abstraktno sintaktično drevo, odkrivanje napak

(8)
(9)

Learning programming can prove to be a challenging task for students, as it demands some algorithmic thinking. Teachers usually assist their students by providing accompanying hints, which should successfully guide the students without revealing the final solution. It would be pointless to present the correct solution to the students prematurely, since they would not achieve the desired learning effect. Larger groups of students present an even bigger teaching challenge as assisting individual students takes a substantial amount of time. Bloom's 2-sigma problem assumes that individual teaching, where the teacher provides assistance to only one student at a time, is the most effective form of teaching and should therefore be taken into consideration while planning a lesson. Intelligent tutoring system (ITS) based on the automated tutorial, enables learning in a program environment that substitutes teacher support while retaining some of the elements of individual teaching, such as hints and instant feedback.

In my master's thesis, I have focused on automated tutorial in the CodeQ system, which is used in teaching programming using Python and Prolog programming languages at both the Faculty of Computer and Information Science and the Faculty of Chemistry and Chemical Technology, University of Ljubljana. I analysed the typical (semantic) mistakes in the selected assignments in the collection of submitted student programs. These programs were transformed into abstract syntax trees (AST), from which I created the attributes to form decision trees. Decision trees can be used for identifying the reasons for the incorrect functioning of the programs, as well as the frequent or typical mistakes. A collection of typical mistakes can help build a bug library and produce ITS tips to help at solving problems.

Key words

learning programming, automated tutorial, intelligent tutoring system, CodeQ, programming language Python, abstract syntax tree, error discovery

(10)
(11)

1 Uvod ... 1

2 Pregled področja ... 3

2.1 Bloomov 2-sigma problem ... 3

2.2 Stroji za učenje ... 4

2.3 Učenje s pomočjo računalnika (CAI) ... 5

2.3.1 Struktura ITS ... 7

2.3.2 Delovanje ITS ... 9

2.4 Napake pri učenju programiranja ... 10

3 Empirični del ... 12

3.1 Opredelitev raziskovalnega problema ... 12

3.2 Pregled sorodnih raziskav ... 12

3.3 Cilj raziskave ... 15

3.4 Vzorec ... 15

3.5 Postopki obdelave podatkov... 15

3.6 Kvantitativna raziskava ... 19

3.6.1 Naloga 1: Pretvarjanje iz Fahrenheitov v Celzije ... 20

3.6.2 Naloga 2: Največji ... 31

3.6.3 Naloga 3: Liha in soda števila ... 40

3.6.4 Naloga 4: Palindrom ... 47

3.7 Ugotovitve raziskave ... 60

4 Zaključek ... 62

5 Literatura ... 64

(12)
(13)

1

1 UVOD

Literatura iz 20. in 21. stoletja razkriva, da pedagoški psihologi kot ostali, ki so zaposleni na področju izobraževanja, iščejo možne rešitve, kako izboljšati pogoje poučevanja v razredu, da bi se učenci med poukom čim bolje naučili učno snov in posledično dosegli boljše rezultate na preverjanjih znanja. Smiselno bi bilo ugotoviti, kateri pristopi so učinkoviti pri poučevanju – kakšno učno okolje, ki ga tvorijo učenci, pedagogi, kurikulum ter gradiva in tehnologija, bi bilo optimalno za uspešno poučevanje.

Inteligentni tutorski sistemi (ITS) so zasnovani tako, da nadomeščajo učiteljevo pomoč učencem, saj se znajo prilagoditi zaznanemu učenčevemu predznanju ter ponuditi pomoč, kjer je to potrebno (Koedinger in Tanner, 2013). Tovrstni sistemi zajemajo nekatere bistvene lastnosti individualnega poučevanja (tj. en učitelj poučuje enega učenca), ki naj bi bila po Bloomovi raziskavi (1984) najbolj učinkovita oblika poučevanja. Raziskovalci so prav tako ugotovili, da je dosežen boljši učni učinek, če se učencu pri napakah ponudi namig, kot pa ponovna razlaga učne snovi (Koedinger in Tanner, 2013). Namige nudi učencu sistem ITS, ki vsebuje knjižnico s tipičnimi napakami1.

V magistrskem delu sem se osredotočil na poučevanje programiranja v programskem jeziku Python v sistemu za avtomatsko poučevanje CodeQ. Na primeru izbranih nalog sem predstavil, kako iz oddanih programov študentov izluščimo tipične napake, ki se nato uporabijo za nadaljnjo izgradnjo knjižnice z napakami ter izdelavo namigov.

Dodaten razlog za samodejno nudenje pomoči učencem pri učenju programiranja v sistemu ITS je sprotno vrednotenje izdelkov ter oblikovanje prilagojene povratne informacije učencem s strani učiteljev, kar pogostokrat postane časovno potratno. Problem predstavlja tudi raznolikost oddanih programov, saj se tudi pri preprostih nalogah lahko pojavi mnogo različnih rešitev ter napak (Možina in Lazar, 2018).

V naslednjem poglavju, ki predstavlja teoretični del magistrske naloge, sem napravil pregled področja – opisal sem Bloomov 2-sigma problem, ki osmisli vpeljavo ITS v pedagoški proces. Predstavljeni so sorodni pripomočki za poučevanje, ki se opirajo na behavioristično teorijo učenja, saj nudijo takojšnjo povratno informacijo in s tem omogočijo boljši učni učinek. Poleg učne tehnologije je predstavljen teoretični okvir, ki

1 V magistrskem delu z izrazom tipične napake opisujem semantične napake, ki se pojavljajo pri večih oddanih programih učencev in so posledica zmotnega mišljenja.

(14)

2

omogoča klasifikacijo napak študentov pri učenju programiranja – znanje in veščine, ki se uporabljajo pri pisanju programske kode lahko delimo na sintaktično, konceptualno ter strateško znanje. Semantične napake se nanašajo na nepopolno izdelane pojme, postopke in koncepte iz konceptualnega in strateškega znanja.

V empiričnem delu je predstavljen potek kvantitativne raziskave. Oddani programi so bili pri izbranih nalogah iz sistema CodeQ preoblikovani v abstraktna sintaktična drevesa (oznaka ASD), iz katerih sem pridobil atribute. Atributi so ponavljajoči deli programske kode in lahko ločijo oddane programe učencev na pravilne ali napačne. Iz ustvarjenih atributov sem v programu Orange generiral odločitvena drevesa, s katerimi lahko oblikujemo podmnožice napačnih programov. Z zaporedjem atributov, ki opisujejo pot od korena drevesa do izbrane podmnožice, sem raziskoval tipične napake študentov.

(15)

3

2 PREGLED PODROČJA

2.1 Bloomov 2-sigma problem

Ameriški psiholog Benjamin S. Bloom je v 80. letih 20. stoletja raziskoval načine poučevanja. Učence je razdelil v tri skupine, glede na različne načine poučevanja. V prvi skupini gre za konvencionalen pristop – en učitelj poučuje približno 30 učencev. V drugi skupini je bilo število učiteljev in učencev v razredu enako, podoben je bil tudi način dela, vendar so učenci po formativnem preverjanju prejeli popravke, iz katerih je bilo razvidno, v kolikšni meri so razumeli snov. V tretji skupini je vsakega učenca poučeval en učitelj (oz.

tutor). Formativno preverjanje je bilo zasnovano enako kot pri drugi skupini. Rezultati so bili presenetljivi – povprečni učenec (po uspehu) iz tretje skupine je imel za dva standardna odklona boljši rezultat od povprečnega učenca iz prve skupine (konvencionalno učenje) ter za en standardni odklon boljši rezultat od povprečnega učenca iz druge skupine (prikazano na sliki 1). To pomeni, da je povprečni učenec iz tretje skupine dosegel boljši rezultat od 98 % učencev iz prve skupine (Bloom, 1984)

Iz raziskave lahko sklepamo, da ima večina učencev zmožnost, da se temeljito nauči obravnavane snovi, le če so pogoji za poučevanje ustrezni. Ker je način poučevanja, kjer bi bil en učitelj na učenca, cenovno drag in tudi težko izvedljiv, bi bilo smiselno poiskati drugačne pristope, s katerimi bi se približali učinku individualnega poučevanja. Avtor je v članku ta izziv poimenoval »2-sigma problem«.

Slika 1 Prikaz normalne porazdelitve končnih rezultatov prve skupine (modra krivulja), druge skupine (rdeča krivulja) ter tretje skupine (zelena krivulja)

(16)

4

2.2 Stroji za učenje

Prvi pripomočki, ki so posnemali delo tutorja, so bili učbeniki, ki so jih pedagoški psihologi izdelali v 50. letih prejšnjega stoletja. Učno snov so razdelili na manjše učne enote in jih preoblikovali v vprašanja z več možnimi odgovori. Vprašanja so bila zapisana v učbenikih ter so se smiselno navezovala – v kolikor je bil odgovor na dano vprašanje pravilen, je učbenik usmeril učenca na novo vprašanje, v nasprotnem primeru pa je učbenik preusmeril učenca k dodatni razlagi ali podobnemu vprašanju. To so bili zametki programiranega učenja (angl. programmed instruction/learning), ki je eno izmed prvih oblik avtomatskega poučevanja (angl. automated tutorial). Učbenik je bil nekoliko neroden za uporabo, zato so se v naslednjih desetletjih pojavile naprednejše implementacije tega izuma, npr.

mehanski stoji za učenje (angl. teaching machines), ki so prikazovali vprašanja in so, glede na izbran odgovor, avtomatsko prikazali naslednjo stran (Bits and Bytes, 2012). Glavni principi delovanja sistemov za poučevanje (angl. teaching sistems), ne glede na izdelavo, so (Lazar, 2017):

• prikaz podatkov iz učne snovi

• možnost interakcije učenca s sistemom

• nudenje povratne informacije učencu

V 60. letih 20. stoletja je psiholog B. F. Skinner zasnoval mehanski stroj za učenje, ki ga je poimenoval GLIDER (Slika 2). Pri načrtovanju se je opiral na behavioristično teorijo učenja, natančneje na teorijo okrepitve. Stroj učencu prikaže delno informacijo, npr.

nedokončan stavek, vprašanje, enačbo ali račun. Učenec odgovor zapiše s svinčnikom v ločeno okno na stroju, premakne drsnik ter nemudoma preveri, ali je odgovor pravilen (Teaching machine, 2017).

Po Skinnerju (2016) so prednosti podajanja takojšne povratne informacije sledeče:

• Učenec hitreje zgradi pravilno znanje o učni temi

• Motivacija za učenje je boljša, saj je učenec pri poučevanju bolje voden, manjša pa je tudi možnost za neuspeh

• Pri učenju se učenec ne prilagaja več »razrednemu« tempu učenja, temveč si prilagaja tempo učenja sam. Tako se večji delež učencev temeljito nauči osnov, učenje je bolj učinkovito za posameznika.

• Učenec sledi vnaprej načrtovanemu programu poučevanja. Učna tema je razdeljena na več manjših, medsebojno (logično) povezanih enot.

(17)

5

Slika 2 Mehanski stroj za učenje GLIDER (Teaching machine, 2017)

V 70. letih 20. stoletja so mehanske stroje pri poučevanju pričeli nadomeščati osebni računalniki, ki so postajali cenovno ugodnejši, omogočajo pa veliko bolj napredno interakcijo z učencem glede na predhodne izume (Bits and Bytes, 2012). Npr. glede na določeno zaporedno število napačnih odgovorov, učenec lahko prejme dodatno razlago ali pa, če je učenec pravilno rešil nekaj zaporednih primerov, so le-ti postajali težji.

Programska oprema poleg besedila lahko vsebuje tudi zvok, animacijo, shranjevanje rezultatov ter prilagajanje težavnosti učencu.

2.3 Učenje s pomočjo računalnika (CAI)

Teoretični del magistrske naloge se navezuje na učenje s pomočjo računalnika (angl.

Computer Assisted Instruction - CAI), ki izhaja s področja avtomatskega poučevanja. Izraz Computer Assisted Instruction nima splošno veljavne definicije, v grobem pa s tem izrazom opisujemo učenje, pri katerem računalnik prevzame vlogo učitelja. V tej vlogi računalnik učencu podaja vprašanja, na katera mora odgovoriti ali pa odločitve, ki jih mora sprejeti.

Računalnik poda učencu takojšnjo povratno informacijo o odgovoru. V literaturi zasledimo še nekaj sorodnih izrazov, ki opisujejo podoben pristop pri poučevanju: Computer-based training (CBT), Computer-Aided Instruction (CAI), Computer-Based Instruction (CBI) (EduTechWiki, 2009).

(18)

6

Večino sistemov CAI je zasnovanih za reševanje nalog, ki jih učenci rešujejo z namenom utrjevanja snovi, obstaja pa tudi drugačna zasnova, ki jo v literaturi najdemo pod izrazom mikrosvetovi (angl. microworlds). To so programska okolja, ki nudijo možnost raziskovanja in niso omejena le na reševanje določenih problemov. Bolj poznani primeri so programski jeziki Scratch, Alice in Logo. Ker tovrstni programi nimajo jasno določenih nalog, ponavadi nudijo učencu le povratno informacijo o sintaktičnih napakah (napakah, ki se pojavljajo v programski kodi) (Lazar, 2018).

Prvi sistemi CAI so se zgledovali po mehanskih strojih za učenje in so vsebovali vprašanja, na katera so učenci odgovarjali s preprostimi odgovori ali pa so izbirali med danimi odgovori. Sistem se je lahko odzval na napačne odgovore, vendar učencu še ni bilo možno podati prilagojene takojšnje povratne informacije (Lazar, 2018).

S terminom inteligentni tutorski sistem (v nadaljevanju ITS) označujemo programsko opremo, s katero je mogoče nadomestiti učitelja in njegovo pomoč učencem. Tovrstni programi učencem postavljajo vprašanja oz. naloge, beležijo njihove odzive in podajajo takojšnjo prilagojeno povratno informacijo, v kateri ovrednotijo rešitev. V sistemih ITS učenci (običajno) rešujejo vnaprej določene problemske naloge in se od ostalih sistemov učenja s pomočjo računalnika (CAI) razlikujejo v dveh lastnostih (Koedinger in Tanner, 2013):

• ITS podrobneje interpretira odzive učencev. Za ITS ni dovolj, da prepoznava le pravilne in napačne odgovore. Sistem mora prepoznati, kje se je učenec zmotil ter ponuditi ustrezno pomoč. Pomoč lahko ponudi tudi na zahtevo učenca.

• ITS se uči iz podatkov, ki jih sprejema od učencev. Program zgradi profil učenca in oceni, v kolikšni meri je učenec usvojil učne cilje. ITS preverja učenčevo znanje in spretnosti toliko časa, dokler ni zadoščeno pogojem, ki predvidevajo, da učenec obvlada koncepte in veščine. Nekateri sistemi ITS lahko prilagodijo nadaljnje naloge glede na uspešnost predhodnega reševanja.

Razvijalci sistemov ITS poskušajo zajeti bistvene lastnosti poučevanja »ena-na-ena«, ki se po Bloomovi raziskavi izkaže za najbolj učinkovito metodo, in jih uporabiti v primerih, ko ima učitelj večje število učencev in je le-tem težavneje nuditi učinkovito pomoč pri učenju.

ITS ponuja tudi možnosti za raziskovanje različnih domnev npr. kako se učenci učijo, kateri koncepti so najtežji za razumevanje, kako voditi učence skozi proces učenja ipd.

(Koedinger in Tanner, 2013).

(19)

7

ITS nudi specifičen uporabniški vmesnik, v katerem učenci naredijo večino dela in ne vpisujejo le končnih rezultatov. Uporabniški vmesniki se razlikujejo glede na namen poučevanja, namen vmesnika je nižanje kognitivne obremenitve učencev ter bolj podrobno spremljanje učenčevega poteka reševanja nalog. Zaradi prilagojenega vmesnika, ki spremlja učenčev potek reševanja nalog, ITS lahko poda takojšnjo povratno informacijo (Lazar, 2018).

Razvijalci ITS ne želijo povsem nadomestiti vloge učitelja pri izobraževanju, ki skrbi za vključevanje učencev v proces učenja. ITS je lahko učinkovit pripomoček za poučevanje večjih skupin kot tudi za individualno učenje, saj se prilagaja učenčevemu tempu učenja in različnim zahtevam, ki se lahko pojavijo pri učenju (Koedinger in Tanner, 2013).

2.3.1 Struktura ITS

V tem razdelku so predstavljeni štirje ključni deli ITS (prikazani na sliki 3), ki jih najdemo v strokovni literaturi. Elementov ITS, ki so opisani v nadaljevanju, v praksi ne moremo posplošiti, saj kot argumentira Nwana (Intelligent tutoring system, 2019), zaradi različnih pristopov poučevanja potrebujemo tudi različne arhitekture ITS. Nekateri sistemi so namenjeni reševanju kompleksnih problemov, a vsebujejo relativno preproste pristope za poučevanje, na drugi strani pa obstajajo sistemi s kompleksnimi metodami poučevanja, a nudijo utrjevanje snovi le preko reševanja preprostih problemov (Intelligent tutoring system, 2019):

Model eksperta (angl. domain model, cognitive model, expert knowledge model, knowledge component, expert module,…) hrani koncepte, pravila in strategije reševanja problemov, ki se jih učenec mora naučiti. Model eksperta predstavlja znanje strokovnjaka in vsebuje standarde za ocenjevanje učenčevega znanja kot tudi za zaznavanje učenčevih napak.

Model učenca (angl. student model) se smatra kot osrednja komponenta ITS, ki hrani podatke o načinu reševanja nalog posameznega učenca kot tudi o samem napredku. Hrani lahko tudi informacije o napačnih predstavah in napakah učenca.

Model učenca podatke posreduje modelu tutorja.

Model tutorja (angl. tutor model) za vhodne podatke sprejme podatke modela eksperta in modela učenca. Model tutorja vsebuje pravila in strategije za poučevanje – to je, kako ukrepati ob napakah, katere koncepte mora učenec razumeti, da lahko preide na obravnavo naslednjega poglavja ipd. Model tudi zazna, kdaj učenčevo

(20)

8

znanje odstopa od produkcijskih pravil2. Model tutorja lahko vsebuje večje število produkcijskih pravil, ki so lahko v enem od stanj: naučeno ali nenaučeno. Vsakič, ko učenec ustrezno uporabi pravilo v dani situaciji, sistem zabeleži, da se je verjetnost, da se je učenec naučil pravilo, povečala.

Uporabniški vmesnik (angl user interface) ni natančno določen. V principu gre za interakcijo z učencem – nekateri ITS za komunikacijo uporabljajo simulacijo ali samo besedilo, lahko pa komunicirajo z učencem tudi preko dialoga. Glede na zahteve in temo poučevanja se naredi ustrezen uporabniški vmesnik (Inteligentni tutorski sistemi, 2007).

Slika 3 Povezave komponent ITS

Pri strukturi ITS opazimo, da podatke o posameznem učencu zbira model učenca. Tu se zbirajo odzivi učenca pri interakciji z uporabniškim vmesnikom, kar ITS lahko interpretira kot znanje učenca (Inteligentni tutorski sistemi, 2007). Znanje učenca na samem začetku poučevanja ponavadi ni popolno. V nadaljevanju so opisani principi, s katerimi ITS, natančneje model tutorja, zaznava napake v učenčevem znanju.

2 Produkcijska pravila opisujejo znanje. Pravilo je zapisano v obliki pogojnega stavka, v katerem je razviden pogoj in sklep oz. akcija (Production rules, b.d.).

(21)

9

2.3.2 Delovanje ITS

Inteligenti tutorski sistemi se od preostalih oblik učenja s pomočjo računalnika (CAI) razlikujejo po tem, da učencem nudijo podrobnejšo povratno informacijo o zaznanemu znanju. Sistemi se sproti odločajo, kako poučujejo, pri tem pa zbirajo podatke o učencu, zato jih lahko označimo kot inteligentne (Inteligentni tutorski sistemi, 2007).

Delovanje ITS lahko opišemo z izvajanjem dveh zank; zunanje in notranje (Lazar, 2018).

Zunanja zanka se izvede enkrat na nalogo; namen le-te je izbira naslednje naloge za učenca.

Pri izbiri ustrezne naloge sta vključeni dve komponenti ITS: model učenca ter model tutorja. Model učenca hrani podatke o učenčevem usvojenem znanju, model tutorja na podlagi danih strategij za poučevanje določi naslednjo nalogo z namenom, da učenec čim bolj temeljito usvoji učne cilje. Delovanje zunanje zanke se lahko izboljša z metodo strojnega učenja (Lazar, 2018).

Notranja zanka nudi povratno informacijo učencem med reševanjem naloge. ITS sproti spremlja učenčev potek reševanja naloge in ga opozori, če je naredil napako. Nekateri ITS ne omogočajo pregledovanja poteka reševanja nalog in nudijo povratno informacijo le takrat, ko je naloga oddana. V nadaljevanju sta predstavljeni pogosti rešitvi nudenja sprotne pomoči: kognitivni tutorji (angl. cognitive ali model-tracing tutoring) ter model z omejitvami (angl. constraint-based modeling) (Lazar, 2018).

Pri kognitivnem tutorju ITS med reševanjem naloge spremlja, kdaj pridobljeni podatki modela učenca odstopajo od podatkov modela eksperta. Ko se to zgodi, sistem zazna, da se je zgodila napaka in posreduje sporočilo (Intelligent tutoring system, 2019). Tovrstno modeliranje je lahko učinkovito, a je zahtevno izgraditi model eksperta (model eksperta je pri Lisp tutorju potreboval 1200 produkcijskih pravil za 30-urno učno vsebino). Dodatna omejitev je tudi ta, da ITS vrednoti učenčevo znanje le preko vnaprej danih produkcijskih pravilih in pripadajočih stanj. Pri gradnji kognitivnega tutorja je potrebno vnaprej predpostaviti potek reševanja naloge ter omejiti učence le na tovrstno reševanje (Lazar, 2018).

Pri drugi možni implementaciji, model z omejitvami, se rešitev učenca primerja z možnimi omejitvami pri dani nalogi. Model eksperta je v tem primeru predstavljen kot množica možnih omejitev oz. tudi napak, ki jih program ne sme vsebovati. Ko sistem zazna, da je v učenčevi rešitvi vsebovana napaka, ITS poda učencu povratno informacijo, da je rešitev

(22)

10

naloge napačna (Intelligent tutoring system, 2019). Naloga ustreza danim kriterijem, če ne vsebuje nobene napake, ki bi bila navedena kot možna omejitev programa. Omejitve lahko opisujejo tudi semantične napake in če je tovrstna napaka zaznana, ITS učencu ponudi namig. Omejitve so enostavnejše za izdelavo kot produkcijska pravila, saj opisujejo le deklerativno in ne proceduralnega znanja (Lazar, 2018).

2.4 Napake pri učenju programiranja

V literaturi avtorji napake oz. nerazumevanje učencev pri učenju naravoslovnih ved označujejo s terminom »misconceptions«, ki ga Qian in Lehman (2017) opredeljujeta kot

»učenčeve zmotne, nepopolne predstave, ki se ne ujemajo z akademskimi spoznanji« (str.

1:2). Nekateri avtorji zmotno mišljenje učencev opisujejo tudi s pojmom »alternative conceptions«, saj ima prvotni pojem lahko negativno konotacijo. Tudi na področju poučevanja računalništva se pojavljajo termini, ki opisujejo učenčeve napačno ali nepopolno znanje iz računalniške stroke, npr. »difficulties«, »errors«, »bugs«,

»mistakes«,... (Qian in Lehman, 2017).

Za klasifikacijo težav in napak, ki se pojavljajo pri učenju programiranja, se v strokovni literaturi uporabljajo različni teoretični okviri. V magistrskem delu bom predstavil opredelitev napak glede na tip znanja, ki se uporablja pri programiranju. Napake iz ustvarjanja programske kode so lahko posledica nepopolnega sintaktičnega znanja, konceptualnega znanja ali strateškega znanja. Teoretični okvir izhaja iz literature o poučevanju računalništva ter se navezuje na kognitivno psihologijo, v raziskavah so se na omenjeni teoretični okvir sklicevali avtorji Bayman in Mayer (1988) ter McGill in Volet (1977) (Qian in Lehman, 2017).

Sintaktično znanje zajema poznavanje lastnosti programskega jezika, dejstev in pravil za pisanje programske kode. Napake, ki se pojavijo v sintaktičnem znanju, so sorazmeroma enostavne za odkrivanje in popravljanje, saj jih zazna prevajalnik (angl. compiler) programskega jezika ali integrirano razvojno okolje (angl. integrated development enviroment IDE). Omenjeni metodi nudita uporabniku sporočilo o napaki ter pomoč za odpravo napake (Qian in Lehman, 2017).

Konceptualno znanje vsebuje znanje o ustvarjanju in delovanju programske kode. Z zmotnim mišljenjem (angl. misconseption-s) opisujemo napačno ali nepopolno izdelane učenčeve predstave iz konceptualnega znanja o programiranju. V kolikor so sintaktične napake le »površinske« in enostavno odpravljive, so napake iz konceptualnega – kot tudi

(23)

11

iz strateškega znanja – težje popravljive, saj izhajajo iz obširnega ter temeljnega znanja o programiranju. Napake iz konceptualnega znanja se navezujejo na predstave o izvajanju programske kode ter o sestavi računalniškega sistema (Qian in Lehman, 2017).

Strateško znanje je uporaba sintaktičnega in konceptualnega znanja za reševanje problemov. Tovrstno znanje zajema načrtovanje, pisanje in razhroščevanje (angl.

debugging) programske kode. Zmotno mišljenje, ki se pojavlja pri strateškem znanju, se navezuje na težave in napake iz sintaktičnega in konceptualnega znanja. De Raadt je iz raziskave o poučevanju strateškega znanja pri predmetih iz programiranja podal sklep, da so »izdelane veščine iz programiranja predpogoj za dobro strateško znanje« (str. 1:6).

Izkušen programer ne pozna dobro samo sintakse in semantike programskega jezika, ampak zna program tudi načrtovati, napisati, iz problema izluščiti vzorce in preveriti končno rešitev (Qian in Lehman, 2017).

(24)

12

3 EMPIRIČNI DEL

3.1 Opredelitev raziskovalnega problema

V teoretičnem delu magistrske naloge sem omenil, da ITS zaradi svoje arhitekture omogoča raziskovanje različnih domnev (Koedinger in Tanner, 2013), tj. kako se učenci učijo, kateri koncepti so težavni za razumevanje, kje se pojavijo napake in nerazumevanja ipd.

V empiričnem delu bom raziskoval pogoste oz. tipične napake študentov pri učenju programiranja v programskem jeziku Python. Študentje so reševali naloge preko sistema CodeQ, ki so bile zastavljene in predstavljene v sklopu začetnih predmetov programiranja v prvih letnikih na FRI in FKKT. Omejil se bom na iskanje tipičnih začetniških napak, ki sem jih zaznal pri reševanju nalog, napake pa so predvsem semantične in so odraz nepopolnega konceptualnega ali strateškega znanja.

3.2 Pregled sorodnih raziskav

V literaturi (Možina in Lazar, 2018) zasledimo analizo dveh nalog, ki sta bili objavljeni v sistemu CodeQ. Tu so oddani programi in atributi predstavljeni z abstraktnimi sintaktičnimi drevesi (ASD), kjer je programska koda prikazana v drevesni podatkovni strukturi, tj.

posamezni elementi programske kode so predstavljeni z vozlišči in povezavami. Atributi3, predstavljeni z ASD, imajo vozlišča in pripadajoče povezave zapisana z S-izrazi (angl. S- expression). Bistveno pri raziskavi je bilo iskanje tipičnih pristopov pri reševanju nalog kot tudi tipičnih napak, ki so se pojavile. Programska koda lahko deluje napačno zaradi dveh razlogov:

• Vsebuje neustrezen atribut, zaradi katerega deluje napačno.

• Ne vsebuje atributa, ki bi bil nujen za pravilno delovanje.

Program torej deluje pravilno, če vsebuje ustrezne (potrebne) atribute in predvsem nobenega napačnega. Tipične napake in tipične pristope pri reševanju sta avtorja poiskala s klasifikacijskimi pravili, ki so bila ustvarjena z algoritmom ABCN2e (algoritem je implementiran v knjižnici programa Orange). Posamezno pravilo je sestavljeno iz največ treh atributov, kjer ima vsak atribut klasifikacijsko točnost najmanj 90 %, pravilo pa mora zadostiti vsaj petim različnim oddanim programom.

3 V raziskavi so atributi poimenovani z izrazom vzorci (angl. patterns).

(25)

13

Klasifikacijska točnost je definirana kot razmerje med številom pravilno klasificiranih primerov in številom vseh primerov. V kolikor razvrščamo primere le v dve skupini (tj.

dvojiška klasifikacija), velja formula 𝑇𝑜č𝑛𝑜𝑠𝑡 = 𝑅𝑃+𝑅𝑁

𝑅𝑃+𝑅𝑁+𝑁𝑃+𝑁𝑁 , kjer so primeri RP = resnično pozitivni, RN = resnično negativni, NP = napačno pozitivni ali NN = napačno negativni (Classification Accuracy, 2019).

Avtorja sta analizirala nalogi, pri kateri so se študentje učili začetnih korakov v programskem jeziku Python. Prva naloga je bila Pretvarjanje iz Fahrenheitov v Celzije.

Zaznane so bile naslednje tipične napake (Možina in Lazar, 2018):

• Vhodne vrednosti programa se shranjujejo kot celoštevilska vrednost, decimalnih števil ni možno shraniti.

• Vhodne vrednosti programa se ne pretvorijo v številsko vrednost, shranijo se kot niz.

• Programi ne vsebujejo ukaza za izpis, tj. print().

• Programi vsebujejo ukaz za izpis, ki vsebuje formulo za pretvorbo temperature, vendar delujejo napačno, saj se vhodna vrednost ne pretvori v številsko vrednost z decimalnim zapisom.

Pri drugi nalogi, Največji absolutist, so študentje napisali funkcijo, ki iz danega seznama izpiše število z največjo absolutno vrednostjo. Ugotovljene tipične napake so:

• Neustrezno zapisan pogoj v pogojnem stavku – primerja se absolutna vrednost le enega elementa in ne obeh elementov.

• Funkcija kot vrednost največjega elementa shrani le absolutno vrednost in ne dejanske vrednosti števila.

• V programu je uporabljena funkcija, ki ne shrani dejanske vrednosti nekega števila in v izhodu funkcije ni uporabljeno naslavljanje elementov v seznamu z indeksiranjem.

• Neustrezna uporaba ukaza max(), saj ukaz ne sprejme seznama za vhodni parameter.

Avtorja Qian in Lehman (2017) sta z analizo obstoječe literature napravila nabor napak in nerazumevanj, ki je značilen predvsem za učence pri začetnih predmetih programiranja.

Napake učencev so bile razvrščene glede na tip znanja – torej na sintaktične, konceptualne

(26)

14

in strateške napake. V nadaljevanju bodo predstavljene le tipične semantične napake, ki se pojavijo pri učenju programiranja, torej konceptualne in strateške napake.

K pogostim nerazumevanjem, ki izhajajo iz konceptualnega znanja, avtorji pripisujejo mišljenje učencev, da spremenljivke lahko hranijo več vrednosti hkrati; da vrstni red zapisovanja spremenljivk pri prirejanju vrednosti ni pomemben, npr. učenci lahko predpostavljajo enakost zapisov 1 := A ter A := 1; učenci lahko tudi razumejo, da se z določevanjem imena spremenljivk neposredno določi tudi naloga spremenljivke – to pomeni, v kolikor ima spremenljivka ime največjeŠtevilo, naj bi hranila največje število izključno zaradi imena in ne zaradi ustrezno zapisanih ukazov; napake se pojavljajo tudi pri uporabi globalnih in lokalnih spremenljivk. Začetniki imajo težave pri uporabi spremenljivk za vhodne ali izhodne parametre funkcij ali podprogramov. Napačno je tudi mišljenje, da vsebina izpisa programa vpliva na vrednost spremenljivk, npr. izpis

»Vrednost spremenljivke A je 1« ne nastavi vrednosti spremenljivke A na 1 (Qian in Lehman, 2017).

Učencem je težavno razumeti koncept pogojnega stavka – mislijo lahko, da se izvršita oba ukaza pogojnega stavka v isti iteraciji; zmotno je tudi mišljenje, da se izvajanje programa ustavi, če je vrednost pri pogojnem stavku enaka »False«. Učenci imajo lahko težave tudi pri razumevanju zank; ne vedo, kateri ukazi znotraj zanke se bodo ponavljali ter kolikokrat se bodo ukazi ponovili. Težave povzroča tudi uporaba različnih tipov zank (for, while, repeat until,…) pri pisanju programske kode, saj se začetniki težko odločijo za uporabo poljubne vrste zank (Qian in Lehman, 2017).

K nerazumevanjem konceptov iz strateškega znanja raziskovalci uvrščajo to, da učenci ne znajo ustrezno ponastaviti vrednosti spremenljivke; uporabiti spremenljivke za števec ali vsoto; težave se pojavijo tudi pri strategijah reševanja problema, pri razumevanju ter dekompoziciji le-tega. Začetniki lahko brez težav spišejo enostavno programsko kodo, katero bo prevajalnik uspešno pretvoril, vendar so možna nerazumevanja pri robnih pogojih problema. Pri programiranju imajo začetniki težave tudi z učinkovitim testiranjem programske kode ter z razhroščevanjem, zaradi česa s težavo ocenijo pravilno delovanje programa (Qian in Lehman, 2017).

(27)

15

3.3 Cilj raziskave

Namen magistrskega dela je raziskati, katere napake so se največkrat pojavljale pri reševanju nalog. V literaturi (Možina in Lazar, 2018) zasledimo analizo dveh nalog iz sistema CodeQ, v magistrskem delu pa bodo predstavljene napake študentov na širšem izboru nalog, kjer je delež pravilno klasificiranih oddanih programov vsaj 80 %.

Raziskovalni vprašanji, za kateri bom poiskal odgovore, sta:

• RV1: Kateri atributi razdelijo množico programov na podmnožice napačnih in pravilnih programov?

• RV2: Katere tipične napake so naredili študenti pri reševanju nalog?

3.4 Vzorec

Kvantitativni del raziskave temelji na obdelavi predhodno zbranih podatkov. V vzorec so vključeni študentje prvih letnikov Fakultete za računalništvo in informatiko ter Fakultete za kemijo in kemijsko tehnologijo Univerze v Ljubljani. Vzorec je priložnostni, sodelujočim osebam je skupno, da obiskujejo eno izmed fakultet. Število sodelujočih je pri nalogah različno, znano je število oddanih programov pri izbranih nalogah, ki je od 120 do približno 1200. Spol in starost udeležencev nista zabeležena, podatki so bili zbrani med leti 2015 in 2017.

3.5 Postopki obdelave podatkov

Študenti so pri predmetih programiranja reševali naloge in oddali rešitve preko sistema CodeQ. Zbirka oddanih nalog je bila ustvarjena novembra 2017 in je last Laboratorija za umetno inteligenco Fakultete za računalništvo in informatiko v Ljubljani. V zbirki so oddane začetne, sprotne in končne rešitve študentov. Poleg zapisane programske kode oddanih programov je zabeleženo, ali programi delujejo semantično pravilno. Program deluje semantično pravilno, če opravi vse testne primere v sistemu CodeQ. Iz oddanih programov sem s programsko kodo, ki jo je posredoval Laboratorij za umetno inteligenco, ustvaril atribute in jih uporabil za izdelavo odločitvenih dreves.

Atributi so ustvarjeni iz oddanih programov študentov. Programi študentov so bili predhodno pretvorjeni v ustrezno enotno obliko, s čimer so se poenotila imena spremenljivk, uredil vrstni red spremenljivk v izrazih ipd. Programska koda, ki ustvari atribute, generira dve datoteki; prva datoteka je tekstovnega tipa (attributes.txt) in vsebuje vse atribute z oznakami ter pripadajočimi opisi v S-izrazih. Pri zapisu je poznan

(28)

16

koren drevesa, vozlišča pa so zapisana v določenem vrstnem redu. Primer zapisa v S-izrazu je (a (b c) d), ki pomeni (Možina in Lazar, 2018):

• Vozlišče a ima dva potomca, tj. vozlišči b in d, v danem vrstnem redu

• Vozlišče b ima le enega potomca, tj. vozlišče c

Opis atributa (regex-0) v S-izrazu je prikazan v spodnji vrstici:

regex-0:

(Module (body (Expr (value (Call (func (Name (id print) (ctx Load))))))))

Oddani programi študentov so bili preoblikoval v abstraktna sintaktična drevesa (ASD), iz katerih so se ustvarili atributi – to so deli ASD, ki se pojavljajo v več primerih oddanih programov. Ustvarjene atribute je možno predstaviti v drevesni podatkovni strukturi.

Posamezen atribut opisuje pot od izbranega vozlišča do korena drevesa, poleg začetnega vozlišča in korena drevesa so v zapisu vključena tudi vsa vmesna vozlišča. Za primer je prikazan opis atributa regex-0 v drevesni strukturi.

1. (Module 2. └── (body 3. └── (Expr 4. └── (value 5. └── (Call 6. └── (func 7. └── (Name 8. ├── (id

9. │ └── print) 10. └── (ctx

11. └── Load))))))))

Druga datoteka z imenom programs.tab vsebuje v vrsticah zapisane oddane programe študentov in zaporedje oznak True ali False, ki opisujejo, katere atribute vsebuje posamezen program. Ta datoteka se je uporabila za izdelavo odločitvenih dreves v programu Orange.

Odločitvena drevesa so bila izdelala z algoritmom, ki je vključen v odprtokodnem programu Orange. Delovni tok izdelave odločitvenih dreves je prikazan na sliki 4. V programu so bila odločitvena drevesa tudi ovrednotena – vsako drevo ima določeno klasifikacijsko točnost (angl. classification accuracy), preciznost (angl. precision) in priklic (angl. recall). Iz odločitvenih dreves je razvidno, kako atributi razdelijo množico oddanih programov na podmnožice, pri katerih programi delujejo pravilno ali napačno. S

(29)

17

pomočjo odločitvenih dreves je na podlagi zaporedja atributov možno ugotoviti razloge za napačno delovanje.

Na vozliščih odločitvenega drevesa (prikazano na sliki 5) se preverja, ali programi vsebujejo atribut, ki je vpisan. Iz odločitvenega drevesa lahko razberemo, kakšno zaporedje atributov vsebujejo programi, ki se nahajajo v listih drevesa (to so vozlišča, ki imajo samo eno povezavo) in tudi, kolikšen delež programov je napačnih pri posameznih vozliščih.

Zanimajo nas le tisti listi drevesa, ki vsebujejo samo napačne programe. Pri vseh nalogah je bila nastavljena globina4 odločitvenih dreves na največ 4.

Za analizo so izbrane tiste naloge, pri katerih ima ustvarjeno odločitveno drevo klasifikacijsko točnost vsaj 80 %, število oddanih nalog pa je več kot 120. Mere klasifikacijska točnost, preciznost in priklic so bile izračunane pri gradniku Test & Score (prikazano na sliki 4), kjer se je za vzorčenje uporabila metoda prečnega preverjanja (angl.

Cross-validation).

Slika 4 Delovni tok v programu Orange

4 Globina drevesa je največje število povezav od korena do poljubnega lista drevesa (Height, Depth and Level of a Tree, 2014).

(30)

18

Pri metodi prečnega preverjanja so bili oddani programi naključno razdeljeni v 10 disjunktnih podmnožic – gre torej za 10-kratno prečno preverjanje (angl. 10-fold cross- validation). Izmed desetih podmnožic se izbere poljubna za testno množico, preostalih devet množic pa se uporabi za učno množico. Postopek se ponovi 10-krat, pri čemer se za testno množico določi tista podmnožica, ki predhodno še ni bila izbrana. Končna vrednost mer klasifikacijska točnost, preciznost in priklic je povprečje rezultatov vseh desetih meritev (Cross-validation, 2019).

Analizo oddanih programov sem opravil pri naslednjih nalogah:

Pretvarjanje iz Fahrenheitov v Celzije (FRI)

Študentje so napisali program, v katerega se vnese temperaturo v enoti Fahrenheit, program pa izračuna temperaturo v enoti Celzij in jo izpiše.

Največji (FRI)

Pri nalogi Največji so študentje napisali funkcijo, ki sprejme seznam, vrne pa največji element seznama.

Liha in soda števila (FKKT)

Pri tej nalogi je potrebno napisati program, ki iz seznama naravnih števil ustvari dva podseznama; en vsebuje vsa liha števila, drugi pa vsa soda števila.

Palindrom (FKKT)

Pri nalogi Palindrom so študenti napisali program, v katerega uporabnik vpiše niz, program pa izpiše, ali je dani niz palindrom.

(31)

19

3.6 Kvantitativna raziskava

V tem poglavju so predstavljene naloge, ki so jih reševali študentje FRI-ja in FKKT-ja preko sistema CodeQ. Vseh nalog je 112 in so razvrščene v 12 poglavij, od tega jih je devet namenjenih študentom Fakultete za računalništvo in informatiko, preostala poglavja pa študentom Fakultete za kemijo in kemijsko tehnologijo. Poglavja, ki jih obravnava skupina študentov FRI-ja, so:

1. uvod

2. pogojni stavki in zanke 3. seznami in zanke 4. funkcije

5. funkcije in delo z moduli 6. slovarji

7. izpeljani seznami, slovarji, množice, generatorji 8. rekurzija

9. regularni izrazi

študentje FKKT-ja so obravnavali manjše število poglavij:

1. uvod

2. pogojni stavki in seznami 3. for zanka

V izbor za analizo sem izbral 4 naloge, ki imajo oddanih vsaj 120 primerov, klasifikacijska točnost odločitvenega drevesa pa je večja od 0,8. V spodnji tabeli so prikazani podatki pri posameznih nalogah – koliko je oddanih primerov in kolikšna je točnost klasifikacije (klasifikacijska točnost, preciznost in priklic).

Naloga Ime naloge Poglavje Fakulteta

ODDANI PRIMERI ODLOČITVENO DREVO

Pravilni Napačni Vsi K.T. Preciznost Priklic 1 Pretvarjanje iz °F v °C Uvod

FRI 495 674 1169 0,921 0,925 0,921

2 Največji Funkcije 70 58 128 0,852 0,851 0,852

3 Liha in soda števila Pogojni stavki in seznami

FKKT

136 178 314 0,809 0,809 0,809

4 Palindrom 138 84 222 0,851 0,851 0,851

(32)

20

3.6.1 Naloga 1: Pretvarjanje iz Fahrenheitov v Celzije

Pri prvi nalogi uvodnega poglavja so študentje napisati program, v katerega uporabnik vnese temperaturo v enoti Fahrenheit, program pa po formuli 𝐶 = 5

9∙ (𝐹 – 32) izračuna temperaturo v enoti Celzij. Primer delujočega programa je:

1. F = float(input('Vnesi temperaturo v Fahrenheitih:')) 2. print('Temperatura v celzijih je:', ((5 / 9)*(F - 32)))

V prvi vrstici programa se vnos shrani v spremenljivko F in nato se v drugi vrstici izpiše temperatura v Celzijih, ki je izračunana po formuli iz zgornjega odstavka.

Pri tej nalogi so študentje oddali največ primerov (1169), več kot polovica primerov je bilo rešenih napačno (674). Klasifikacijska točnost odločitvenega drevesa je med višjimi v izboru nalog (0,921), visoki vrednosti sta tudi pri merah preciznost in priklic. Pričakujemo, da bodo pri tej nalogi z modelom odločitvenega drevesa dobro opredeljeni vzroki, zakaj oddani programi delujejo napačno.

Dobljeno odločitveno drevo opredeli začetno množico programov na deset podmnožic; v osmih podmnožicah so zbrani samo pravilni ali napačni programi, pri tem je zajetih 236 napačnih ter 337 pravilnih oddanih primerov.

(33)

21

Slika 5 Odločitveno drevo

(34)

22

Odločitveno drevo ima 5 nivojev, 19 povezav in 20 vozlišč (10 listov). Pri vsakem vozlišču (razen pri listih) se preverja, ali dana množica programov vsebuje atribut (ime atributa je zapisano pri vozlišču). V eni podmnožici so vsebovani programi, ki vsebujejo atribut, v drugi podmnožici pa programi ne vsebujejo atributa. Ker vsako vozlišče lahko vsebuje največ dve povezavi, je odločitveno drevo tudi dvojiško.

V nadaljevanju bodo predstavljena imena atributov ter zapis v S-izrazu (izraz je prikazan v drevesni strukturi), za boljše razumevanje je razložen tudi zapis.

3.6.1.1 Predstavitev atributov

V tem razdelku so predstavljeni atributi odločitvenega drevesa. Poleg imen je predstavljen tudi zapis v S-izrazu in značilnosti programov, ki vsebujejo določen atribut.

Atribut regex-1

Programi, ki vsebujejo atribut regex-1, imajo v svoji programski kodi zapisan ukaz

float(). Ta ukaz pretvori vneseni niz v zapis z decimalnim številom.

1. (Module 2. └── (body 3. └── (Assign 4. └── (value 5. └── (Call 6. └── (func 7. └── (Name 8. ├── (id

9. │ └── float) 10. └── (ctx

11. └── Load))))))))

Atribut regex-1 se nahaja na prvem nivoju odločitvenega drevesa. Od 1169 oddanih programov ta atribut vsebuje 511 programov, kjer je nekoliko manjši delež (18,6 %) napačnih programov

(35)

23

Atribut regex-80:

Programi z atributom regex-80 vsebujejo spremenljivko, ki shrani neko vrednost (vrstice 6-9). Vrednost spremenljivke se pretvori v zapis z decimalno številko (vrstica 20) in se uporabi kot zmanjševanec (vrstica 13) pri operaciji odštevanja (vrstica 30). Razliko se nato pomnoži (vrstica 32) s poljubno vrednostjo ali spremenljivko.

1. (Module 2. └── (body 3. ├── (Assign 4. │ └── (targets 5. │ └── (Name 6. │ ├── (id 7. │ │ └── VAR) 8. │ └── (ctx

9. │ └── Store)))) 10. └── (Assign

11. └── (value 12. └── (BinOp 13. ├── (left 14. │ └── (BinOp 15. │ ├── (left 16. │ │ └── (Call 17. │ │ ├── (func 18. │ │ │ └── (Name 19. │ │ │ ├── (id

20. │ │ │ │ └── float) 21. │ │ │ └── (ctx

22. │ │ │ └── Load))) 23. │ │ └── (args

24. │ │ └── (Name 25. │ │ ├── (id 26. │ │ │ └── VAR) 27. │ │ └── (ctx

28. │ │ └── Load))))) 29. │ └── (op

30. │ └── Sub))) 31. └── (op

32. └── Mult))))))

Programi, ki ne vsebujejo atributa regex-1, a vsebujejo atribut regex-80, imajo v programski kodi spodnji zapis. Spremenljivka g1 shrani vhodni niz (vrstica 1), le-ta se pretvori v zapis z decimalno številko in se uporabi pri operaciji odštevanja in množenja (vrstica 2). Vrednost izraza se shrani v spremenljivko g0, ki se nato izpiše (vrstica 3).

1. g1 = input()

2. g0 = ((float(g1) - x) * (n)) 3. print(g0)

Od 658 programov, ki ne vsebujejo atributa regex-1, regex-80 vsebuje 38 programov. Vsi ti programi delujejo pravilno.

(36)

24

Atribut regex-14:

Programi z atributom regex-14 vsebujejo izpis razlike (vrstica 17) poljubne vrednosti in števila 32, ki je na mestu odštevanca (vrstice 18-21). Razlika se nato pomnoži z izrazom 5 ∶ 𝑛 (vrstice 22-31), kjer ima 𝑛 poljubno vrednost. Opisani izraz (5 ∶ 𝑛) ∙ (𝑥 – 32) je že dober približek formule za pretvorbo iz Fahrenheitov v Celzije 𝐶 = 5

9∙ (𝐹 – 32).

Smiselna vrednost spremenljivke 𝑛 bi bilo število 9.

1. (Module 2. └── (body 3. └── (Expr 4. └── (value 5. └── (Call 6. ├── (func 7. │ └── (Name 8. │ ├── (id

9. │ │ └── print) 10. │ └── (ctx

11. │ └── Load))) 12. └── (args

13. └── (BinOp 14. ├── (left 15. │ └── (BinOp 16. │ ├── (op 17. │ │ └── Sub) 18. │ └── (right 19. │ └── (Num 20. │ └── (n

21. │ └── 32))))) 22. ├── (op

23. │ └── Mult) 24. └── (right 25. └── (BinOp 26. ├── (left 27. │ └── (Num 28. │ └── (n 29. │ └── 5))) 30. └── (op

31. └── Div))))))))))

Atribut regex-14 se preverja na množici 511 programov – atribut vsebuje 215 programov, le dva programa delujeta napačno.

(37)

25

Atribut regex-250:

Atribut regex-250 vsebujejo programi, ki imajo v svoji programski kodi ukaz za izpis (vrstica 9). Izpisan izraz je razlika vrednosti spremenljivke (člen 𝑥), pretvorjena v decimalni zapis (vrstica 21), in poljubne vrednosti (člen 𝑎). Razlika se nato uporabi kot prvi faktor pri operaciji množenja (vrstice 13-27), kjer je drugi faktor poljubna vrednost (člen 𝑏).

1. (Module 2. └── (body 3. └── (Expr 4. └── (value 5. └── (Call 6. ├── (func 7. │ └── (Name 8. │ ├── (id

9. │ │ └── print) 10. │ └── (ctx

11. │ └── Load))) 12. └── (args

13. └── (BinOp 14. ├── (left 15. │ └── (BinOp 16. │ ├── (left 17. │ │ └── (Call 18. │ │ └── (func 19. │ │ └── (Name 20. │ │ ├── (id

21. │ │ │ └── float) 22. │ │ └── (ctx

23. │ │ └── Load))))) 24. │ └── (op

25. │ └── Sub))) 26. └── (op

27. └── Mult))))))))

Programi, ki ne vsebujejo atributov regex-1 in regex-80 ter vsebujejo atribut regex-250, imajo v programski kodi zapis:

print((float(x) – a) * b))

Od 620 oddanih programov, atribut regex-250 vsebuje 18 programov in vsi programi delujejo pravilno.

(38)

26

Atribut regex-61:

Atribut regex-61 opisuje operacijo deljenja (vrstica 11), kjer je levi člen število 5 (vrstice 6-9), delitelj pa ima poljubno vrednost.

1. (Module 2. └── (body 3. └── (Assign 4. └── (value 5. └── (BinOp 6. ├── (left 7. │ └── (Num 8. │ └── (n 9. │ └── 5))) 10. └── (op

11. └── Div)))))))

V programskih kodah napačnih programov se pojavlja spodnji zapis za pretvorbo (spremenljivka g1 ima shranjeno vrednost temperature v Celzijih, g0 pa vrednost temperature v Fahrenheitih):

g0 = (5 / 9((g1 - 32)))

kot tudi:

g0 = (5 / ((g1 - 32) * 9))

Razlog za napačno delovanje je v neustreznem zapisu formule za pretvorbo. Pri prvem zapisu manjka znak za množenje med številom 9 in izrazom g1 - 32, pri drugem zapisu se ta izraz nahaja v imenovalcu ulomka, kar ni ustrezno.

Atribut regex-61 se nahaja na tretjem nivoju odločitvenega drevesa. Število programov, ki vsebujejo atribut regex-1 in ne vsebujejo atributa regex-14 je 296. Atribut regex-61 vsebuje 26 programov in vsi delujejo napačno.

Atribut regex-2:

Atribut regex-2 vsebujejo programi, ki v programski kodi ukaz znotraj ukaza za pretvorbo v decimalna števila float() (vrstice 7-11) vsebujejo ukaz za vnos input() (vrstice 12-19).

(39)

27

1. (Module 2. └── (body 3. └── (Assign 4. └── (value 5. └── (Call 6. ├── (func 7. │ └── (Name 8. │ ├── (id

9. │ │ └── float) 10. │ └── (ctx

11. │ └── Load))) 12. └── (args

13. └── (Call 14. └── (func 15. └── (Name 16. ├── (id

17. │ └── input) 18. └── (ctx

19. └── Load))))))))))

V programskem jeziku Python se ta del programske kode zapiše kot:

float(input())

Od 215 programov, ki vsebujejo atributa regex-1 in regex-14, jih atribut regex-2 vsebuje 197. Vsi ti programi delujejo pravilno.

Atribut regex-20:

Atribut regex-20 vsebujejo programi, ki imajo zapisan ukaz za pretvorbo vrednosti spremenljivke v cela števila int() (vrstica 9). Ta ukaz je neustrezen, saj mora spremenljivka (v katero se shrani zapis v Celzijih) shraniti tudi decimalna števila.

1. (Module 2. └── (body 3. └── (Assign 4. └── (value 5. └── (Call 6. └── (func 7. └── (Name 8. ├── (id 9. │ └── int) 10. └── (ctx

11. └── Load))))))))

V zadnjem nivoju odločitvenega drevesa se je za atribut regex-20 preverilo 602 programov, kjer je večji delež programov napačen (96.2 %). Atribut vsebujejo 208 programov in vsi delujejo napačno.

(40)

28

Atribut regex-42:

Programi z atributom regex-42 v programski kodi vsebujejo izpis (vrstica 9) formule za pretvorbo v Celzije (𝐹 – 32) ∙ 𝑥 (vrstice 12-23), kjer je 𝑥 poljubno število, 𝐹 pa vrednost temperature v Fahrenheitih. Ustrezna vrednost spremenljivke 𝑥 bi bil ulomek 5

9.

1. (Module 2. └── (body 3. └── (Expr 4. └── (value 5. └── (Call 6. ├── (func 7. │ └── (Name 8. │ ├── (id

9. │ │ └── print) 10. │ └── (ctx

11. │ └── Load))) 12. └── (args

13. └── (BinOp 14. ├── (left 15. │ └── (BinOp 16. │ ├── (op 17. │ │ └── Sub) 18. │ └── (right 19. │ └── (Num 20. │ └── (n

21. │ └── 32))))) 22. └── (op

23. └── Mult))))))))

Število programov, ki ne vsebujejo atributa regex-14 in regex-61, vsebujejo pa atribut regex-1, je 270. Atribut regex-42 vsebuje 68 programov in vsi delujejo pravilno.

Atribut regex-5:

Programi z atributom regex-5 vsebujejo ukaz za vnos vrednosti input() (vrstice 7-11).

1. (Module 2. └── (body 3. └── (Assign 4. └── (value 5. └── (Call 6. └── (func 7. └── (Name 8. ├── (id

9. │ └── input) 10. └── (ctx

11. └── Load))))))))

Vozlišče, ki preverja programe po atributu regex-5, je zadnje v četrtem nivoju odločitvenega drevesa. Programi, ki so v tem izboru, vsebujejo atributa regex-1, regex-14 ter ne vsebujejo atributa regex-2. Atribut regex-5 vsebuje 16 programov in vsi delujejo pravilno.

(41)

29 3.6.1.2 Iskanje tipičnih napak

Z opisom zaporedja vozlišč od začetnega vozlišča (oz. korena drevesa) in do poljubnega končnega vozlišča (oz. lista odločitvenega dreva) so opisane lastnosti pravilnih ter napačnih programov. Pri nalogi Pretvarjanje iz Fahrenheitov v Celzije je bilo mogoče oblikovati 7 lastnosti, ki so predstavljene v spodnji tabeli. V dveh primerih je delovanje programske kode napačno, kar predstavlja tipični napaki študentov pri reševanju nalog. V naslednjih odstavkih sta napaki predstavljeni.

Oznaka Delovanje Število Pot v odločitvenem drevesu P1 Pravilno 38 P1 = regex-1=F ⋀ regex-80=T

P2 Pravilno 18 P2 = regex-1=F ⋀ regex-80=F ⋀ regex-250=T N1 Nepravilno 26 N1 = regex-1=T ⋀ regex-14=F ⋀ regex-61=T P3 Pravilno 197 P3 = regex-1=T ⋀ regex-14=T ⋀ regex-2=T

N2 Nepravilno 208 N2 = regex-1=F ⋀ regex-80=F ⋀ regex-250=F ⋀ regex-20=T P4 Pravilno 68 P4 = regex-1=T ⋀ regex-14=F ⋀ regex-61=F ⋀ regex-42=T P5 Pravilno 16 P4 = regex-1=T ⋀ regex-14=T ⋀ regex-2=F ⋀ regex-5=T

Programi, ki ustrezajo oznaki N1, delujejo napačno zaradi atributa regex-61, ki ima vrednost True. Pri opisu atributa je bilo omenjeno, da programi s tem atributom delujejo napačno, saj je formula za pretvorbo temperature zapisana neustrezno. V tem primeru je izpuščen znak za množenje:

g0 = (5 / 9((g1 - 32)))

ali pa je izraz pomnožen le z imenovalcem ulomka:

g0 = (5 / ((g1 - 32) * 9))

Drugo tipično napako oddanih programov opredeljuje oznaka N2. Programi delujejo napačno, saj se vhodna spremenljivka pretvori v celoštevilsko vrednost, kar ni ustrezno.

Opazimo, da je pod to oznako vsebovanih največ napačnih programov (208 primerov).

Programi ne vsebujejo atributov regex-1, regex-80 ter regex-250, kar je smiselno, saj omenjeni atributi opisujejo vsebovanost ukaza float(), ki pretvori vneseni niz v zapis z decimalnim številom. Vsi napačni programi pod oznako N2 vsebujejo ukaz int(), ki vhodni niz shrani kot celoštevilsko vrednost. Primer takšnega programa je zapisan v nadaljevanju – tu je znotraj ukaza int() uporabljen ukaz input(), ki v spremenljivko g0

shrani vhodni niz:

(42)

30

1. g0 = int(input('Vnesi temperaturo')) 2. print((((g0 - 32) * 5) / 9))

Nekateri primeri imajo ukaza int() ter input() napisana ločeno, vendar to bistveno ne spremeni delovanje programa:

1. g2 = input('T v F') 2. g1 = int(g2)

3. print((((g1 - 32) * 5) / 9))

Izsledimo lahko tudi programe, ki v spremenljivki shranijo vhodni niz (spremenljivka g1) kot tudi pretvorbo temperature v Fahrenheite (spremenljivka g0) s celoštevilsko vrednostjo.

1. g1 = int(input('Vnesi stevilo: ')) 2. g0 = int(((g1 - 32) * (5 / 9))) 3. print('C=', g0,'°C')

Naj omenim, da bi zgornji primeri delovali pravilo, če bi bil namesto ukaza int() zapisan ukaz float(), s čimer bi se v vhodno spremenljivko lahko shranile poljubne decimalne vrednosti ter ne samo celoštevilske.

(43)

31

3.6.2 Naloga 2: Največji

Naloga Največji je prva v učnem sklopu Funkcije. Študenti so pri tej nalogi napisali funkcijo, ki sprejme seznam xs in vrne največje število v seznamu. Ena izmed možnih rešitev delujoče programske kode je:

1. def max_val (xs):

2. max = xs[0]

3. for i in xs:

4. if i >= max:

5. max = i 6. return max

Funkcija sprejme seznam xs (vrstica 1) in se v naslednji vrstici prvi element seznama shrani pod spremenljivko max. Nato se z zanko for preveri, ali so preostale vrednosti elementov seznama večje od vrednosti spremenljivke max (vrstice 3-4). V kolikor to velja, se v spremenljivko max shrani večja vrednost (vrstica 5). Ko se funkcija zaključi, vrne spremenljivko max.

Enostavnejša rešitev naloge je z uporabo že obstoječe funkcije max(), ki vrne največji element seznama. Programska koda te rešitve je:

1. def max_val(xs):

2. return max(xs)

Pri tej nalogi je bilo oddanih 128 primerov, od tega je večina primerov rešenih pravilno (70 primerov). Klasifikacijska točnost napovedovanja pravilnosti delovanja programske kode je nad določeno mejo (0,852), podobni vrednosti imata meri preciznosti (0,851) in priklica (0,852).

Globina odločitvenega drevesa je 4, vsebuje 19 vozlišč in 10 povezav. V nadaljevanju so predstavljeni atributi, ki so vsebovani v odločitvenem drevesu. Zapisani so v S-izrazih, predstavljena je tudi interpretacija atributov.

Reference

POVEZANI DOKUMENTI

Diplomska naloga 7 Program Visual Studio je interaktivno razvojno okolje, ki omogoˇ ca osnovno podlago za pregled in urejanje kakrˇsne koli kode}. Omogoˇ ca odkrivanje na- pak,

V procese razvoja programske opreme so najbolj vpeta orodja za nadzor izvorne kode, zato je rudarjenje dnevniˇskih zapisov ome- njenih orodij pogost predmet raziskav [56, 15,

Aspektni naˇ cin razvoja programske opreme je uvedel nov pristop pri obravnavanju preseˇ cnih zadev, ki se pojavijo kot rezultat zapletenosti in razmetanosti kode. Do pojava

 Upravljanje vseh sprememb poteka preko uporabniškega vmesnika (poseg v programsko logiko ni potreben)..  Strukturiranost programske kode sistema je pregledna,

Maven je programsko orodje za avtomatizacijo prevajanja izvorne kode. Najpogosteje se ga uporablja v javanskih projektih. Podpira pa tudi nekatere druge programske jezike, kot na

Zato je pomembno tudi odkrivanje programov z zelo podobno izvorno kodo (plagiatov). Plagiat bi lahko opisali kot izvorno kodo programa, ki je skopirana, vendar modificirana z

Za delovanje Image Grid potrebuje dva druga gradnika: Import Images, s katerim uvozimo slike (ima tudi to uporabno funkcijo, da gradnik sam doda atribut s kategorijo, ˇ ce so bile

Ideja za tem je, da bo dober atribut, tudi ob prisotnosti najslabˇsih drugih izbranih atributov pripomogel k viˇsji uspeˇsnosti. SM, max) predstavlja idejo opazovanja za vsak atribut