滝の音

滝の音

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

計算プリントを自動生成する 一次方程式 その3(値の調整)

はじめに

現状の関数のみでは、解が分数の問題ばかりができてしまいます。
なので「値の調整」を行いましょう。

願望

「値の調整」はいうなれば、現状の仕組みが弱いから付けざるを得ない付属品です。
そのうちその「仕組み」自体を変更することがあるかもしれないので、その時のために原案を練っておきましょう。
こうなったらいいなぁというものを書いておきます。

方程式に含まれる項のうちの、文字が含まれる項の数を指定できる。
方程式を整理した後の係数を指定できる。

あとふたつくらい「方程式」を実装してから、それらをうまく扱える「仕組み」を作ろうかなと思っています。
それまでは多少のちぐはぐは我慢。

Equ_kou_Adjust

係数を都合の良いように変更する関数です。

Function Equ_kou_Adjust(ByRef kou)
'---------------------
'係数を調整する
'---------------------

'---------------------
'変数の定義
'---------------------
 Dim adj As Literal2
 Dim flag As Boolean
 Dim i As Integer
 Dim j As Integer
 
 Set adj = New Literal2
 adj.Va = 0
 adj.Vb = 0
'---------------------
'方程式の調査
'---------------------
ReAdj:

 For i = 1 To 2
    For j = 1 To UBound(kou, 2)
        If kou(i, j).La <> "" Then
            adj.Vb = adj.Vb + kou(i, j).Va * (-1) ^ (i + 1)
        Else
            adj.Va = adj.Va + kou(i, j).Va * (-1) ^ i
        End If
    Next
 Next
 
'----------------------
'調査結果の反映
'----------------------

'----------------------
'ひとつめの対応
'----------------------
 If adj.Vb = 0 Then
    For i = 1 To 2
        For j = 1 To UBound(kou, 2)
            If kou(i, j).La <> "" Then
                kou(i, j).Va = kou(i, j).Va + Rnd_Num(1, 3)
            End If
        Next
    Next
    GoTo ReAdj
 End If
 
 If adj.Va = 0 Then Exit Function
 
 tmp = Abs(adj.Vb)
 adj.Fit
 
'----------------------
'ふたつめの対応
'----------------------
 If tmp > 12 Then
    For i = 1 To 2
       For j = 1 To UBound(kou, 2)
           If kou(i, j).La <> "" Then
               kou(i, j).Va = Application.WorksheetFunction.Max(2, kou(i, j).Va \ 2)
           End If
       Next
    Next
    GoTo ReAdj
 End If
 
'----------------------
'みっつめの対応
'----------------------
 For i = 1 To 2
    For j = 1 To UBound(kou, 2)
        If kou(i, j).La = "" Then
            kou(i, j).Va = kou(i, j).Va * adj.Vb
        End If
    Next
 Next

ReSub:
 flag = False
 
For i = 1 To 2
    For j = 1 To UBound(kou, 2)
        If kou(i, j).La = "" Then
            If kou(i, j).Va > 40 Then
                kou(i, j).Va = kou(i, j).Va - tmp
                flag = True
            ElseIf kou(i, j).Va < -40 Then
                kou(i, j).Va = kou(i, j).Va + tmp
                flag = True
            End If
        End If
    Next
 Next
 
 If flag = True Then GoTo ReSub:

End Function

結構ちぐはぐな関数です。
現状はこれで我慢。

まとめ

「一次方程式」の回は、どの関数もあんまりきれいじゃないですね。
前に作った関数たちとの互換性が薄いからこんなことになるんですね。
でもそれって回避できる問題なのだろうか。。
まだ見ぬ未来の関数とも互換性の良いコードって書けるのだろうか。。

さて、次回は今まで作った関数を組み合わせて、「一次方程式」の計算プリントを作ります。