滝の音

滝の音

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

計算プリントを自動生成する 一次方程式 その1 (問題の自動生成)

はじめに

「方程式」の第一段は「一次方程式」です。
これは昔に何度か扱ったことがあるのですが、今回はそれとは違うアプローチでやりたいですね。

手動で生成してみる

3x+5=x-1
適当に作ってみました。
今までとの違いは3つ。
生成する文字列中に”=”が存在する
文字と数字が少なくとも1項ずつあってほしい
方程式として成立する項の組み合わせであってほしい

このあたりが最初のとっかかりです。

自動で生成する

とりあえず第一案として。

Equation_Make_A

Formula_Make系の方程式バージョンです。

Function Equation_Make_A() As String
'-------------------
'文字式の方程式を作成する
'-------------------
 NN = 2
'------------------
'変数の定義
'------------------
 Dim ope() As String        '演算子
 Dim kou() As Literal2      '数値
 Dim ope_() As String
 Dim kou_() As Literal2
 Dim i As Integer           '繰り返しの制御変数
 Dim j As Integer           '繰り返しの制御変数
 Dim str(1 To 2) As String  '右辺と左辺
 
ReSelect:
 
 ReDim kou(1 To 2, 1 To NN)
 ReDim ope(1 To 2, 1 To NN)
 
'------------------
'kou,opeを指定
'------------------
 For i = 1 To 2

    ReDim kou_(1 To NN)
    ReDim ope_(1 To NN)
     
    For j = 1 To NN
        Set kou(i, j) = Lit_Kou_Select(2, 1, 2)
        Set kou_(i) = kou(i, j)
    Next
    ope(i, 1) = "+"
    ope(i, 2) = ""
 Next
 
'------------------
'kouのチェック
'------------------
 flag = False
 flag = Equ_ReDo_Jdg(kou)
 
 If flag = True Then GoTo ReSelect

'------------------
'strの生成
'------------------
 For i = 1 To 2
 
    For j = 1 To NN
        Set kou_(j) = kou(i, j)
        ope_(j) = ope(i, j)
    Next
    
    str(i) = Lit_Str_Make(kou_, ope_)
    str(i) = Replace(str(i), "(", "")
    str(i) = Replace(str(i), ")", "")
    str(i) = Replace(str(i), "+-", "-")
 Next

'------------------
'strを生成
'------------------
 Equation_Make_A = str(1) & "=" & str(2)
 
End Function

Equ_ReDo_Jdg

基本的にこれを強化していくことになりそう。

Function Equ_ReDo_Jdg(kou) As Boolean
'----------------
'kouが適当かチェック
'----------------

'----------------
'変数の定義
'----------------
 Dim i As Integer   '繰り返しの制御変数
 Dim j As Integer   '繰り返しの制御変数
 Dim cnt As Integer '判断のアシスト変数

'----------------
'判断
'----------------
 cnt = 0
 
 For i = 1 To UBound(kou, 1)
    For j = 1 To UBound(kou, 2)
        If kou(i, j).La <> "" Then
            cnt = cnt + 1
            stock = stock + kou(i, j).Va * (-1) ^ i
        End If
    Next
 Next
 
 'If cnt = 0 Or cnt = UBound(kou, 1) * UBound(kou, 2) Then
 If cnt <> UBound(kou, 2) Then
    Equ_ReDo_Jdg = True
 End If
 
 If stock = 0 Then

    Equ_ReDo_Jdg = True
 End If
End Function

今回は「文字を持つ項が全体の半分」であり「方程式を整理しても文字を持つ項が残る」ことを条件としています。

まとめ

全体的にまだしっくりとは来ていないのですが、これをたたき台として作っていきます。

次回は「解析関数」を作りましょう。