滝の音

滝の音

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

文章問題を生成する その3_2 ひながた (worのストック)

はじめに

地味な回が続きます。
書くのは意外と難しいのですが。

均したい部分

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

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

今回は「wor」のストックを作ります。

worのストック

ちょっとまえに「文章をコード内で管理するのはよくない」と書きました。
「wor」でも同じ対応をとります。
「wor」の候補たちをメモ帳で管理しておく、というやり方です。

今回はフルーツのファイル、人名のファイルを作ります。
ただ「fruit.txt」にフルーツの名前を列挙するだけですが笑
人名も同様に。

そしてまた「text」のほうも一部書き換えます。

自動でやってみる

扱う文章

2 name fruit
3
'--------------------------
'問題文
'--------------------------
wor1はwor2をnum1つもっています。
いま、さらにnum2つのwor2をもらいました。
もっているwor2はぜんぶでいくつでしょうか。

'--------------------------
'解き方
'--------------------------
num1+num2=num3
よってnum3つ

コード

先ほどの考えを踏まえてコードを書き換えます。
前回は「文章題生成3」を変えたので、今回は「文章題生成4」を変えます。
もちろん前回の変更点は踏んでいます。

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

'--------------------------
'変数の定義
'--------------------------
 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 trgt As String         '数値入れ替え用の変数
 Dim tmp As Integer         '一時使用
 Dim i As Integer           '繰り返しの制御変数
 Dim j As Integer           '繰り返しの制御変数
 
'--------------------------
'文章の読み込み
'--------------------------
 path = ThisWorkbook.path & "\text\text2_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, 6)
 num(2) = Rnd_Num(3, 7)
 num(3) = num(1) + num(2)
 
'--------------------------
'問題文を変更
'--------------------------
 For i = LBound(str) + 2 To UBound(str)
    For j = 1 To (worlist(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) + 2 To UBound(str)
    Call Insert_Equation(20, 30 * (i + 1), str(i))
 Next
 
 path = ThisWorkbook.path & "\text\text2_2.txt"
 Call txt_output(str, path)
 
End Sub

パスの設定が少し汚いですが。。
そこは保留。

まとめ

これでまたひとつ枷が外れました。
「計算プリント」系に比べてひながたづくりが大変ですね。