Parent Directory
|
Revision Log
Revision 8 - (view) (download) (as text)
| 1 : | gage | 8 | #!/usr/local/bin/webwork-perl |
| 2 : | sam | 2 | |
| 3 : | BEGIN { | ||
| 4 : | be_strict(); | ||
| 5 : | } | ||
| 6 : | |||
| 7 : | |||
| 8 : | sub CAPA_ans { | ||
| 9 : | my $ans = shift; | ||
| 10 : | my %options = @_; | ||
| 11 : | my $answer_evaluator = 0; | ||
| 12 : | |||
| 13 : | #TEXT("answerCounter =". ++$problemCounter,"$BR"); # checking whether values are reinitialized | ||
| 14 : | if (defined($options{'reltol'}) or defined($options{'tol'}) or defined($options{'unit'}) ) { | ||
| 15 : | |||
| 16 : | if (defined( $options{'unit'} ) ) { | ||
| 17 : | $ans = "$ans $options{'unit'}"; | ||
| 18 : | $answer_evaluator = numerical_compare_with_units($ans, %options); | ||
| 19 : | } else { # numerical compare: | ||
| 20 : | if (defined($options{'reltol'}) ) { #relative tolerance is given with a percent sign | ||
| 21 : | my $reltol = $options{ 'reltol' }; | ||
| 22 : | my $format = $options{'format'} if defined($options{'format'}); | ||
| 23 : | $answer_evaluator = std_num_cmp($ans,$reltol,$format); | ||
| 24 : | } elsif (defined($options{'tol'}) ) { | ||
| 25 : | my $format = $options{'format'} if defined($options{'format'}); | ||
| 26 : | $answer_evaluator = std_num_cmp_abs($ans,$options{'tol'},$format); | ||
| 27 : | } else { | ||
| 28 : | my $tol = $ans*$main::numRelPercentTolDefault; | ||
| 29 : | my $format = $options{'format'} if defined($options{'format'}); | ||
| 30 : | $answer_evaluator = std_num_cmp_abs($ans,$tol,$format); | ||
| 31 : | } | ||
| 32 : | } | ||
| 33 : | } else { | ||
| 34 : | # string comparisons | ||
| 35 : | if ( defined($options{'str'}) and $options{'str'} =~/CS/i ) { | ||
| 36 : | $answer_evaluator =std_cs_str_cmp($ans); | ||
| 37 : | } elsif ( defined($options{'str'}) and $options{'str'} =~/MC/i ) { | ||
| 38 : | $answer_evaluator = unordered_str_cmp($ans); | ||
| 39 : | } else { | ||
| 40 : | $answer_evaluator = std_str_cmp($ans); | ||
| 41 : | } | ||
| 42 : | } | ||
| 43 : | |||
| 44 : | $answer_evaluator; | ||
| 45 : | } | ||
| 46 : | |||
| 47 : | sub CAPA_import { | ||
| 48 : | my $filePath = shift; | ||
| 49 : | my %save_envir = %main::envir; | ||
| 50 : | my $r_string = read_whole_problem_file($filePath); | ||
| 51 : | |||
| 52 : | $main::envir{'probFileName'} = $filePath; | ||
| 53 : | $main::envir{'fileName'} = $filePath; | ||
| 54 : | includePGtext($r_string); # the 0 prevents a new Safe compartment from being used | ||
| 55 : | %main::envir = %save_envir; | ||
| 56 : | } | ||
| 57 : | |||
| 58 : | |||
| 59 : | |||
| 60 : | sub CAPA_map { | ||
| 61 : | my $seed = shift; | ||
| 62 : | my $array_var_ref = shift; | ||
| 63 : | my $PGrand = new PGrandom($seed); | ||
| 64 : | local $main::array_values_ref = shift; # this must be local since it must be passed to PG_restricted_eval | ||
| 65 : | my $size = @$main::array_values_ref; # get number of values | ||
| 66 : | my @array = 0..($size-1); | ||
| 67 : | my @slice = (); | ||
| 68 : | while ( @slice < $size) { | ||
| 69 : | push(@slice, splice(@array , $PGrand->random(0,$#array) , 1) ); | ||
| 70 : | } | ||
| 71 : | my $string = ""; | ||
| 72 : | my $var; | ||
| 73 : | my $i = 0; | ||
| 74 : | foreach $var (@$array_var_ref) { | ||
| 75 : | $string .= "\$$var = \$\$main::array_values_ref[ $slice[$i++]]; "; | ||
| 76 : | } | ||
| 77 : | |||
| 78 : | # it is important that PG-restriced eval can accesss the $array_values_ref | ||
| 79 : | my($val, $PG_eval_errors,$PG_full_error_report) =PG_restricted_eval($string); | ||
| 80 : | my $out = ''; | ||
| 81 : | $string =~ s/\$/\\\$/g; # protect variables for error message | ||
| 82 : | $out = "Error in MAP subroutine: $PG_eval_errors <BR>\n" . $string ." <BR>\n" if $PG_eval_errors; | ||
| 83 : | $out; | ||
| 84 : | } | ||
| 85 : | |||
| 86 : | sub compare_units { | ||
| 87 : | |||
| 88 : | |||
| 89 : | } | ||
| 90 : | |||
| 91 : | sub CAPA_hint { | ||
| 92 : | my $hint = shift; | ||
| 93 : | TEXT(hint(qq{ HINT: $hint $main::BR})); | ||
| 94 : | } | ||
| 95 : | |||
| 96 : | sub CAPA_explanation { | ||
| 97 : | TEXT(solution( qq{ $main::BR$main::BR EXPLANATION: @_ $main::BR$main::BR} )) if solution(@_); | ||
| 98 : | } | ||
| 99 : | |||
| 100 : | sub pow { | ||
| 101 : | my($base,$exponent)=@_; | ||
| 102 : | $base**$exponent; | ||
| 103 : | } | ||
| 104 : | sub CAPA_tex { | ||
| 105 : | my $tex = shift; | ||
| 106 : | # $tex =~ s|/*|\$|g; | ||
| 107 : | #$tex =~ s/\\/\\\\/g; #protect backslashes??? | ||
| 108 : | my $nontex = shift; | ||
| 109 : | &M3($tex, $nontex,$nontex); | ||
| 110 : | } | ||
| 111 : | sub CAPA_web { | ||
| 112 : | my $text = shift; | ||
| 113 : | my $tex = shift; | ||
| 114 : | my $html = shift; | ||
| 115 : | &M3($tex,"\\begin{rawhtml}$html\\end{rawhtml}",$html); | ||
| 116 : | } | ||
| 117 : | sub CAPA_html { | ||
| 118 : | my $html = shift; | ||
| 119 : | &M3("","\\begin{rawhtml}$html\\end{rawhtml}",$html); | ||
| 120 : | } | ||
| 121 : | sub var_in_tex { | ||
| 122 : | my($tex)=$_[0]; | ||
| 123 : | &M3( "$tex","$tex",""); | ||
| 124 : | } | ||
| 125 : | |||
| 126 : | |||
| 127 : | |||
| 128 : | sub isNumberQ { # determine whether the input is a number | ||
| 129 : | my $in = shift; | ||
| 130 : | $in =~ /^[\d\.\+\-Ee]+$/; | ||
| 131 : | } | ||
| 132 : | |||
| 133 : | sub choose { | ||
| 134 : | # my($in)=join(" ",@_); | ||
| 135 : | my($var)=$_[0]; | ||
| 136 : | $_[$var]; | ||
| 137 : | } | ||
| 138 : | |||
| 139 : | sub problem { | ||
| 140 : | $main::probNum; | ||
| 141 : | } | ||
| 142 : | |||
| 143 : | sub pin { | ||
| 144 : | $main::psvnNumber; | ||
| 145 : | } | ||
| 146 : | sub section { | ||
| 147 : | $main::sectionNumber; | ||
| 148 : | } | ||
| 149 : | sub name { | ||
| 150 : | $main::studentName; | ||
| 151 : | } | ||
| 152 : | sub set { | ||
| 153 : | $main::setNumber; | ||
| 154 : | } | ||
| 155 : | sub question { | ||
| 156 : | $main::probNum; | ||
| 157 : | } | ||
| 158 : | |||
| 159 : | sub due_date { | ||
| 160 : | $main::formattedDueDate; | ||
| 161 : | } | ||
| 162 : | |||
| 163 : | sub answer_date { | ||
| 164 : | $main::formattedAnswerDate; | ||
| 165 : | } | ||
| 166 : | sub open_date { | ||
| 167 : | $main::formattedOpenDate; | ||
| 168 : | } | ||
| 169 : | sub to_string { | ||
| 170 : | $_[0]; | ||
| 171 : | } | ||
| 172 : | |||
| 173 : | |||
| 174 : | sub CAPA_EV { | ||
| 175 : | |||
| 176 : | my $out = &EV3(@_); | ||
| 177 : | $out =~ s/\n\n/\n/g; # hack to prevent introduction of paragraphs in TeX?? | ||
| 178 : | # HACK TO DO THE RIGHT THING WITH DOLLAR SIGNS | ||
| 179 : | $out = ev_substring($out,"/*/*","/*/*",\&display_math_ev3); | ||
| 180 : | $out = ev_substring($out,"/*","/*",\&math_ev3); | ||
| 181 : | # TEXT($main::BR, $main::BR, $out,$main::BR,$main::BR); | ||
| 182 : | $out; | ||
| 183 : | } | ||
| 184 : | |||
| 185 : | # these are very commonly needed files | ||
| 186 : | CAPA_import("${main::CAPA_Tools}StdMacros"); | ||
| 187 : | CAPA_import("${main::CAPA_Tools}StdUnits"); | ||
| 188 : | CAPA_import("${main::CAPA_Tools}StdConst"); | ||
| 189 : | ##################### | ||
| 190 : | |||
| 191 : | $main::prob_val=""; # gets rid of spurious errors. | ||
| 192 : | $main::prob_try=""; | ||
| 193 : | |||
| 194 : | 1; |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |