計算プリントを自動生成する 一次方程式 その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
結構ちぐはぐな関数です。
現状はこれで我慢。
まとめ
「一次方程式」の回は、どの関数もあんまりきれいじゃないですね。
前に作った関数たちとの互換性が薄いからこんなことになるんですね。
でもそれって回避できる問題なのだろうか。。
まだ見ぬ未来の関数とも互換性の良いコードって書けるのだろうか。。
さて、次回は今まで作った関数を組み合わせて、「一次方程式」の計算プリントを作ります。