加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Moodle多项选择题评分——全答对才给分

(2011-05-22 18:21:22)
标签:

moodle

多项选择题

少选

漏选

错选

分类: 开源与教育
    Moodle的quiz模块支持各种题型,其中的多项选择题是以设置选项的“成绩”字段来统计的。如果在答题时选择了部分正确答案,该题还是会得分。有网友提出在设置题目时,给错误的答案的“成绩”字须设置相应的负值,来达到目的,比如A:50%,B:50%,C:-50%,D:-50%;这样貌似学习者只要都做选择,即可达到目的,这个前提要在学习者都将对与错的答案都选择时才能做抵销,没有解决少选,错选问题。
    官网上虽有安装新的插件来实现这种需求的问题类型(附于后),但要新建问题,对于题库中已存在的问题,或是通过其它格式(如gift)导入的问题,似乎没看到有转换的方法,可能在官网讨论区中有其解决方法。如果要在正式场合使用,请按官网上的路子走比较好一些。
    最后决定直接到代码里去改动。用记事本给question_multichoice_qtype类的grade_responses方法补上了几句代码,达到Moodle测试中多项选择题多选、少选、错选、不选都不得分的问题。简记于此:
文件路径:moodle/question/type/multichoice/questiontype.php

    function grade_responses(&$question, &$state, $cmoptions) {
        $state->raw_grade = 0;       
        if($question->options->single) {
            $response = reset($state->responses);
            if ($response) {
                $state->raw_grade = $question->options->answers[$response]->fraction;
            }
        } else {               
                //lltang:先计算该题正确答案的个数
                $tmc2=0;
                foreach ($question->options->answers as $answer) {
                    if($answer->fraction>0)$tmc2++;
                }
                $tmc=0;
                //end lltang
               
            foreach ($state->responses as $response) {
               
                if ($response) {
                    $state->raw_grade += $question->options->answers[$response]->fraction;
                   
                    //lltang:考生选择的答案中正确答案的个数
                    if($question->options->answers[$response]->fraction>0)$tmc++;
                    else $tmc=-1;
                    //end lltang
                }
            }
           
            //lltang:如果考生选择的正确答案个数与问题的正确答案个数不符,即给0分。
            if($tmc!=$tmc2)$state->raw_grade=0;
            //end lltang
        }
                       
               
                       
        // Make sure we don't assign negative or too high marks
        $state->raw_grade = min(max((float) $state->raw_grade,
            0.0), 1.0) * $question->maxgrade;
                                               
        // Apply the penalty for this attempt
        $state->penalty = $question->penalty * $question->maxgrade;

        // mark the state as graded
        $state->event = ($state->event ==  QUESTION_EVENTCLOSE) ? QUESTION_EVENTCLOSEANDGRADE : QUESTION_EVENTGRADE;

        return true;
    }

小记:虽说Moodle2在代码上做了大幅度的改动,但感觉还是很乱,不够清晰。

简单测试了一回,截图如下:
题目:
http://s16/middle/67532f7cga3d7b4616cbf&690

全答对:
http://s3/middle/67532f7cga3d7b889bdb2&690

错选:
http://s13/middle/67532f7cga3d7c09a438c&690

漏选
http://s5/middle/67532f7cga3d7caa358e4&690


官网上提供的解决方法:
这个问题在官网上Bug是:http://tracker.moodle.org/browse/CONTRIB/component/10704
解决方法是添加新的问题类型,叫做:All-or-nothing multiple choice,1.9之后的版本有效。地址:http://moodle.org/mod/data/view.php?d=13&rid=4014&filter=1
主要也是修改了question_multichoice_qtype类中的compare_responses,get_correct_responses,grade_responses这几个方法。

使用过程如下:
1、下载压缩包multichoiceset.zip。地址:http://download.moodle.org/plugins/question/type/multichoiceset.zip
(Moodle2.0,19.6k;moodle1.9的另见下载:http://download.moodle.org/plugins19/question/type/multichoiceset.zip
2、将该压缩文件解压到Moodle安装目录下的question/type
3、管理员登录,进行插件的更新。
4、进入课程的题库中新建试题,可以发现有一种新的类型,叫做“All-or-Nothing Multiple Choice”。新建这种类型的问题。
5、这个问题的内容与多项选择题问题填写的内容是基本一样的,不同之处在于Grade处不是填百分比了,而只有正确/错误(incorrect/Correct)的选择。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有