滝の音

滝の音

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

計算プリントを生成する 3項以上の文字式の計算 その2(関数を整える)

はじめに

今回は「機能を関数に割り振る」ことをします。

コード

Lit_Formula_Make

前回までの「Lit_Str_Make」です。
ちょっと名前がおかしいと思ったので変更しました。
あと、この関数にいろいろやらせすぎていると感じたので、いくつかの機能をサブ関数に割り振りました。

Function Lit_Formula_Make(NN) As String
'-------------------
'文字式の計算式を作成する
'-------------------

'------------------
'変数の定義
'------------------
 Dim ope() As String    '演算子
 Dim kou() As Literal2   '数値
 Dim i As Integer       '繰り返しの制御変数
 Dim str As String      '計算式
 Dim str1 As String
 Dim str2 As String
 Dim ans()  As Literal2    '計算式の答え
 
'------------------
'kou,opeを指定
'------------------
 Call Lit_kou_ope_Select(NN, kou, ope)

'------------------
'str1を作成
'------------------
 str1 = Lit_Str_Make(kou, ope)
 
'------------------
'ansを配列で取得
'------------------
 ans = Lit_Str_Analyze(str1)
 
'------------------
'str2を作成
'------------------
 ReDim ope(LBound(ans) To UBound(ans))
 
 For i = LBound(ans) To UBound(ans) - 1
    ope(i) = "+"
 Next
 
 str2 = Lit_Str_Make(ans, ope)
 
'------------------
'str2の修飾
'------------------
 If left(str2, 2) = "0+" Then
    str2 = Mid(str2, 3)
 End If
 
 If Right(str2, 1) = "+" Then
    str2 = left(str2, Len(str2) - 1)
 End If
 str2 = Replace(str2, "+-", "-")

'------------------
'戻り値を作成
'------------------
 str = str1 & "=" & str2
 Lit_Formula_Make = str
End Function

これでだいぶ見やすくなったかなと思います。

Lit_kou_ope_Select

「kou」と「ope」の値を決める変数です。
ここが実質的に問題の内容を作っています。

Function Lit_kou_ope_Select(NN, ByRef kou, ByRef ope)
'-----------------
'kou,opeの値を指定
'-----------------

'-----------------
'変数の定義
'-----------------
 Dim box As Variant     '値決定のアシスト変数
 Dim tmp As Integer     '値決定のアシスト変数
 
'------------------
'opeとnumの配列数を指定
'------------------
 ReDim ope(1 To NN)
 ReDim kou(1 To NN)
 
'------------------
'opeの値を指定
'------------------
 box = Array("+", "-", "×", "÷")
 For i = 1 To NN - 1
    tmp = Rnd_Num(0, 1)
    ope(i) = box(tmp)
 Next

'------------------
'kouの値を指定
'------------------
 box = Array("", "a", "b")
 For i = 1 To NN
    Set kou(i) = New Literal2
    kou(i).Va = Rnd_Num(1, 3)
    tmp = Rnd_Num(0, 1)
    kou(i).La = box(tmp)
 Next
 
End Function

Lit_Str_Make

「kou」と「ope」を文字式に起こす関数です。
この機能をサブ関数化することで、個人的にはコードの流れが見やすくなったと思います。

Function Lit_Str_Make(kou, ope)
'-----------------
'kou,opeを文字列に起こす
'-----------------

'-----------------
'変数の定義
'-----------------
 Dim i As Integer   '繰り返しの制御変数
 Dim ans As String  '戻り値
 
 ans = kou(LBound(kou)).S
 
 For i = LBound(kou) + 1 To UBound(kou)
    If Not (kou(i).S = "0" And ope(i - 1) = "+") Then
        
        ans = ans & ope(i - 1) & kou(i).S
    End If
 Next
 
 Lit_Str_Make = ans
End Function

ただ、このコード自体はあまりきれいじゃないです。

Lit_Str_Analyze

関数の型を「Literal2」にして、「kou」の配列を戻り値にしました。
それ以外は変更していないので、コードは省略で。

まとめ

関数の名前の変更とサブ関数の作成をしました。

悪い癖かもしれませんが、「名前」がしっくりこないと気分が悪くなってしまいます。
そういうこだわりはまだ持たなくていい、と思いつつも取り払えないですね。

「修飾」の部分を上手に書けないせいで、全体的にぎこちない見た目になっています。
これはもうちょっとスキルを上げないと解決できなさそうなのでながーく保留。

さて、これで「3項以上の文字式の計算」を一段落です。

次は文字式への「代入」を行います。