滝の音

滝の音

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

計算プリントを自動生成する その4_1 いろいろな足し算(準備編)

はじめに

前回は繰り上がりなしの1ケタの足し算でした。
今回はもうちょっと種類を増やしてみましょう。

……

と思ったのですが「計算の難度」を導入するためには関数をいろいろ書き換える必要があるので、今回は準備をしましょう。

準備すること

  1. 変数numを配列にする
  2. Numの値を決める部分を関数化する
  3. 難度を設定するために変数を1つ足す

この3つ。
3を実現するために2を
2を実現するために1を準備します。

変数numを配列にする

今まではnum1,num2というように変数を複数個使っていましたが
今回からnum(1 to 3)というように変えます。

関数Int_Addition_Ver1をnumの部分を書き換えてVer1_1にしましょう。

関数Int_Addition_Ver1

Function Int_Addition_Ver1() As String
'----------------------------------
'1ケタの二つの数を定義する
'それらの和を求める
'計算式を文字列にして戻す
'----------------------------------

'----------------------------------
'扱う変数の定義
'----------------------------------
 Dim num1 As Integer    '指定する数値
 Dim num2 As Integer    '指定する数値
 Dim num3 As Integer    '計算結果
 Dim ans As String      'strに戻す値

'----------------------------------
'num1とnum2の定義
'----------------------------------
 num1 = Rnd_Num(1, 9)
 num2 = Rnd_Num(1, 9)
 
'----------------------------------
'num3を求める
'----------------------------------
 num3 = num1 + num2
 
'----------------------------------
'計算式を文字列にする
'----------------------------------
 ans = "a+b=c"
 ans = Replace(ans, "a", num1)
 ans = Replace(ans, "b", num2)
 ans = Replace(ans, "c", num3)
 
'----------------------------------
'文字列を戻す
'----------------------------------
 Int_Addition_Ver1 = ans
End Function

を 関数Int_Addition_Ver1_1

Function Int_Addition_Ver1_1() As String
'----------------------------------
'1ケタの二つの数を定義する
'それらの和を求める
'計算式を文字列にして戻す
'----------------------------------

'----------------------------------
'扱う変数の定義
'----------------------------------
 Dim num(1 To 3) As Integer    '指定する数値
 Dim ans As String      'strに戻す値

'----------------------------------
'num(1)とnum(2)の定義
'----------------------------------
 num(1) = Rnd_Num(1, 9)
 num(2) = Rnd_Num(1, 9)
 
'----------------------------------
'num(3)を求める
'----------------------------------
 num(3) = num(1) + num(2)
 
'----------------------------------
'計算式を文字列にする
'----------------------------------
 ans = "a+b=c"
 ans = Replace(ans, "a", num(1))
 ans = Replace(ans, "b", num(2))
 ans = Replace(ans, "c", num(3))
 
'----------------------------------
'文字列を戻す
'----------------------------------
 Int_Addition_Ver1_1 = ans
End Function

内容は特に変わっていません。

Numの値を決める部分を関数化する

最終的には条件分岐を使ってnumの値を設定する仕様にするつもりです。
その時にnumの値を設定する部分を関数化しておくとコードが読みやすいかなと思い、ここで関数化しておきます。

現在数式を作っている関数を「Int_Addition」と名付けているので
この関数の数字を選ぶ部分を「Int_Addition_Num_Select」とします。

Function Int_Addition_Num_Select() As Integer()
'変数の定義
 Dim num() As Integer
 'numの数を決定
 ReDim num(1 To 3)
 
 'numの数値を決定
 num(1) = Rnd_Num(1, 9)
 num(2) = Rnd_Num(1, 9)
 num(3) = num(1) + num(2)
 
 Int_Addition_Num_Select = num
 
End Function

ここでも本質は変わらず。

難度を設定するために変数を1つ足す

これは「ひながた」プロシージャの部分に足します。
そしてInt_Additionなどの計算式をつくる関数に引数として渡します。

仮で「ひながた2」という名前で書きます。

Sub ひながた2()

'------------------------------
'0. 扱う変数の定義
'------------------------------
 Dim N As Integer       '問題数を決める変数
 Dim i As Integer       '繰り返しの制御変数
 Dim str As String      '計算式の文字列
 Dim level As Integer     '難度の設定
'------------------------------
'1. 問題数の指定
'------------------------------
 N = 10
 
 For i = 1 To N
    '------------------------------
    '2. 問題を指定して式を求める
    '------------------------------
    level = 1
    str = Int_Addition_Ver1_3(level)
 
    '------------------------------
    '3. 出力
    '------------------------------
    Call Insert_Equation(20, 30 * i, str)
 Next


End Sub

これでひながたから難度をコントロールできるようになりました。

まとめ

今回はいくつかの関数の名前をいろいろ変えてしまってややこしくなったので
それらの関数の名前を定義しなおします。

まずは「ひながた」プロシージャ。

Sub ひながた()

'------------------------------
'0. 扱う変数の定義
'------------------------------
 Dim N As Integer       '問題数を決める変数
 Dim i As Integer       '繰り返しの制御変数
 Dim str As String      '計算式の文字列
 Dim level As Integer     '難度の設定
'------------------------------
'1. 問題数の指定
'------------------------------
 N = 10
 
 For i = 1 To N
    '------------------------------
    '2. 問題を指定して式を求める
    '------------------------------
    level = 1
    str = Int_Addition(level)
 
    '------------------------------
    '3. 出力
    '------------------------------
    Call Insert_Equation(20, 30 * i, str)
 Next


End Sub

次に「Int_Addition」関数。

Function Int_Addition(level) As String
'----------------------------------
'足し算
'計算式を文字列にして戻す
'----------------------------------

'----------------------------------
'扱う変数の定義
'----------------------------------
 Dim num() As Integer    '指定する数値
 Dim ans As String      'strに戻す値

'----------------------------------
'numの値の決定
'----------------------------------
 num() = Int_Addition_Num_Select(level)
 
'----------------------------------
'計算式を文字列にする
'----------------------------------
 ans = "a+b=c"
 ans = Replace(ans, "a", num(1))
 ans = Replace(ans, "b", num(2))
 ans = Replace(ans, "c", num(3))
 
'----------------------------------
'文字列を戻す
'----------------------------------
 Int_Addition_nnd = ans
End Function

あ。
「Int_Addition_Num_Select」も変数levelに対応した仕様にしましょう。

Function Int_Addition_Num_Select(level) As Integer()
'変数の定義
 Dim num() As Integer
 'numの数を決定
 ReDim num(1 To 3)
 
 'numの数値を決定
 num(1) = Rnd_Num(1, 9)
 num(2) = Rnd_Num(1, 9)
 num(3) = num(1) + num(2)
 
 Int_Addition_Num_Select = num
 
End Function

現状ではlevelがいくつであろうがnumの値は変わりませんが。。。
この条件分岐の部分をつくるのが次回です!