Parent Directory
|
Revision Log
This file defines a DifferenceQuotient class that provides an answer checker for difference quotients. These include a variable "dx" (or a user specified one) that can be used as part of the formula, and the student must simplify the answer at least enough to remove the dx from the denominator.
1 loadMacros('Parser.pl'); 2 3 sub _parserDifferenceQuotient_init {}; # don't reload this file 4 5 ###################################################################### 6 # 7 # This is a Parser class that implements an answer checker for 8 # difference quotients as a subclass of the Formula class. The 9 # standard ->cmp routine will work for this. The difference quotient 10 # is just a special type of formula with a special variable 11 # for 'dx'. The checker will give an error message if the 12 # student's result contains a dx in the denominator, meaning it 13 # is not fully reduced. 14 # 15 # Use DifferenceQuotient(formula) to create a difference equation 16 # object. If the context has more than one variable, the first one 17 # alphabetically is used to form the dx. Otherwise, you can specify 18 # the variable used for dx as the second argument to 19 # DifferenceQuotient(). You could use a variable like h instead of 20 # dx if you prefer. 21 # 22 # Usage examples: 23 # 24 # $df = DifferenceQuotient("2x+dx"); 25 # ANS($df->cmp); 26 # 27 # $df = DifferenceQuotient("2x+h","h"); 28 # ANS($df->cmp); 29 # 30 # Context()->variables->are(t=>'Real',a=>'Real'); 31 # ANS(DifferenceQuotient("-a/t(t+dt)","dt")->cmp); 32 # 33 34 Context("Numeric"); 35 36 sub DifferenceQuotient {new DifferenceQuotient(@_)} 37 38 package DifferenceQuotient; 39 our @ISA = qw(Value::Formula); 40 41 sub new { 42 my $self = shift; my $class = ref($self) || $self; 43 my $formula = shift; 44 my $dx = shift || 'd'.($$Value::context->variables->names)[0]; 45 # 46 # Save the original context, and make a copy to which we 47 # add a variable for 'dx' 48 # 49 my $current = $$Value::context; 50 my $context = main::Context($current->copy); 51 $context->{_variables}->{pattern} = $context->{_variables}->{namePattern} = 52 $dx . '|' . $context->{_variables}->{pattern}; 53 $context->update; 54 $context->variables->add($dx=>'Real'); 55 $dx = bless $self->SUPER::new($formula), $class; 56 $dx->{isValue} = 1; $dx->{isFormula} = 1; 57 main::Context($current); # put back the original context; 58 return $dx; 59 } 60 61 sub cmp_class {'a Difference Quotient'} 62 63 sub cmp_defaults{( 64 shift->SUPER::cmp_defaults, 65 ignoreInfinity => 0, 66 )} 67 68 sub cmp_postprocess { 69 my $self = shift; my $ans = shift; 70 return if $ans->{score} == 0 || $ans->{isPreview}; 71 $main::__student_value__ = $ans->{student_value}; 72 my ($value,$err) = main::PG_restricted_eval('$__student_value__->reduce(dx=>0)'); 73 $self->cmp_Error($ans,"It looks like you didn't finish simplifying your answer") 74 if $err && $err =~ m/division by zero/i; 75 } 76
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |