計算プリント 第一回統合 その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数の計算」を統合します。