WeBWorK Problems

Why this error

Why this error

by Adam Z -
Number of replies: 3

Here is the code. error is attached. Any help is appreciated. 



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

loadMacros(

   "PGstandard.pl",     # Standard macros for PG language

   "MathObjects.pl",

   "PGML.pl",

   "contextCurrency.pl",

   "PGcourse.pl",

);


TEXT(beginproblem());

Context("Currency");

$showPartialCorrectAnswers = 1;


do{$a = Currency(random(4,15,0.1));

do{$b = Currency(random(4,15,0.1));} until ($b!=$a);

$x = random(1,50,1);

$y = random(1,50,1);

$n = $x+$y;

$m = ($a*$x+$b*$y)/$n;

} until (gcd($a*$x,$b*$y) == $n);


BEGIN_PGML



Julia and her husband own a coffee shop. They experimented with mixing a City Roast Columbian coffee that cost [$a] per pound with French Roast Columbian coffee that cost [$b] per pound to make a [$n]-pound blend. Their blend should cost them [$m] per pound. How much of each type of coffee should they buy?



Julia and her husband should mix [________]{$x} pound of the city Roast Columbian coffee, and [________]{$y} pound of the French Roast Columbian coffee  to make [$n]-pound blend.


END_PGML

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


Attachment d.png
Tags:
In reply to Adam Z

Re: Why this error

by Alex Jordan -

When you do this:

gcd($a*$x,$b*$y)

You are passing two Currency objects to gcd(). It is not expecting Currency objects.

Also you are seeing evidence of how many times your code is looping.

In reply to Alex Jordan

Re: Why this error

by Adam Z -

Thanks Alex. This worked out, I agree about the loop . I do not have other solutions.

In reply to Adam Z

Re: Why this error

by Alex Jordan -
I think that you are trying to get everything to have exact values that have only one or two decimal places, and I understand why that would be nice. But you could allow for some of these things to have more decimal places, and then rely on rounding for presentation and error tolerance for answer checking.

So you could have:

$a = Currency(random(4,15,0.1));
do{$b = Currency(random(4,15,0.1));} until ($b!=$a);
$x = random(1,50,1);
$y = random(1,50,1);
$n = $x+$y;
$m = ($a*$x+$b*$y)/$n;

And yes, $m might end up not having a short decimal presentation. But $m is a Currency object, so already it will display only down to the cent. So in the exercise statement that you have, it will not show a distracting number of decimal places:

Julia and her husband own a coffee shop. They experimented with mixing a City Roast Colombian coffee that cost [$a] per pound with French Roast Colombian coffee that cost [$b] per pound to make a [$n]-pound blend. Their blend should cost them [$m] per pound. How much of each type of coffee should they buy?

Julia and her husband should mix [________]{$x} pound of the city Roast Colombian coffee, and [________]{$y} pound of the French Roast Colombian coffee to make [$n]-pound blend.

Then with answer checking, the student may do work using that rounded value of $m, and so they might not find $x and $y exactly as they were originally crated. But the error tolerance should make that OK. As long as they enter something within ±0.1% of the actual values of $x and $y, they will get credit under the default error tolerance. If you find that in practice that error tolerance is not enough, you can change it.


Alternatively, you can get those conditions you would like with some careful randomization. I came up with the following, but I would not recommend this approach unless you have time to work these things out carefully:

$a = Currency(random(4,15,0.1));
$x = random(20,40,1);
$y = $x + list_random(-10..-5,5..10);
$m = ($a + $y*random(1,5,1)/100);
$b = $m + ($m - $a)*$x/$y;
$n = $x + $y;

This leaves $x and $y distinct integers that are not too close to each other.

And it leaves $a < $m < $b with each of them Currency objects. And they each have no more than two decimal places. This is true for $b because $y divides into ($m - $a) leaving something with at most 2 decimal places.

The relation m = (ax + by)/(x + y) is true because $b is explicitly defined that way at the end.