我正在为一堂课写一些儿童的数学教育软件。
我将尝试向不同技能水平的学生提出问题,并以有趣的方式随机生成不同类型的数学问题。
使用基于计算机的数学软件的一个挫败感是它的刚性。如果有人参加过在线数学课程,那么你就会知道所有关于参加在线测验并将正确答案抛出的挫败感,因为你的问题形式不正确,或者出现一些奇怪的间距问题。
所以,我原本以为,“我知道!我会在答案框上使用表达式解析器,这样我就可以评估他们输入的内容,即使它不是同一种形式,我也会能够检查它是否是相同的答案。“所以我启动了IDE并开始实现Shunting Yard Algorithm.
这将解决它不能以最小的形式和其他问题采取分数的问题。
然而,然后,它让我觉得一个棘手的学生只能将大部分问题输入答案框,我的表达式解析器会尽职地解析并评估它到正确的答案!
那么,我应该在这个实例中不使用表达式解析器吗?我是否真的必须生成一种形式的答案并进行字符串比较?
答案 0 :(得分:5)
一种可能的解决方案是注意表达式评估程序采用多少步骤来评估问题的原始表达式,并将其与最佳答案进行比较。如果差异太大,那么问题就不会减少,你可以建议学生继续学习。
如果学生提出比你自己的“最佳”定义更好的答案,不要感到惊讶!我是几个班级的助教/评分员,最聪明的学生经常在他们的问题集上找到优于教授提供的答案。
答案 1 :(得分:2)
对于您正在寻找确切答案的简单问题,然后删除空格并进行字符串比较是合理的。
对于更高级的问题,您可能会使用Shunting Yard算法(或类似的),但可能会对其进行参数化,以便您可以打开/关闭减少以防止这个棘手的学生。您会注意到“简单”答案仍然可以使用解析器,但您将禁用所有缩减。
例如,在分组问题上,您将禁用“/”减少。
答案 2 :(得分:1)
这是一个很好的问题。
如果你正在编写一个表达系统和一个评估/转换/等价引擎(某个地方没有可用的那个?我几乎100%确定某个地方有一个开源的),那么它更像是一个教育/代数问题:学生的答案是代数上更接近原始表达式或预期表达式。
我不确定如何回答这个问题,但只是一个想法(不一定是实用的):也许您的评估引擎可以将转换步骤计算为等价。如果答案所采取的步骤比原始步骤少,那可能没问题。如果它太接近原版,则不是。
答案 3 :(得分:0)
您可以使用表达式解析器,但对答案中允许的表达式的复杂性应用限制。
例如,如果目标是减少(4/5)*(1/2)并且您想要允许(2/5)或(4/10),那么您可以限制允许答案的集合表达式采用格式(x / y)并且也计算正确数字的表达式。也许你也会允许“0.4”,即形式(x)的表达式,其评估正确的数字。
如果您手动对问题进行评分,这正是您(隐式)要做的事情 - 您将寻找一个正确的答案,但也属于可接受的类。
答案 4 :(得分:0)
在数学评估软件中执行此操作的常用方法是允许问题设置者指定正确答案中不允许的表达式/字符串。
如果您对现有软件感兴趣,可以使用开源堆栈http://www.stack.bham.ac.uk/(或各种商业选项,如MapleTA)。我怀疑Stack会遇到你遇到的大多数问题,所以即使你不想使用它,看看它如何处理事情也可能具有教育意义。