Difference between revisions of "MatchingProblems"

From WeBWorK_wiki
Jump to navigation Jump to search
m
Line 96: Line 96:
 
<p>
 
<p>
 
To display the list of questions and answers side-by-side, in the initialization section load the Union macros with <code>loadMacros("unionTables.pl");</code> and in the main text use
 
To display the list of questions and answers side-by-side, in the initialization section load the Union macros with <code>loadMacros("unionTables.pl");</code> and in the main text use
  +
<pre>
  +
BEGIN_TEXT
  +
\{ ColumnMatchTable($ml) \}
  +
END_TEXT
  +
</pre>
  +
or
 
<pre>
 
<pre>
 
BEGIN_TEXT
 
BEGIN_TEXT

Revision as of 13:47, 24 March 2010

Matching Problems

This shows the essential PG code to set up a matching problem.

Problem Techniques Index

PG problem file Explanation
DOCUMENT();

loadMacros(
"PG.pl",
"PGbasicmacros.pl",
"PGchoicemacros.pl",
"PGanswermacros.pl",
"unionTables.pl",
);

TEXT(beginproblem());

Initialization: All of these macros are required, except for unionTables.pl, which is only needed if side-by-side matching lists are desired (see the Main Text section for more details).

$ml = new_match_list();
$ml->qa(
"What's the answer to question 1?", "Ans 1",
"What's the answer to question 2?", "Ans 2",
"What's the answer to question 3?", "Ans 3"
);

# use pop-up-lists
$ml->rf_print_q(~~&pop_up_list_print_q);
# you may need to add more letters D=>"D", etc. 
$ml->ra_pop_up_list([No_answer=>"?",A=>"A",B=>"B",C=>"C"]);

$ml->choose(3);

# to add extra answers that show up in the
#    matching list, we would uncomment
#    (remove the leading "# " from) the two
#    lines below:
# $ml->extra("Extra Ans 1", "Extra Ans 2");
# $ml->choose_extra(2);
  
$ml->makeLast("None of the above");

Setup: We need make no changes to the description or initialization sections of the problem. In the problem set-up section, we define the matching list object by initializing it with new_match_list(), and then define a set of questions and answers with object->qa().

We can then select a subset of the matching problems to display to any given student by using the object->choose() call. Here, we select two of the three questions to display. We can also add extra answers that are displayed at the end of the answer list, as suggested by the commented out line with the call to extra(). In general, when there are extra answers (that is, when fewer than the full number of matches is chosen to display, or if extra answers are defined), we specify the number of extra answers to show with the choose_extra() call. In the commented out lines here, the choose_extra(2) indicates that two extra answers will be shown, drawn from the unused correct answers and the defined extra answers.

Finally, we can also add an extra answer or answers at the end of the matching list by calling makeLast(), as shown here. This call will add the one answer None of the above; specifying a list of answers (e.g., makeLast('All of the above','None of the above')) will add all of those, in order at the end. The correct answer can be included in the makeLast() call.

BEGIN_TEXT

\{ $ml->print_q() \}
$BR
\{ $ml->print_a() \}

END_TEXT

Main Text: We then insert the matching list questions and answers into the problem text section of the problem.

To display the list of questions and answers side-by-side, in the initialization section load the Union macros with loadMacros("unionTables.pl"); and in the main text use

BEGIN_TEXT
\{ ColumnMatchTable($ml) \}
END_TEXT

or

BEGIN_TEXT
\{ColumnTable(
$PAR.$ml->print_q.$PAR,
$ml->print_a,
indent => 0, separation => 30, valign => "TOP"
)\}
$PAR
END_TEXT

# no credit until all answers are correct
install_problem_grader(~~&std_problem_grader);
$showPartialCorrectAnswers = 0;

ANS( str_cmp( $ml->ra_correct_ans ) );

# the remainder of the code is included to
#    provide a sensible solution for the
#    student.

# the answers to the questions that were
#    asked, in order, are
@correctAns = @{$ml->ra_correct_ans};

# the following becomes necessary if we want
#    to figure out what questions were asked
#    so that we can give explanations for 
#    them.  
# it's useful to define an array of 
#    explanations that correspond to the
#    list of questions we might have asked
@explanations = (
"explanation for question 1",
"explanation for question 2",
"explanation for question 3"
);

# then find the questions that were asked
@askedQuestions = ();
foreach $q ( @{$ml->selected_q} ) {
  $i = 0;
  foreach $mq ( @{$ml->questions} ) {
    if ( $q eq $mq ) {
      push(@askedQuestions, $i);
      last;
    }
    $i++;
  } 
}
# now we know which questions were asked,
#    and can print the corresponding 
#    explanations for the solution
#SOLUTION(EV3(<<'END_SOLUTION'));
BEGIN_SOLUTION
$PAR SOLUTION $PAR
  
The answer to the first question is
$correctAns[0], because
$explanations[$askedQuestions[0]].

$PAR
The answer to the second question is
$correctAns[1], because
explanations[$askedQuestions[1]].

END_SOLUTION

ENDDOCUMENT();

Answer evaluation and solution: The correct answers are most easily graded using the old-style answer evaluator str_cmp.

We can get a list of the answers the student had to answer by looking at the array reference found from object->ra_correct_ans(). However, this doesn't tell us what questions from the list that we started were asked of the student, so to explain to the student what the correct answers were in our solution is a bit more complicated.

One way to do this is to use the list of questions that were asked to figure out which of the questions we could have asked showed up in the problem. Then we can show the corresponding explanations in the solution.

To find the answers that were asked, we go through the questions that were asked and compare them with each of the questions that we could have asked, to see which is which. In this example we then save the index of the question and use that to print out the correct explanation.

Problem Techniques Index