プログラミング学習における意図を考慮した
空欄補充問題の自動生成
2009SE040 長谷川 靖成

2009SE234 大竹 諒

2009SE271 田島 侑典

指導教員：蜂巣 吉成

はじめに「学習者に合わせた C 言語演習穴埋め問題の自動生成」[2] では，本研究と同じように，プログラムを解析し，そプログラミング言語の学習では，演習問題を繰り返しこに問題作成者の問題作成意図を適用することで，演習解き，多くのプログラムに触れることが重要である．プ
問題の自動生成を行っている．問題点として，構文を利
ログラムをすべて記述するような演習問題では，採点者用して空欄箇所を指定しているが，問題作成意図が提案はプログラムを目視し，コンパイル，実行して動作確認されている方法で表現できるか明確でない．複数解答にするなどの作業が必要となり，負担が大きい．
ついても考察されていない．
採点の手間を軽減する方法として，moodle などの教育「いかにプログラム空欄補充問題を作るか?」[3] では，プ支援システムを用いて，プログラムの一部が空欄になっログラムにおける処理の流れの要所となる部分を PDG(プた問題を出題して，自動採点を行う方法が知られている．
ログラム依存グラフ) を用いて見つけ，その箇所を空欄とこの方法は，問題作成者が学習者に学習して欲しい内容して設定する．PDG とは，プログラムの各文と文の間のに合わせて，プログラム中の適切な箇所に空欄を設定し依存関係を示す有向グラフであり，データの流れを定量て多くの問題を作成しなければならない．自動採点を行的に判断できるので，データが集中している文が流れのう際，解答も用意しなくてはならないが，プログラミン中心であると判断することが出来る．しかし，問題作成
グ言語には，正解となる記述が複数ある場合があり，全者の意図に合わせた空欄箇所を設定することが出来ない．ての解答を列挙することは手間である．
文法を理解している上級者向であり，本研究で対象とし本研究では，これらの問題を解決するために，学習意ている学習者には合わない．
図を考慮して，プログラムミング言語の空欄補充問題の自動生成を行う方法を提案する．学習意図とは，問題作 3 空欄補充問題の自動生成
成者が学習してほしいと思う内容であり，文法や条件式
本研究での空欄補充問題は初学者向けの問題とし，プの記述方法，変数の初期化の必要性などである．一般的
ログラミング言語の文法を，条件分岐や繰り返しなどのに一つのプログラムは，変数宣言，代入文，入出力文，条単元毎に学習していくとする．3.1 節では問題作成に用い件分岐，繰り返しなどの複数の要素から構成されている．
る学習意図について述べる．3.2 節では解答の自動生成に適用する学習意図を変更することで一つのプログラムかおける問題について説明する．
ら複数の空欄補充問題を作成できる．学習意図は複数組み合わせて使えるが，生成された問題の品質について考 3.1 学習意図える必要がある．例えば，空欄箇所の数が多すぎると問C 言語などのプログラミング言語の教科書を参考にし題の難易度があがってしまう．また，解答によって他の空 て，単元毎に入出力，演算と型，分岐，繰返し，配列，文欄箇所の解答が決まるような，相関性がある問題もある． 字列，関数，ポインタ，構造体の学習意図を考え，問題集
本研究の技術的課題は次の通りである．
[4] などを参考にしてどこが学習意図に応じた空欄箇所な

1

1. プログラミング学習における学習意図の分類とパターン化
2. 複数解答がある場合の解答自動生成
3. 相関性のある空欄箇所の解答自動生成
4. 複数の学習意図を組み合わせた際の問題の品質

2

空欄補充問題の自動生成における関連研究「初級プログラミング学習のための自動作問システム」[1] は，対象言語は Java であり，問題作成者は，問題となるプログラムとその説明をシステムに登録する．シス
テムは登録されたプログラムからキーワードや識別子を抽出し，その部分に空欄をあけることで空欄補充問題を生成する．問題中の空欄は乱数によって設定されるので，毎回異なった箇所に空欄が生成されるので，同じプログラムでも異なった問題が生成される．反復練習が可能となるが，識別子や予約語などを指定できないので，出題者の意図に沿った学習意図を細かく指定できない．のかを調査した．学習意図の例を次に示す．

