Function Composition: linking multiple student answers with ParserMultiAnswer.pl.

From WeBWorK_wiki
Revision as of 18:35, 7 May 2022 by Rhcpkole (talk | contribs) (Created page with "Sometimes one problem depends on multiple student responses. We deal with this by using [https://webwork.maa.org/wiki/MultiAnswerProblems parserMultiAnswer.pl]. The problem be...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Sometimes one problem depends on multiple student responses. We deal with this by using parserMultiAnswer.pl. The problem below is a typical function decomposition problem that precalc and calc students are assigned.

# Created by Nikola Kuzmanovski.
# In this problem we ask the student to decompose a function in to two functions.
# Thus the student answer depends on two inputs.
# We will use parserMultiAnswer.pl to link two answer blanks together for this
# The student is awarded full points if they provide two function that when you compose them together give the correct function.
# Otherwise the student gets 0.

########################################################################

DOCUMENT();      

loadMacros(
   "PGstandard.pl",     	# Standard macros for PG language
   "MathObjects.pl",		# Standard objects like real numbers, functions etc.
   "parserMultiAnswer.pl",	# Allows us to link multiple answer blanks into one.
);

# Print problem number and point value (weight) for the problem.
TEXT(beginproblem());

# Show which answers are correct and which ones are incorrect.
$showPartialCorrectAnswers = 1;

##############################################################
#
#  Setup
#
#


Context("Numeric");	# Contains almost everything you need for real variable calculus.

# Possible correct answers.
$firstFunc = Formula("sqrt(x)");
$secondFunc = Formula("5*x^2+3");

# The function the student needs to decompose.
$displayFunc = $firstFunc->substitute(x => $secondFunc);

##############################################################
#
#  Text
#
#

Context()->texStrings;
BEGIN_TEXT
Consider the function
\[f(x) = $displayFunc .\]
Find two functions \(g(x)\) and \(h(x)\) such that \(f(x) = g(h(x))\).
That is, find functions \(g(x)\) and \(h(x)\) such that
\[g(h(x)) = $displayFunc .\]

\(g(x) = \) \{ans_rule\}.
$BR
\(h(x) = \) \{ans_rule\}. 


END_TEXT
Context()->normalStrings;

##############################################################
#
#  Answers
#
#

# Link the two answer blanks into one answer checker.
# We will return two scores values, one for each answer blank
# Blanks answers will not be allowed.
# The answer checkers will check the type of objects given by the student before running.
$multiAnsCheck = MultiAnswer($firstFunc, $secondFunc)->with(singleResult => 0, allowBlankAnswers => 0, checkTypes => 1,
	checker => sub {
		#Get the arrays of correct answers and student answers, and get the answer hash. 
		my ($correctAns, $studentAns, $ansHash) = @_;
	
		# Get the student functions from the array of student answers.
		my ($studentFirstFunc, $studentSecondFunc) = @{$studentAns};
		
		# Array with studetn scores
		my @scores = (0.0, 0.0);
		
		# Compose the student functions.
		$studentComp = $studentFirstFunc->substitute(x => $studentSecondFunc);
		
		# Check if the function composition results in the correct function.
		if($displayFunc == $studentComp){
			$scores[0] = 1.0;
			$scores[1] = 1.0
		}
	
		return [ @scores ];
		}
);


ANS($multiAnsCheck->cmp());


ENDDOCUMENT();        

Exercises:

  1. Modify the problem above to not allow the student to enter the identity function for one of the answers.
  2. Modify the problem from the first exercise to include helpful messages to the student. You need to use the answer hash here. It is a little different compared to a previous example. Look at parserMultiAnswer.pl for details on how to do this.
  3. Modify the problem from the second exercise to give partial credit when the student flips the order of composition and include helpful messages.
  4. Modify the problem from the third exercise to minimize code repetition. Make one procedure that checks if two functions compose to the correct thing and awards points accordingly.
  5. Modify the problem from the fourth exercise to randomize the constants.
  6. Modify the problem from the fifth exercise to check for at least two more ways to assign partial credit.
  7. Modify the problem from the sixth exercise to ask for another decomposition of a function after the first one. That is, the student needs to do the same thing twice for different functions.
  8. Write an instructor solution to the problem from exercise seven.