Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

関数タイプの受講者の解答に対する評価の作成

受講者の解答をテストするための評価は、関数タイプの問題よりもスクリプトタイプの問題のほうがより複雑になります。評価の作成を支援するために、MATLAB® Grader™ には、変数の等価性を評価したり、特定のキーワードや関数の有無を評価したりする組み込み関数が用意されています。

次の考え方や手法は、評価の作成に役立ちます。

例: コーディング問題 "Write a function to calculate the normalized sinc" (正規化された sinc を計算する関数の記述) の評価で評価の例をいくつか確認できます。

受講者の解答の評価に影響する要素については、受講者の解答のテストを参照してください。

MATLAB Grader の組み込み関数

関数タイプの解答の場合、変数の等価性、キーワードまたは関数の存在をチェックする以下の組み込み関数を使用できます。

  • assessVariableEqual — 受講者の解答の変数が、指定された値と許容誤差の範囲内で等しいかどうかをチェックします。許容誤差は数値データ型にのみ適用されます。

  • assessFunctionPresence — 受講者の解答に、特定の関数またはキーワードが存在するかどうかをチェックします。

    このオプションは、次のようにして単一のテストとしても利用できます。[テスト タイプ] メニューから [関数またはキーワードが存在する] を選択し、指定した関数名またはキーワードと、不正解に対して表示する追加のフィードバックを指定します。

  • assessFunctionAbsence — 受講者の解答に、特定の関数またはキーワードが存在しないことを確認します。

    このオプションは、次のようにして単一のテストとしても利用できます。[テスト タイプ] メニューから [関数またはキーワードが存在しない] を選択し、指定した関数名またはキーワードと、不正解に対して表示する追加のフィードバックを指定します。

独自の評価コードを作成する場合は、MATLAB コード テスト タイプの組み込み関数を使用して提出物を評価し、不正解に対して表示する追加のフィードバックを提供することもできます。

実行モデル

実行モデルは、MATLAB Grader で評価がどのように実行され、評価結果がどのようにマークされるかを説明します。

  • 通常、関数タイプの解答用に作成する各評価には、受講者の解答への呼び出しが含まれます。関数への入力を提供して、返された値を評価できます。また、模範解答に対して呼び出しを行って、その出力を受講者の解答の出力と比較することもできます。

  • 各評価は、他の評価とは独立して順番に実行されます。1 つの評価で不合格となった場合でも、後続の評価は実行されます。

  • ある評価で作成された変数を、次の評価で使用することはできません。各評価で必要な変数をすべて定義します。

  • エラーが返されない場合、評価は正解としてマークされます。エラーがある場合、評価は不正解としてマークされます。

  • 評価がプレテストの場合、解答が評価に合格したか不合格となったかに関わらず、受講者はテスト名の左側にある矢印をクリックして、評価コードを表示できます。

メモ

assessVariableEqual によって生成される既定のエラー メッセージには、テスト対象の変数名が含まれます。関数タイプの問題の場合、この変数は受講者ではなく、講師によって評価スクリプト内で作成されます。関数宣言で定義された出力変数など、受講者が認識できる意味のある変数名を使用します。

コーディング問題に対する各評価は、解答と評価の実行時間に影響を与えます。詳細については、提出の制限時間を参照してください。

評価における受講者の解答の呼び出し

関数タイプの問題は、特定の入力を使用して受講者の解答を呼び出し、出力をテストすることによって評価します。このセクションでは、[My first FUNCTION problem] のコード例を使用します。このコードは、MATLAB Grader ホーム ページの [MATLAB Grader の問題カタログ][Getting Started with MATLAB Grader] にあります。

[My first FUNCTION problem] の例では、受講者は華氏温度を摂氏温度に変換する関数を記述します。評価では、まず正の温度を定義し、その入力を使用して受講者の関数を呼び出し、その出力を新しい変数に取得します。

以下の評価では、MATLAB コードを使用して、受講者が入力した値が正の温度に対して正しいかどうかをテストしています。

% Create test input
temp = 78;

% Run student solution.
tempC = tempF2C(temp); 

次に、この評価に出力変数の値が正しいかどうかをテストする別のコードを追加できます。

模範解答を使用した受講者の解答の評価

