|
|
Line 88: |
Line 88: |
| [http://hobbes.la.asu.edu/Holt/chaps-and-secs.html list of current chapter and section names] and a similar | | [http://hobbes.la.asu.edu/Holt/chaps-and-secs.html list of current chapter and section names] and a similar |
| [http://hobbes.la.asu.edu/Holt/keywords.html list of keywords]. The list of keywords should be comma separated and quoted (e.g., KEYWORDS('calculus','derivatives')). | | [http://hobbes.la.asu.edu/Holt/keywords.html list of keywords]. The list of keywords should be comma separated and quoted (e.g., KEYWORDS('calculus','derivatives')). |
| </p>
| |
| |- style=" background-color:#ddffdd;"
| |
| | <pre>
| |
| DOCUMENT();
| |
|
| |
| loadMacros(
| |
| "PGstandard.pl",
| |
| "AppletObjects.pl",
| |
| "MathObjects.pl",
| |
| );
| |
| </pre>
| |
| | <p>
| |
| This is the <strong>initialization section</strong> of the problem. The first executed line of the problem <strong>must</strong> be the <code>DOCUMENT();</code> command. Note that every command <em>must end with a semicolon</em>.
| |
| </p>
| |
| <p>
| |
| The <code>loadMacros</code> command loads information that works behind the scenes. For our purposes we can usually just load the macros shown here and not worry about things further.
| |
| </p>
| |
| |- style=" background-color:#ffffdd;"
| |
| | <pre>
| |
| # Set up problem
| |
| $qtype='limits';
| |
|
| |
| $showHint = 0;
| |
| if(time>$dueDate){
| |
| $showHint=1;
| |
| }
| |
|
| |
| $x1=random(-8,-2,1);
| |
| $x2=$x1+random(2,4,1);
| |
| $x3=$x2+random(2,3,1);
| |
| $x4=random($x3+2,7,1);
| |
| </pre>
| |
| | <p>
| |
| The GraphLimits.swf applet will accept four different question types, specified with the <code>$qtype</code> variable. These are: limits, continuity, first_derivative and second_derivative. This sample problem is set to 'limits'.
| |
| </p>
| |
| <p>
| |
| The applet has solution/hint information embedded in it. When <code>$hintState=0</code>, this information is not shown. When <code>$hintState=1</code>, this information is revealed. The <code>time</code> parameter tracks the current date and time. The conditional compares that to the due date for the problem set (in the <code>$dueDate</code> scalar variable) and sets <code>$hintState</code> to 1 if the due date has passed and leaves <code>$hintState</code> set to 0 if the assignment is not yet due.
| |
| </p>
| |
| <p>
| |
| The four variables <code>$x1</code>, <code>$x2</code>, <code>$x3</code> and <code>$x4</code> are the x-coordinates of four points on the graph that the applet will set to be a removable discontinuity, a jump discontinuity or a cusp. The order of these phenomena is random as are the y-values chosen. The x-coordinates must be between -10 and 10.
| |
| </p>
| |
| |- style=" background-color:#ccffff;"
| |
| | <pre>
| |
| #######################################
| |
| # How to use the Graph_Test applet.
| |
| # Purpose: The purpose of this
| |
| # applet is to ask graphical
| |
| # limit questions
| |
| # Use of applet: The applet
| |
| # state consists of the
| |
| # following fields:
| |
| # qType - question type: limits,
| |
| # continuity, first_derivative,
| |
| # second_derivative
| |
| # hintState - context sensitive
| |
| # help is either on or off.
| |
| # Generally turned on after
| |
| # dueDate
| |
| # problemSeed - the seed sets
| |
| # the random parameters that
| |
| # control which graph is
| |
| # chosen. If the seed is
| |
| # changed, the graph is
| |
| # changed.
| |
| #######################################
| |
| # qType = limits
| |
| # right_limits - returns a
| |
| # list of points (a,b)
| |
| # such that
| |
| # lim_{x\to a^-}f(x)=b,
| |
| # but
| |
| # lim_{x\to a^+}f(x)\= b
| |
| # left_limits - returns a
| |
| # list of points (a,b)
| |
| # such that
| |
| # lim_{x\to a^+}f(x)=b,
| |
| # but
| |
| # lim_{x\to a^-}f(x)\= b
| |
| # neither_limits - returns
| |
| # a list of points (a,b)
| |
| # such that
| |
| # lim_{x\to a^-}f(x)\=
| |
| # lim_{x\to a^+}f(x)\=
| |
| # f(a)=b
| |
| # get_intervals returns a
| |
| # list of intervals on
| |
| # which f(x) is continuous.
| |
| # get_f_of_x - given x value,
| |
| # returns f(x).
| |
| # returns NaN for x notin
| |
| # [-10,10].
| |
| # getf_list - given x value
| |
| # and string returns
| |
| # "function" - returns f(x)
| |
| # "leftlimit" - returns
| |
| # lim_{x->a^-}f(x)
| |
| # "rightlimit" - returns
| |
| # lim_{x->a^+}f(x)
| |
| # "limit" - returns
| |
| # lim_{x->a}f(x) or "DNE"
| |
| #
| |
| # What does the applet do?
| |
| # The applet draws a graph
| |
| # with jumps, a cusp and
| |
| # discontinuities
| |
| # When turned on, there is
| |
| # context sensitive help.
| |
| ################################
| |
| ############################
| |
| # Create link to applet
| |
| ############################
| |
| $appletName = "Graph_Limit";
| |
| $applet = FlashApplet(
| |
| codebase
| |
| => findAppletCodebase
| |
| ("$appletName.swf"),
| |
| appletName
| |
| => $appletName,
| |
| appletId
| |
| => $appletName,
| |
| setStateAlias
| |
| => 'setXML',
| |
| getStateAlias
| |
| => 'getXML',
| |
| setConfigAlias
| |
| => 'setConfig',
| |
| maxInitializationAttempts
| |
| => 10,
| |
| height
| |
| => '475',
| |
| width
| |
| => '425',
| |
| bgcolor
| |
| => '#e8e8e8',
| |
| debugMode
| |
| => 0,
| |
| submitActionScript
| |
| => qq{
| |
| getQE("func").value=getApplet
| |
| ("$appletName").getf_list($x1,"function");
| |
| getQE("rlimit").value=getApplet
| |
| ("$appletName").getf_list($x2,"rightlimit");
| |
| getQE("llimit").value=getApplet
| |
| ("$appletName").getf_list($x3,"leftlimit");
| |
| getQE("limit").value=getApplet
| |
| ("$appletName").getf_list($x4,"limit");
| |
| },
| |
| );
| |
|
| |
| ###################################
| |
| # Configure applet
| |
| ###################################
| |
| # configuration consists of
| |
| # hintState, question type, and
| |
| # random seed, and x-coordinates of
| |
| # four points where jumps,
| |
| # discontinuities or cusps
| |
| # occur.
| |
| $applet->configuration(qq{<xml>
| |
| <hintState>$hintState</hintState>
| |
| <qtype>limits</qtype>
| |
| <seed>$problemSeed</seed>
| |
| <xlist x1='$x1' x2='$x2'
| |
| x3='$x3' x4='$x4' /></xml>});
| |
| $applet->initialState(qq{<xml>
| |
| <hintState>$hintState</hintState>
| |
| <qtype>limits</qtype>
| |
| <seed>$problemSeed</seed>
| |
| <xlist x1='$x1' x2='$x2'
| |
| x3='$x3' x4='$x4' /></xml>});
| |
|
| |
| TEXT( MODES(TeX=>'object code',
| |
| HTML=>$applet->insertAll(
| |
| debug=>0,
| |
| includeAnswerBox=>0,
| |
| )));
| |
|
| |
| TEXT(MODES(TeX=>"", HTML=><<'END_TEXT'));
| |
| <input type="hidden"
| |
| name="func" id="func" />
| |
| <input type="hidden"
| |
| name="llimit" id="llimit" />
| |
| <input type="hidden"
| |
| name="rlimit" id="rlimit" />
| |
| <input type="hidden"
| |
| name="limit" id="limit" />
| |
| END_TEXT
| |
|
| |
| $answerString1 =
| |
| $inputs_ref->{func};
| |
| my $correctAnswer1 =
| |
| Compute("$answerString1");
| |
|
| |
| $answerString2 =
| |
| $inputs_ref->{rlimit};
| |
| my $correctAnswer2 =
| |
| Compute("$answerString2");
| |
|
| |
| $answerString3 =
| |
| $inputs_ref->{llimit};
| |
| my $correctAnswer3 =
| |
| Compute("$answerString3");
| |
|
| |
| $answerString4 =
| |
| $inputs_ref->{limit};
| |
| my $correctAnswer4 =
| |
| Compute("$answerString4");
| |
|
| |
| </pre>
| |
| | <p>
| |
| This is the <strong>Applet link section</strong> of the problem.
| |
| </p><br>
| |
| <p>
| |
| Those portions of the code that begin
| |
| the line with <code>#</code>
| |
| are comments and can be omitted or
| |
| replaced with comments appropriate
| |
| to your particular problem.
| |
| </p>
| |
| <p>You must include the section that
| |
| follows <code># Create link to
| |
| applet</code>. If you are embedding
| |
| a different applet, from the Graph_Limit
| |
| applet, put your applet name in place of
| |
| 'Graph_Limit' in the line <code>$appletName =</code>
| |
| <code> "Graph_Limit";</code>.
| |
| Enter the height of the applet
| |
| in the line <code>height => '475',</code>
| |
| in place of 475 and the width in the line
| |
| <code>width => '425',</code> in place of 425.
| |
| </p><br>
| |
| <p> The lines <code>$applet->configuration</code>
| |
| <code>(qq{<xml><hintState>$hintState</hintState></code>
| |
| <code><qtype>$qtype</qtype></code>
| |
| <code><seed>$problemSeed</seed></code>
| |
| <code><xlist x1='$x1' x2='$x2'</code>
| |
| <code> x3='$x3' x4='$x4' /></code>
| |
| <code></xml>});</code> and <code>$applet</code>
| |
| <code>->initialState</code><code>(qq{<xml></code>
| |
| <code><hintState>$hintState</hintState></code>
| |
| <code><qtype>$qtype</qtype></code><code><seed>$problemSeed</seed></code>
| |
| <code><xlist x1='$x1' x2='$x2'</code><code> x3='$x3' x4='$x4' /></code>
| |
| <code></xml>});</code> configure the applet.
| |
| The configuration of the applet is done in xml.
| |
| The hintState is set to the variable
| |
| <code>$hintState</code>, the question type is set to
| |
| <code>$qtype</code> and the problem seed is the
| |
| WeBWorK environmental variable <code>$problemSeed</code>.
| |
| The variables <code>$x1</code>, <code>$x2</code>,
| |
| <code>$x3</code> and <code>$x4</code> are also
| |
| passed to the applet.
| |
| </p><br>
| |
| <p>The code <code>qq{ </code><code>
| |
| getQE("func").value=getApplet</code>
| |
| <code>("$appletName").getf_list($x1,"function");</code><code>
| |
| getQE("rlimit").value=getApplet</code>
| |
| <code>("$appletName").getf_list($x2,"rightlimit");</code><code>
| |
| getQE("llimit").value=getApplet</code>
| |
| <code>("$appletName").getf_list($x3,"leftlimit");</code><code>
| |
| getQE("limit").value=getApplet</code>
| |
| <code>("$appletName").getf_list($x4,"limit");</code><code>
| |
| }</code>
| |
| is called when the 'Submit Answers'
| |
| button in the problem is pressed.
| |
| There is an external interface function
| |
| designed inside the applet. The function
| |
| name is 'getf_list'. These lines of code
| |
| call the function with javascript.
| |
| <code>getf_list</code>, takes two arguments:
| |
| the x-coordinate of a point, and a string
| |
| value. The string may be any of the
| |
| following four alternatives: "function",
| |
| "rightlimit", "leftlimit", "limit".
| |
| <code>getf_list</code> returns either
| |
| the value of the function at the x-coordinate,
| |
| or the specified limit. The line <code>
| |
| getQE("func").value=getApplet</code>
| |
| <code>("$appletName").getf_list($x1,"function");</code>
| |
| gets the value of the function at <code>$x1</code>
| |
| and stores this value in the hidden javascript
| |
| form field named "func".</p>
| |
| <p>
| |
| The hidden form fields are created in the code block:
| |
| <code>
| |
| TEXT(MODES(TeX=>"", HTML=><<'END_TEXT'));
| |
| <input type="hidden"</code>
| |
| <code> name="func" id="func" /></code>
| |
| <code>
| |
| <input type="hidden"</code>
| |
| <code> name="llimit" id="llimit" /></code>
| |
| <code>
| |
| <input type="hidden"</code>
| |
| <code> name="rlimit" id="rlimit" /></code>
| |
| <code>
| |
| <input type="hidden"</code>
| |
| <code> name="limit" id="limit" /></code>
| |
| <code>
| |
| END_TEXT
| |
| </code>
| |
| The line <code>TEXT(MODES(TeX=>"", HTML=><<'END_TEXT'));</code>
| |
| prevents the hidden fields from becoming part of the hard copy.
| |
| </p><br>
| |
| <p>
| |
| The applet is configured in the code line:
| |
| <code>$applet->configuration</code>
| |
| <code>(qq{<xml></code>
| |
| <code><hintState>$hintState</hintState></code>
| |
| <code><qtype>limits</qtype></code><code>
| |
| <seed>$problemSeed</seed></code>
| |
| <code><xlist x1='$x1' x2='$x2' x3='$x3' x4='$x4' /></code>
| |
| <code></xml>});</code> and the similar line below it.
| |
| The variables $hintState, $problemSeed, and $x1, $x2,
| |
| $x3, and $x4 are defined within WeBWorK and used
| |
| by the applet to set the problem up.
| |
| </p><br>
| |
| <p>
| |
| <code>TEXT( MODES(TeX=>'object code',</code>
| |
| <code> HTML=>$applet->insertAll(</code>
| |
| <code>
| |
| debug=>0,</code>
| |
| <code>
| |
| includeAnswerBox=>0,</code>
| |
| <code>
| |
| reinitialize_button=>$permissionLevel>=10,</code>
| |
| <code>
| |
| )));</code> actually embeds the applet
| |
| in the WeBWorK problem.
| |
| </p><br>
| |
| <p>When the submit button is pressed, the
| |
| hidden form fields defined in this block are
| |
| filled with information from the applet.
| |
| </p>
| |
| <p>
| |
| The data from the hidden form fields is used
| |
| in these simple perl subroutines to define the
| |
| correct answers to the four questions that are
| |
| part of this WeBWorK problem.</p><br>
| |
| <p>The WeBWorK variable $answerString1 is the
| |
| content of the hidden form field "func".
| |
| $correctAnswer1 is the solution to the first
| |
| question. The solutions for the next two
| |
| questions are defined in a similar way.
| |
| The final question also has 'DNE' as a possible
| |
| correct answer for the student to enter. The
| |
| way that the applet is designed, the left and
| |
| right limits always exist.</p>
| |
| |- style=" background-color:#ffdddd;"
| |
| | <pre>
| |
| BEGIN_TEXT
| |
|
| |
| $BR
| |
| The graph shown is for the
| |
| function \(f(x)\).
| |
| $BR Compute the following
| |
| quantities:
| |
| $BR
| |
| a)
| |
| \(f($x1)=\)
| |
| \{ans_rule(35) \}
| |
| $BR
| |
| b)
| |
| \(\lim_{x\to {$x2}^+}f(x)=\)
| |
| \{ans_rule(35) \}
| |
|
| |
| $BR
| |
| c)
| |
| \(\lim_{x\to {$x3}^-}f(x)=\)
| |
| \{ans_rule(35) \}
| |
|
| |
| $BR
| |
| d)
| |
| \(\lim_{x\to {$x4}}f(x)=\)
| |
| \{ans_rule(35) \}
| |
|
| |
| $BR
| |
| END_TEXT
| |
| Context()->normalStrings;
| |
| </pre>
| |
| | <p>
| |
| This is the <strong>text section</strong>
| |
| of the problem. The
| |
| <code>TEXT(beginproblem());</code> line
| |
| displays a header for the problem, and
| |
| the <code>Context()->texStrings</code>
| |
| line sets how formulas are displayed in the
| |
| text, and we reset this after the text section.
| |
| Everything between the <code>BEGIN_TEXT</code>
| |
| and <code>END_TEXT</code> lines (each of which
| |
| must appear alone on a line) is shown to the
| |
| student.
| |
| </p>
| |
| <p>
| |
| Mathematical equations are delimited by
| |
| <code class="tex2math_ignore">\( \)</code>
| |
| (for inline equations) or <code class="tex2math_ignore">\[ \]</code>
| |
| (for displayed equations); in these contexts inserted
| |
| text is assumed to be TeX code.
| |
| </p>
| |
| <p>
| |
| There are a number of variables that set
| |
| formatting: <code>$PAR</code> is a paragraph
| |
| break (like <code>\par</code> in TeX).
| |
| [[FormatVariableList|This page]] gives a list
| |
| of variables like this. Finally, <code>\{ \}</code>
| |
| sets off <em>code that will be executed
| |
| in the problem text</em>. Here, <code>ans_rule(35)</code>
| |
| is a function that inserts an answer blank 35
| |
| characters wide.
| |
| </p>
| |
| |- style=" background-color:#eeccff;"
| |
| | <pre>
| |
| #############################
| |
| #
| |
| # Answers
| |
| #
| |
| ## answer evaluators
| |
|
| |
| ANS( $correctAnswer1->cmp() );
| |
| #checks AnSwEr00001
| |
| ANS( $correctAnswer2->cmp() );
| |
| #checks AnSwEr00002
| |
| ANS( $correctAnswer3->cmp() );
| |
| #checks AnSwEr00003
| |
| ANS(num_cmp($correctAnswer4,
| |
| strings=>['DNE']));
| |
| #checks AnSwEr00004
| |
|
| |
|
| |
| ENDDOCUMENT();
| |
| </pre>
| |
| | <p>
| |
| This is the <strong>answer</strong>
| |
| section of the problem. The problem answer
| |
| is set by the <code>ANS( $correctAnswer1->cmp() );</code>,
| |
| <code>ANS( $correctAnswer2->cmp() );</code>,
| |
| <code>ANS( $correctAnswer3->cmp() );</code>,
| |
| and <code>ANS(num_cmp</code>
| |
| <code>($correctAnswer4,</code>
| |
| <code>strings=>['DNE']));</code> lines.
| |
| These compare the student's answer with the
| |
| answers returned from the applet. Answers 1-3
| |
| follow the same basic structure. The fourth
| |
| answer allows for either a numeric answer or
| |
| the string 'DNE' for limits that do not exist.
| |
| </p>
| |
| <p>
| |
| The solution is embedded in the applet and
| |
| becomes available when the due date has passed.
| |
| </p>
| |
| <p>
| |
| The <code>ENDDOCUMENT();</code> command is the
| |
| last command in the file.
| |
| </p> | | </p> |
| |} | | |} |
|
| |
| [[Category:Sample Problems]]
| |
| [[Category:Applets]]
| |
| [[Category:Problem_Techniques]]
| |
| [[Category:Flash Applets]]
| |