計算プリントを自動生成する 文字式への代入
はじめに
記事をためて書いておいて、一週間くらいおきにまとめて投稿しているのですが、なぜかこの回は「はじめに」が空欄でした。
なんでだろう??
コード
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」の変換が頻繁に起きています。
そうすることで「計算プリントを自動生成する」の本筋からはずれてしまっているのですが、それでもそうしたいなーと思っています。
まとめ
前回、関数の整理をした甲斐もあって、なかなかスムーズに実装できたかなと思います。
とりあえず「文字式の計算」はここで打ち止め。
次に何をしようか迷いますね。
「文章問題」を扱うために「数列」を実装したくて、そのために「文字列の計算」をこなしました。
ただ「文章問題」はわざわざ「数列」を使わなくとも解決できそうなんですよね。
んー。
このあたりでいったん「統合」しておきますか。
いろいろ関数を作りっぱなしになっているので。