滝の音

滝の音

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

計算プリントを自動生成する 文字式への代入

はじめに

記事をためて書いておいて、一週間くらいおきにまとめて投稿しているのですが、なぜかこの回は「はじめに」が空欄でした。
なんでだろう??

コード

Literal2クラス

今回気が付きましたが、コード全体を無造作に載せるより、追加部分や変更部分のみを載せたほうが見やすいですね。

Substitution関数を追加しました。
プライベート変数のelementが役に立っています。

Function Substitution(char, num)
'----------------
'文字に数字を代入
'----------------
 trgt = element(Asc(char) - 96)
  
 Select Case trgt
    Case Is = 0
    Case Is > 0
        Va = Va * num * trgt
        La_ = Replace(La_, char, "")
    Case Is < 0
        Vb = Vb * num * trgt
        Lb_ = Replace(Lb_, char, "")
 End Select
 
 element(Asc(char) - 96) = 0
 
End Function

Lit_Str_Division

文字列を「kou」と「ope」に分割する関数を作りました。
もともとは「Analyze系」の関数内に入れていたのですが、「代入」の関数にも同じ機能が欲しいと思い、サブ関数に分けました。

Function Lit_Str_Divide(str, ByRef kou, ByRef ope)
'----------------------
'strをopeとkouに分ける
'----------------------

'----------------------
'変数の定義
'----------------------
 Dim trgt As String     '仕分けのアシスト変数
 Dim stock As String    '仕分けのアシスト変数
 Dim cnt As Integer     '仕分けのアシスト変数
 
'----------------------
'分割
'----------------------
 For i = 1 To Len(str)
 
    trgt = Mid(str, i, 1)
    Select Case trgt
        Case Is = "+", "-", "×", "÷"
        
            ReDim Preserve kou(cnt)
            ReDim Preserve ope(cnt)
            Set kou(cnt) = New Literal2
            kou(cnt).Conversion (stock)
            ope(cnt) = trgt

            stock = ""
            cnt = cnt + 1
            
        Case Else
            stock = stock & trgt
    End Select
 Next

 If stock <> "" Then
    ReDim Preserve kou(cnt)
    Set kou(cnt) = New Literal2
    kou(cnt).Conversion (stock)
    stock = ""
 End If
 
'-----------------------
'-の処理
'-----------------------
 For i = 0 To UBound(ope)
    If ope(i) = "-" Then
        ope(i) = "+"
        kou(i + 1).Va = kou(i + 1).Va * -1
    End If
 Next
 
End Function

Lit_Str_Substitution

文字列で与えられた文字式について、指定された文字に指定された数値を代入する関数です。

Function Lit_Str_Substitution(ByVal str As String, char As String, num As Integer) As Literal2()

'---------------------
'変数の定義
'---------------------
 Dim kou() As Literal2  '項
 Dim ope() As String    '演算子
 Dim i As Integer       '繰り返しの制御変数
 Dim j As Integer       '繰り返しの制御変数
 
'----------------------
'strをopeとkouに分ける
'----------------------
 Call Lit_Str_Divide(str, kou, ope)

'----------------------
'代入
'----------------------
 For i = LBound(kou) To UBound(kou)
    Call kou(i).Substitution(char, num)
 Next
 
 Lit_Str_Substitution = kou()
End Function

「Analyze」系の関数もそうですが、それ単独でも使える仕様にしているため、「文字列」⇔「kou」の変換が頻繁に起きています。

そうすることで「計算プリントを自動生成する」の本筋からはずれてしまっているのですが、それでもそうしたいなーと思っています。

まとめ

前回、関数の整理をした甲斐もあって、なかなかスムーズに実装できたかなと思います。

とりあえず「文字式の計算」はここで打ち止め。

次に何をしようか迷いますね。

「文章問題」を扱うために「数列」を実装したくて、そのために「文字列の計算」をこなしました。
ただ「文章問題」はわざわざ「数列」を使わなくとも解決できそうなんですよね。

んー。
このあたりでいったん「統合」しておきますか。
いろいろ関数を作りっぱなしになっているので。