滝の音

滝の音

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

文章問題を生成する その3_4 ひながた (計算をする)

はじめに

ひとつのコーナーが4回続くのは初めてかもしれません。
だんだん枷は外れてきていますが、サブ関数をあまり設置していないので、コードが長いですね。

均したい部分

まだ均せていない部分は以下の通り。

「num1」「num2」の値の範囲を変更した。
「num3」の求め方を変えた。

今回は「num3」を自動で取得できるようにします。

自動でやってみる

今回はかなり簡単。
ほんとうは簡単ではないのですが、遺産があるので。
「解析関数」を使います。
「解析関数」を使いやすい環境を設定することが今回のミッション。

コード

Sub 文章題生成_3_2()
'--------------------------
'文章第の一部を書き換える
'--------------------------

'--------------------------
'変数の定義
'--------------------------
 Dim str() As String        '文章
 Dim path As String         'メモ帳のアドレス
 Dim worlist As Variant     'ワード群の選択
 Dim box() As String        'ワードの候補
 Dim wor() As String        'ワード入れ替え用の変数
 Dim num() As Integer       '数値入れ替え用の変数
 Dim sss As String          '計算式
 Dim ans As Fraction        '計算式の答え
 Dim trgt As String         '数値入れ替え用の変数
 Dim tmp As Integer         '一時使用
 Dim i As Integer           '繰り返しの制御変数
 Dim j As Integer           '繰り返しの制御変数
 
'--------------------------
'文章の読み込み
'--------------------------
 path = ThisWorkbook.path & "\text\text1_1.txt"
 str = txt_input(path)

'--------------------------
'worlistの作成
'--------------------------
 worlist = Split(str(0), " ")
 
'--------------------------
'worとnumの配列数を取得
'--------------------------
 tmp = Val(worlist(0))
 ReDim wor(1 To tmp)
 
 tmp = Val(str(1))
 ReDim num(1 To tmp)
 
'--------------------------
'worを指定
'--------------------------
 For i = 1 To UBound(worlist)
    path = ThisWorkbook.path & "\wor\" & worlist(i) & ".txt"
    box = txt_input(path)
    tmp = Rnd_Num(0, UBound(box))
    wor(i) = box(tmp)
 Next
 
'--------------------------
'numを指定
'--------------------------
 num(1) = Rnd_Num(1, 5) * 10 + 100
 num(2) = Rnd_Num(3, 7)
 
 sss = str(2)
 For i = 1 To UBound(num) - 1
    sss = Replace(sss, "num" & i, num(i))
 Next
 Set ans = New Fraction
 Set ans = Int_Str_Analyze(sss)
 
 num(3) = Val(ans.S)
 
'--------------------------
'問題文を変更
'--------------------------
 For i = LBound(str) + 3 To UBound(str)
    For j = 1 To Val(str(0))
        trgt = "wor" & j
        str(i) = Replace(str(i), trgt, wor(j))
        str(i) = Replace(str(i), trgt, wor(j))
    Next
    For j = 1 To Val(str(1))
        trgt = "num" & j
        str(i) = Replace(str(i), trgt, num(j))
        str(i) = Replace(str(i), trgt, num(j))
    Next
 Next
 
 
'--------------------------
'文章の書き出し
'--------------------------
 For i = LBound(str) + 3 To UBound(str)
    Call Insert_Equation(20, 30 * (i + 1), str(i))
 Next
 
 path = ThisWorkbook.path & "\text\text1_2.txt"
 Call txt_output(str, path)
End Sub

たぶん最適ではないのですが、こんな感じにしましょう。

「num1」「num2」の設定をいじれない理由

言い訳コーナーです笑
言い訳をして、それをつぶすことにしましょう笑

残る枷はnum1,2の設定のみなのですが、ちょっともやもやしています。

数字の範囲を選択することが難しい理由は「刻み」です。

たとえば果物ひとつの値段。
100~150からランダムに数字を選択、は結構簡単なのですが。
実際は110,120,130,140,150のどれかから欲しいですよね。
このような10刻み。
コードに起こせないことはないのですが、これってあるものに似ていますよね。
そう、数列です。

等差数列です。

ここで無理やりコードを書くよりは、数列の環境を整えて、そこで作られた関数を使いたいなーと思っているのです。

ただ数列には文字が出てくるから、それをやるためには文字式の計算(具体的には代入)を実装しないといけないんだよなーとも思っているのです。

。。。

言い訳はこんな感じです。
書いたら結論は出ました。

文章問題はここで一回凍結。
数列の計算プリントを作成して、その過程で等差数列を扱う。
そこでつくるであろう関数を用いてnum1.2の設定をする。
そのためにまずは文字式の計算を実装する。

こうします。

まとめ

まさかの文章問題の凍結です笑
まだ一週間分くらいしかやっていませんが笑

でもどうしても気が変わってしまったので、それに従います。

というわけで次回からまた「計算プリント」に復帰します。
扱う内容は「文字式」。
文字式は面倒くさいなーと思って放置していたのですが。
必要性を感じてすごくやる気が出てきました笑
不思議ですね笑