滝の音

滝の音

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

文章問題を自動生成する その3_1 ひながた (worとnumの個数を考慮)

はじめに

前回現れた多くの課題を解決していきます。
「その1」と「その2」で扱った二つの文章に、できるだけ対応できる関数を作ることが「その3」の目的です。
なので抽象的な話が多くなります。

均したい部分

前回コードを変更した部分を再びあげます。

「wor1」を書き換える候補を手書きで加えた。
「wor2」を新たに加えた。 「wor」配列の個数を変更した。 「num1」「num2」の値の範囲を変更した。
「num3」の求め方を変えた。
「wor」を書き換える構文を変更した。

今回は、「wor」と「num」の個数を考慮してくれる仕様にします。

自動でやってみる

扱う文章

「その1」で使ったものを一部変更します。

1 3 '-------------------------- '問題文 '-------------------------- wor1が1個num1円で売られています。 wor1をnum2つ買う時の値段はいくらでしょう。

'-------------------------- '解き方 '-------------------------- num2×num1=num3 よってnum3円

1行目にworの数を、2行目にnumの数を打ち込みました。

コード

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

'--------------------------
'変数の定義
'--------------------------
 Dim str() As String        '文章
 Dim path As String         'メモ帳のアドレス
 Dim tmp As Integer         '一時的な保管変数
 Dim box As Variant         'ワードの候補
 Dim wor() As String        'ワード入れ替え用の変数
 Dim num() As Integer       '数値入れ替え用の変数
 Dim trgt As String         '数値入れ替え用の変数
 Dim i As Integer           '繰り返しの制御変数
 Dim j As Integer           '繰り返しの制御変数
 
'--------------------------
'文章の読み込み
'--------------------------
 path = ThisWorkbook.path & "\text\text1_1.txt"
 str = txt_input(path)

'--------------------------
'書き換えの用意
'--------------------------

'--------------------------
'worとnumの配列数を取得
'--------------------------
 tmp = Val(str(0))
 ReDim wor(1 To tmp)
 
 tmp = Val(str(1))
 ReDim num(1 To tmp)

 box = Array("りんご", "みかん", "なし", "もも", "かき")
 tmp = Rnd_Num(0, UBound(box))
 wor(1) = box(tmp)
 
 num(1) = Rnd_Num(1, 5) * 10 + 100
 num(2) = Rnd_Num(3, 7)
 num(3) = num(1) * num(2)
 
'--------------------------
'問題文を変更
'--------------------------
 For i = LBound(str) + 2 To UBound(str)
    For j = 1 To Val(str(0))
        trgt = "wor" & 1
        str(i) = Replace(str(i), trgt, wor(1))
        str(i) = Replace(str(i), trgt, wor(1))
    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) + 2 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

まとめ

地味ですが、恩恵は大きいです。
これで文章が変わっても関数の構造自体は変更せずに済みます。

こんな調子で少しずつ課題をつぶしていきます。