VBA100本ノック 41本目:暗算練習アプリ

この記事から得るもの

乱数の作り方。
ランダムに演算子を選んで、計算する方法。


1 今回のお題

暗算練習アプリを作成します。
・整数2個と+-*/の演算子をランダムに選ぶ
・問題をInputBoxに表示
・入力値を採点
・全10問、最後に10点満点で点数をMsgBox表示
・キャンセルや未回答は次の問題に進む
※整数の範囲については暗算できる範囲で随意
※添付GIFを参考に

f:id:bimori466:20201227213157g:plain

excel-ubara.com

2 今回のお題の意図

計算用の変数を乱数で2つ取得する。
演算子を選択する(+、ー、*、/)。
計算する
10回繰り返す。

3 回答

アプリ開発的なお題なので作成までの過程を記述していきます。

1 乱数を取得する。

0~9の乱数を取得する手順。

1 Rnd関数で0以上1未満のランダムな小数を取得する。
2 少数を10倍する。
3 Int関数で整数部分を抜き出す。

コードで表現すると、

operator = Int(Rnd * 10)

変数operatorに0~9の乱数を取得します。

2 演算子を選択する。

Select Caseで処理パターンを決めることにしました。
変数operatorが0~3で場合分けします。

'計算する数字を乱数で求める。
operatorNo1 = Int(Rnd * 100): operatorNo2 = Int(Rnd * 100)

'演算子の場合分け
Do
    operator = Int(Rnd * 10)
Loop Until operator < 4

Select Case operator
    Case Is = 0
        Anser= operatorNo1 + operatorNo2
        operatorString = operatorNo1 & " + " & operatorNo2
        
    Case Is = 1
        Anser = operatorNo1 - operatorNo2
        operatorString = operatorNo1 & " - " & operatorNo2
        
    Case Is = 2
        Anser = operatorNo1 * operatorNo2
        operatorString = operatorNo1 & " * " & operatorNo2
        
    Case Is = 3
        Anser = operatorNo1 / operatorNo2
        operatorString = operatorNo1 & " / " & operatorNo2
        
End Select

3 計算結果を受け取る

Inputbox関数を使います。
変数にInputboxに入力した値を代入する際は、Inputboxを()でくくります。

myAnser = InputBox(i & "問目" & String(2, vbCrLf) & operatorString, "暗算練習")

変数myAnserに、Inputboxに入力した値(解答)を代入します。

変数myAnser(解答)と変数Anser(答え)を比較します。

これを10回繰り返します。

私の回答

Sub ノック41本目_1()
Dim Anser(1 To 10) As Integer: Dim myAnser(1 To 10) As Integer

For i = 1 To 10

'計算する数字を乱数で求める。
operatorNo1 = Int(Rnd * 100): operatorNo2 = Int(Rnd * 100)


'演算子の場合分け----------------------------------------------------
Dim operator As Byte

Do
    operator = Int(Rnd * 10)
    
    On Error Resume Next
    
    '割り算の場合は整数になる数字を求める
    If operator = 3 Then
        If operatorNo1 Mod operatorNo2 <> 0 Then
            Do
                operatorNo1 = Int(Rnd * 100): operatorNo2 = Int(Rnd * 100)
                
            Loop Until operatorNo1 Mod operatorNo2 = 0
        End If
    End If
Loop Until operator < 4
'____________________________________________________________________


Select Case operator
    Case Is = 0
        Anser(i) = operatorNo1 + operatorNo2
        operatorString = operatorNo1 & " + " & operatorNo2
        
    Case Is = 1
        Anser(i) = operatorNo1 - operatorNo2
        operatorString = operatorNo1 & " - " & operatorNo2
        
    Case Is = 2
        Anser(i) = operatorNo1 * operatorNo2
        operatorString = operatorNo1 & " * " & operatorNo2
        
    Case Is = 3
        Anser(i) = operatorNo1 / operatorNo2
        operatorString = operatorNo1 & " / " & operatorNo2
        
End Select


myAnser(i) = InputBox(i & "問目" & String(2, vbCrLf) & operatorString, "暗算練習")

Next


'正解数確認
correctAnswerCount = 0

For j = 1 To 10
    If Anser(j) = CInt(myAnser(j)) Then
        correctAnswerCount = correctAnswerCount + 1
    End If
Next

MsgBox "10問中、" & correctAnswerCount & "問正解です。"
        
End Sub


配列変数Anser()、myAnser()に問題の答えと回答を書込みます。
正解数確認で答え合わせをします。
割り算の問題では、割り切れないものは再度乱数を取り直します。
難点としては、解答が0の場合未回答でも正解になってしまうことです(;^ω^)。

4 感想

乱数の作り方は知っているようでちゃんと理解していませんでした。
58*42とか出るんですが、暗算できません(;^ω^)。
便利な頭の体操アプリがエクセルでできてしまうんですね!


ではでは、この辺で(^^)/~~~

5 英語の勉強

演算子:operator