手順 6: 減算問題の追加Step 6: Add a Subtraction Problem

このチュートリアルの第 6 部では、減算問題を追加し、次のタスクを実行する方法を説明します。In the sixth part of this tutorial, you'll add a subtraction problem and learn how to perform the following tasks:

  • 減算の値を格納します。Store the subtraction values.

  • 問題の乱数を生成します (答えが 0 ~ 100 になるようにします)。Generate random numbers for the problem (and be sure that the answer is between 0 and 100).

  • 解答を確認するメソッドを更新して、新しい減算問題についても確認するようにします。Update the method that checks the answers so that it checks the new subtraction problem too.

  • タイマーの Tick イベント ハンドラーを、残り時間がなくなったら正しい答えを表示するように更新します。Update your timer's Tick event handler so that the event handler fills in the correct answer when time runs out.

減算問題を追加するにはTo add a subtraction problem

  1. 減算問題の 2 つの整数変数をフォームの加算問題の整数変数とタイマーの間に追加します。Add two integer variables for the subtraction problem to your form, between the integer variables for the addition problem and the timer. コードは次のようになります。The code should look like the following.

    Public Class Form1
    
        ' Create a Random object called randomizer 
        ' to generate random numbers.
        Private randomizer As New Random
    
        ' These integer variables store the numbers 
        ' for the addition problem. 
        Private addend1 As Integer
        Private addend2 As Integer
    
        ' These integer variables store the numbers 
        ' for the subtraction problem. 
        Private minuend As Integer
        Private subtrahend As Integer
    
        ' This integer variable keeps track of the 
        ' remaining time.
        Private timeLeft As Integer
    
    public partial class Form1 : Form
    {
        // Create a Random object called randomizer 
        // to generate random numbers.
        Random randomizer = new Random();
    
        // These integer variables store the numbers 
        // for the addition problem. 
        int addend1;
        int addend2;
    
        // These integer variables store the numbers 
        // for the subtraction problem. 
        int minuend;
        int subtrahend;
    
        // This integer variable keeps track of the 
        // remaining time.
        int timeLeft;
    

    新しい整数変数の名前 (minuend および subtrahend) は、プログラミング用語ではありません。The names of the new integer variables—minuend and subtrahend—aren't programming terms. これらは、減算する数値 (subtrahend/減数) と減算される数値 (minuend/被減数) を表す従来の数学用語です。They're the traditional names in arithmetic for the number that's being subtracted (the subtrahend) and the number from which the subtrahend is being subtracted (the minuend). 被減数から減数を引いたものが差になります。The difference is the minuend minus the subtrahend. 変数、コントロール、コンポーネント、またはメソッドの名前を特定の名前にするようにプログラムで制限されているわけではないため、別の名前を使用することもできます。You could use other names, because your program doesn't require specific names for variables, controls, components, or methods. 名前の先頭を数字にすることはできないなどの規則に従う必要はありますが、一般に、x1、x2、x3、x4 などの名前を使用できます。You must follow rules such as not starting names with digits, but you can generally use names such as x1, x2, x3, and x4. ただし、汎用名はコードを読み取りにくくし、問題の追跡がほとんど不可能になります。However, generic names make code difficult to read and problems nearly impossible to track down. 変数名を一意で役立つようにしておくために、このチュートリアルでは乗算 (被乗数 × 乗数 = 積) および除算 (被除数 ÷ 除数 = 商) についても従来の名前を使用します。To keep variable names unique and helpful, you'll use the traditional names for multiplication (multiplicand × multiplier = product) and division (dividend ÷ divisor = quotient) later in this tutorial.

    次に、StartTheQuiz() メソッドを変更して減算問題に乱数値を提供します。Next, you'll modify the StartTheQuiz() method to provide random values for the subtraction problem.

  2. "Fill in the subtraction problem" というコメントの後に次のコードを追加します。Add the following code after the "Fill in the subtraction problem" comment.

    ''' <summary>
    ''' Start the quiz by filling in all of the problem 
    ''' values and starting the timer. 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub StartTheQuiz()
    
        ' Fill in the addition problem.
        ' Generate two random numbers to add.
        ' Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51)
        addend2 = randomizer.Next(51)
    
        ' Convert the two randomly generated numbers
        ' into strings so that they can be displayed
        ' in the label controls.
        plusLeftLabel.Text = addend1.ToString()
        plusRightLabel.Text = addend2.ToString()
    
        ' 'sum' is the name of the NumericUpDown control.
        ' This step makes sure its value is zero before
        ' adding any values to it.
        sum.Value = 0
    
        ' Fill in the subtraction problem.
        minuend = randomizer.Next(1, 101)
        subtrahend = randomizer.Next(1, minuend)
        minusLeftLabel.Text = minuend.ToString()
        minusRightLabel.Text = subtrahend.ToString()
        difference.Value = 0
    
        ' Start the timer.
        timeLeft = 30
        timeLabel.Text = "30 seconds"
        Timer1.Start()
    
    End Sub
    
    /// <summary>
    /// Start the quiz by filling in all of the problem 
    /// values and starting the timer. 
    /// </summary>
    public void StartTheQuiz()
    {
        // Fill in the addition problem.
        // Generate two random numbers to add.
        // Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51);
        addend2 = randomizer.Next(51);
    
        // Convert the two randomly generated numbers
        // into strings so that they can be displayed
        // in the label controls.
        plusLeftLabel.Text = addend1.ToString();
        plusRightLabel.Text = addend2.ToString();
    
        // 'sum' is the name of the NumericUpDown control.
        // This step makes sure its value is zero before
        // adding any values to it.
        sum.Value = 0;
    
        // Fill in the subtraction problem.
        minuend = randomizer.Next(1, 101);
        subtrahend = randomizer.Next(1, minuend);
        minusLeftLabel.Text = minuend.ToString();
        minusRightLabel.Text = subtrahend.ToString();
        difference.Value = 0;
    
        // Start the timer.
        timeLeft = 30;
        timeLabel.Text = "30 seconds"; 
        timer1.Start();
    }
    

    減算問題の解答が負にならないように、このコードでは、加算問題とは少し異なる方法で Next() クラスの Random メソッドを使用します。To prevent negative answers for the subtraction problem, this code uses the Next() method of the Random class a little differently from how the addition problem does. Next() メソッドに 2 つの値を指定した場合、最初の値以上で 2 番目の値未満の乱数が選択されます。When you give the Next() method two values, it picks a random number that's greater than or equal to the first value and less than the second one. 次のコードでは、1 ~ 100 の乱数が選択され、minuend 変数に格納されます。The following code chooses a random number from 1 through 100 and stores it in the minuend variable.

    minuend = randomizer.Next(1, 101)
    
    minuend = randomizer.Next(1, 101);
    

    複数の方法で、このチュートリアルで前に randomizer と名付けた、Next() クラスの Random メソッドを呼び出すことができます。You can call the Next() method of the Random class, which you named "randomizer" earlier in this tutorial, in multiple ways. 複数の方法で呼び出すことができるメソッドをオーバーロード メソッドと呼び、IntelliSense を使用して確認することができます。Methods that you can call in more than one way are referred to as overloaded, and you can use IntelliSense to explore them. Next() メソッドについての IntelliSense ウィンドウのツールヒントをもう一度見てください。Look again at the tooltip of the IntelliSense window for the Next() method.

    Intellisense ウィンドウのツールヒントIntellisense window tooltip
    IntelliSense ウィンドウのツールヒントIntellisense window tooltip

    ツールヒントには "(+ 2 オーバーロード)" と表示され、これは他の 2 つの方法で Next() メソッドを呼び出せることを意味します。The tooltip shows (+ 2 overload(s)), which means that you can call the Next() method in two other ways. オーバーロードには、異なる数または型の引数が含まれていて、互いに動作が若干異なります。Overloads contain different numbers or types of arguments, so that they work slightly differently from one another. たとえば、オーバーロードの 1 つは整数と文字列を受け取ることがありますが、メソッドは単一の整数引数を受け取ることがあります。For example, a method might take a single integer argument, whereas one of its overloads might take an integer and a string. 目的に基づいて適切なオーバーロードを選択します。You choose the correct overload based on what you want it to do. StartTheQuiz() メソッドにコードを追加すると、randomizer.Next( を入力するとすぐに、詳細情報が IntelliSense ウィンドウに表示されます。When you add the code to the StartTheQuiz() method, more information appears in the Intellisense window as soon as you enter randomizer.Next(. 上矢印キーおよび下矢印キーを押すと、次の図に示すように、別のオーバーロードに切り替わります。Choose the Up Arrow and Down Arrow keys to cycle through the overloads, as the following illustration shows.

    IntelliSense 内での Next() メソッドのオーバーライドOverload for Next() method in IntelliSense
    IntelliSense 内での Next() メソッドのオーバーライドOverload for Next() method in IntelliSense

    この場合、最小値と最大値を指定できるため、最後のオーバーロードを選択する必要があります。In this case, you want to choose the last overload, because you can specify minimum and maximum values.

  3. CheckTheAnswer() メソッドを、減算の答えが正しいかどうかを確認するように変更します。Modify the CheckTheAnswer() method to check for the correct subtraction answer.

    ''' <summary>
    ''' Check the answers to see if the user got everything right.
    ''' </summary>
    ''' <returns>True if the answer's correct, false otherwise.</returns>
    ''' <remarks></remarks>
    Public Function CheckTheAnswer() As Boolean
    
        If addend1 + addend2 = sum.Value AndAlso 
           minuend - subtrahend = difference.Value Then
    
            Return True
        Else
            Return False
        End If
    
    End Function
    
    /// <summary>
    /// Check the answers to see if the user got everything right.
    /// </summary>
    /// <returns>True if the answer's correct, false otherwise.</returns>
    private bool CheckTheAnswer()
    {
        if ((addend1 + addend2 == sum.Value)
            && (minuend - subtrahend == difference.Value))
            return true;
        else
            return false;
    }
    

    Visual C# では、&&logical and 演算子です。In Visual C#, && is the logical and operator. Visual Basic でこれに相当する演算子は AndAlso です。In Visual Basic, the equivalent operator is AndAlso. これらの演算子は、"addend1 と addend2 の合計が sum NumericUpDown の値と等しい場合、かつ minuend から subtrahend を引いた値が difference NumericUpDown の値と等しい場合" ということを示しています。These operators indicate "If the sum of addend1 and addend2 equals the value of the sum NumericUpDown and if minuend minus subtrahend equals the value of the difference NumericUpDown." CheckTheAnswer() メソッドは、加算問題と減算問題の両方に正解した場合にのみ true を返します。The CheckTheAnswer() method returns true only if the answers to the addition and the subtraction problems are both correct.

  4. タイマーの Tick イベント ハンドラーの最後の部分を次のコードで置き換えて、残り時間がなくなったら正しい解答を表示するようにします。Replace the last part of the timer's Tick event handler with the following code so that it fills in the correct answer when time runs out.

    Else
        ' If the user ran out of time, stop the timer, show 
        ' a MessageBox, and fill in the answers.
        Timer1.Stop()
        timeLabel.Text = "Time's up!"
        MessageBox.Show("You didn't finish in time.", "Sorry!")
        sum.Value = addend1 + addend2
        difference.Value = minuend - subtrahend
        startButton.Enabled = True
    End If
    
    else
    {
        // If the user ran out of time, stop the timer, show
        // a MessageBox, and fill in the answers.
        timer1.Stop();
        timeLabel.Text = "Time's up!";
        MessageBox.Show("You didn't finish in time.", "Sorry!");
        sum.Value = addend1 + addend2;
        difference.Value = minuend - subtrahend;
        startButton.Enabled = true;
    }
    
  5. コードを保存し、実行します。Save and run your code.

    プログラムには、次の図に示すように減算問題が含まれます。Your program includes a subtraction problem, as the following illustration shows.

    減算の問題のある計算クイズMath quiz with subtraction problem
    減算の問題のある計算クイズMath quiz with subtraction problem

続行または確認するにはTo continue or review