[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 3662 - (view) (download) (as text)

1 : dpvc 2730 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 : dpvc 3661 # ANS(DifferenceQuotient("-a/[t(t+dt)]","dt")->cmp);
32 : dpvc 2730 #
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 : dpvc 3662 $q = bless $self->SUPER::new($formula), $class;
56 :     $q->{isValue} = 1; $q->{isFormula} = 1; $q->{dx} = $dx;
57 : dpvc 2730 main::Context($current); # put back the original context;
58 : dpvc 3662 return $q;
59 : dpvc 2730 }
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 : dpvc 3662 my $self = shift; my $ans = shift; my $dx = $self->{dx};
70 : dpvc 2730 return if $ans->{score} == 0 || $ans->{isPreview};
71 :     $main::__student_value__ = $ans->{student_value};
72 : dpvc 3662 my ($value,$err) = main::PG_restricted_eval('$__student_value__->substitute('.$dx.'=>0)->reduce');
73 : dpvc 2730 $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