計算プリントを生成する 文字式の計算 その1(2aとaの四則の計算)
はじめに
想像より早く「計算プリント」に戻ってきました。
今回は項をa,2aに絞って、それらの四則の計算を行います。
あとタイトルのナンバリングについて。
今まで通りなら15_1なのですが、それってわかりやすいか?と思い、ちょっと変更しました。
手動でやってみる
計算式 | 答え |
---|---|
2a+a | 3a |
2a-a | a |
2a×a | 2a2 |
2a÷a | 2 |
これを見るだけでも文字式に必要そうな要素は見えてきますね。
自動でやってみる
Literalクラス
分数と同様にクラスを作ります。
Public V As Integer Private L_ As String Private element(1 To 26) As Integer Private Sub Class_Initialize() V = 0 End Sub Property Get L() As String L = L_ End Property Property Let L(str As String) L_ = str Dim i As Integer '繰り返しの制御変数 Dim trgt As String 'element作成のアシスト変数 Dim num As Integer 'element作成のアシスト変数 '--------------- 'elementに仕分け '--------------- For i = 1 To Len(str) trgt = Mid(str, i, 1) num = Asc(trgt) - 96 Select Case num Case Is < 1 Stop Case Is < 27 element(num) = element(num) + 1 Case Else Stop End Select Next End Property Function Fit() '-------------- 'L_の表記を整える '-------------- '変数の定義 '-------------- Dim i As Integer '繰り返しの制御変数 Dim trgt As String 'fitのアシスト変数 Dim num As Integer 'fitのアシスト変数 Dim asn As String 'fitのアシスト変数 '--------------- 'elementの反映 '--------------- For i = 1 To Len(L_) trgt = Chr(i + 96) num = element(i) Select Case num Case Is = 0 Case Is = 1 ans = ans & trgt Case Else ans = ans & trgt & "^" & num End Select Next L_ = ans End Function Property Get S() As String '----------------- 'V,L_からStrを作成 '----------------- '----------------- '考慮が必要ない場合の対処 '----------------- If L_ = "" Then S = V Exit Property End If Select Case True Case V = 0 S = 0 Case V = 1 S = L_ Case V = -1 S = "-" & L_ Case Else S = V & L_ End Select End Property
「element」が特徴かなと思います。
Lit_Str_Make
「Int_Str_Make」を参考にしました、サブ関数がまだ充実していないのでかなり機能は制限されています。
Function Lit_Str_Make(NN) As String '------------------- '文字式の計算式を作成する '------------------- '------------------ '変数の定義 '------------------ Dim ope() As String '演算子 Dim kou() As Literal '数値 Dim i As Integer '繰り返しの制御変数 Dim box As Variant '演算子決定のアシスト変数 Dim tmp As Integer '演算子決定のアシスト変数 Dim str As String '計算式 '------------------ 'opeとnumの配列数を指定 '------------------ ReDim ope(1 To NN + 1) ReDim kou(1 To NN + 1) '------------------ 'boxの指定 '------------------ box = Array("+", "-", "×", "÷") '------------------ 'opeの値を指定 '------------------ For i = 1 To NN - 1 tmp = Rnd_Num(0, 3) ope(i) = box(tmp) Next ope(2) = "=" '------------------ 'kouの値を指定 '------------------ For i = 1 To NN Set kou(i) = New Literal kou(i).V = Rnd_Num(1, 9) kou(i).L = "a" Next kou(1).V = 2 kou(2).V = 1 '------------------ 'kou3を計算 '------------------ Set kou(3) = New Literal Select Case ope(1) Case Is = "+" If kou(1).L = kou(2).L Then kou(3).V = kou(1).V + kou(2).V kou(3).L = kou(1).L End If Case Is = "-" If kou(1).L = kou(2).L Then kou(3).V = kou(1).V - kou(2).V kou(3).L = kou(1).L End If Case Is = "×" kou(3).V = kou(1).V * kou(2).V kou(3).L = kou(1).L & kou(2).L Case Is = "÷" If kou(1).L = kou(2).L Then kou(3).V = kou(1).V / kou(2).V kou(3).L = "" End If End Select kou(3).Fit '------------------ 'ansを作成 '------------------ For i = 1 To NN + 1 str = str & kou(i).S & ope(i) Next Lit_Str_Make = str End Function
まとめ
今回は項を2a,aに設定することで、難しい問題をいくつか回避しています。
次回は項を2a,3a2に設定して同じことを行います。