I have a question where students do some calculations, make a conjecture on the pattern, and then test their conjecture on a few more problems.

For the conjecture I give the students an essay blank.

I want to give more weight to the conjecture and the subsequent questions thank to the first simple calculations.

But essay_cmp() is a different type of answer checker than $num->cmp (I know they are different but I don't remember the essence of the difference.)

When I try to use WEIGHTED_ANS, no matter what weight I give the essay question, it assumes a weight of 1. The weights in the problem are nonsense right now (not the weights I eventually want, but was using for testing) I got all the calculations correct and my score should be (40 + 10 x 1)/(40 + 10 x 1 + 86) = 37% but it ended up being 98% which is (40 + 10 x 1)/(40 + 10 x 1 + 1).

A related question: can I capture students' answers? I was thinking if I captured the answer, somehow passed it essay_cmp like we pass the correct answers to cmp - but then what would be the point of that? Just wondering.

(You said not to be afraid to ask questions - I'm taking you up on that. I have learned a lot just by reading the questions/answers in the other forums on the Moodle site. Thanks again for all the help. I think I would have found my work much more daunting if I felt I was alone doing this.)

DOCUMENT(); # This should be the first executable line in the problem.

loadMacros(

"PG.pl",

"PGbasicmacros.pl",

"MathObjects.pl",

"PGanswermacros.pl",

"PGauxiliaryFunctions.pl",

"PGcomplexmacros.pl",

"PGessaymacros.pl",

"weightedGrader.pl", # Don't forget to install this later

"unionLists.pl"

);

TEXT(beginproblem());

######################################

# Setup

Context("Complex");

# create random numbers

$a[0] = non_zero_random( 11, 70, 1 );

$a[1] = non_zero_random( $a[0] + 1, $a[0] + 49, 4 );

$a[2] = non_zero_random( $a[1] + 1, $a[1] + 49, 4);

$a[3] = non_zero_random( $a[2] + 1, $a[2] + 49, 4);

# Calculate the answers: first with exponents 0 through 9

for ( $n = 0; $n <= 9; $n++ )

{

$answer[$n] = Complex("i^$n");

}

# More answers: now with 4 random integers

for ( $n = 0; $n <= 3; $n++ )

{

$answer[$n + 10] = Complex("i^($a[$n])");

}

# Convert the answer to LimitedComplex context

# so that the students have to simplify their answer.

# .... so they can't enter things like i^3

Context("LimitedComplex");

for ( $n = 0; $n <= 13; $n++ )

{

$simple_ans[$n] = Compute($answer[$n]->string);

}

BEGIN_TEXT

Part 1 of 3: Calculate the following:$PAR

(1a) \(i^0\ =\) \{ans_rule(5)\} $PAR

(1b) \(i^1 =\) \{ans_rule(5)\} $PAR

(1c) \(i^2\ =\) \{ans_rule(5)\} $PAR

(1d) \(i^3\ =\) \{ans_rule(5)\} $PAR

(1e) \(i^4\ =\) \{ans_rule(5)\} $PAR

(1f) \(i^5\ =\) \{ans_rule(5)\} $PAR

(1g) \(i^6\ =\) \{ans_rule(5)\} $PAR

(1h) \(i^7\ =\) \{ans_rule(5)\} $PAR

(1i) \(i^8\ =\) \{ans_rule(5)\} $PAR

(1j) \(i^9\ =\) \{ans_rule(5)\} $PAR

$PAR

$BR

Part 2 of 3: Describe the pattern above in a way that will help you calculate \(i^n\) for any nonnegative integer \(n\).

$PAR

Try to be as mathematical as possible.

$PAR

This part will be read and graded later. You will not get immediate feedback on this answer.

$PAR

\{ essay_box(8,60) \}

$PAR

$BR

Part 3 of 3: To test your hypothesis from Part 2, use your pattern to calculate the following. Revise your answer to Part 2 if needed based on these results.$PAR

(3a) \(i^{$a[0]}\ =\) \{ans_rule(5)\} $PAR

(3b) \(i^{$a[1]}\ =\) \{ans_rule(5)\} $PAR

(3c) \(i^{$a[2]} \ =\) \{ans_rule(5)\} $PAR

(3d) \(i^{$a[3]}\ =\) \{ans_rule(5)\} $PAR

END_TEXT

#####################################################

# End Game

# Must be done so weighted grading can be done - see macro above

install_weighted_grader();

# Make the error message something easier for the students to understand

# especially since they haven't seen e^(ai) yet

Context()->{error}{msg}

{"Exponentials can only be of the form 'e^(ai)' in this context"}

= "You must enter a number in the form a + bi";

Context()->{error}{msg}

{"The constant 'i' may appear only once in your formula"}

= "You must enter a number in the form a + bi";

# Check answers - using weights

#

# Part 1 answers

for ( $n = 0; $n <= 9; $n++ )

{

WEIGHTED_ANS( ($simple_ans[$n])->cmp, 1);

}

# Part 2 answers

WEIGHTED_ANS( essay_cmp(), 86 ); # Stores the essay box input for later grading

# Part 3 answers

for ( $n = 10; $n <= 13; $n++ )

{

WEIGHTED_ANS( ($simple_ans[$n])->cmp, 10);

}

$showPartialCorrectAnswers = 1;

ENDDOCUMENT(); # This should be the last executable line in the problem.

Just touching this so it moves up the list. Hoping for a reply. Thanks

In any case, it does appear that `essay_cmp`

doesn't work properly with the weighted grader. The reason is that answer checkers contain an object that gets used during the grading process, and `WEIGHTED_ANS()`

inserts the weight into that object so the grader can use it, but `essay_cmp()`

replaces that object with a new one, and so the weight is lost.

You can get around that by using

WEIGHTED_ANS(sub {essay_cmp()->evaluate(@_)}, 86);instead of

WEIGHTED_ANS(essay_cmp(), 86);This provides an answer checker that calls the essay checker internally and returns its value. Since this is just a perl function rather than an

`AnswerChecker`

object, the `WEIGHTED_ANS()`

treats it differently and supplies its own `AnswerChecker`

that holds onto the weight properly.
The `essay_cmp`

checker probably could be modified to retain the weights, but this should work for now.

Thanks! (and I hope you had a good trip abroad)