受講者の解答を模範解答と比較するには、同じ入力で模範関数を呼び出します。

模範解答に対する呼び出しには、構文 reference.myFunction を使用します。myFunction を、模範解答で作成した関数の名前に置き換えます。

[My first FUNCTION problem] の例では、同じ入力で模範解答が呼び出され、その出力が新しい変数に取得されます。最後に、assessVAriableEqual を使用して、受講者の解答の出力を模範解答の出力と比較します。

模範解答

function tempC = tempF2C(tempF)
    tempC = (tempF-32)/1.8;
end

評価

% Run reference solution.
refT = reference.tempF2C(temp); 

% Compare.
assessVariableEqual('tempC', refT);

例: コーディング問題 "Write a function to calculate the normalized sinc" (正規化された sinc を計算する関数の記述) の評価

MATLAB Grader の問題カタログの例 [Write a function to calculate the normalized sinc] では、受講者は MATLAB の組み込みの sinc 関数を使用せずに入力値の sinc を返す関数を作成するように指示されます。

評価 1. sinc の式が正しく実装されているかをテストする

最初の評価では、sinc の式が正しく実装されているかどうかを確認します。受講者が解答で組み込み sinc 関数を使用した場合、講師は既定のエラー メッセージに次のフィードバックを追加します。"Implement the sinc function yourself. Do not use the built-in function." (sinc 関数は自分で実装します。組み込み関数を使用しないでください。)

% Create a random input. 
% Make sure not to have pi, 2pi, 3pi, etc where sin(pi*x) = 0
x = 0.25*randi([1 3]);

% Run learner solution.
y = normsinc(x);

% Run reference solution
yReference = reference.normsinc(x); 

% Compare.
assessVariableEqual('y', yReference);
assessFunctionAbsence('sinc', 'FileName', 'normsinc.m', 'Feedback',...
    'Implement the sinc function yourself. Do not use the built-in function.')

受講者の解答が評価で不合格となった場合、この評価に次のような追加のフィードバックが表示されます。

Double check the equation for sinc. In particular, pay attention to the order of operations and need for parenthesis.

0 が正しく処理されているかをテストする

2 番目の評価では、入力が 0 の場合に受講者の関数が正しい出力を返すかどうかを確認します。

x = 0
% Run learner solution.
y = normsinc(x); 

% Run reference solution.
yReference = reference.normsinc(x); 

% Compare.
assessVariableEqual('y', yReference);

受講者の解答が評価で不合格となった場合、講師がこのような追加のフィードバックを提供します。

Test your function using 0 as input, the result should be 1. Try using an if-else statement or logical indexing to achieve this.

解答が行列で機能するかをテストする

3 番目の評価では、受講者の関数が行列で機能するかどうかを確認します。

% In this test we'll create a random non-square matrix
% Use randi to set the dimensions
dim1 = randi([2 5]);
dim2 = randi([6 9]);
% Create a random matrix with values between [-3 3]
x = 6*rand(dim1,dim2) - 3;
% Add a 0 to the x to see that 0 students still meet requirement with a matrix
x(3) = 0;
 
% Run learner solution.
y = normsinc(x);
 
% Run reference solution
yReference = reference.normsinc(x); 
 
% Compare.
assessVariableEqual('y', yReference);

受講者の解答が不正解の場合、講師が次のような追加のフィードバックを提供します。

What does your error message say:
If you receive an error about the wrong size, make sure to use the element-wise operator ./ in your calculation. 
If you receive a wrong value error, make sure any element of a input matrix that is 0 returns 1 for the corresponding element in your output.

関数問題の例の試行

このトピックの最初の例は、[Getting Started with MATLAB Grader][MATLAB Grader の問題カタログ] にある [My first FUNCTION problem] のものを使用しています。

このトピックの 2 番目の例は、[Getting Started with MATLAB Grader][MATLAB Grader の問題カタログ] にある [Write a function to calculate the normalized sinc] からのものを使用しています。

受講者として問題を解いてみるには、問題を開いて [受講者の環境でのプレビュー] をクリックします。解答ボックスにコードを入力し、[提出] をクリックして評価を実行します (提出は実際には記録されません)。正しいコードと間違ったコードの両方を試して、フィードバックを確認します。

関連するトピック