午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

VBA自定義函數(shù):考試多項(xiàng)選擇題判分;山東高考數(shù)學(xué)多選題判分解決方法

 冷茶視界 2024-10-10 發(fā)布于江蘇

內(nèi)容提要

  • VBA自定義函數(shù)
  • InStr函數(shù)
大家好,我是冷水泡茶,今天在EXCELHOME論壇上看到一個(gè)求助貼:[求助] 求助山東高考數(shù)學(xué)多選題 判分解決方法
具體要求

山東高考數(shù)學(xué)多選題,1個(gè)6分。

1、若標(biāo)準(zhǔn)答案AB,學(xué)生選了A,則得6/3=2分

2、若標(biāo)準(zhǔn)答案AB,學(xué)生選了AC,則得0分

3、若標(biāo)準(zhǔn)答案ABC,學(xué)生選了A,得6/3=2,學(xué)生選了AB,得6/3*2=4分。

https://club./forum.php?mod=viewthread&tid=1703380&page=1&_dsign=cb0ebcd2

案例比較簡單,已經(jīng)有人給出了解決方法。我本來不打算弄它的,但仔細(xì)研究了一下別人的代碼,我忽然有了不同的思路。我們一起來看一下:

數(shù)據(jù)表格:

基本思路:
1、他這個(gè)要求,也就是判分規(guī)則,舉了三個(gè)例子,我們給他總結(jié)一下:有錯(cuò)誤選項(xiàng)該題得0分,沒有錯(cuò)誤選項(xiàng),則答對(duì)幾個(gè)相應(yīng)得分。
2、我們寫一個(gè)自定義函數(shù)getScore,設(shè)置三個(gè)參數(shù),1題分,2標(biāo)準(zhǔn)答案,3學(xué)生答。
3、我們循環(huán)學(xué)生答案的每個(gè)字符,用InStr函數(shù)判斷是不是包含在標(biāo)準(zhǔn)答案中,如果包含,則相應(yīng)得分,累計(jì)到一個(gè)變量currScore中;如果直到循環(huán)結(jié)束,仍沒有發(fā)現(xiàn)任何不包含在標(biāo)準(zhǔn)答案中的字符,那么該題得分為currScore,如果發(fā)現(xiàn)一個(gè)錯(cuò)誤選項(xiàng),則該題得零分,退出函數(shù)過程。
Function getScore( _        totalScore As Integer, _        rightAnswer As String, _        studentAnswer As String)    '//totalScore:單題總分    '//rightAnswer:正確答案    '//studentAnswer:學(xué)生答案    Dim unitScore As Double    Dim currScore As Double    Dim i As Integer    unitScore = Round(totalScore / Len(rightAnswer), 2)    For i = 1 To Len(studentAnswer)        If InStr(rightAnswer, Mid(studentAnswer, i, 1)) > 0 Then            currScore = currScore + unitScore        Else            getScore = 0            Exit Function        End If    Next    getScore = currScoreEnd Function
4、以上代碼我已發(fā)到了論壇,但后來再想想,還有優(yōu)化的空間:
(1)先判斷一下完全正確的答案,直接用等于來比較,不用循環(huán)所有選項(xiàng);
(2)再判斷一下肯定錯(cuò)誤的答案,學(xué)生答案的選項(xiàng)比標(biāo)準(zhǔn)答案多,用Len函數(shù)取得兩個(gè)答案的長度進(jìn)行比較。
(3)學(xué)生答案為空,直接得0分。
5、后來,問主在貼子里又有要求,希望點(diǎn)一個(gè)按鈕直接出結(jié)果,而不是自定義函數(shù)。這也好辦,我們前面的努力不會(huì)白費(fèi),我們把工作表A列到D列數(shù)據(jù)裝入數(shù)組arr,循環(huán)數(shù)組,把第2列、第3列帶入getScore自定義函數(shù),結(jié)果寫入第4列,最后,再把a(bǔ)rr回寫到工作表。
6、我們還可以設(shè)置一個(gè)工作表Change事件,當(dāng)學(xué)生答案或標(biāo)準(zhǔn)答案發(fā)生改變時(shí),得分也自動(dòng)改變。

完整示例代碼詳見當(dāng)天另一條推文。

后記

1、這個(gè)案例雖然簡單,但是解決思路還是蠻有意思的。我看有人是這么做的,循環(huán)標(biāo)準(zhǔn)答案中的每個(gè)字符,如果包含于學(xué)生答案中,則得一次分,然后把學(xué)生答案中已經(jīng)得分的選項(xiàng)去掉(用Replace函數(shù)),最后,再判斷一下學(xué)生答案的長度是否大于0,如果大于0,則表明有錯(cuò)誤選項(xiàng),得0分。

2、不管用什么方法,只要能達(dá)到目的都可以。只是在數(shù)據(jù)量特別大的情況下,我們要考慮一下程序運(yùn)行效率的問題。當(dāng)然,我們總是考慮效率問題,也不是什么壞事。

好,今天就到這里,我們下期再會(huì)!


~~~~~~End~~~~~~

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多