滝の音

滝の音

名こそ流れてなお聞こえけれ

計算プリントを自動生成する その4_2 いろいろな足し算(本番)

はじめに

前回、その4_1で関数を変更、追加しました。
今回はいよいよ「いろいろな足し算」を実装します。

足し算の種類

  1. 繰り上がりなしの1ケタどうしの足し算
  2. 繰り上がりありの1ケタどうしの足し算
  3. 制約なしの1ケタどうしの足し算
  4. 繰り上がりなしの2ケタ+1ケタ
  5. 繰り上がりありの2ケタ+1ケタ
  6. 繰り上がりなしの2ケタ+2ケタ
  7. 1の位が繰り上がる2ケタ+2ケタ

1と3はすでに作っているので、今回作るのはそれ以外です。

自動化してみる

levelと難度の対応

コードを書く前に変数「level」と足し算の種類を対応付けましょう。

level 足し算の種類
1 繰り上がりなし、1ケタ+1ケタ
2 繰り上がりあり、1ケタ+1ケタ
3 制約なし、2ケタ+1ケタ
4 繰り上がりなし、2ケタ+1ケタ
5 繰り上がりあり、2ケタ+1ケタ
6 繰り上がりなし、2ケタ+2ケタ
7 1の位繰り上がり、2ケタ+2ケタ

Int_Addition_Num_Selectを書く

前回のコードを書き換えます。
具体的にはSelect Caseを追加してlevelによるnumの設定の変更を実装します。

Function Int_Addition_Num_Select(level) As Integer()
'-------------------
'変数の定義
'-------------------
 Dim num() As Integer   '計算式に入れる数値
 Dim N() As Integer     'num1を作るための変数
 Dim M() As Integer     'num2を作るための変数
 Dim i As Integer       '繰り返しの制御変数
'-------------------
'numの数を決定
'-------------------
 ReDim num(1 To 3)
 ReDim N(1 To 2)
 ReDim M(1 To 2)
 
'-------------------
'N,Mの数値を決定
'-------------------
 Select Case level
    Case Is = 1             '1_1繰り上がりなし
        N(1) = Rnd_Num(1, 8)
        M(1) = Rnd_Num(1, 9 - N(1))
    Case Is = 2             '1_1繰り上がりあり
        N(1) = Rnd_Num(1, 9)
        M(1) = Rnd_Num(10 - N(1), 9)
    Case Is = 3             '1_1制約なし
        N(1) = Rnd_Num(1, 9)
        M(2) = Rnd_Num(1, 9)
        
    Case Is = 4             '2_1繰り上がりなし
        N(1) = Rnd_Num(0, 8)
        N(2) = Rnd_Num(1, 9)
        M(1) = Rnd_Num(1, 9 - N(1))
    Case Is = 5             '2_1繰り上がりあり
        N(1) = Rnd_Num(1, 9)
        N(2) = Rnd_Num(1, 8)
        M(1) = Rnd_Num(10 - N(1), 9)
        
    Case Is = 6             '2_2繰り上がりなし
        N(1) = Rnd_Num(0, 8)
        N(2) = Rnd_Num(1, 8)
        M(1) = Rnd_Num(0, 9 - N(1))
        M(2) = Rnd_Num(1, 9 - N(2))
        
    Case Is = 7             '2_2繰り上がり1
        N(1) = Rnd_Num(1, 9)
        N(2) = Rnd_Num(1, 7)
        M(1) = Rnd_Num(1, 9 - N(1))
        M(2) = Rnd_Num(1, 9 - N(2))
 End Select
 
'---------------------
'numの値の決定
'---------------------
 For i = 1 To 2
    num(1) = num(1) + N(i) * 10 ^ (i - 1)
    num(2) = num(2) + M(i) * 10 ^ (i - 1)
 Next

 num(3) = num(1) + num(2)
 
 Int_Addition_Num_Select = num
 
End Function

ふぅ。
この部分を書くのはちょっと疲れました。
試行錯誤した結果、変数N,Mを導入することにしました。

まとめ

「Int_Addition_Num_Select」はもっとシンプルな書き方があるかもしれません。
昔に「Nケタ+Mケタでkの位を繰り上がりさせる計算式」を書いたことがあるのですが
もしかしたらそちらを使ったほうが良かったのか。。

ちょっと課題は残りましたが保留で。

とにかくこれで足し算は終わりです。
次回は掛け算をやりましょう。