If you have a question where a student has to calculate a result form given data it would be nice if you did not have to give fixed ranges for the correct answer, but if the question calculated those from the given data. It would also be nice if the question would give different numbers each time a student makes the question. That is now possible with ClosedQuestion using the <matheval /> and <mathresult /> tags.
Lets start with an example:
<?xml version="1.0" encoding="UTF-8"?> <question type="fillblanks"> <matheval expression="a=random()" store="1" /> <matheval expression="b=random()" store="1" /> <matheval expression="a=round(a*0.8+0.11,2)" /> <matheval expression="b=round(b*5+2,0)" /> <matheval expression="ans=a*b" /> <matheval expression="min=min(round(ans,1),(ans-0.01))" /> <matheval expression="max=max(round(ans,1),(ans+0.01))" /> <text> <p>You have measured a concentration of <mathresult expression="a" />mg/ml in a <mathresult expression="b" />-times diluted sample.<br/> What was the concentration in the non-diluted solution?</p> <p><b>The original concentration was: <inlineChoice identifier="c" freeform="1" />g/l</b></p> </text> <hint mintries="1">That's not correct.</hint> <hint mintries="2"> The concentration in the non-diluted solution is higher than the measured concentration. </hint> <hint mintries="3"> The correct answer is: <mathresult expression="a" /> * <mathresult expression="b" /> = <mathresult expression="ans" />. </hint> <mapping correct="1"> <range inlineChoice="c" minval="min" maxval="max" /> <feedback>Very good.</feedback> </mapping> <mapping correct="0" stop="1"> <not><match inlineChoice="c" pattern="^[+-]?[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?$" /></not> <feedback>Please give a number.</feedback> </mapping> </question>
There are two new tags in this example: <matheval /> and <mathresult />.
The <matheval /> tag evaluates an expression. Matheval nodes are placed directly in the <question> node.
The <mathresult /> tag evaluates an expression AND puts the result in it's place in the text. Mathresult nodes can be placed anywhere where output text is placed, like for example in the <text> node and in <feedback> nodes
The example first generates two random numbers (between 0 and 1) and stores those in variables a and b.
store="1" in a <matheval /> means all variables up to that expression are stored and loaded the next time a student visits the question. Expressions with store="1" are only evaluated on the first visit. So in our example the values of variable a and b are stored. This makes sure that when the student "reloads" the page to give his answer, the variables stay the same.
Next the variables a and b, that have a value between 0 and 1, are changed to have the required range and precision. Variable a is now between 0.11 and 0.91 with a two decimal precision, while b is a whole number between 2 and 7.
Then the answer is calculated from a and b, and stored in the variable ans.
Lastly the minimum and maximum values that will be considered "correct" are calculated form ans. By using this trick with min() and round() we make sure that the student has to give a precision of at least one decimal, but can give more if he wants to.
In the question text the different variables are displayed using the <mathresult /> tag that evaluates an expression and displays the result.
When a <range> tag finds a non-numeric value in the minval or maxval attributes it will check of the given value is a math variable that was previously defined. If so, it will use the value of that variable.
Variable and function names have to start with a letter.
All variable and function names are case insensitive, the whole expression is converted to lower-case.
PHP Functions that are built-in:
Function aliases: