計算プリントを自動生成する その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数のリベンジ。