計算プリントを生成する 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項以上の文字式の計算」を一段落です。
次は文字式への「代入」を行います。