滝の音

滝の音

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

計算プリントを自動生成する その13_2 負の数 (カッコつき)

はじめに

前回に制約ありで、負の数を扱えるようになりました。
今回はその制約を外していきます。
ただそれでもひとつ制約は残ります。

今回の制約

今回は負の数だけでなく正の数も扱えるようにします。
また掛け算と割り算も行えるようにします。

ただ計算式(正確には左辺)をカッコつきにします。
(+3)-(+2)=1
(-2)×(+5)=-10
のように。
ほんとは
3-(-2)=5
のように不必要なかっこは外したいのですが。
これが今回の制約。

自動でやってみる

Int_PM_Num_Select

本当はこれが真のInt_Num_Selectなのですが、とりあえず今回はPMをつけます。

Function Int_PM_Num_Select(version) As String()
'-------------------
'変数の定義
'-------------------
 Dim num(1 To 3) As Integer   '計算式に入れる数値
 Dim ans(1 To 3) As String    '戻り値を入れる変数
 Dim i As Integer       '繰り返しの制御変数
 Dim flag As Integer    '傾斜のアシスト変数
 Dim tmp As Integer     'versionを反映する変数
'---------------------
'numの値の決定
'---------------------

Reselect:
 
 num(1) = Rnd_Num(-9, 9)
 num(2) = Rnd_Num(-9, 9)
    
 
 If flag = False Then
    If num(1) * num(2) = 0 Then
        flag = True
        GoTo Reselect
    End If
 End If
 
'---------------------
'num3の値の決定
'---------------------
 Select Case version
    Case 1
        num(3) = num(1) + num(2)
    Case 2
        num(3) = num(1) - num(2)
    Case 3, 4
        num(3) = num(1) * num(2)
  End Select
 
'---------------------
'割り算の処理
'---------------------
 If version = 4 Then
    tmp = num(1)
    num(1) = num(3)
    num(3) = tmp
 End If
'---------------------
'ansの値の決定
'---------------------
 For i = 1 To 3
    ans(i) = num(i)
 Next
 Int_PM_Num_Select = ans
 
End Function

ちょっと統合したいけども保留して進みましょう。
もう少し景色が良くなってからのほうが良い感じの統合ができそうですし。

Int_PM_Calculation

前回の「Int_Minus_Calculation」を発展させます。

Function IntPM_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     'kouを入れ替えるための変数
'----------------------------------

'numの値の決定
'----------------------------------

 kou() = Int_Minus_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))

 ans = Replace(ans, "+-", "-")
 ans = Replace(ans, "+0", "0")
 
'----------------------------------
'文字列を戻す
'----------------------------------
 Int_PM_Calculation = ans
End Function

「ans」の値が特徴的です。
さらに、今回追加した、Replaceの2行。
これによって正の数が扱えるようになりました。
また、引き算と割り算が使えなかったのも、正の数が使えなかったことが原因なので、それも一緒に解決。

まとめ

負の数を扱うと引き算に気を使わなくてよくなります。
実は分数を利用すれば割り算も気を使わなくてよくなるのですが。

カッコを外す計算式の生成もおいしくはあるのですが、これはまた今度にしましょう。

割り切ってから保留がガンガン増えていますね笑

次回は3数のリベンジ。