Parent Directory
|
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 |