From WeBWorK_wiki
Revision as of 12:06, 13 June 2015 by Paultpearson (talk | contribs) (PGML example link)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Answers that are Algebraic Fractions that Require Simplification

Click to enlarge

This code shows how to format questions in which the answer is an algebraic fraction that has separate answer blanks for the numerator and denominator that are stacked on top of each other like a fraction. Stacking the answer blanks is nice formatting that simplifies how to ask students for the parts of a fraction separately. In addition, having two separate answer blanks is useful for requiring students to simplify their answer as much as possible.

Templates by Subject Area

PG problem file Explanation

Problem tagging data

Problem tagging:




Initialization: We include the macros file to be able to display the answer boxes on top of each other (as a fraction).

Context()->{error}{msg}{"Operands of '*' can't be words"} = " ";

$a = random(2,8,2);
$b = random(3,9,2);
$c = random(1,9,1);

while ($c == $b/$a) { $c = random(1,9,1); } 

$fraction = "\frac{$a y}{y-$c} + \frac{$b}{$c - y} ";

$num = Formula("$a y - $b");
$den = Formula("y - $c");

$numbogus = Formula("$a*y+$b");
$denbogus = Formula("(y-$c)*($c-y)");

$multians = MultiAnswer($num, $den)->with(
  singleResult => 0,
  allowBlankAnswers => 1,
  checker => sub {
      my ( $correct, $student, $self ) = @_;
      my ( $f1stu, $f2stu ) = @{$student};
      my ( $f1, $f2 ) = @{$correct};
      if ( ( $f1==$f1stu &&  $f2==$f2stu) || 
           (-$f1==$f1stu && -$f2==$f2stu) ) {
          return [1,1];
      } elsif ( $f1==$f1stu || -$f1==$f1stu) {
          return [1,0];
      } elsif ( ($numbogus==$f1stu || -$numbogus==$f1stu) ||
                ($denbogus==$f2stu || -$denbogus==$f2stu) ) {
          $self->setMessage(1,"Find a common denominator first");
          $self->setMessage(2,"Find a common denominator first");
          return [0,0];
      } elsif ( $f2==$f2stu || -$f2==$f2stu ) {
          return [0,1];
      } elsif ( $f1*$f2stu==$f1stu*$f2 ) {
          $self->setMessage(1,"Simplify your answer further");
          $self->setMessage(2,"Simplify your answer further");
          return [0,0];
      } else {
          return [0,0];

#  Display the fraction and answer blanks nicely
if ($displayMode eq 'TeX') {
  $showfraction =
  "\[ $fraction = ".$multians->ans_rule(10).$multians->ans_rule(10)." \]";
} else {
  $showfraction =
  "\( \displaystyle $fraction = \)",
  indent => 0, separation => 10, valign => "MIDDLE"

Setup: We define a string $fraction that will be displayed in TeX mode. We define MathObjects formulas $num and $den that are the correct numerator and denominator for the answer, as well as some bogus answers $numbogus and $denbogus that result from not finding a common denominator. We use MultiAnswer to manipulate both student answers at the same time. In $multians we allow for answers to be left blank, which requires one of two things: either we disable the error message or do type checking on the students input by using ref($f1) eq ref($f1stu) to see if the correct numerator $f1 and the student numerator $f1stu have the same type. We used the code Context()->{error}{msg}{"Operands of '*' can't be words"} = " "; to disable the error message because this method allows the "Simplify your answer" feature to work more reliably. We also allow for the student to enter the fraction as either (6y-3)/(y-2) or (3-6y)/(2-y), since both are correct and it is not clear that one is preferable to the other, which requires that we check $f1==$f1stu || -$f1==$f1stu. Here || is perl's "or" operator. We provide some custom answer hints by testing for bogus numerators and denominators and displaying answer messages via $self->setMessage(1,"Simplify your answer further");, where the 1 stands for the first answer blank.

We define a mode-dependent string $showfraction that will be the nicely formatted fraction and answer blanks. Notice that each answer rule must be a method of the $multians object via the code $multians->ans_rule(20). To display the fraction nicely in TeX mode, we use displaystyle math

\[ ... \]
and append two concatenated answer blanks to the string $fraction. In other modes (such as html), we use a ColumnTable from macros to display the answer blanks as a fraction.

To get fractions that have a large font size, be sure to use the LaTeX command

\( \displaystyle \frac{a}{b} \)

For fractions over fractions (a/b) / (c/d), to keep the font size large use the LaTeX commands


Perform the indicated operations.
Express your answer in reduced form.

Main Text: Everything is as usual. Insert the fraction and answer blanks using $showfraction.

$showPartialCorrectAnswers = 1;


ANS( $multians->cmp() );

Answer Evaluation: We want to give students feedback on whether their numerator and denominator are correct, so we set $showPartialCorrectAnswers = 1;. If you want to withhold credit until both answer blanks are correct, use the standard problem grader, otherwise omit it to use the default (average problem grader).

Solution explanation goes here.

COMMENT('MathObject version.');



Templates by Subject Area