滝の音

滝の音

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

計算プリント 第一回統合 その1 (無作為系の統合)

はじめに

今まで作ってきた関数を統合していきます。 まずは「数値の指定」に重きを置かないものたちから。

統合の回はコードは統合後のものだけを書きます。
統合前のものまでいちいち書くときりがないので。。

統合してみる

今回は「正の整数」「分数」「負の数」「文字式」のすべてを扱える関数を作ります。

Formula_Make_A

Function Formula_Make_A(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を指定
'------------------
 ReDim kou(1 To NN)
 ReDim ope(1 To NN)
 
 For i = 1 To NN
    Set kou(i) = Lit_Kou_Select(1, 1, 2)
    ope(i) = Lit_Ope_Select(3)
 Next
 ope(NN) = ""
 
'------------------
'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の修飾
'------------------
 str2 = Replace(str2, "(", "")
 str2 = Replace(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
 Formula_Make_A = str
End Function

Lit_Kou_Select

ここで項の種類を指定しています。

Function Lit_Kou_Select(ver1, ver2, ver3) As Literal2

'---------------
'kouの値を指定
'ver1は文字の有無
'ver2は分母の有無
'ver3は正負
'---------------
 Dim ans As Literal2
 Dim box As Variant
 Dim tmp As Integer
 
'------------------
'kouの値を指定
'------------------

 Set ans = New Literal2
 box = Array("", "a", "b")
 
 
 Select Case ver1
    Case Is = 1
        
    Case Is = 2
        tmp = Rnd_Num(0, 1)
        ans.La = box(tmp)
 End Select
 
 Select Case ver2
    Case Is = 1
        ans.Va = Rnd_Num(1, 9)
    Case Is = 2
        ans.Va = Rnd_Num(1, 3)
        ans.Vb = Rnd_Num(3, 8)
 End Select
 
 Select Case ver3
    Case Is = 1
        
    Case Is = 2
        If Rnd() < 0.5 Then
            ans.Va = ans.Va * -1
        End If
 End Select
 Set Lit_Kou_Select = ans
 
End Function

Literal2クラス

Sのつくりかたを少し変えました。
負の数に対応するために。

Property Get S() As String
'-----------------
'V,L_からSを作成
'-----------------

'-----------------
'変数の定義
'-----------------
 Dim ansa As String     '分子
 Dim ansb As String     '分母
 
 Call Fit
 
'-----------------
'分子の作成
'-----------------
 Select Case True
    Case La_ = ""
        ansa = Va
    Case Va = 0
        ansa = ""
    Case Va = 1
        ansa = La_
    Case Va = -1
        ansa = "-" & La_
    Case Else
        ansa = Va & La_
 End Select

'-----------------
'分母の作成
'-----------------
 Select Case True
    Case Lb_ = ""
        If Vb = 1 Then
            ansb = ""
        Else
            ansb = Vb
        End If
    Case Vb = 0
        Stop
    Case Vb = 1
        ansb = Lb_
    Case Vb = -1
        ansb = "-" & Lb_
    Case Else
        ansb = Vb & Lb_
 End Select
 
'-----------------
'全体の作成
'-----------------
 If ansa = "" Then
    S = 0
 ElseIf ansb = "" Then
    S = ansa
 Else
    S = ansa & "/" & ansb
 End If
 
'-----------------
'-の処理
'-----------------
 If Va < 0 Then
    S = "(" & S & ")"
 End If
 
End Property

まとめ

あっけないですね笑
数値をランダムに選べるものは簡単に作れます。

次回は「3数の計算」を統合します。