滝の音

滝の音

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

文章問題を自動生成する その2 ぜんぶでいくつ? (変更点をみつける)

はじめに

今回は新しい文章を扱います。
前回作成した関数をそのまま流用できるのだろうか……

手動でやってみる

問題

だいご君はあめを3つもっています。
いま、さらに5つのあめをもらいました。
もっているあめはぜんぶでいくつでしょうか。

解き方

3+5=8
よって8つ

書き換えの準備

まずは文章にマークを付けないといけません。
ワードは「あめ」
数値は「3」と「5」と「8」
をマーキングします。

この作業は今のところ手動です。
目で見て、手でひとつひとつ書き換えています。

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

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

自動でやってみるPart1

前回作成した「文章題生成_3」に投げてみます。
メモ帳のアドレスなどは手動で書き換えています。

生成した文章Part1

'-------------------------- '問題文 '-------------------------- だいご君はももを110つもっています。
いま、さらに5つのももをもらいました。
もっているももはぜんぶでいくつでしょうか。

'-------------------------- '解き方 '-------------------------- 110+5=550
よって550つ

考察Part1

んー。すごいおかしいですね。
おかしな点をリストアップ。

ももを110個持っているのは多すぎる。
110つではなく110個と表記してほしい。
計算が間違っている。

致命的な欠点は計算が間違っていること。

これは「num3」の求め方が「num1×num2」となっているからです。
この部分を「num1+num2」とすれば解決はするのですが。
今回はそれで。

「num1」と「num2」は乱数の範囲を書き換えます。
ここも妥協。

あ、あとせっかくなので「だいご君」も書き換えられるようにしましょう。

自動でやってみるPart2

扱う文章題

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

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

コードPart2

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

'-------------------------- '変数の定義 '-------------------------- Dim str() As String '文章 Dim path As String 'メモ帳のアドレス Dim box As Variant 'ワードの候補 Dim wor(1 To 2) As String 'ワード入れ替え用の変数 Dim num(1 To 3) As Integer '数値入れ替え用の変数 Dim trgt As String '数値入れ替え用の変数 Dim i As Integer '繰り返しの制御変数 Dim j As Integer '繰り返しの制御変数

'-------------------------- '文章の読み込み '-------------------------- path = ThisWorkbook.path & "\text\text2_1.txt" str = txt_input(path)

'-------------------------- '書き換えの用意 '-------------------------- box = Array("だいご君", "ひかる君", "むつこちゃん", "うらべ君") tmp = Rnd_Num(0, UBound(box)) wor(1) = box(tmp) box = Array("あめ", "りんご", "みかん", "なし", "もも", "かき") tmp = Rnd_Num(0, UBound(box)) wor(2) = box(tmp)

num(1) = Rnd_Num(1, 6) num(2) = Rnd_Num(3, 7) num(3) = num(1) + num(2)

'-------------------------- '問題文を変更 '-------------------------- For i = LBound(str) To UBound(str) For j = 1 To 2 trgt = "wor" & j str(i) = Replace(str(i), trgt, wor(j)) str(i) = Replace(str(i), trgt, wor(j)) Next For j = 1 To 3 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) 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

生成した文章Part2

'--------------------------
'問題文
'--------------------------
むつこちゃんはなしを4つもっています。
いま、さらに4つのなしをもらいました。
もっているなしはぜんぶでいくつでしょうか。

'--------------------------
'解き方
'--------------------------
4+4=8
よって8つ

考察Part2

新たに手を加えた部分をリストアップします。

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

感覚的には相当書き換えたな、という感じです。

まとめ

「文章題生成3」はぜんぜん汎用性のない関数であることが分かりました。
当然ながら「文章題生成
4」も同様です。

文章題を変えるたびにコードのあちこちを変更するのは疲れるので、できるだけ手間を減らすことが次の課題です。
つぶせるものからひとつずつつぶしていきましょう。