1. 分岐(a) if の理解if( a ＞ 1 )∼(b) if∼else の理解
if(a ＞ 1)∼ else(c) if∼else if の理解if(a ＞ 1)∼else if( b ＞ 1 )∼2. 繰返し(a) while 文の初期値の理解
a=1 ;while(a > 0){(b) for 文の初期値の理解
for( i = 1 ;a > 0;i++)(c) for 文の条件式の理解
for(i = 1 ; a ＞ 0 ;i++)(d) 繰返しの中で代入される変数の初期値の理解
ans = 1 ;for(i = 1 ; i<=n ; i++)ans = ans*i
3.1.1

学習意図の表現方法

3.2

解答の自動生成空欄補充問題を作成する際，問題作成者が空欄箇所の答えとなりうる解答を設定し，別解が存在する場合も考慮する必要がある．しかし，設定された空欄箇所に入る解答を別解も含め作成するのは負担である．そこで，空欄補充問題を自動で生成すると同時に，解答も自動生成する方法を提案する．以下では解答を自動生成する際に考慮すべき点について述べる．

学習意図を指定する方法として，構文要素で指定できる
3.2.1 複数解答
意図，構文要素で指定できない意図があることがわかった．
空欄箇所には解答が複数存在するものがある．ここで1. 構文要素で指定できる意図はその解答群を複数解答と呼ぶ．本研究では，空欄とな(a) 制御構文の式る以前の元の記述から，複数解答の自動生成を行う．
if の条件式，for の初期値，for の条件式，while
3.2.2 同じ意味となる式の条件式
同じ意味となる式の記述の例は以下のものが挙げられる(b) 予約語• a==b, b==aif，for，while，do，switch，case，default• a>=b, b<=a(c) 演算子• a+b, b+a
条件式の論理演算子，アドレス演算子• i++, i=i+1, i+=1(d) 関数
これらの同じ意味となる複数解答の自動生成は問題生成
return 文における関数の返り値，関数呼び出 と同様に TEBA のパターンを利用し自動生成を行う．
し式
3.2.3 相関性のある解答
2. 構文要素で指定できない意図
ソースコード内に空欄箇所が二つ以上ある場合，その(a) 同一変数に対する計算代入空欄間に相関性が生じる可能性がある．二つ以上の解答が複数ある空欄箇所において，一つの解答が決まると他(b) 繰返しの中で代入される変数の初期化文の解答が決まる場合，その空欄箇所の間には相関性があ
2 の学習意図は左辺と右辺で同じ変数が出現する代入文
るとする．例えば，空欄１と空欄２があり，１でＡと答えや，while 文の条件式の中で使われている変数の while 文た場合，２の解答はＢ，１でＣと答えた場合，２の解答の前の代入式などを指定しなければならない．
はＤとなる場合がある．空欄間に相関性がある場合，学習者によって解答が変わってくるので解答判定が難しい．
3.1.2 パターン記述
プログラム断片や構文単位でプログラムを解析するこ 相関性が生じる可能性がある空欄箇所となる場合は次のとができ，決まった文の並びなどをパターンで書くこと 3 通りである

1. for 文の初期値と終端条件の部分に空欄が設定されたができる解析器である TEBA[5] を利用してパターンを表場合現する．TEBA により構文だけでなく 3.1.1 節の 2 の意
2. for 文の初期値と終端条件増分の，部分に空欄が設定図も記述できる．

された場合
パターン例
3. scanf 文が二つ以上あり入力変数の部分に空欄が設定
sum.pt「同一変数に対する計算・代入の理解」
された場合% before${var1:ID_VAR}=
相関性の判定方法${var1}${ope:OPE}${var2:ID_VAR};
4 節であげた 3 通りの相関性について判定を行う方法を%after述べる．for に関する 1，2 は同じ方法で判定可能である${var1}=<Q>${var1}${ope}${var2}</Q>;
ので２つをまとめて，for に関する相関性，3 を scanf に%end関する相関性とする．

どちらの相関性の判定も，ソースコードを字句解析し上記のパターン例は，TEBA を用いたパターン変換記述た結果を基に行う．相関性が生じる可能性がある箇所に，の例である．学習意図ごとにパターンがあり，印<Q></Q>
空欄が設定されているソースコードのみを対象に相関性をつけて空欄箇所として設定している．の判定を行う．

for に関する相関性
for に関する相関性は，for 文の初期値や終端条件の部分で使われた変数が，同じ for 文のループ内の処理で使われていない場合に生じる．よって，for 文の該当する場所で使われている変数を記憶しておき，その変数を for 文のループの処理内から探し，見つかった場合は相関性は生じない．見つからなかった場合は相関性が生じると判定する．また回数を数える繰返しにおいて初期値と条件の値の組み合わせは無数に考えられるが，一般的に 0 か 1を基準に数える場合が多いので，本研究でもその形に限定し相関性の解答を生成する．

を学ぶ場合，変数名は重要なものであり，適切な変数名を使用することが望ましい．入力を促す printf 文で適切なメッセーシを表示することで，scanf 文における適切な入力変数を決めることができる．よって scanf 文に関しては相関性がある問題としない．例では height は身長を意味する単語であるので，身長の変数名として扱い，weightは体重を意味する単語であるので，体重の変数名として扱い，相関性は生じない．

4

空欄補充問題の自動生成システム

空欄補充問題作成の際の問題作成者の負担を軽減するために，ひとつのソースコードから複数の空欄補充問題
for 文の初期値が 0 か 1 で条件式の値が 2 以上の数字と を作成するツールの作成を行った．選択された学習意図なる場合から，元となるソースコードに含まれる学習意図の組み合わせの数の空欄補充問題を生成する．
for 文の形が for(i = 0; i < #; i++ ) の場合は，i=1, i< @を相関性の解答として生成する．#は定数であり， 空欄補充問題の自動生成ツールの実現にあたり，シェルスクリプトを用いて，元のソースコードが空欄補充問題@は#に 1 加えた数値である．に変換されるまでに必要な処理をまとめた．
for 文の形が for(i = 1; i < #; i++ ) の場合は，i=0, i< *を相関性の解答として生成する．#は定数であり， 4.1 学習意図の選択方法*は#から 1 引いた数値である．
問題作成者が学習意図を選択する際，数多くある学習
for 文の初期値が 2 以上の数字で条件式の値が 0 か 1 と 意図をひとつひとつ選択するのは手間がかかる．そこでなる場合
学習意図を if に関するもの，while に関するものなどのカテゴリごとに分類し，そのカテゴリを選択することでfor 文の形が for(i = #; i > 0; i-- ) の場合は，問題に意図を反映させる．カテゴリは複数選択でき，カi=@, i> 1 を相関性の解答として生成する．
テゴリに含まれる学習意図のすべての組み合わせを適用
for 文の形が for(i = #; i > 1; i-- ) の場合は，i=*, i> 0 を相関性の解答として生成する．#，@，*は上 する．
記と同じ意味である．

4.2

システムの概略

for 文の初期値が 0 か 1 で条件式の値が変数となる場合
for 文の形が for(i = 0 ; i < n; i++ ) の場合は，i=1，i<= n を相関性の解答として生成する．
for 文の形が for(i = 1; i <= n; i++ ) の場合は，i=0，i< n を相関性の解答として生成する．
scanf に関する相関性
例

身長と体重を入力して，BMI を計算して表示するプ
ログラム
double height, weight, bmi;

printf("身長を入力してください ");scanf("%lf", &height );printf("体重を入力してください ");scanf("%lf", &weight );bmi = weight/(height*height) ;printf("あなたの BMI = %f\n",bmi);
return (0);scanf 文の入力変数の箇所が空欄であり，そこで使われ図 1 システムの流れた変数が scanf 文以降の記述で空欄になっている場合，相関性が生じる場合がある．しかし，プログラミング言語提案する空欄補充問題の自動生成システムの処理の流れを図 1 に示す．
認した．
問題作成者は空欄補充問題の元となるソースコードを3.1 節であげた学習意図により問題集 [4] の空欄箇所の用意し，適用させる学習意図を選択する．このソースコー 78 ％を空欄にできた．設定できなかった空欄箇所はライ
ドはどのような処理を行うものなのかコードの初めに記 ブラリ関数名を空欄にするものや printf 関数における書述されているものとする．学習意図ごとにコードの空欄箇 式文字列を空欄にする問題であった．関数名については所となる場所に印<Q></Q>を挿入する空欄生成パターン パターンを記述すれば，関数名を空欄にすることができが設定されており，TEBA を利用してパターンを適用す る．書式文字列を空欄にする場合は，文字列リテラルにることでソースコードを書き換え，空欄箇所を設定する． パターンを記述する方法が必要である．
空欄箇所が設定されたソースコードを相関性を判定す
3.1 節では単元や構文の観点から分類したが，意味の観るツールに渡して，空欄箇所間に相関性が生じるかどう 点から分類することも考えられる．例えば，条件式，変か判定する．その後，複数解答生成パターンを適用する 数の初期化，型，同一変数を使った代入文などが挙げらことで，解答が複数存在する場合，複数解答を生成する． れる．これらに該当するパターンを学習意図のカテゴリ
空欄箇所を設定し相関性，複数解答についての処理を として記述することもできる．
行ったソースコードから，空欄箇所の印を元に空欄問題
学習意図を複数選択する場合，空欄箇所が多く設定さhtml ファイルと正誤判定を行うための解答用 txt ファイ れすぎてしまい，難易度の高い問題や解答者が解きづらルを生成する．
い問題が生成される可能性がある．空欄補充問題の品質の評価を行う必要がある．また，複数のカテゴリを選択
5 評価・考察する際，選択する順番を変更することで，同じカテゴリ点数分布グラフ表示プログラム，素数判定のプログラ を選択しても異なる問題が生成される場合や，空欄箇所
ム，最小値最大値を表示するプログラム，逐次探索の 4 が二重に設定されてしまい，うまく問題が作成されないつのソースコードを元に，一つのソースコードに対して， 場合があった．学習意図をソースコードに適用させる順
どれだけの学習意図が適用できるか，またその結果，い 番や組み合わせについても調査をしていく必要がある．
くつの空欄が設定されるのかを観点として評価を行った．
6 おわりに
表 1 は評価結果である．
本研究では，複数の学習意図を用いて少ないソースコードから多くの空欄補充問題を自動生成し，出題者の負担表 1 評価結果を軽減した．今後の課題として，問題の品質の評価基準
行数 空欄箇所学習意図を明確にすることがあげられる．ソースコードの行数に点数分布
4026if,for,do-while
対する空欄箇所の数や，宣言された変数がどれだけ空欄
素数判定
1912if,for箇所として設定されているか，空欄内のトークン数など
最大最小26
16if,for, 入力, 出力を考えているが，考察をする必要がある．学習意図を適
逐次探索
3611if,while, 入力, 配列
用した際にパターンマッチした箇所すべてに空欄が設定されてしまうので，ランダムに設定することも今後の課評価結果の学習意図はソースコードに含まれる学習意
題である．
図であり，空欄箇所は含まれる学習意図をすべて適用した場合に設定される最大の空欄数である．適用させる学 参考文献
習意図を減らすことで，様々な学習意図をもった問題が[1] 内田 保雄, “初級プログラミング学習のための自動作生成でき，一つのソースコードから複数の空欄補充問題問システム,” 情報処理学会研究報告 Vol2007, No.123,を生成できることが確認できた．適用した学習意図を次
pp.109–113, Dec.2007.に示す．
[2] 有安 浩平, 池田 絵里, 岡本 辰夫, 國島 丈生, 横田 一
• if: if の条件式の理解，if else の理解，if if else の理
正 “学習者に合わせた C 言語演習穴埋め問題の自動解，if 文の予約語の理解生成,” 第 1 回データ工学と情報マネジメントに関す• for: for 文の初期値の理解，for 文の条件式の理解，るフォーラム (DEIM Forum 2009),5 pages,2009.
for 文の増分の理解，for 文の予約語の理解[3] 柏原 昭博, 寺井 淳裕, 豊田 順一, “いかにプログラム• while: while の初期値の理解，while の条件式の理解，空欄補充問題を作るか？,” 電子情報通信学会技術研
while の予約語の理解究報告, Vol.99, No.81, pp.9–16, May. 1999.
• do-while: do-while の条件式の理解，do-while の予 [4] 柴田 望洋, 赤尾 浩, 肘井 信一, 高木 宏典, 解きなが約語の理解
ら学ぶ C 言語, ソフトバンククリェイティブ株式会• 配列: 配列要素数の理解，二次元配列の要素数の理解実現したツールで，学習意図の選択の方法により，点数分布は 37 問，素数判定は 10 問，最大最小は 20 問，逐次探索は 19 問の問題を作成できた．提案手法により１つのソースプログラムから複数の問題を作成できることを確社,2004 年.

[5] 吉田 敦, 蜂巣 吉成, 沢田 篤史, 張 漢明, 野呂 昌満, “属性付き字句系列に基づくソースコード書き換え支援環
境,” 情報処理学会論文誌 Vol.53, No.7, pp.1832-1849,
July 2012