Difference between revisions of "AlgebraicFractions"
m (10 revisions: import all default namespace pages from old wiki) 

(4 intermediate revisions by one other user not shown)  
Line 62:  Line 62:  
<pre> 
<pre> 

Context("Numeric")>variables>are(y=>"Real"); 
Context("Numeric")>variables>are(y=>"Real"); 

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

$a = random(2,8,2); 
$a = random(2,8,2); 

Line 71:  Line 72:  
$fraction = "\frac{$a y}{y$c} + \frac{$b}{$c  y} "; 
$fraction = "\frac{$a y}{y$c} + \frac{$b}{$c  y} "; 

−  $num = Formula("$a y  $b") 
+  $num = Formula("$a y  $b"); 
−  $den = Formula("y  $c") 
+  $den = Formula("y  $c"); 
$numbogus = Formula("$a*y+$b"); 
$numbogus = Formula("$a*y+$b"); 

Line 81:  Line 82:  
allowBlankAnswers => 1, 
allowBlankAnswers => 1, 

checker => sub { 
checker => sub { 

−  my ( $correct, $student, $ 
+  my ( $correct, $student, $self ) = @_; 
my ( $f1stu, $f2stu ) = @{$student}; 
my ( $f1stu, $f2stu ) = @{$student}; 

my ( $f1, $f2 ) = @{$correct}; 
my ( $f1, $f2 ) = @{$correct}; 

−  if ( 
+  if ( ( $f1==$f1stu && $f2==$f2stu)  
−  +  ($f1==$f1stu && $f2==$f2stu) ) { 

return [1,1]; 
return [1,1]; 

−  } elsif ( 
+  } elsif ( $f1==$f1stu  $f1==$f1stu) { 
return [1,0]; 
return [1,0]; 

−  } elsif 
+  } 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]; 
return [0,0]; 

−  } elsif ( 
+  } elsif ( $f2==$f2stu  $f2==$f2stu ) { 
return [0,1]; 
return [0,1]; 

−  } elsif ( 
+  } elsif ( $f1*$f2stu==$f1stu*$f2 ) { 
−  $ 
+  $self>setMessage(1,"Simplify your answer further"); 
−  $ 
+  $self>setMessage(2,"Simplify your answer further"); 
return [0,0]; 
return [0,0]; 

} else { 
} else { 

Line 130:  Line 131:  
<b>Setup:</b> 
<b>Setup:</b> 

We define a string <code>$fraction</code> that will be displayed in TeX mode. 
We define a string <code>$fraction</code> that will be displayed in TeX mode. 

−  We define MathObjects formulas <code>$num</code> and <code>$den</code> that are the correct numerator and denominator for the answer, as well as some bogus answers <code>$numbogus</code> and <code>$denbogus</code> that result from not finding a common denominator. We use <code>MultiAnswer</code> to manipulate both student answers at the same time. In <code>$multians</code> we allow for answers to be left blank, which requires 
+  We define MathObjects formulas <code>$num</code> and <code>$den</code> that are the correct numerator and denominator for the answer, as well as some bogus answers <code>$numbogus</code> and <code>$denbogus</code> that result from not finding a common denominator. We use <code>MultiAnswer</code> to manipulate both student answers at the same time. In <code>$multians</code> 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 <code>ref($f1) eq ref($f1stu)</code> to see if the correct numerator <code>$f1</code> and the student numerator <code>$f1stu</code> have the same type. We used the code <code>Context()>{error}{msg}{"Operands of '*' can't be words"} = " ";</code> 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 <code>(6y3)/(y2)</code> or <code>(36y)/(2y)</code>, since both are correct and it is not clear that one is preferable to the other, which requires that we check <code>$f1==$f1stu  $f1==$f1stu</code>. Here <code></code> is perl's "or" operator. We provide some custom answer hints by testing for bogus numerators and denominators and displaying answer messages via <code>$self>setMessage(1,"Simplify your answer further");</code>, where the 1 stands for the first answer blank. 
</p> 
</p> 

<p> 
<p> 

Line 192:  Line 193:  
<p> 
<p> 

<b>Answer Evaluation:</b> 
<b>Answer Evaluation:</b> 

−  +  We want to give students feedback on whether their numerator and denominator are correct, so we set <code>$showPartialCorrectAnswers = 1;</code>. 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). 

−  </p> 

−  <p> 

−  We added custom answer hints provided by <code>answerHints.pl</code> to let the student know when they have a correct answer that can be simplified. Alternatively, we could have used <code>parserMultiAnswer.pl</code> instead, but it would have involved writing even more lines of code. 

</p> 
</p> 

</td> 
</td> 
Latest revision as of 16:19, 14 May 2010
Algebraic Fractions in Student Answers
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.
 Example 1: (Recommended) Algebraic fractions using MultiAnswer
 Example 2: Algebraic fractions without using MultiAnswer
Example 1: (Recommended) Algebraic fractions using MultiAnswer
PG problem file  Explanation 

DOCUMENT(); loadMacros( "PGstandard.pl", "MathObjects.pl", "PGunion.pl", "parserMultiAnswer.pl", "PGcourse.pl", ); TEXT(beginproblem()); 
Initialization:
We include the macros file 
Context("Numeric")>variables>are(y=>"Real"); 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)*($cy)"); $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 # Context()>texStrings; if ($displayMode eq 'TeX') { $showfraction = "\[ $fraction = ".$multians>ans_rule(10).$multians>ans_rule(10)." \]"; } else { $showfraction = ColumnTable( "\( \displaystyle $fraction = \)", $multians>ans_rule(20).$BR.$HR.$multians>ans_rule(20), indent => 0, separation => 10, valign => "MIDDLE" ); } Context()>normalStrings; 
Setup:
We define a string
We define a modedependent string
To get fractions that have a large font size, be sure to use the LaTeX command \( \displaystyle\frac{ \displaystyle\frac{a}{b} }{ \displaystyle\frac{c}{d} } \) 
Context()>texStrings; BEGIN_TEXT Perform the indicated operations. Express your answer in reduced form. $BR $BR $BCENTER $showfraction $ECENTER END_TEXT Context()>normalStrings; 
Main Text:
Everything is as usual. Insert the fraction and answer blanks using 
$showPartialCorrectAnswers = 1; install_problem_grader(~~&std_problem_grader); ANS( $multians>cmp() ); ENDDOCUMENT(); 
Answer Evaluation:
We want to give students feedback on whether their numerator and denominator are correct, so we set 
Example 2: Algebraic fractions without using MultiAnswer
PG problem file  Explanation 

