• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      測(cè)評(píng)系統(tǒng)揭秘
      ——從Python程序設(shè)計(jì)測(cè)評(píng)說(shuō)起

      2022-09-02 07:35:58虞穎健浙江省海寧市第一中學(xué)
      中國(guó)信息技術(shù)教育 2022年17期
      關(guān)鍵詞:程序代碼正確性程序設(shè)計(jì)

      虞穎健 浙江省海寧市第一中學(xué)

      倪俊杰 浙江省桐鄉(xiāng)市鳳鳴高級(jí)中學(xué)

      新一輪的課程改革大幅增加了高中信息技術(shù)新教材程序設(shè)計(jì)相關(guān)內(nèi)容的比重,大數(shù)據(jù)、物聯(lián)網(wǎng)、人工智能等內(nèi)容進(jìn)入了信息技術(shù)新版教材,新版教材的編程語(yǔ)言換成了在以上領(lǐng)域應(yīng)用廣泛的Python。Python程序設(shè)計(jì)教學(xué)在新課程的教學(xué)中具有舉足輕重的地位。程序設(shè)計(jì)測(cè)評(píng)系統(tǒng)能夠即時(shí)檢驗(yàn)學(xué)生編寫的程序代碼是否正確,教學(xué)需求也日益增強(qiáng)。相比傳統(tǒng)的課堂教學(xué)模式,采用程序測(cè)評(píng)系統(tǒng)的程序設(shè)計(jì)課堂教學(xué)能夠根據(jù)測(cè)評(píng)系統(tǒng)的實(shí)時(shí)反饋及時(shí)掌握學(xué)生的學(xué)習(xí)情況,進(jìn)而能更好地調(diào)整課堂教學(xué),提升課堂教學(xué)的有效性。

      ● 在線測(cè)評(píng)系統(tǒng)的需求

      在線測(cè)評(píng)系統(tǒng)(Online Judge,簡(jiǎn)稱OJ系統(tǒng))是目前廣泛使用的主流程序測(cè)評(píng)系統(tǒng)。OJ系統(tǒng)是一個(gè)在線判題系統(tǒng),用戶可以在線提交程序源代碼,系統(tǒng)通過(guò)預(yù)先設(shè)計(jì)的測(cè)試數(shù)據(jù)來(lái)檢驗(yàn)程序源代碼的正確性。用戶提交的程序在OJ系統(tǒng)下執(zhí)行時(shí)將受到比較嚴(yán)格的限制,包括運(yùn)行時(shí)間限制、內(nèi)存使用限制和安全限制等。用戶程序執(zhí)行的結(jié)果將被OJ系統(tǒng)捕捉并保存,然后再轉(zhuǎn)交給一個(gè)裁判程序。該裁判程序或者比較用戶程序的輸出數(shù)據(jù)和標(biāo)準(zhǔn)輸出樣例的差別,或者檢驗(yàn)用戶程序的輸出數(shù)據(jù)是否滿足一定的邏輯條件。國(guó)內(nèi)較為著名的OJ系統(tǒng)有POJ(北京大學(xué))、ZOJ(浙江大學(xué))、HDOJ(杭州電子科技大學(xué))。

      傳統(tǒng)的OJ系統(tǒng)經(jīng)過(guò)多年的發(fā)展,雖然功能較為完善,但應(yīng)用于中小學(xué)信息技術(shù)課堂教學(xué),存在如下問(wèn)題:①OJ系統(tǒng)用戶提交的程序代碼在服務(wù)器運(yùn)行,用戶較多情況下對(duì)服務(wù)器的性能有一定要求,需要配置專門的服務(wù)器,不符合大多數(shù)學(xué)校的實(shí)際情況。②OJ系統(tǒng)基于B/S架構(gòu),通常需要安裝數(shù)據(jù)庫(kù)和Web服務(wù)器并進(jìn)行必要的配置和部署;OJ系統(tǒng)用戶提交的程序代碼在執(zhí)行時(shí)有運(yùn)行時(shí)間、內(nèi)存使用、安全等的限制,需要在服務(wù)器上進(jìn)行配置。使用OJ系統(tǒng)對(duì)信息教師的專業(yè)能力要求較高。③OJ系統(tǒng)檢驗(yàn)的是用戶提交程序代碼的正確性,其中只有正確和錯(cuò)誤兩種結(jié)果,無(wú)法對(duì)程序設(shè)計(jì)填空的正確性進(jìn)行檢驗(yàn),而目前不少程序設(shè)計(jì)考題都為填空題,這就需要測(cè)評(píng)系統(tǒng)具有程序設(shè)計(jì)填空碼的評(píng)測(cè)功能。以上問(wèn)題在一定程度上阻礙了OJ系統(tǒng)在中小學(xué)信息技術(shù)課堂教學(xué)中的推廣與使用。

      要想讓廣大中小學(xué)信息技術(shù)教師能夠在課堂教學(xué)中使用程序測(cè)評(píng)系統(tǒng),提升課堂教學(xué)的有效性,需要開發(fā)一款適用于當(dāng)下信息技術(shù)課堂教學(xué)、使用門檻較低的程序測(cè)評(píng)系統(tǒng),該系統(tǒng)需要滿足如下需求:①系統(tǒng)無(wú)需高性能計(jì)算機(jī),無(wú)需服務(wù)器,在機(jī)房學(xué)生機(jī)或者教師機(jī)上即可運(yùn)行使用。②無(wú)需部署數(shù)據(jù)庫(kù)與Web服務(wù)器,無(wú)需煩瑣復(fù)雜的配置。③既能夠檢驗(yàn)提交的完整代碼的正確性,也能夠檢驗(yàn)程序設(shè)計(jì)填空的正確性。

      ● 在線測(cè)評(píng)系統(tǒng)的設(shè)計(jì)

      筆者根據(jù)浙江信息技術(shù)教學(xué)情況,設(shè)計(jì)并實(shí)現(xiàn)了Python程序設(shè)計(jì)測(cè)評(píng)系統(tǒng)——YYOJ系統(tǒng)。該系統(tǒng)有如下優(yōu)點(diǎn):①學(xué)生提交的程序代碼的正確性在學(xué)生使用的本地機(jī)器上檢驗(yàn),對(duì)運(yùn)行YYOJ系統(tǒng)數(shù)據(jù)庫(kù)和Web服務(wù)器的計(jì)算機(jī)性能沒(méi)有要求,YYOJ系統(tǒng)可以在機(jī)房任意一臺(tái)計(jì)算機(jī)上運(yùn)行,不需要配置專門的服務(wù)器,也無(wú)需對(duì)運(yùn)行YYOJ系統(tǒng)計(jì)算機(jī)的內(nèi)存、安全限制進(jìn)行配置。②YYOJ系統(tǒng)不需要安裝數(shù)據(jù)庫(kù)和Web服務(wù)器并進(jìn)行配置,它自帶數(shù)據(jù)庫(kù)和Web服務(wù)器的應(yīng)用程序。③YYOJ系統(tǒng)除了可以檢驗(yàn)學(xué)生提交的完整程序代碼的正確性,還可以檢驗(yàn)程序設(shè)計(jì)填空的正確性。此外,YYOJ系統(tǒng)對(duì)硬件設(shè)備要求較低,使用門檻不高且易于使用,特別適合浙江高中信息技術(shù)課堂教學(xué)。

      1.系統(tǒng)技術(shù)介紹

      YYOJ系統(tǒng)是基于B/S架構(gòu)的Web應(yīng)用程序,在開發(fā)過(guò)程中使用了Web框架、Web服務(wù)器、數(shù)據(jù)庫(kù)等技術(shù)。

      FastAPI是一個(gè)用于構(gòu)建Web API的現(xiàn)代、高性能的WEB框架,它實(shí)現(xiàn)了ASGI規(guī)范。雖然FastAPI的主要用途是用于構(gòu)建Web API,但是FastAPI也提供了對(duì)Jinja2、Mako等模板引擎的支持,能夠像Flask、Django一樣開發(fā)基于服務(wù)端渲染的Web應(yīng)用程序。

      Uvicorn是使用C和Python編寫的ASGI Web服務(wù)器。使用Uvicorn部署實(shí)現(xiàn)了ASGI規(guī)范的Web應(yīng)用程序。FastAPI實(shí)現(xiàn)了ASGI規(guī)范,所以,F(xiàn)astAPI開發(fā)的Web應(yīng)用程序能夠部署在Uvicorn中。Uvicorn與傳統(tǒng)的Web服務(wù)器不同,傳統(tǒng)的Web服務(wù)器如nginx、apache、IIS需要單獨(dú)安裝,Uvicorn不需要安裝,并且可以通過(guò)Python編碼的方式直接嵌入應(yīng)用程序中運(yùn)行。

      Nuitka是Python編寫的優(yōu)化Python編譯器,它能夠把Python代碼編譯生成為可執(zhí)行程序,而且通過(guò)Nuitka編譯生成的可執(zhí)行程序不需要安裝Python環(huán)境也能夠獨(dú)立運(yùn)行。Nuitka支持Python2與Python3,支持Windows、Linux與蘋果等主流操作系統(tǒng)。Nuitka的工作原理是把Python代碼編譯成C代碼,再把C代碼編譯成可執(zhí)行文件,生成的文件不能像.pyc文件一樣反編譯,因此安全性高,而且因?yàn)榫幾g成C代碼,所以生成的可執(zhí)行程序運(yùn)行速度會(huì)更快。

      Brython是用javascript編寫的Python編譯器和解析器。使用Brython,可以在瀏覽器中編譯和運(yùn)行Python代碼。

      SQLite是一個(gè)C語(yǔ)言庫(kù),它實(shí)現(xiàn)了一個(gè)小型、快速、自包含、高可靠性、功能齊全的SQL數(shù)據(jù)庫(kù)引擎。SQLite內(nèi)置于所有手機(jī)和大多數(shù)計(jì)算機(jī)中,并捆綁在人們每天使用的無(wú)數(shù)其他應(yīng)用程序中。SQLite不像MySQL、Postgres那樣需要開啟服務(wù)器提供數(shù)據(jù)庫(kù)服務(wù),它是無(wú)服務(wù)器的數(shù)據(jù)庫(kù),可以通過(guò)編程語(yǔ)言調(diào)用API直接與SQLite數(shù)據(jù)庫(kù)通信。

      總的來(lái)說(shuō),YYOJ系統(tǒng)是使用FastAPI開發(fā)的Web應(yīng)用程序,內(nèi)嵌了Uvicorn和SQLite,Uvicorn用于承載Web應(yīng)用程序,SQLite作為應(yīng)用程序的數(shù)據(jù)存儲(chǔ),因此,省去了安裝數(shù)據(jù)庫(kù)和Web服務(wù)器以及配置的步驟。YYOJ的源碼采用Nuitka編譯并生成可執(zhí)行程序,不需要安裝Python環(huán)境,使用時(shí)把可執(zhí)行程序拷貝到計(jì)算機(jī)上直接運(yùn)行即可。判題代碼在瀏覽器端通過(guò)Brython運(yùn)行檢驗(yàn)學(xué)生提交程序代碼的正確性,提交的程序代碼無(wú)需上傳到服務(wù)器后再進(jìn)行判題,減輕了服務(wù)器端的壓力。

      2.在線測(cè)評(píng)系統(tǒng)功能設(shè)計(jì)

      YYOJ系統(tǒng)是一個(gè)Python程序設(shè)計(jì)測(cè)評(píng)系統(tǒng),教師在系統(tǒng)中錄入Python程序設(shè)計(jì)的題目及其評(píng)判代碼,學(xué)生登錄系統(tǒng)根據(jù)題目要求編寫或完善程序并提交,系統(tǒng)根據(jù)教師提供的評(píng)判代碼對(duì)學(xué)生提交的程序進(jìn)行評(píng)判,檢驗(yàn)學(xué)生程序的正確性。YYOJ系統(tǒng)的功能主要包括學(xué)生界面功能、教師界面功能、第三方軟件實(shí)現(xiàn)的管理功能。

      ①在線運(yùn)行。學(xué)生可以輸入Python代碼并運(yùn)行查看執(zhí)行結(jié)果。該模塊輸入的Python代碼在網(wǎng)頁(yè)中運(yùn)行,因此不需要Python編程環(huán)境,在瀏覽器的環(huán)境下就可以運(yùn)行。開發(fā)該模塊主要是考慮學(xué)生如果不在機(jī)房或者不在學(xué)校,YYOJ系統(tǒng)只要部署在學(xué)校的服務(wù)器上,學(xué)生通過(guò)自己的計(jì)算機(jī)、平板、手機(jī)登錄YYOJ系統(tǒng)就可以練習(xí)Python代碼,而無(wú)需安裝Python編程環(huán)境。

      ②我要挑戰(zhàn)。學(xué)生可以選擇教師錄入系統(tǒng)中的題目進(jìn)行挑戰(zhàn)練習(xí),在學(xué)生提交Python代碼后,系統(tǒng)根據(jù)教師的判題代碼檢驗(yàn)學(xué)生提交代碼的正確性并反饋結(jié)果給學(xué)生。學(xué)生在課余時(shí)間可以使用該模塊開展自主編程練習(xí)。

      ③練習(xí)反饋。學(xué)生登錄之后才能使用。在“我要挑戰(zhàn)”的基礎(chǔ)上還添加了一項(xiàng)額外的功能:學(xué)生提交的Python代碼檢驗(yàn)的結(jié)果會(huì)保存到數(shù)據(jù)庫(kù)中,教師可以在后臺(tái)查看。

      教師功能必須在教師登錄后臺(tái)之后才能使用,教師功能主要包括以下內(nèi)容:

      ①題目查看。對(duì)系統(tǒng)中已經(jīng)錄入的題目提供分頁(yè)查看功能。

      ②錄入題目。提供錄入題目的功能。錄入的題目包括題目名稱、需要批閱的代碼、批閱代碼三塊內(nèi)容。如果代碼完全由學(xué)生編寫,“需要批閱的代碼”留空,如果代碼是一部分由學(xué)生完善,如程序設(shè)計(jì)填空,則教師在“需要批閱的代碼”中錄入無(wú)需學(xué)生完善的代碼部分并標(biāo)記需要完善的部分。“批閱代碼”是檢驗(yàn)學(xué)生代碼正確與否的評(píng)判代碼。

      ③修改題目。提供修改錄入的某個(gè)題目的功能。

      ④刪除題目。提供刪除某個(gè)題目的功能。

      ⑤查看做題情況。提供以班級(jí)為單位查看某個(gè)題目的評(píng)判結(jié)果的功能。

      ①教師管理。提供查看、添加、修改、刪除教師賬號(hào)的功能。

      ②班級(jí)管理。包括班級(jí)的查看、添加、修改、刪除功能。

      ③學(xué)生管理。包括學(xué)生的查看、添加、修改、刪除功能。

      考慮到Y(jié)YOJ系統(tǒng)的主要使用群體是信息技術(shù)教師,能夠使用數(shù)據(jù)庫(kù)管理軟件來(lái)管理數(shù)據(jù)庫(kù)中的數(shù)據(jù),并且YYOJ使用的是無(wú)需服務(wù)器的SQLite數(shù)據(jù)庫(kù),所以以上三項(xiàng)功能并未在系統(tǒng)中實(shí)現(xiàn),教師可以直接使用HeidiSQL或者DB Browser for SQLite這樣的SQLite數(shù)據(jù)庫(kù)管理工具來(lái)實(shí)現(xiàn)上述功能。

      ● 在線測(cè)評(píng)系統(tǒng)的實(shí)現(xiàn)

      YYOJ系統(tǒng)通過(guò)Brython在瀏覽器中運(yùn)行評(píng)判代碼以檢驗(yàn)學(xué)生提交代碼的正確性。當(dāng)學(xué)生點(diǎn)擊提交按鈕之后,Brython會(huì)將學(xué)生提交的代碼傳遞給教師編寫的評(píng)判代碼,并在瀏覽器中運(yùn)行評(píng)判代碼檢驗(yàn)學(xué)生提交的代碼是否正確,最后僅將評(píng)判的結(jié)果返回給服務(wù)器并保存在數(shù)據(jù)庫(kù)中。因?yàn)樵u(píng)判代碼在瀏覽器中運(yùn)行,所以減輕了服務(wù)器的壓力。

      YYOJ系統(tǒng)與傳統(tǒng)的OJ系統(tǒng)不同,YYOJ系統(tǒng)除了支持完整代碼正確性的評(píng)判,也支持程序設(shè)計(jì)填空正確性的評(píng)判。程序設(shè)計(jì)填空的答案通常不是唯一的,為了確保評(píng)判的正確性,教師需要編寫評(píng)判代碼,通過(guò)評(píng)判代碼來(lái)評(píng)判程序設(shè)計(jì)填空的正確性。在學(xué)生提交代碼之后,教師編寫的評(píng)判代碼在瀏覽器中運(yùn)行評(píng)判學(xué)生提交代碼的正確性,并通過(guò)AJAX請(qǐng)求將題目的編號(hào)、學(xué)生標(biāo)志以及題目正確與否等信息傳回服務(wù)端并保存在數(shù)據(jù)庫(kù)中,教師在后臺(tái)能夠查看學(xué)生的答題情況。

      評(píng)判代碼的編寫主要分為完整代碼的正確性評(píng)判和程序設(shè)計(jì)填空的正確性評(píng)判。

      1.完整代碼的正確性評(píng)判

      評(píng)判完整代碼的正確性的方式是檢驗(yàn)?zāi)承┳兞康闹祷蛘叱绦虻妮敵鲈诔绦蜻\(yùn)行后是否符合預(yù)期。

      ①根據(jù)變量值評(píng)判代碼正確性。

      某些問(wèn)題會(huì)將結(jié)果存儲(chǔ)到某個(gè)變量中,對(duì)于這樣的問(wèn)題,需要通過(guò)檢驗(yàn)變量?jī)?nèi)存儲(chǔ)的值來(lái)判斷代碼的正確性。

      例1,描述:在列表s中存儲(chǔ)[1, 10]范圍內(nèi)的所有偶數(shù);

      題目已有代碼:無(wú);

      學(xué)生提交代碼如圖1所示。

      圖1

      分析:該問(wèn)題希望在列表s中存儲(chǔ)[1,10]范圍內(nèi)的所有偶數(shù),當(dāng)程序運(yùn)行完畢之后,列表s的值為[10,8,6,4,2],要評(píng)判提交的代碼是否正確,只要判斷列表s中是否僅包含2、4、6、8、10這5個(gè)偶數(shù)即可。

      學(xué)生提交的代碼作為文本字符串存儲(chǔ)在變量src中提交給評(píng)判代碼,評(píng)判代碼通過(guò)exec函數(shù)運(yùn)行學(xué)生提交的代碼。exec是Python的內(nèi)置函數(shù),它能夠動(dòng)態(tài)地執(zhí)行存儲(chǔ)在字符串或文件中的 Python 語(yǔ)句。

      exec(src)

      通過(guò)上面的語(yǔ)句,學(xué)生提交的代碼已經(jīng)在評(píng)判代碼中運(yùn)行完畢,在評(píng)判代碼運(yùn)行的上下文環(huán)境中已經(jīng)存在變量s且它的值為[10,8,6,4,2]。評(píng)判代碼只需要判斷s的值是否僅包含2、4、6、8、10這5個(gè)偶數(shù)即可。

      在評(píng)判代碼中引入變量correct,將其賦值為False,假設(shè)代碼是錯(cuò)誤的。通過(guò)if語(yǔ)句檢驗(yàn)s的值是否僅包含2、4、6、8、10這5個(gè)偶數(shù),如果代碼正確,correct的值設(shè)置為True(如圖2)。

      圖2

      ②根據(jù)輸出評(píng)判代碼正確性。

      某些問(wèn)題需要將結(jié)果通過(guò)print函數(shù)直接輸出并顯示,對(duì)于這樣的問(wèn)題,需要檢驗(yàn)輸出是否正確。

      print函數(shù)的工作原理是將數(shù)據(jù)寫入sys.stdout流中,stdout是標(biāo)準(zhǔn)輸出流,默認(rèn)情況下stdout會(huì)把數(shù)據(jù)顯示在運(yùn)行當(dāng)前Python代碼的終端命令行窗口中。

      print("你好,世界!")

      等價(jià)于

      import sys

      sys.stdout.write("你好,世界! ")

      print函數(shù)的輸出顯示在屏幕上,沒(méi)有辦法對(duì)print函數(shù)的輸出進(jìn)行檢驗(yàn)。要評(píng)判學(xué)生提交的代碼是否正確需要對(duì)print函數(shù)的輸出進(jìn)行捕獲并將其放入某個(gè)變量?jī)?nèi)。

      如圖3所示的代碼自定了類MarkingOutput,改寫了sys.stdout的默認(rèn)行為,當(dāng)執(zhí)行print函數(shù)調(diào)用sys.stdout.write的時(shí)候,本來(lái)在屏幕上輸出的數(shù)據(jù)不再輸出到屏幕上,print函數(shù)的輸出被添加到MarkingOutput的實(shí)例out的屬性bufs列表中。上述代碼默認(rèn)包含在評(píng)判代碼中,評(píng)判代碼要判斷提交代碼的正確性只需要檢查out實(shí)例的bufs列表即可。

      圖3

      例2,描述:使用print輸出三個(gè)變量a、b、c的最大值;

      題目已有代碼:a, b, c = 2, 4, 6;

      學(xué)生提交代碼如下頁(yè)圖4所示。

      圖4

      分析:學(xué)生提交的代碼作為文本字符串存儲(chǔ)在變量src中提交給評(píng)判代碼,通過(guò)exec執(zhí)行學(xué)生提交的代碼。

      exec(src)

      通過(guò)上面的語(yǔ)句,學(xué)生提交的代碼已經(jīng)在評(píng)判代碼中運(yùn)行完畢。

      correct = False

      if sys.stdout.bufs[0] == str(max(a, b, c)):

      correct = True

      在評(píng)判代碼中引入變量correct,將其賦值為False,假設(shè)代碼是錯(cuò)誤的。本題最終結(jié)果僅僅輸出的a、b、c三個(gè)變量中的最大值,輸出的最大值保存在bufs列表的第一個(gè)元素中,要判斷提交的代碼是否正確,只需要判斷bufs列表的第一個(gè)元素是不是a、b、c三個(gè)變量的最大值即可。

      ③程序結(jié)果隨輸入改變的正確性評(píng)判。

      某些程序在運(yùn)行時(shí)需要預(yù)先給定一個(gè)輸入,程序代碼運(yùn)行的結(jié)果會(huì)隨著輸入的改變而改變,結(jié)果并不唯一。該類代碼在評(píng)判的時(shí)候,需要提供多組測(cè)試的輸入數(shù)據(jù),一一檢測(cè)其程序運(yùn)行結(jié)果是否與預(yù)期相符合,如果全部符合則代碼正確,否則代碼錯(cuò)誤。

      例3,描述:將十進(jìn)制自然數(shù)n(n是整型)轉(zhuǎn)化為二進(jìn)制數(shù)s(是字符串型)。

      題目已有代碼:

      n = 13

      s = ''

      學(xué)生提交代碼,如圖5所示。

      圖5

      分析:十進(jìn)制自然數(shù)n轉(zhuǎn)二進(jìn)制數(shù)s,其結(jié)果會(huì)隨著變量n的值的改變而改變,當(dāng)變量n的值為13的時(shí)候,s的值為"1101",但是如果僅僅判斷變量s的值為"1101"是無(wú)法達(dá)到判題效果的,提交的代碼中n的值有可能為任意一個(gè)整數(shù),如果不是13的情況下仍然判斷s的值是否為"1101"將得出錯(cuò)誤的判題結(jié)果。

      此類問(wèn)題的解決方法是提供一組測(cè)試輸入值及其對(duì)應(yīng)的結(jié)果,用提供的測(cè)試輸入值來(lái)替代原來(lái)的輸入值,運(yùn)行代碼檢驗(yàn)對(duì)應(yīng)的結(jié)果是否符合預(yù)期,如果提供的每個(gè)測(cè)試輸入值得到的結(jié)果都符合預(yù)期,則可以認(rèn)為提交代碼是正確的。

      對(duì)于例3,通過(guò)下面的代碼隨機(jī)生成10個(gè)測(cè)試輸入值(如圖6)。

      圖6

      學(xué)生提交的代碼作為文本字符串存儲(chǔ)在變量src中,通過(guò)如圖7所示的代碼使用test_input中的每個(gè)測(cè)試輸入來(lái)驗(yàn)證代碼的正確性。

      圖7

      其中,src_r=src.replace('n =13',f'n=j5i0abt0b')用測(cè)試輸入值替換學(xué)生提交代碼中變量n的輸入值,exec(src_r)運(yùn)行修改輸入數(shù)據(jù)后的提交代碼,s !=dtob(d)判斷提交代碼運(yùn)行的結(jié)果是否與提供輸入值得到的對(duì)應(yīng)結(jié)果一致,只要其中一次檢驗(yàn)結(jié)果不一致就可以確定提交代碼錯(cuò)誤,設(shè)置correct為False并退出循環(huán)。但以上代碼有一個(gè)缺陷,如果學(xué)生修改了“n=13”這一行代碼為“n=任意整數(shù)”,則上面的判題代碼無(wú)法得出正確的結(jié)果。對(duì)于“n=任意整數(shù)”的情況,需要使用正則表達(dá)式來(lái)進(jìn)行輸入值的替換。

      正則表達(dá)式,又稱規(guī)則表達(dá)式(RegularExpression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),是一種文本模式,包括普通字符(如a到z之間的字母)和特殊字符(稱為“元字符”),是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串,通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。

      在Python中使用正則表達(dá)式需要引入正則表達(dá)式的內(nèi)置庫(kù):

      import re

      然后將

      src_r = src.replace('n = 13', f'n = j5i0abt0b')

      這一行代碼修改為:

      re.sub('ns*=s*d+', f'n = j5i0abt0b', src)

      其中的sub函數(shù)用于替換符合模式的字符串。第一個(gè)參數(shù)“ns*=s*d+”是要尋找的模式,其中的“s”表示空格,“d”表示數(shù)字,“*”表示匹配零到多個(gè)字符,“+”表示匹配一到多個(gè)字符,“ns*=s*d+”的含義是“n+包含零到多個(gè)空格+=+包含零到多個(gè)空格+包含一到多個(gè)數(shù)字”(+號(hào)表示連接),第二個(gè)參數(shù)是要替換為的字符串,第三個(gè)參數(shù)是需要替換字符串的文本。通過(guò)以上代碼可知,不管n的值為何整數(shù),都能將其替換為測(cè)試輸入值。

      2.程序設(shè)計(jì)填空的評(píng)判

      評(píng)判程序設(shè)計(jì)填空的正確性的方法是先提取填空的程序段,再使用測(cè)試數(shù)據(jù)測(cè)試提取的程序段運(yùn)行能否達(dá)到預(yù)期的結(jié)果。

      例4,描述:二進(jìn)制數(shù)b轉(zhuǎn)換成十六進(jìn)制數(shù)h(填空題)。

      題目已有代碼如圖8所示。學(xué)生提交代碼如圖9所示。

      圖8

      圖9

      分析:程序設(shè)計(jì)填空的題目需要教師預(yù)先提供題目非填空部分的代碼,其中標(biāo)注的“#第1題”“#第2題”是為了方便判題程序提取學(xué)生填空的程序代碼。

      在學(xué)生提交代碼之后,判題程序會(huì)使用正則表達(dá)式提取其中填空的程序代碼,并利用編寫的判題代碼判斷學(xué)生填寫的程序代碼是否正確。圖10所示是針對(duì)例4填空2編寫的判題代碼的核心代碼。

      圖10

      re.search函數(shù)的作用是找到與正則表達(dá)式匹配的字符串,第一個(gè)參數(shù)中的“(?P.+?)”表示捕獲命名組,用于提取查找到的程序代碼其中的一部分,捕獲組的名稱是b2,“.+”表示捕獲的內(nèi)容是一到多個(gè)字符。第一個(gè)參數(shù)“^s{8}ns*=s*(?P.+?)s*#第2題s* ”表示的含義是“行首以8個(gè)空格開頭+n+零到多個(gè)空格+=+零到多個(gè)空格+(命令捕獲組b2)+零到多個(gè)空格+#第2題+零到多個(gè)空格+換行符”(其中的+號(hào)表示連接)。第二個(gè)參數(shù)“src”是需要查找程序代碼段即學(xué)生提交的代碼,第三個(gè)參數(shù)“re.M”表示多行匹配。當(dāng)執(zhí)行re.search函數(shù)后,通過(guò)match.group("b2")獲得捕獲命名組的內(nèi)容即學(xué)生填空的代碼“chr(55+n)”。

      該填空主要功能是將10~15的十進(jìn)制數(shù)字轉(zhuǎn)化成對(duì)應(yīng)的16進(jìn)制數(shù)的A~F。for循環(huán)中n的變化范圍為10~15。通過(guò)exec將填空代碼“chr(55+n)”執(zhí)行結(jié)果賦值給變量c,if語(yǔ)句判斷c是不是十進(jìn)制數(shù)n對(duì)應(yīng)的十六進(jìn)制數(shù)的大寫或小寫字母,不是則程序錯(cuò)誤,變量ec累加1,退出for循環(huán)。for循環(huán)退出后變量ec的值為0表示程序正確,設(shè)置變量b2_correct的值為True。

      ● 結(jié)語(yǔ)

      隨著信息技術(shù)(信息科技)課程越來(lái)越得到重視,教師對(duì)程序設(shè)計(jì)在線測(cè)評(píng)系統(tǒng)的需求也愈發(fā)強(qiáng)烈。YYOJ系統(tǒng)是根據(jù)多年實(shí)際教學(xué)經(jīng)驗(yàn)與廣大一線信息技術(shù)教師的需求設(shè)計(jì)開發(fā)的,該程序設(shè)計(jì)評(píng)測(cè)系統(tǒng)除了支持常規(guī)的完整程序代碼的評(píng)判,還支持程序設(shè)計(jì)填空題的評(píng)判,符合當(dāng)下學(xué)考、高考教學(xué)的實(shí)際。該系統(tǒng)無(wú)需安裝,無(wú)需數(shù)據(jù)庫(kù)與Web服務(wù)器,只需要一臺(tái)機(jī)房的普通計(jì)算機(jī)即可零配置快速部署使用,適用于在機(jī)房開展的程序設(shè)計(jì)教學(xué),能有效提升課堂教學(xué)的效率。

      猜你喜歡
      程序代碼正確性程序設(shè)計(jì)
      基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
      一種基于系統(tǒng)穩(wěn)定性和正確性的定位導(dǎo)航方法研究
      從細(xì)節(jié)入手,談PLC程序設(shè)計(jì)技巧
      電子制作(2019年9期)2019-05-30 09:42:04
      計(jì)算機(jī)網(wǎng)絡(luò)信息安全未來(lái)發(fā)展趨勢(shì)
      淺談如何提高水質(zhì)檢測(cè)結(jié)果準(zhǔn)確性
      基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼
      軟件工程(2016年11期)2017-01-17 16:56:57
      高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
      PLC梯形圖程序設(shè)計(jì)技巧及應(yīng)用
      雙口RAM讀寫正確性自動(dòng)測(cè)試的有限狀態(tài)機(jī)控制器設(shè)計(jì)方法
      嵌入式系統(tǒng)中程序的優(yōu)化策略
      新媒體研究(2009年4期)2009-03-14 06:59:48
      沾化县| 醴陵市| 金平| 资源县| 龙口市| 贵溪市| 肥东县| 武强县| 兴文县| 收藏| 新巴尔虎右旗| 遂宁市| 星座| 高州市| 牡丹江市| 巧家县| 肃宁县| 瑞昌市| 潼关县| 延吉市| 霍州市| 仁化县| 渭源县| 朝阳市| 麻城市| 宣威市| 久治县| 景洪市| 西贡区| 兴和县| 广德县| 岳西县| 鹤庆县| 旬邑县| 措勤县| 徐水县| 兴安盟| 天津市| 隆子县| 图木舒克市| 专栏|