[system] / trunk / pg / macros / parserDifferenceQuotient.pl Repository:
ViewVC logotype

Annotation of /trunk/pg/macros/parserDifferenceQuotient.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5392 - (view) (download) (as text)

1 : gage 4997
2 : dpvc 5371 loadMacros('MathObjects.pl');
3 : dpvc 2730
4 : dpvc 5392 sub _parserDifferenceQuotient_init {DifferenceQuotient::Init()}; # don't reload this file
5 : dpvc 2730
6 : gage 4997 =head1 DESCRIPTION
7 :    
8 : dpvc 5373 ######################################################################
9 :     #
10 :     # This is a Parser class that implements an answer checker for
11 :     # difference quotients as a subclass of the Formula class. The
12 :     # standard ->cmp routine will work for this. The difference quotient
13 :     # is just a special type of formula with a special variable
14 :     # for 'dx'. The checker will give an error message if the
15 :     # student's result contains a dx in the denominator, meaning it
16 :     # is not fully reduced.
17 :     #
18 :     # Use DifferenceQuotient(formula) to create a difference equation
19 :     # object. If the context has more than one variable, the last one
20 :     # alphabetically is used to form the dx. Otherwise, you can specify
21 :     # the variable used for dx as the second argument to
22 :     # DifferenceQuotient(). You could use a variable like h instead of
23 :     # dx if you prefer.
24 :     #
25 :     # Usage examples:
26 :     #
27 :     # $df = DifferenceQuotient("2x+dx");
28 :     # ANS($df->cmp);
29 :     #
30 :     # $df = DifferenceQuotient("2x+h","h");
31 :     # ANS($df->cmp);
32 :     #
33 :     # Context()->variables->are(t=>'Real',a=>'Real');
34 :     # ANS(DifferenceQuotient("-a/[t(t+dt)]","dt")->cmp);
35 :     #
36 : dpvc 2730
37 : gage 4997 =cut
38 :    
39 : dpvc 2730 package DifferenceQuotient;
40 :     our @ISA = qw(Value::Formula);
41 :    
42 : dpvc 5392 sub Init {
43 :     main::Context("Numeric"); ### FIXME: probably should require author to set this explicitly
44 :     main::PG_restricted_eval('sub DifferenceQuotient {new DifferenceQuotient(@_)}');
45 :     }
46 :    
47 : dpvc 2730 sub new {
48 :     my $self = shift; my $class = ref($self) || $self;
49 : dpvc 5059 my $current = (Value::isContext($_[0]) ? shift : $self->context);
50 :     my $formula = shift;
51 : dpvc 3867 my $dx = shift || $current->flag('diffQuotientVar') || 'd'.($current->variables->names)[-1];
52 : dpvc 2730 #
53 : dpvc 5059 # Make a copy of the context to which we add a variable for 'dx'
54 : dpvc 2730 #
55 : dpvc 5059 my $context = $current->copy;
56 : dpvc 3867 $context->variables->add($dx=>'Real') unless ($context->variables->get($dx));
57 : dpvc 5059 $q = bless $context->Package("Formula")->new($context,$formula), $class;
58 : dpvc 5392 $q->{'dx'} = $dx;
59 : dpvc 3662 return $q;
60 : dpvc 2730 }
61 :    
62 :     sub cmp_class {'a Difference Quotient'}
63 :    
64 :     sub cmp_defaults{(
65 :     shift->SUPER::cmp_defaults,
66 :     ignoreInfinity => 0,
67 :     )}
68 :    
69 :     sub cmp_postprocess {
70 : dpvc 3971 my $self = shift; my $ans = shift; my $dx = $self->{'dx'};
71 : dpvc 2730 return if $ans->{score} == 0 || $ans->{isPreview};
72 :     $main::__student_value__ = $ans->{student_value};
73 : dpvc 3971 my ($value,$err) = main::PG_restricted_eval('$__student_value__->substitute(\''.$dx.'\'=>0)->reduce');
74 : dpvc 2730 $self->cmp_Error($ans,"It looks like you didn't finish simplifying your answer")
75 :     if $err && $err =~ m/division by zero/i;
76 :     }
77 :    
78 : dpvc 5373 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9