DOCUMENT(); loadMacros( "PGstandard.pl", "PGunion.pl", "MathObjects.pl", "answerHints.pl", "PGcourse.pl", ); TEXT(beginproblem()); 
Initialization:
We include the macros file 
Context("Numeric"); $fraction = "\frac{d}{dx} \left( \frac{(x^2+4)}{(x^24)^2} \right)"; $num = Formula("2 * x * (x**2 + 12)")>reduce; $den = Formula("(x**2  4)**3")>reduce; # # Display the fraction and answer blanks nicely # Context()>texStrings; if ($displayMode eq 'TeX') { $showfraction = "\[ $fraction = ".ans_rule(10).ans_rule(10)." \]"; } else { $showfraction = ColumnTable( "\( \displaystyle $fraction = \)", ans_rule(20).$BR.$HR.ans_rule(20), indent => 0, separation => 10, valign => "MIDDLE" ); } Context()>normalStrings; 
Setup:
We define a string
We define a modedependent string
To get fractions that have a large font size, be sure to use the LaTeX command \( \displaystyle\frac{ \displaystyle\frac{a}{b} }{ \displaystyle\frac{c}{d} } \) 
Context()>texStrings; BEGIN_TEXT Calculate the indicated derivative. Simplify your answer as much as possible. $BR $BR $BCENTER $showfraction $ECENTER END_TEXT Context()>normalStrings; 
Main Text:
Everything is as usual. Insert the fraction and answer blanks using 
$showPartialCorrectAnswers = 1; install_problem_grader(~~&std_problem_grader); ANS( $num>cmp() >withPostFilter(AnswerHints( Formula("2x(x^24)+4(x^2+4)(x^24)") => "Simplify your answer further.", )) ); ANS( $den>cmp() >withPostFilter(AnswerHints( Formula("(x^24)^4") => "Simplify your answer further.", )) ); ENDDOCUMENT(); 
Answer Evaluation:
If you want to give students feedback on whether their numerator and denominator are correct, set
We added custom answer hints provided by 