滝の音

滝の音

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

計算プリントを自動生成する その12_2 分数の計算

はじめに

前回は分数クラスを作成しました。
今回はそれを使って分数の計算を実装します。

自動でやってみる

いきなり四則の計算を想定して書きます。

クラスモジュール

これは前回書いた通りです。

Fra_Calculation

Function Fra_Calculation(version, level) As String
'----------------------------------
'整数の計算式を生成する
'version=1は足し算
'version=2は引き算
'version=3は掛け算
'version=4は割り算
'----------------------------------

'----------------------------------
'扱う変数の定義
'----------------------------------
 Dim kou() As String  '指定する数値
 Dim ans As String      'strに戻す値
 Dim tmp As String     'numを入れ替えるための変数
'----------------------------------

'kouの値の決定
'----------------------------------
 kou() = Fra_Num_Select(version)

 
'----------------------------------
'計算式を文字列にする
'----------------------------------
 Select Case version
    Case Is = 1
        ans = "a+b=c"
    Case Is = 2
        ans = "a-b=c"
    Case Is = 3
        ans = "a×b=c"
    Case Is = 4
        ans = "a÷b=c"
 End Select
 
 ans = Replace(ans, "a", kou(1))
 ans = Replace(ans, "b", kou(2))
 ans = Replace(ans, "c", kou(3))

'----------------------------------
'文字列を戻す
'----------------------------------
 Fra_Calculation = ans
End Function

これは「Int_Calculation」とほとんどおなじコードです。
「Num_Select」系の関数からの戻り値をString型にしたところが変更点です。

ちなみに「Fra」は「Fraction」の頭三文字です。

Fra _Num_Select

戻り値の型をStringにしたことで少し意味合いが変わりました。
Num_SelectよりもTerm_Makeのほうが近いかもしれませんね。
しばらくは名残でそのままの名前にしておきます。

Function Fra_Num_Select(version) As String()
'------------------------
'変数の定義
'------------------------
 Dim kou(1 To 3) As Fraction    '分数
 Dim swt As Integer
 Dim ans(1 To 3) As String      '戻り値用の変数
 
'------------------------
'kouの値を仮決め
'------------------------
 Set kou(1) = New Fraction
 Set kou(2) = New Fraction
 Set kou(3) = New Fraction
 
 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 version
    Case Is = 1
    
    Case Is = 2
        If kou(1).Va * kou(2).Vb - kou(1).Vb * kou(2).Va < 0 Then
            swt = kou(1).Va
            kou(1).Va = kou(2).Va
            kou(2).Va = swt
            
            swt = kou(1).Vb
            kou(1).Vb = kou(2).Vb
            kou(2).Vb = swt
        End If
        
    Case Is = 3
        swt = kou(2).Va
        kou(2).Va = kou(2).Vb
        kou(2).Vb = swt
        
    Case Is = 4

 End Select
 
'-------------------------
'kou3を決定
'-------------------------
  Select Case version
    Case Is = 1
        kou(3).Va = kou(1).Va * kou(2).Vb + kou(1).Vb * kou(2).Va
        kou(3).Vb = kou(1).Vb * kou(2).Vb
        
    Case Is = 2

        kou(3).Va = kou(1).Va * kou(2).Vb - kou(1).Vb * kou(2).Va
        kou(3).Vb = kou(1).Vb * kou(2).Vb
        
    Case Is = 3
        
        kou(3).Va = kou(1).Va * kou(2).Va
        kou(3).Vb = kou(1).Vb * kou(2).Vb
    
    Case Is = 4
        kou(3).Va = kou(1).Va * kou(2).Vb
        kou(3).Vb = kou(1).Vb * kou(2).Va
        
 End Select
'------------------------------
'kouの約分
'------------------------------
 kou(1).Fit
 kou(2).Fit
 kou(3).Fit
 
'------------------------------
'戻り値を決定
'------------------------------
 ans(1) = kou(1).Str
 ans(2) = kou(2).Str
 ans(3) = kou(3).Str
 
 Fra_Num_Select = ans
 
End Function

こちらは整数の時とはだいぶ違う仕様にしました。
とくに引き算や割り算。
計算前に値を調整するタイプに変えました。

まとめ

これらを組み合わせることでとりあえず分数の四則の計算が実装されました。
難度設定は、正直やっていて頭が痛くなるので保留します。

第12回までやってみてなんとなく気づきました。

あんまり気が乗らないものを義務感で行うとモチベーションが下がって、コードを書くこと自体がおっくうになってしまうことに。

めんどくさいなと感じたものはどんどん保留なり凍結なりして
「最初の願い」を失わいようにしたいなぁと思います。

次回は負の数。
次々回は3数の計算のリベンジ。

こんな流れで行きます。