摘要:隨著Python越來越受到編程愛好者的青睞,普通高中信息技術(shù)教材都采用了Python作為編程語言。但在實(shí)際教學(xué)過程中,學(xué)生編寫了很多Python程序,教師如果都進(jìn)行手工批改,工作量就很大。作者提出使用基于Python的評分軟件,可以大大提高教師的工作效率,體現(xiàn)信息技術(shù)的優(yōu)勢。
關(guān)鍵詞:Python;程序;評分;黑箱測試
中圖分類號(hào):G434 ?文獻(xiàn)標(biāo)識(shí)碼:A ?論文編號(hào):1674-2117(2021)02-0077-03
Python簡單易學(xué),功能強(qiáng)大,相比其他語言更容易上手。2020年9月,江蘇省正式開始使用高中信息技術(shù)新教材,采用的編程語言是Python。學(xué)生在學(xué)習(xí)編程的過程中,寫了很多的Python程序需要批改。另外,即使是解決同一個(gè)問題,學(xué)生的程序也是五花八門,各有特色。因此,對于教師來說,逐個(gè)手工批改程序作業(yè),費(fèi)時(shí)費(fèi)力。
Python在文本處理、自動(dòng)化辦公等方面有著很大的優(yōu)勢,用很短的代碼便可實(shí)現(xiàn)一些煩瑣工作的自動(dòng)化處理。因此,本文采用黑箱測試法來評價(jià)學(xué)生的程序。
● 問題描述
現(xiàn)有若干班級(jí)的Python程序等待批改(如圖1),每名學(xué)生都有一個(gè)以學(xué)號(hào)命名的文件夾,程序文件名都是統(tǒng)一的,所有學(xué)生的文件夾都在student目錄中。要求批改每名學(xué)生的程序,給出評分、程序運(yùn)行時(shí)間以及錯(cuò)誤提示信息,形成電子表格。
● 準(zhǔn)備工作
學(xué)校機(jī)房里的計(jì)算機(jī)都裝有Thonny3.2.7,自帶Python3.7.7。Thonny的界面簡潔明了,適合初學(xué)者。系統(tǒng)中安裝了常見的第三方庫,為了將結(jié)果寫入電子表格,還安裝了openpyxl庫。
● 軟件的設(shè)計(jì)分析
本軟件的輸入信息為學(xué)生的Python程序,輸出信息為程序評分的結(jié)果,包括得分、程序運(yùn)行時(shí)間、程序錯(cuò)誤信息。
Python自帶模塊subprocess,它可以創(chuàng)建一個(gè)子進(jìn)程,并運(yùn)行一個(gè)外部的程序,正好可以用于測試學(xué)生程序。
學(xué)生程序的輸入輸出都是通過鍵盤和顯示器,subprocess可以將輸入輸出定義到指定的文件,方便實(shí)現(xiàn)批量處理。
本軟件采用黑箱測試法給學(xué)生程序評分。通過比對學(xué)生程序的輸出和教師程序的輸出是否相同,來確定學(xué)生程序的得分。
● 軟件的主要代碼
1.獲取配置文件信息
評分軟件的文件夾programJudge和學(xué)生文件夾在同一目錄。
評分軟件的配置文件為programJudge.js,內(nèi)容如圖2所示。
學(xué)生程序名應(yīng)根據(jù)實(shí)際的要求改為相應(yīng)的Python程序名。
timeout的值是學(xué)生程序最長運(yùn)行時(shí)間,本軟件設(shè)置為3秒。
class的值是若干個(gè)班級(jí)的編號(hào)。
將配置文件讀入到字典d中,只需一行代碼,如圖3所示。
2.獲取測試數(shù)據(jù)
測試數(shù)據(jù)和教師標(biāo)準(zhǔn)程序所在文件夾:programJudge/學(xué)生程序名/。
輸入文件為:0.in, 1.in, … 由教師自己手工生成。
標(biāo)準(zhǔn)答案為:0.ans, 1.ans, …由教師程序自動(dòng)產(chǎn)生。
獲取測試數(shù)據(jù)getNumOfTestFile()代碼如圖4所示。
該函數(shù)將根據(jù)順序編號(hào)的輸入文件數(shù)量返回測試數(shù)據(jù)數(shù)量,同時(shí),根據(jù)教師程序生成標(biāo)準(zhǔn)答案,函數(shù)myCmd在后面會(huì)有說明。
3.新建工作簿
新建工作簿是為了收集學(xué)生程序的評分信息,代碼如圖5所示。
4.枚舉學(xué)生文件
枚舉學(xué)號(hào)studID,如果studID的前綴和班級(jí)一致,處理該學(xué)號(hào)(如上頁圖6)。其中,n為測試數(shù)據(jù)數(shù)量。
5.學(xué)生文件的評分
根據(jù)學(xué)號(hào)和程序名得到學(xué)生文件studFile,如果studFile不存在,得分score為-1,如果存在,分別用n組測試數(shù)據(jù)測試,如果學(xué)生程序的輸出文件和標(biāo)準(zhǔn)答案文件相同,那么k自增1。n組數(shù)據(jù)測試完畢,k*100/n即為本程序的得分,如上頁圖7所示。
程序執(zhí)行時(shí)間和錯(cuò)誤信息要根據(jù)myCmd的返回值而定,代碼如圖8所示。
subprocess.run執(zhí)行完畢后,若是學(xué)生程序超時(shí),返回(0,'Timeout'),若是returncode為0,表示正常結(jié)束學(xué)生程序,返回(執(zhí)行時(shí)間,),否則返回(0,'Error')。一般是學(xué)生程序中存在錯(cuò)誤,可在文件testOut中獲取錯(cuò)誤信息,本軟件只取錯(cuò)誤信息的最后一行寫入表格,方便教師了解學(xué)生程序中出現(xiàn)的錯(cuò)誤種類。
ws為新建的工作簿的活動(dòng)工作表,ws.append可以將一個(gè)元組作為行寫入工作表中,最終形成所有學(xué)生程序評分的一張表格,如圖9所示。
其中,score為-1表示學(xué)生程序文件不存在;time單位為ms;error為TimeOut一般是學(xué)生程序出現(xiàn)死循環(huán)或者算法沒有優(yōu)化;其他錯(cuò)誤與Thonny中運(yùn)行Python程序的錯(cuò)誤提示信息是一樣的。
● 結(jié)論
本文從一線教師的實(shí)際需求出發(fā),通過黑箱測試法給學(xué)生程序自動(dòng)評分,利用Python的subprocess模塊,獲取學(xué)生程序執(zhí)行的其他信息,如執(zhí)行時(shí)間、錯(cuò)誤提示信息等,最終得到一張學(xué)生程序評分的表格。這樣可以讓教師及時(shí)掌握學(xué)生的學(xué)習(xí)情況,學(xué)生也能獲得及時(shí)的反饋,有利于更好地學(xué)習(xí)編程。
參考文獻(xiàn):
[1]Python3.7. Using the subprocess Module [OL].2020.
[2]Eric Gazoni,Charlie Clark. openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files [OL]. 2020.
作者簡介:王曉華(1973—),男,江蘇無錫人,教育碩士,中學(xué)高級(jí),無錫市第一中學(xué)信息技術(shù)教師。
基金項(xiàng)目:本文是江蘇省教育科學(xué)“十三五”規(guī)劃2020年度普教立項(xiàng)課題“基于計(jì)算思維的高中生設(shè)計(jì)與智造項(xiàng)目化實(shí)踐研究”階段性成果,課題批準(zhǔn)文號(hào):D/2020/02/283;2019年江蘇省基礎(chǔ)教育前瞻性教學(xué)改革實(shí)驗(yàn)項(xiàng)目“設(shè)計(jì)與智造:統(tǒng)整理念下高中生學(xué)習(xí)方式的變革”階段性成果。