Difference between revisions of "CustomAnswerCheckers"
(added historical tag and gave updated problem link) |
|||
(7 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{historical}} |
||
+ | |||
+ | <p style="font-size: 120%;font-weight:bold">This problem has been replaced with [https://openwebwork.github.io/pg-docs/sample-problems/problem-techniques/CustomAnswerCheckers.html a newer version of this problem]</p> |
||
<h2>Custom Answer Checkers: PG Code Snippet</h2> |
<h2>Custom Answer Checkers: PG Code Snippet</h2> |
||
Line 10: | Line 13: | ||
<p style="text-align:center;"> |
<p style="text-align:center;"> |
||
− | [[ |
+ | [[Problem_Techniques|Problem Techniques Index]] |
</p> |
</p> |
||
Line 31: | Line 34: | ||
<td style="background-color:#ccffcc;padding:7px;"> |
<td style="background-color:#ccffcc;padding:7px;"> |
||
<p> |
<p> |
||
− | <b>Initialization:</b> Standard. You might want to use [http://webwork.maa.org/pod/ |
+ | <b>Initialization:</b> Standard. You might want to use [http://webwork.maa.org/pod/pg/macros/answerCustom.html answerCustom.pl], although it is not necessary. |
</p> |
</p> |
||
</td> |
</td> |
||
Line 77: | Line 80: | ||
<td style="background-color:#eeddff;border:black 1px dashed;"> |
<td style="background-color:#eeddff;border:black 1px dashed;"> |
||
<pre> |
<pre> |
||
+ | $showPartialCorrectAnswers = 1; |
||
+ | |||
ANS( $ans->cmp( checker=>sub { |
ANS( $ans->cmp( checker=>sub { |
||
my ( $correct, $student, $ansHash ) = @_; |
my ( $correct, $student, $ansHash ) = @_; |
||
Line 87: | Line 92: | ||
<p> |
<p> |
||
<b>Answer Evaluation:</b> |
<b>Answer Evaluation:</b> |
||
− | Then when setting up the answer and solution section, we |
+ | Then when setting up the answer and solution section, we override the default answer checker in the answer. The replacement is a Perl subroutine that takes as its arguments the correct answer, student answer, and answer hash that is being processed in the answer comparison. Its return value should be 1 if the student's answer is correct, and 0 (false) otherwise. When doing the relational check, you should always put the correct answer on the left and the student answer on the right, e.g., <code>cos($correct) == cos($student)</code> should be used, but <code>cos($student) == cos($correct)</code> should not since the relational operator works from left to right which would mean that the student's answer would be determining the settings (such as domain of function evaluation) instead of the correct answer. |
</p> |
</p> |
||
<p> |
<p> |
||
Line 94: | Line 99: | ||
sub mycheck { |
sub mycheck { |
||
my ($correct, $student, $ansHash) = @_; |
my ($correct, $student, $ansHash) = @_; |
||
− | return cos($ |
+ | return cos($correct) == cos($student); |
} |
} |
||
Line 102: | Line 107: | ||
</p> |
</p> |
||
<p> |
<p> |
||
− | + | We can set an error message in the answer checker by using <code>Value->Error("message")</code>. This will set the message that is displayed to the student and exit the checker with an incorrect return value. For example: |
|
<pre> |
<pre> |
||
sub mycheck { |
sub mycheck { |
||
my ($correct, $student, $ansHash) = @_; |
my ($correct, $student, $ansHash) = @_; |
||
Value->Error("Try again") if cos($student)==sqrt(3)/2; |
Value->Error("Try again") if cos($student)==sqrt(3)/2; |
||
− | return cos($ |
+ | return cos($correct) == cos($student); |
} |
} |
||
ANS( $ans->cmp( checker=>~~&mycheck ) ); |
ANS( $ans->cmp( checker=>~~&mycheck ) ); |
||
− | |||
− | ENDDOCUMENT(); |
||
</pre> |
</pre> |
||
− | |||
+ | To see all of the keys and values in the <code>$ansHash</code> when the submit answers button is pressed, include this in your custom answer checker: |
||
+ | <pre> |
||
+ | foreach my $key ( keys %{$ansHash} ) { |
||
+ | warn "key: $key, value: $ansHash->{$key}"; |
||
+ | } |
||
+ | </pre> |
||
</p> |
</p> |
||
</td> |
</td> |
||
Line 121: | Line 129: | ||
<p style="text-align:center;"> |
<p style="text-align:center;"> |
||
− | [[ |
+ | [[Problem_Techniques|Problem Techniques Index]] |
</p> |
</p> |
||
Line 129: | Line 137: | ||
<ul> |
<ul> |
||
− | <li>POD documentation: [http://webwork.maa.org/pod/ |
+ | <li>POD documentation: [http://webwork.maa.org/pod/pg/macros/answerCustom.html answerCustom.pl]</li> |
<li>PG macro: [http://webwork.maa.org/viewvc/system/trunk/pg/macros/answerCustom.pl?view=log answerCustom.pl]</li> |
<li>PG macro: [http://webwork.maa.org/viewvc/system/trunk/pg/macros/answerCustom.pl?view=log answerCustom.pl]</li> |
||
</ul> |
</ul> |
Latest revision as of 08:17, 28 June 2023
This problem has been replaced with a newer version of this problem
Custom Answer Checkers: PG Code Snippet
This is the essential PG code to write problems that check "arbitrary" conditions on the student's answer.
You may also be interested in PeriodicAnswers
PG problem file | Explanation |
---|---|
DOCUMENT(); loadMacros( "PGstandard.pl", "MathObjects.pl", ); TEXT(beginproblem()); |
Initialization: Standard. You might want to use answerCustom.pl, although it is not necessary. |
Context("Numeric"); $ans = pi/3; $val = cos($ans); |
Setup: To set up the custom answer checker we will override the answer checker routine for the MathObject that we're using to check the answer. Thus our answer object should be of the same type (e.g., Real, Formula, etc.) as what we want the student to be entering. For example, here we're going to ask for a value of x such that cos(x)=cos($ans). Thus we set up the answer to be a real number.
In this sample, we've taken advantage of a bunch of overloading that MathObjects do: the line
Similarly, |
Context()->texStrings; BEGIN_TEXT Enter a value of \(x\) for which \(\cos(x) = $val\): \(x = \) \{ ans_rule(25) \} END_TEXT Context()->normalStrings; |
Main Text: We don't have to make any changes or additions to the text section of the file. |
$showPartialCorrectAnswers = 1; ANS( $ans->cmp( checker=>sub { my ( $correct, $student, $ansHash ) = @_; return cos($correct) == cos($student); } ) ); ENDDOCUMENT(); |
Answer Evaluation:
Then when setting up the answer and solution section, we override the default answer checker in the answer. The replacement is a Perl subroutine that takes as its arguments the correct answer, student answer, and answer hash that is being processed in the answer comparison. Its return value should be 1 if the student's answer is correct, and 0 (false) otherwise. When doing the relational check, you should always put the correct answer on the left and the student answer on the right, e.g., We could also specify the answer checker as a separate subroutine by writing sub mycheck { my ($correct, $student, $ansHash) = @_; return cos($correct) == cos($student); } ANS( $ans->cmp( checker=>~~&mycheck ) ); (The
We can set an error message in the answer checker by using sub mycheck { my ($correct, $student, $ansHash) = @_; Value->Error("Try again") if cos($student)==sqrt(3)/2; return cos($correct) == cos($student); } ANS( $ans->cmp( checker=>~~&mycheck ) ); To see all of the keys and values in the foreach my $key ( keys %{$ansHash} ) { warn "key: $key, value: $ansHash->{$key}"; } |
- POD documentation: answerCustom.pl
- PG macro: answerCustom.pl