[system] / trunk / webwork / system / courseScripts / PGcomplexmacros.pl Repository:
ViewVC logotype

Diff of /trunk/webwork/system/courseScripts/PGcomplexmacros.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 91 Revision 321
1#!/usr/local/bin/perl 1#!/usr/local/bin/webwork-perl
2# This file is PGcomplexmacros.pl
3# This includes the subroutines for the ANS macros, that
4# is, macros allowing a more flexible answer checking
5####################################################################
6# Copyright @ 1995-2001 The WeBWorK Team
7# All Rights Reserved
8####################################################################
9#$Id$
10
11
12
13
14
15
16
17
18
19=head1 NAME
20
21 Macros for complex numbers for the PG language
22
23=head1 SYNPOSIS
24
25
26
27=head1 DESCRIPTION
28
29=cut
30
31
2BEGIN{ 32BEGIN{
3 be_strict(); 33 be_strict();
4 34
5} 35}
36sub _PGcomplexmacros_init {
37
6# export functions from Complex1. 38# export functions from Complex1.
7 39
8foreach my $f (@Complex1::EXPORT) { 40 foreach my $f (@Complex1::EXPORT) {
9 #PG_restricted_eval("\*$f = \*Complex1::$f"); # this is too clever -- 41 #PG_restricted_eval("\*$f = \*Complex1::$f"); # this is too clever --
10 # the original subroutines are destroyed 42 # the original subroutines are destroyed
11 next if $f eq 'sqrt'; #exporting the square root caused conflicts with the standard version 43 next if $f eq 'sqrt'; #exporting the square root caused conflicts with the standard version
12 # You can still use Complex1::sqrt to take square root of complex numbers 44 # You can still use Complex1::sqrt to take square root of complex numbers
13 local($main::string) = qq{ 45 next if $f eq 'log'; #exporting loq caused conflicts with the standard version
46 # You can still use Complex1::log to take square root of complex numbers
47
48 my $string = qq{
14 sub main::$f { 49 sub main::$f {
15 &Complex1::$f; 50 &Complex1::$f;
16 } 51 }
17 }; 52 };
18 PG_restricted_eval($main::string); 53 PG_restricted_eval($string);
54 }
19} 55}
20 56
21# You need to add 57# You need to add
22# sub i(); # to your problem or else to dangerousMacros.pl 58# sub i(); # to your problem or else to dangerousMacros.pl
23# in order to use expressions such as 1 +3*i; 59# in order to use expressions such as 1 +3*i;
24# Without this prototype you would have to write 1+3*i(); 60# Without this prototype you would have to write 1+3*i();
25# The prototype has to be defined at compile time, but dangerousMacros.pl is complied first. 61# The prototype has to be defined at compile time, but dangerousMacros.pl is complied first.
26#Complex1::display_format('cartesian'); 62#Complex1::display_format('cartesian');
27 63
64
65=head4 polar
66
67 Usage polar($complex_number,r_format=>"%0.3f",theta_format=>"%0.3f")
68
69 Output is text displaying the complex number in "e to the i theta" form. The
70 formats for the argument theta is determined by the option C<theta_format> and the
71 format for the modulus is determined by the C<r_format> option.
72
73=cut
74
75
28sub polar{ 76sub polar{
29 my $z = shift; 77 my $z = shift;
30 my %options = @_; 78 my %options = @_;
79 set_default_options(\%options, r_format => ':%0.3f',
80 theta_format => ':%0.3f',
81 );
31 my $r = rho($z); 82 my $r = rho($z);
32 my $theta = $z->theta; 83 my $theta = $z->theta;
33 my $r_format = ':%0.3f'; 84 my $r_format=":" . $options{r_format};
34 my $theta_format = ':%0.3f'; 85 my $theta_format = ":" . $options{theta_format});
35 $r_format=":" . $options{r_format} if defined($options{r_format});
36 $theta_format = ":" . $options{theta_format} if defined($options{theta_format});
37 "{$r$r_format} e^{i {$theta$theta_format}}"; 86 "{$r$r_format} e^{i {$theta$theta_format}}";
38 87
39} 88}
89
40sub cplx_cmp { 90sub cplx_cmp {
41 my $correctAns = shift; 91 my $correctAns = shift;
42 my %options = @_; 92 my %options = @_;
43 $correctAns = cplx($correctAns,0) unless ref($correctAns) =~/Complex/; 93 $correctAns = cplx($correctAns,0) unless ref($correctAns) =~/Complex/;
44 assign_option_aliases( \%options, 94 assign_option_aliases( \%options,
45 'reltol' => 'relTol', 95 'reltol' => 'relTol',
46 ); 96 );
47 set_default_options(\%options, 97 set_default_options(\%options,
48 'tolType' => (defined($options{tol}) ) ? 'absolute' : 'relative', 98 'tolType' => (defined($options{tol}) ) ? 'absolute' : 'relative',
49 # default mode should be relative, to obtain this tol must not be defined 99 # default mode should be relative, to obtain this tol must not be defined
50 'tol' => $main::numAbsTolDefault, 100 'tol' => $main::numAbsTolDefault,
51 'relTol' => $main::numRelPercentTolDefault, 101 'relTol' => $main::numRelPercentTolDefault,
52 'zeroLevel' => $main::numZeroLevelDefault, 102 'zeroLevel' => $main::numZeroLevelDefault,
53 'zeroLevelTol' => $main::numZeroLevelTolDefault, 103 'zeroLevelTol' => $main::numZeroLevelTolDefault,
54 'format' => $main::numFormatDefault, 104 'format' => $main::numFormatDefault,
55 'debug' => 0, 105 'debug' => 0,
56 106
57 ); 107 );
58 108
59 109
60 my $ans_eval = sub { 110 my $ans_eval = sub {
61 my $in = shift; 111 my $in = shift;
62 my $rh_ans = new AnswerHash; 112 my $rh_ans = new AnswerHash;
63 $rh_ans->{correct_ans} = $correctAns; 113 $rh_ans->{correct_ans} = $correctAns;
64 unless (defined($in) and $in =~/\S/ ) { #bail on empty answer 114 unless (defined($in) and $in =~/\S/ ) { #bail on empty answer
65 $rh_ans->{student_ans} = "error: empty"; 115 $rh_ans->{student_ans} = "error: empty";
66 return $rh_ans; 116 return $rh_ans;
67 } 117 }

Legend:
Removed from v.91  
changed lines
  Added in v.321

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9