計算プリント 第一回統合 その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
意外と悪くない考え方なんじゃないかなと思います。
まとめ
なんだかものすごい疲れました。
なんていうんだろう。
頭の変な部分を使った気がします。
楽しいというより苦しい回でしたが、第一回統合もこれで終わり。
次に何をするかはやっぱり悩ましいですね。
「文章問題」と「方程式」が天秤に乗っています。
んー。
指で右に傾けて、「方程式」に進みましょう。