滝の音

滝の音

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

計算プリントを自動生成する 一次方程式 その2 (解析関数)

はじめに

おなじみの流れです。
最初に問題を生成する関数をつくって。
次に問題を解析する関数を書きます。

手動でやってみる

2a+5=4a-1
-2a=-6
a=3

2列目の式を「-2a=」とするか「2a=」とするかは流派がありそうですね。
自分は後者なのですが、前者のほうがややこしくないかなとも思います。

自動でやってみる

Function Equation_Analyze()

 Dim str As String
 Dim equ() As String
 Dim ans() As Literal2
 Dim ope() As String
 Dim tmp As Integer
 Dim trgt As String
 
 str = "a+5=3a+5"
 
 ReDim equ(1 To 3)
 
 equ(1) = str
'-------------------
'strを修正
'-------------------
 tmp = InStr(str, "=")
 
 For i = tmp To Len(str)
    trgt = Mid(str, i, 1)
    Select Case trgt
        Case Is = "=", "+"
            str = left(str, i - 1) & "-" & Mid(str, i + 1)
        Case Is = "-"
            str = left(str, i - 1) & "+" & Mid(str, i + 1)
    End Select
 Next
 
 ans = Lit_Str_Analyze(str)
 
 
 ReDim ope(LBound(ans) To UBound(ans))
 
 For i = LBound(ans) To UBound(ans) - 1
    ope(i) = "+"
 Next
 
 
 equ(2) = Lit_Str_Make(ans, ope, 0)
 equ(2) = Replace(equ(2), "-", "=")
 equ(2) = Replace(equ(2), "+", "=-")
   
 If ans(1).Va = 0 Then
    equ(2) = equ(2) & "=0"
 End If

 ans(1).Vb = ans(1).Vb * ans(0).Va
 ans(0).Va = 1
 
 equ(3) = Lit_Str_Make(ans, ope, 0)
 equ(3) = Replace(equ(3), "-", "=")
 equ(3) = Replace(equ(3), "+", "=-")
 
 If ans(1).Va = 0 Then
    equ(3) = equ(3) & "=0"
 End If
 
End Function

腕力でつくっちゃいました。
せっかく作った「Lit_Str_Analyze」を使えないかなーと考えたらこんな風になりました。
0への処理はもうちょっとうまくできる気もしますが、今回は保留で。

まとめ

だいたい今までの流れでは。
その時に作れるギリギリのものを作って2,3日眠ると。
それと全然違うもっと良いものを思いついたりするので。

今日の関数はそのための供物みたいなものです。
なんで供物のフェイズを省略できないのかは謎です。

次回は「値の調整」をします。