滝の音

滝の音

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

計算プリントを生成する 文字式の計算 その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に設定して同じことを行います。