滝の音

滝の音

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

計算プリント 第一回統合 その3 (数値指定系)

はじめに

「数値指定系」は最初に作った関数たちです。
二項の計算に絞って「意図的な計算式」を作るものです。

これは「二項の関係」が肝なので「無作為系」や「繰り返し系」とは相いれません。
これはこれで出来るだけ小さくまとめます。

統合してみる

まずは「分数の計算」を現状での最新式に書き換えます。
そして「整数の計算」をそれに対応させます。

Formula_Make_C

Cは二項の値を同時に(?)決める仕様です。

Function Formula_Make_C(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 2)
 ReDim ope(1 To 2)
 
 ope(1) = "-"
 ope(2) = ""
 kou = Fra_Num_Select(ope(1))
 
'------------------
'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_C = str
End Function

Fra_Num_Select

Literal2クラスに対応させました。
また、Formula_Make_Cのほうで出来ることはそちらでさせる方針に。

Function Fra_Num_Select(ope) As Literal2()
'------------------------
'変数の定義
'------------------------
 Dim kou(1 To 2) As Literal2    '分数
 Dim swt As Literal2
 Dim tmp As Integer
 
'------------------------
'kouの値を仮決め
'------------------------
 Set kou(1) = New Literal2
 Set kou(2) = New Literal2
 
 kou(1).Va = Rnd_Num(1, 3)
 kou(1).Vb = Rnd_Num(3, 8)
 kou(2).Va = Rnd_Num(1, 3)
 kou(2).Vb = Rnd_Num(1, 3) * kou(1).Vb
 
 
'-------------------------
'versionを反映してkou1,2を本決定
'-------------------------

 Select Case ope
    Case Is = "+"
    
    Case Is = "-"
        If kou(1).Va * kou(2).Vb - kou(1).Vb * kou(2).Va < 0 Then
            Set swt = kou(1)
            Set kou(1) = kou(2)
            Set kou(2) = swt
        End If
        
    Case Is = "×"
        swt = kou(2).Va
        kou(2).Va = kou(2).Vb
        kou(2).Vb = swt
        
    Case Is = "÷"

 End Select
 
 Fra_Num_Select = kou
 
End Function

Int_Num_Select

「整数の計算」の関数たち、中でも「Num_Select」系はコードの分量が多くて、うまくまとめるのが難しいです。
なので今回はごまかしの方法で。
従来の関数で数値を指定してから、それをそのままLiteral2クラスの変数に変換することにしました。

Function Int_Num_Select(ope, level) As Literal2()
'----------------------------------
'LitとIntのパイプ
'kouを指定する
'----------------------------------

'----------------------------------
'扱う変数の定義
'----------------------------------
 Dim kou() As Literal2
 Dim num() As Integer   '指定する数値
 Dim ans As String      'strに戻す値
 Dim tmp As Integer     'numを入れ替えるための変数
 
'----------------------------------
'numの値の決定
'----------------------------------
 Select Case ope
    Case Is = "+", "-"
        num() = Int_AddSub_Num_Select(level)
    Case Is = "×", "÷"
        num() = Int_MulDiv_Num_Select(level)
 End Select
 
'----------------------------------
'引き算、割り算用の処理
'----------------------------------
 Select Case ope
    Case Is = "+", "×"
    Case Is = "-", "÷"
        tmp = num(1)
        num(1) = num(3)
        num(3) = tmp
 End Select
 
'----------------------------------
'kouを作成
'----------------------------------
 ReDim kou(1 To 2)
 
 For i = 1 To 2
    Set kou(i) = New Literal2
    Call kou(i).Conversion(num(i))
 Next

 Int_Num_Select = kou
End Function

意外と悪くない考え方なんじゃないかなと思います。

まとめ

なんだかものすごい疲れました。
なんていうんだろう。
頭の変な部分を使った気がします。

楽しいというより苦しい回でしたが、第一回統合もこれで終わり。

次に何をするかはやっぱり悩ましいですね。

「文章問題」と「方程式」が天秤に乗っています。

んー。

指で右に傾けて、「方程式」に進みましょう。