Algebraic Fraction Answer

Algebraic fraction answer requiring simplification

Complete Code

Download file: AlgebraicFractionAnswer.pg

POD for Macro Files

PG problem file

Explanation

DOCUMENT();

loadMacros(
    'PGstandard.pl', 'PGML.pl',
    'niceTables.pl', 'parserMultiAnswer.pl',
    'PGcourse.pl'
);

Preamble

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

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

do {
    $a = random(2, 8, 2);
    $b = random(3, 9, 2);
    $c = random(1, 9, 1);
} until ($a * $c != $b);

$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 ];
        }
    }
);

$frac = LayoutTable(
    [ [
        "\(\displaystyle\frac{$a y}{y-$c} + \frac{$b}{$c - y}=\)",
        LayoutTable(
            [ [ [ ans_rule(4), bottom => 1 ] ], [ ans_rule(4) ], ],
            padding => [ 0.5, 0 ],
        )
    ] ],
    padding => [ 0, 0.5 ],
    valign  => 'middle',
);

Setup

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.

The fraction answer is created using a LayoutTable from niceTables.pl. The outer LayoutTable has a single row with the mathematical expression and then another LayoutTable that formats the fraction with a bottom horizontal line. The padding is changed to improve the look of the fraction.

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

[$frac]*

END_PGML

Statement

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

ANS($multians->cmp());

Answer

It is necessary to use the answer evaluator ANS since ans_rule was used to produce answer blanks.

BEGIN_PGML_SOLUTION
Solution explanation goes here.
END_PGML_SOLUTION

ENDDOCUMENT();

Solution

A solution should be provided here.