日本ソフトウェア科学会第 36 回大会 (2019 年度) 講演論文集

写経型学習の欠点を補う摂動を用いた理解度確認問題
生成手法 — 二項演算子の事例に基づく有効性評価
亀井 亮汰

吉塚 大浩

篠埜 功

古宮 誠一

プログラミング初学者は，サンプルコードを模倣して，実行結果を確認することによる学習をよく行う．これは写経型学習と呼ばれるが，この学習法では思考を伴わないような単調な作業となり，対象言語の構文や意味についての理解が不十分になりがちである．そこで本研究では，ソースコードに微小な変更を加えることによる新たな学習法を提案する．提案手法では，ソフトウェアテスト手法の 1 つであるミューテーションテストのミュータント生成を利用して，コードに微小な変更を加える．この変更を摂動と呼び，例として二項演算子に対して摂動を加えた問題を生成し初学者に提示する．提案手法に基づいて，プログラミング学習支援ツールを開発し，開発したツールを用いて初学者を対象に評価実験を行った．その結果，写経型学習を繰り返し行ったグループよりも写経型学習に加えて摂動に基づく学習法を行ったグループの方が，学習効果や学習意欲が向上したことを確認した．また，ツールの実装の詳細についても報告する．

げられるが，いずれも教授者に負担がかかる方法で

1 はじめにある．

プログラミングの学習法は様々であり，特にプログ

本研究では，問題のソースコードの生成，出題，解ラミング初学者は，何らかの学習事項の解説を読んだ

答の正誤判定を教授者に変わってツールが行う，新た後，それに関するサンプルコードを書き写して実行結な学習法を提案する．この学習法では，コードに微小果を確認する学習をよく行う．このような学習法は写な変更を加え，その変更に関係する問題を出題する

経型学習と呼ばれる．しかし，この学習法では，学習ことにより，学習者のプログラミング言語の構文や意者によっては思考を伴わないような単調の作業となっ味に関する知識の習得を支援する．ソフトウェアテスてしまい，対象言語の構文や意味についての理解が不ト手法の 1 つにミューテーションテスト [10] があり，十分になりがちである．このような写経型学習の形骸

これはソースコードに微小な変更を加えてミュータン化を防ぐためには，学習者の理解度を確認するため，

トを生成するという過程を含む．提案する新たな学習

写経型学習で扱った知識の問いかけが必要である．そ法では，この技術がプログラミング学習支援においてのための方法として，口頭試問やペーパーテストが挙

ソースコードに微小な変更を加える際に使えるという洞察に基づいている．この微小な変更を我々は摂動

Generating Comprehension Checking Problems Using
Mutation Analysis Compensating for Shakyo-Style
Learning Defects: A Case Study on Binary Operators with Evaluating its Eﬀectiveness.
Ryota Kamei, Takahiro Yoshizuka, Isao Sasano, 芝浦
工業大学大学院 理工学研究科 電気電子情報工学専
攻, Department of Electrical Engineering and Computer Science, Graduate School of Engineering andScience, Shibaura Institute of Technology.
Seiichi Komiya, 芝浦工業大学 名誉教授, Professor Emeritus, Shibaura Institute of Technology.

と呼び，この学習法を以下では摂動に基づく学習法と呼ぶ．この学習法では，摂動の加え方を変えることで

1 つのソースコードから様々な知識の問いかけを行う
ことができるため，写経型学習後にこの学習法を実施することで，サンプルコードの内容以上に多くの知識を学習者が習得することが期待される．この学習法に基づき，摂動を加える対象として二項演算子を例として選び，問題のソースコードを生成，出題，解答の正誤判定を行う機能を持つ学習支援ツールを実装する．

れた問題を繰り返し解くことで，従来，写経型学習でこのツールは，C 言語のフルセットに対応している．

学んでいた知識を効率よく習得できると期待される．

また，このツールを用いて芝浦工業大学の学部生 16

このような学習を摂動に基づく学習法と呼ぶ．

人を対象に実験を行うことで，我々のツールを用いた学習法の有効性を評価する．

本論文では，摂動を加える対象として代入演算子
を除いた二項演算子を例として選ぶ．摂動の加え方

本論文の構成は以下の通りである．2 節では開発すについては，追加や削除を行わず，置換のみとする．

るプログラミング学習支援ツールの機能と実装の詳

また，出題する問題は，生成したソースコードを実行

細について述べる．3 節から 5 節で評価実験の概要とした際の標準出力を答えさせる問題とする．

結果を示し，考察を行い，6 節で関連研究について議論し，7 節でまとめを行う．

2. 2 ツールの全体構成
我々が開発したツールは Node.js [5] 及びテンプレー

2 摂動に基づく学習支援ツールの機能および実装

トエンジン EJS [2] を用いた Web アプリケーション
であり，ページ遷移を行いながら動作する．全体でこの節では，摂動に基づく学習法を定義し，摂動に11 ページからなり，ログインページ，メニューペー

基づく学習法を用いて，問題のソースコード生成，出ジ，アップロードページ，教授者用サンプルコード選

題，正誤判定を行うツールを Node.js [5] を用いた Web

択ページ，アップロードされたファイルの内容確認おアプリケーションとして開発した．この Web アプリ

よび削除ページ，摂動を加えるページ，摂動を加えたケーションのソースコードは http://www.cs.ise.

ファイルの内容確認および削除ページ，学生用サンプ

shibaura-it.ac.jp/jssst2019 に置く．ツールで扱

ルコード選択ページ，問題に解答するページがある．

うプログラミング言語は C 言語とする．ツールの主

アップロードページでは，教授者が写経型学習で用な機能は，主に摂動を加えて問題のソースコードをいたサンプルコードをいくつかアップロードする．教

生成する機能，問題を出題する機能，および解答の授者用サンプルコード選択ページは，サンプルコード

正誤判定を行う機能である．また，このツールでは，の一覧が表示してある．このうち，摂動を加えたいサ

ソースコード上で二項演算子を置換することにより，ンプルコードを選択することで摂動を加えるページ

摂動を加える．そのため，コードを構文解析し，二項へ遷移する．摂動を加えるページにおいて，それらの演算子の位置情報を取得する．C 言語のフルセットに

サンプルコードに摂動を加える．教授者が摂動を加え対応するため，構文解析には Clang [1] の構文解析器

るためのページのスクリーンショットを図 1 に示す．

を用いる．以下では，これらの詳細について述べる．

ここまでのページは教授者が操作するページである．
学生用サンプルコード選択ページでは，解く問題を

2. 1 摂動に基づく学習法

学生が選択する．問題を選択すると，問題に解答する

ソフトウェアテスト手法の 1 つであるミューテー

ページに遷移する．問題に解答するページにおいて，ションテスト [10] の手法に基づいて，コードに微小な摂動を加えたソースコードからツールがランダムに変更を加え，その変更に関係する問題を出題する．例

選び，問題として出題する．問題に解答するページのえば if(a<10) break; というコードの断片があるとスクリーンショットを図 2 に示す．ここまでのページ

き，この部分を if(a<=10) break; のように変更をは学生が操作するページである．

加える．本論文では，このように字句単位で置換，追加，削除することを摂動と呼ぶ．

2. 3 摂動を加える機能および実装

写経型学習で扱ったサンプルコードに摂動を加える

摂動を加える機能は，摂動を加えるページで用いらことにより，ソースコードを生成し，そのソースコー

れる．このページは，教授者により操作される．摂動

ドを元に学習者に問題を出題する．学習者は，出題さを加えられる箇所は図 1 のように赤字で表示される．

子，論理演算子の 6 つのグループに分け，選択した二項演算子に対してそのグループに属している他の二項演算子へと置換するようにした．赤字の箇所が複数ある場合は，複数の箇所に摂動を加えることができる．
上記の操作は，教授者が望む回数だけ行うことができる．その結果，一つのサンプルコードに対して複数のソースコードを生成できる．また，図 1 の左側のよ
うに，摂動を加える箇所と摂動の加え方をランダムに指定する機能がある．この機能を用いると，摂動を加える箇所と摂動の加え方をランダムに 1 つ決定し，摂動を加える．この機能は，教授者の手間を省くため
図1

摂動を加えるページのスクリーンショットに設けた．この摂動を加えるページを実現するためには，ソースコード中の二項演算子を特定する必要があるため，構文解析し，生成した抽象構文木から，二項演算子の始点と終点の位置情報を取得し，JSON
形式で保存する．これについては 2. 5 節で述べる．
教授者が赤字の箇所をマウスでクリックすると，摂動の加え方の選択肢が列挙されるように，摂動を加えることのできる箇所を赤字で表示するため，HTMLの font タグ，select タグ，option タグを用いた．赤字で表示する部分を font タグで囲み，それぞれの選択肢を option タグで囲み，それらを select タグで囲みセレクトボックスを生成する．この select タグに

図2

問題に解答するページのスクリーンショット

は，出現順に連番で識別子をつけている．また，選択肢は二項演算子の属するグループによって変わる

教授者は赤字の箇所のどれかをマウスで指定すると，ため，サーバー上で選択肢を生成し，HTML コード

指定した箇所で可能な摂動の加え方について選択肢に埋め込んでいる．HTML コードに埋め込む際，前を列挙する．この選択肢は，赤字の箇所に摂動を加えから順番に埋め込むと HTML タグにより二項演算子

た後のコード断片である．今回は，二項演算子に限定の位置情報がずれるため，後ろから順番に埋め込む．

して摂動を加えるため，選択肢は二項演算子である．

セレクトボックスを生成する際，対象の二項演算子が教授者が選択肢のいずれかを選択し，確定ボタンを押属しているグループの全ての二項演算子を選択肢とすことで，ツールが文字列置換を行い摂動を加える．

し，赤字にする二項演算子は最初の選択肢にする．こ摂動の加え方は手動で選択できるため，教授者は初学

れは Web ページ表示の際に，select タグ内の最初の者にどのような知識を習得させたいのかを考えながoption タグが選択された状態で表示されるためであら摂動を加えることができる．摂動を加えられる箇

る．教授者が確定ボタンを押すと，select タグの識別

所は，代入演算子を除いた二項演算子を対象にして子及び選択された option タグの文字列値がサーバにいる．代入演算子を除いたのは，摂動を加えたソース送られる．select タグの識別子は教授者が選んだ摂動

コードのコンパイル時のエラーを避けるためである．

を加える箇所を表し，option タグの文字列値は摂動

摂動の加え方については，二項演算子を算術演算子，の加え方を表す．

関係演算子，等価演算子，シフト演算子，ビット演算

サーバでは，教授者が選んだ摂動を加える箇所に対応する識別子から，JSON データを参照し，該当す

libclang とは，LLVM [4] 上で動くコンパイラのフロ

るコード断片と位置情報を取得する．この情報を元ントエンドである Clang [1] の機能にアクセスできに，該当するコード断片を特定し，option タグの値

る，Python のライブラリである．この libclang からを用いて文字列を置換する．この置換によって得られClang の持つ抽象構文木生成機能にアクセスし，抽象たソースコードに対して，コンパイルと実行を行う．

構文木を生成することにより，C 言語のフルセットを実行が終了すると，その標準出力をテキストファイル

対象として，摂動を加えることができる．

に保存し，得られたソースコードもファイルに保存す

抽象構文木の生成を行う際，以下のように cindex

る．得られたソースコードは元となるソースコード毎モジュールの Index クラスにある create メソッドとにグループ化して保存する．この後，サーバーはクラparse メソッドを用いる．

イアントに完了した旨を送信する．受信したクライア

import clang.cindex

ントは，どの場所にどのような摂動を加えたかにつfrom clang.cindex import Index

いて，ダイアログに表示し，サンプルコード選択ペー

index = Index.create()

ジに戻る．実行時間が 1000 ミリ秒を超えた場合は計tree = index.parse(filepath)

算が終了しなかったとみなし，摂動を加えたソース

parse メソッドの引数としてアップロードされた C

コードは破棄してクライアントに警告文を送信する．

ファイルのパスを与えると，結果として抽象構文木

警告文を受信したクライアントはダイアログに警告が得られる．この抽象構文木の各ノードは，そのを表示し，摂動を加えるページに戻る．

ノードに対応するコード断片を含むファイルへのパス，子ノードのオブジェクト，ノードの種類，位置情

2. 4 出題機能および正誤判定機能報などをプロパティとして保持しており，取得でき出題機能および正誤判定機能は，問題に解答する

る．二項演算子を含む式に該当するノードの種類はページにおいて用いられる．このページは学習者にBINARY OPERATOR である．

よって操作される．問題に解答するページのスクリー

上記で生成した抽象構文木を全探索し，種類がンショットは図 2 に示した．このページでは，ソース

BINARY OPERATOR であるノードを見つける処理を, ア

コードから標準出力を答えさせる問題を出題する．学

ルゴリズム 1 に示す．アルゴリズム 1 の search 関数

習者が問題を解くことにより，ソースコードからプロは，引数にノード node と解析したい C ファイルのグラムの挙動を考えさせることができる．図 2 の左ファイルパス ﬁle path をとる．関数内部では，はじ側のボックスに問題のソースコードを表示し，右側のめに，node の持つファイルパスと ﬁle path の照合をボックスに解答を入力させる．学習者が解答を入力し行う．ファイルパスを照合するのは，#include でイ

た後，下にある答え合わせボタンを押すことで，正誤ンクルードされるコードの中の二項演算子を対象外

判定が行われ，正解であれば次の問題のソースコードとするためである．search 関数を最初に呼び出す時，が表示される．不正解であれば同じ問題を再度表示

上記で述べた Index.create().parse(filepath) にする．全ての問題が終了した際には，ダイアログが現よって生成される tree のパラメータの 1 つである

れ，メニュー画面に戻るボタンを表示する．正誤判定

cursor を第一引数に与える．この search 関数は再帰

は，学習者が入力した解答と，ソースコード生成時に関数であり，構文木を深さ優先探索する．第一引数の保存した標準出力のテキストとの一致によって行う．

node の種類が BINARY OPERATOR である場合，nodeの子ノードを調べ，左の子ノードの終点の位置情報と

2. 5 抽象構文木の生成および探索

右の子ノードの始点の位置情報を取得する．この位置

ツールでは，アップロードページにおいて C 言語

情報を get code 関数に渡し，ファイルパス ﬁle pathのソースコードをアップロードした際に，libclang

からコード断片を抽出する．このコード断片には，二ライブラリ [3] を用いて抽象構文木を生成している．

項演算子の他に空白，コメント，改行コード等の制御

て，我々の提案学習法によって初学者の学習効果及びsearch(node, ﬁle path)begin

学習意欲を向上させる効果があるという予想を立てる．3. 2 節では，予想の確認を行うため，評価実験を

if node.location.file = ﬁle path and行う．

node.kind.name = BINARY OPERATOR
thenleft = node.get children()[0].pos.end
right =
node.get children()[1].pos.startcode = get code(left, right, ﬁle path)json data +=mkJson(code, left, right)
end
for child ∈ node.get children() dosearch(child, ﬁle path)end
end
Algorithm 1: 構文木から二項演算子の位置を取得する処理

3. 1 実験の予想
学習者の学習効果が向上するかどうかは新たな学習法を提案する上で一番重要な評価内容である．また，

6 節においても述べるが，学習意欲に関する実験が多く行われている [6] [11] [14]．学習法の単調さゆえの学
習意欲の低下も，写経型学習の問題と深く関係があると考えられる．これらのことから，学習者の学習意欲をアンケートで問うことも，評価における重要な要素の一つであると言える．初学者へ効果があるかどうかを確認するため，以下の節で述べるような評価実験を行う．

3. 2 実験方法
プログラミング経験が 2 年以内あるいはプログラ

文字が含まれている．二項演算子以外を除去するた

ミングに自信のない，芝浦工業大学工学部の学生 16

め，コード断片を一文字ごとに判定し，空白および改名をプログラミング初学者として実験を行う．実験は行コード等の制御文字を削除する．この際，//や/*を大学の教室内で行い，教室に備え付けられたデスク

見つけた場合は，コード断片からコメントを削除す

トップ PC1 台と液晶ディスプレイ 1 台を各実験協力

る．これらを削除した際には，削除した分だけ位置者に割り当てたが，実験協力者本人の所有するノート

情報を更新する．抽出したコード断片と位置情報は，PC を使用したい人に対しては，そのノート PC を使

mkJson 関数により JSON メンバに変換し，JSON用して実験を行う．

オブジェクトに追加する．その後，そのノードの子

実験の流れを図 3 に示す．実験では，写経型学習を

ノード child を順次取得し，再帰的に search 関数を繰り返し行うグループと提案学習法による学習を行呼び出す．全てのノードを探索した後，2. 3 節で述べうグループ間において，テスト結果およびアンケー

たように，後ろから順に HTML タグを入れる必要がト結果にどれほど差が出るかについて調査を行う．実あるため，結果として得られる JSON オブジェクト

験協力者 16 名を 8 名ずつ，2 つのグループに分ける．

内の JSON メンバを位置情報によりソートする．

グループに分ける際には，プログラミング経験のヒア
リングを各実験協力者に行い，グループ間においてな

3 評価実験

るべくプログラミング経験が同程度になるよう分け

2 節では摂動に基づく学習法に基づいたツールの開る．実験全体に渡って，写経型学習のみを行うグルー発を行った．本節では開発したツールを用いて，我々プをグループ A とし，提案学習法による学習を行うの提案学習法が初学者に対して有効であるか確認すグループをグループ B とする．実験を開始する前に，るため，評価実験を行う．提案学習法とは，従来の写実験の簡単な概要と実験協力者のタスクについて説経型学習に我々の提案する摂動に基づく学習法を加え明する．実験は前半の学習，前半のテスト，後半の学た学習法のことを指す．3. 1 節では評価実験にあたっ

習，後半のテスト，アンケートの 5 つのタスクからなり，この順番で行う．グループ間においてタスク内容

半のテスト，後半のテストと類似したものである．今に違いがあるのは，後述するように後半の学習および回の実験で最初のサンプルコードの学習が済み，用アンケートの一部の質問項目であり，他のタスク内容

紙を追加で配布した実験協力者は 1 人だけであった．

は同じである．

グループ B では，2 節で述べたツールを使用して後各タスク内容について述べる．最初のタスクである

半の学習を行う．実験協力者は，摂動を加えて生成さ前半の学習では，実験協力者に 15 分間学習してもられたソースコードの入ったフォルダを選択する．フォう．この学習では我々の開発したツールを使わずに，ルダを選択すると，そのソースコードに関する問題

A4 サイズ 2 枚の用紙に書かれた短い 3 つのサンプルが何問か出題され，これらを解くことで学習を行う．

コードを，PC 上で 1 つずつキーボードで打ち込んでツールを使用して摂動を加える対象となるサンプル

実行し，結果をそれぞれ確認する写経型学習を行う．

コードは，後半の学習でグループ A が使用する 3 つ

学習時間中は，彼らが持ち込んだ参考書やノートを使のサンプルコードと同じである．摂動を加える際に用して調べたり，Web 上で検索してもよいこととすは，ツールに備わっているランダム生成機能を使用する．また，彼ら同士の間で一部相談したり，我々に対る．これら３つのサンプルコードに対して摂動を加えして質問を行うことも許したが，今回の実験は各自のて，4 つのソースコードをそれぞれ生成し，サンプル

学習結果を評価するものでありグループワークではな

コードを含めた 5 つのソースコードが 3 つのフォル

い．そのため，サンプルコードの実行結果がなぜこのダにそれぞれ分けられて入っている．どのフォルダかような出力になるのか，ソースコードにおけるこの部

ら選択して問題に取り組むか，どのような時間配分で分はどのような意味なのか等について相談したり質演習するかは実験協力者の自由である．4 番目のタス問を行うことは，周りの人の説明による影響を大きくクである後半のテストについては，付録 B に示す．

受けてしまい，テスト結果に大きな影響を与えてしま

最後のタスクであるアンケートでは，今回の学習にうことを考慮して許可しなかった．前半の学習のサン

よって構文の意味やソースコードの理解が出来たか，

プルコードは，前半のテストで出題するソースコード

学習理解度や学習意欲が上がったと感じるかなどにつに対し，二項演算子の引数部分の整数値だけを変えた

いて実験協力者に回答してもらう．アンケートの質問

サンプルコードになっている．つまり，この前半の学項目を表 1 に示す．質問項目 13-a はグループ A，質習でサンプルコードの基本的な理解が出来ていれば，

問項目 13-b 及び 14-b はグループ B のみに対する質前半のテストにおける各問題の最初の設問について問である．質問項目 13-a，15，16 は記述式で，その解くことができるような，学習とテストの設計となっ他の質問は，そう思う，ややそう思う，どちらでもなている．2 番目のタスクである前半のテストについて

い，ややそう思わない，そう思わないの 5 段階で回は，付録 A に示す．

答する．

3 番目のタスクである後半の学習では，実験協力者に 20 分間学習してもらう．この学習内容はグループ

4 実験結果A とグループ B で異なる．グループ A では，前半の各グループの前半のテストの結果を表 2 に示す．点

学習と同様に 3 つのサンプルコードが書かれた用紙

数は各グループ 8 人の平均であり，各設問の平均点が配られ写経型学習を行う．後半の学習は前半の学習及び合計点の平均である．合計点の標準偏差は，グよりも学習時間が 5 分長く，実験協力者は前半の学習

ループ A で 1.48，グループ B で 1.58 であった．テ

よりも，サンプルコードの意味をより深く考えること

ストの合計点を見ると，グループ A の方が平均がやが出来る．もし，これら 3 つのサンプルコードの学や高いが，グループ間に大きな差はないことが分か習が済み，時間が余った実験協力者には，予備の３つ

る．標準偏差では，グループ B の方が値がやや大きのサンプルコードが書かれた用紙を追加で配布する．

いが，グループ間に大きな差はない．

予備のサンプルコードは前半の学習や後半の学習，前後半のテストの結果を表 3 に示す．表の見方は表 2

後半の学習グループ A開始

前半の学習

前半のテスト後半のテスト

アンケート

終了

後半の学習
グループ B

図3

実験のフローチャートと同様である．合計点の標準偏差は，グループ A で1.5，グループ B で 1.36 であった．テストの合計点を見ると，グループ B の方が平均が高い．前半のテストの合計点の平均と比べても，グループ B の方が点数の伸び率が高かったと言える．標準偏差では，グループ B の方が値が小さくなっており，グループ Bの方がばらつきが小さかったと言える．
テスト結果を見ていくと，問 3 において，グルー
プ A では前半のテストと後半のテストで平均点にあ
まり差がなかったが，グループ B では前半のテスト

図4

グループ A における各実験協力者のテストの点数

図5

グループ B における各実験協力者のテストの点数

よりも後半のテストにおいて平均点が高かった．全ての問題において，前半のテストの時点では，設問 2-1
以外でグループ B よりもグループ A の方が平均点が高かった．しかし，後半のテストでは全ての設問においてグループ A よりもグループ B の方が平均点が高かった．
各グループにおける各実験協力者のテスト結果をそれぞれ図 4，図 5 に示す．グラフの横軸は各実験協
力者を，縦軸はテストの点数を示しており，各実験協
力者毎に前半のテスト，後半のテストの点数を 2 つの棒グラフで示している．グループ A では，前半のテストと後半のテストを比較すると 2 回目に実施した後半のテストにおいて点数の上昇した実験協力者が平均である．グループ間で点数を比較すると，質問項やや見られる．しかし，全体としてはあまり点数は上

目 1 から 5 では，どちらの平均点が高いかについて昇しておらず，取得した点数も低い．グループ B では各質問項目毎に異なっていると言える．質問項目 6

は，後半のテストにおいてほとんどの実験協力者の点から 10 では，9 以外は，グループ A よりもグループ数が上昇しており，取得した点数も高い．

B の方が平均点が高いと言える．質問項目 11，12 で各グループのアンケート結果を，表 1 に示す．記は，グループ B の方が平均点が高い．質問項目 13-b

述式以外の項目について，そう思わないからそう思に関しては平均点が高いが，14-b に関しては他の項

うまでの 5 段階に 1 点から 5 点の点数を割り当てた．

目と比べて平均点が低い．

表の各数値は各グループにおける質問項目の点数の質問項目 13-a に関しては，プログラミングや学習

への取り組み姿勢を変えたというような記述があった

5. 2 テストの設問及びアンケートの質問項目

が，詳細は次節の考察において述べる．質問項目 15

表 2 と表 3 のテスト結果を各問毎に見ていくと，問と 16 に関しては，学習法に関する意見，コードや構

1 は if 文の条件分岐と if 文条件式の論理演算子の理文の意味についての意見，グループ B の後半の学習解度を確認する問題であった．グループ B では，前で使用した学習支援ツールの使用感についての意見

半のテストよりも平均点をやや上げていることが分などが見られた．これらの意見については，次節の考

かる．アンケート結果でも，表 1 のこの大問に関係察とともに述べる．

の深い質問項目のうち，質問項目 1 と 6，2 と 7 においてグループ B の方が点数の上昇率が高い．

5 実験の考察

問 2 は，for 文の 2 重ループの理解度を確認する問

本節では，写経型学習を繰り返し行う学習と提案学題であった．後半のテストでは，どちらのグループも習法との実験結果の違いに関して，3 つの観点に分け

2 つの設問ともに前半のテストと比べて平均点が上昇て考察を行う．

していることから，どちらのグループも for 文の 2 重
ループについて基本的理解の出来た人が多かったと考5. 1 予想についての考察えられる．アンケートの質問項目 3，8 を見ると，グ

表 2 において，グループ間でテストの合計点の平

ループ B のみ，前半の学習だけよりも前半，後半両

均や標準偏差がおおよそ同じであったことから，実験方の学習を行った方が，for 文について理解できたと協力者の能力が同程度になるようにグループ分けさ

評価している．設問 2-2 について，for 文の処理の中れていた事がわかる．表 3 を見ると，グループ B のにコードを追加してどのような実行結果になるかを合計点の平均の方が，グループ A の合計点の平均を問う，設問 2-1 よりもやや難しめな設問であったが，大きく上回っている．両グループで前半のテストと後グループ B の方が平均点の上昇率が大きい．これら

半のテストの結果を比較しても，グループ B の方がのことから，グループ B の方が for 文に対してよりグループ A より点数上昇率が高い．図 4 と図 5 の実

深く理解出来たと考えられる．

験協力者個人の点数データについてもグループ B の

問 3 は，フィボナッチ数列を使用した，再帰関数の方が，点数上昇率が高い．これらの実験結果から，グ

理解度を確認する問題であった．前半のテストでは，

ループ A のように写経型学習を繰り返し行うよりも，両グループとも設問 3-1，3-2 で問 2 と同様に平均点

グループ B のように写経型学習に加えて摂動に基づが低く，再帰関数を理解しなければ解くのが難しい問く学習法を行う提案学習法の方が，よいテスト結果が題であったと言える．グループ A について，後半の得られたと言える．さらに表 1 のアンケート結果のうテストの結果は，前半のテストの結果とあまり変わら

ち，特に質問項目 11 ではグループ A よりもグループなかった．特に設問 3-1 は実行結果を記述する問題でB の方が高い点数が得られており，プログラミングあったが，2 回の写経型学習を経ても平均点が全く同の学習理解度が上がったと感じる人が多かった．よっじであった. 一方でグループ B について，後半のテて前述のテスト結果とアンケート結果から，提案学習

ストの設問 3-1，3-2 では前半のテストと比べて平均法によってプログラミング初学者の学習効果を向上さ点が大きく上昇した．特に 3-2 に関しては実験協力者せる効果があると言える．アンケート質問項目 11 にの全員が正解であった．よって，この問 3 では提案学

ついて，10 と同様にグループ A よりもグループ B に習法による学習効果がより顕著に見られ，再帰関数のおいて，学習意欲が上がったと感じる人が多かった．

理解度向上に大きく貢献したと言える．

このことから，提案学習法によってプログラミング初

アンケートの質問項目 5，10 の平均点の違いを両学者の学習意欲を向上させる効果があると言える．

グループで比較すると，グループ B の方が後半の学習によって各ソースコードの理解度が向上したことがわかる．このことや前述の各問題の考察を踏まえる

表1

アンケートの質問項目と各グループの平均点

項目

グループ A

グループ B4

3.5(四則演算，論理演算など) を正しく理解できたと感じる．

3.25

3.125

3

前半の学習において，for 文を正しく理解できたと感じる．

3.25

3.375

4

前半の学習において，再帰関数を正しく理解できたと感じる． 2.75

3.375

5

前半の学習において，1 題ごとにプログラムの意味を理解で

3.375

2.875

4

4.25

(四則演算，論理演算など) を正しく理解できたと感じる．

3.25

4.25

前半の学習・後半の学習において，for 文を正しく理解できた

3.25

4

3.5

3.5

3.5

3.625

2.875

3.875

2.5

3.375

No.
1

前半の学習において，if 文を正しく理解できたと感じる．

2前半の学習において，演算に関する文法知識きたと感じる.

6前半の学習・後半の学習において，if 文を正しく理解できた
と感じる．

7
8

前半の学習・後半の学習において，演算に関する文法知識

と感じる．

9

前半の学習・後半の学習において，再帰関数を正しく理解できたと感じる．

10前半の学習・後半の学習において，1 題ごとにプログラムの意味を理解できたと感じる.

11前半の学習・後半の学習を行うことで，プログラミングの学
習理解度が上がったと感じる．

12前半の学習・後半の学習を行うことで，プログラミングの学
習意欲が上がったと感じる．

13-a後半の学習において，前半の学習とは異なった，学習面で工夫した点はありましたか．あればどのような点を工夫しまし
たか．

13-b

後半の学習で使用したツールについて，出題の仕方はよかっ

4.25

たと感じる．

14-b

後半の学習で使用したツールについて，ツールは使いやす

2.625

かったと感じる．

15

学習やテストでのプログラムで，最後まで分からなかった点があればどのような点が不明でしたか．

16

自由記入欄

と，写経型学習を繰り返すよりも写経型学習に加え

5. 3 実験協力者のフィードバックて摂動に基づく学習を取り入れた提案学習法の方が，アンケートの質問項目 13-a，15，16 では，5 段階

より深いソースコードの理解度が得られ，学習効果が評価の回答ではなくユーザの意見を記述してもらう高かったということが言える．

質問であった．質問項目 13-a では計 3 人が回答して

表2前半のテストの各グループの平均点

グループ

1-1

1-2

2-1

2-2

3-1

3-2

合計

グループ A (従来型)

1

1.75

0.125

0.25

0.375

0.25

3.75

グループ B (提案型)

0.875

1.625

0.625

0.125

0.25

0.125

3.625

表3

後半のテストの各グループの平均点

グループ

1-1

1-2

2-1

2-2

3-1

3-2

合計

グループ A (従来型)

0.875

1.375

0.625

0.5

0.375

0.375

4

グループ B (提案型)

1

1.875

0.875

0.625

0.75

1

6.125

おり，そのうちの一人は，ただ書き写すという作業に不正解であったとき，何らかのヒントや正解を教えてならないようコードの理解に努めた，という内容で回くれた方が良かった，という内容である．解答が分か答した．この回答から，写経型学習が機械的な作業とらないまま同じ問題を解き続ける行為は，人によってなりがちであるということが分かる．つまり，その実はストレスになる．さらに今回のツールの仕様では，

験協力者のように意識的にソースコードを理解しよ

問題に正解するまでは次の問題に進むことはできず，

うとしなければ，機械的な作業となってしまうという一度戻ってフォルダを再度開かなければ新たな問題にような点が，写経型学習の問題点である．他の 2 人

取り組むことが出来ない．これらの意見を踏まえるの回答は，実行結果を変えるため，自主的にサンプルと，一例として数回間違えるとその問題の解答を見る

コードの一部を変えて実行した，という内容だった．

ことができるように，ツールの仕様を改善することがこの学習の工夫は，彼らにも写経型学習だけを行うの今後の課題である．他のグループ B の意見では，後は不十分であるというような考えがあったからだと考半の学習ではソースコードを理解しようとする時間

える．提案学習法では，摂動によって，彼らの行ったが長いので考える力がつきそうだと感じた，という内サンプルコードを変更するという作業を省けるため，容があった．これは我々が望んでいた学習の在り方でその分だけ学習効率が上がる．

あり，似た問題を解くうちに，1 箇所の変更によって質問項目 15 ではグループ A の意見が大半で，論理標準出力にどのような違いが現れるかなどを考える演算子や for 文が最後まで分からなかったという記述

ことに時間を使っているかもしれない．このように，があった．写経型学習を繰り返すだけでは，人によっ

ソースコードを理解しようと考える時間が重要であてはひとつの構文の理解に多くの時間がかかってしり，今回の実験では提案学習法によってその時間を実

まったり，構文の理解に至らないかもしれない．

験協力者に与えられた．ソースコードを理解しようと質問項目 16 のグループ A では，単調な写しは退屈

考える時間を初学者に与えることが出来れば，様々なだといった意見や，タイピングが遅くて前半の学習で

ソースコードで提案学習法を繰り返すうちに，より多は最後まで入力することが出来ず，テストは以前から

くの構文の理解が得られる．提案学習法で学習した初の知識で解答したという意見があった．前者の意見か学者が，得られた知識を生かして他の問題にどの程度らは，写経型学習では，人によっては学習意欲の低下対応できるのか評価することは今後の課題である．

が起きてしまうことが分かる．後者の意見からは，タイピングの速さが写経型学習に影響を与えてしまう

5. 4 今後の課題ということが分かった．

今回の実験により，5. 3 節で見られた課題の他にも質問項目 16 のグループ B における意見で一番多いくつか課題が見られた．1 つは，摂動の対象とそのかったのは，ツールを使用した後半の学習で，解答が与え方についてである．今回の実験では，各サンプル

コード内の代入演算子を除いた二項演算子に対してを軽減するため，Raspberry Pi を対象として写経型

ランダムに摂動を加え，二項演算子を対象としたが，学習を行わせるプログラミング教材を開発した．写単項演算子や，演算子以外への摂動など選択肢は様々

経型学習を行い，演習問題を行わせるという点では，である．また，どのような摂動の与え方が，プログラ

我々の提案する学習法と一致している．我々は教材を

ミング初学者への学習効果が高くなるか考えること

初めから作るのではなく，教授者がサンプルコードをも重要である．

用意し，それに摂動を加えることにより問題を生成す

もう 1 つは，プログラミング学習支援ツールの機能である．表 1 の質問項目 14-b を見ると，ツールのる学習法を提案し，教授者の負担を軽減するようなツールを開発した．

使いやすさについての質問で平均点が低い．質問項目

16 の意見では，UI がシンプルで見やすかったという

6. 2 ミューテーションテスト

意見があった反面，問題の解答の際にはスペースや改

ミューテーションテスト [10] は，あるコードから行まで一字一句間違えずに入力しなくてはならず，そミュータントと呼ばれる，バグが含まれるコードを大れに対する必要性についての意見があった．さらに，量に生成し，テストスイートがそれらのミュータント

不正解時には毎回解答欄が初期化されてしまうため，を検出できる割合を測定することでテストスイートのユーザは再び始めから入力しなければならなかった．

性能を測定する，ソフトウェアテスト手法の 1 つであ5. 3 節でも課題としたように，ツールの改善を行うこる．ミューテーションテストを支援するため，各プロとで，プログラミング初学者の学習効果や学習意欲を

グラミング言語でテストツールが提供されており，一さらに高められると考える．

例として Java では MAJOR [13] や PIT [9]，MuJava[15] などがある．

6 関連研究

Oliveira ら [17] は，プログラミング初学者の学習プ

摂動に基づく学習法では，写経型学習の問題点を補

ロセスを改善するために，ミューテーションテスト

うため，ミューテーションテストのミュータント生成

ツールを使用することを提案し，本来のテストツー

技術を用いて，コードに微小な変更を加えてソース

ルの機能を制限して初学者が使いやすいようにした，

コードを生成し，そのソースコードに関する問題を学

Pascal Muntants を開発した．Pascal Muntants に

習者に解かせる．この学習法に基づいて，プログラミ

は，ミューテーション演算子を選択してミュータント

ング学習支援としてのツールを開発した．本節では，を生成する機能，オリジナルのソースコードとミュー

6. 1 節で写経型学習に関わる研究を，6. 2 節でミュー

タントコードを比較する機能，テストケースを生成す

テーションテストに関わる研究を，6. 3 節で我々が開る機能，生成した複数のテストケースでどれだけの発するプログラミング学習支援ツールに関わる研究

ミュータントを排除できたかを示すミューテーション

を挙げ，我々の研究と比較する．

スコアを確認する機能がある．Pascal Muntants を用いて，ミューテーションテストを取り入れた学習法

6. 1 写経型学習

が初学者に対して有効であるかどうか，評価実験を

岡本ら [18] は，写経型学習における初学者のつまず行った．実験として，Pascal 言語で書かれたフィボ

きについて分類した．これらのつまずきを軽減あるいナッチ数列のコードに関する問題を初学者に解かせは取り除くために，教授者側が初学者に対して適切なた．初学者をコンパイラを使用するグループと Pascal

助言や教材を与えること，学び方を明示することなど

Muntants を使用するグループの 2 つに分け，2 つのを解決法として検討している．我々は写経型学習の問

グループ間で平均点に差があるかどうか評価した．問

題点を解決するため，摂動に基づく学習法を提案して題は記述式で，完全な正解でなくても部分点をつけツールを開発し，具体的な解決策を示した．

る．実験結果では，ツールを使用したグループの方が辻ら [19] は，初学者の学習効果向上と教授者の負担

完全な正解である割合が高く，一部の問題を除いてコンパイラを使用したグループよりも平均点が上であっした．Miljanovic ら [16] は，デバッグ手法の学習を手たことから，ミューテーションテストを取り入れた学

助けし，学習がより楽しくなるような RoboBUG の習法は初学者に有効であるとした．考察では，ソース

ゲームを開発した．これらのゲーム形式の学習法は摂

コードと比較してミュータントコードではどのような動に基づく学習法とは直接は関係せず，相互に補完し変更が加わったのか，ミュータントを排除するためにうるものであると考えられる．

はどのようなテストケースを考えればよいのかなど，

プログラミング支援の評価対象として，学習意欲

学習者がミューテーションテストを行うことが学習にの向上を扱った研究が行われている．Amer ら [6] は，有効であるとした．この研究はミューテーションテス

プログラミングコースに iPad を導入した際の初学者

トに着目して，プログラミング初学者を支援するといの学習効果および学習意欲に関してアンケートで評価

う点で我々の研究と共通している．しかし我々の研究した．iPad には，iPad のみでプログラミングの作業とは明確に異なる点が存在し，それは学習の方法にを完結できるようにアプリケーションを導入した．一ついてである．彼らはミューテーションテストツール

定期間のコース終了後におけるアンケート結果では，

でミューテーションテストを初学者に行わせている．

iPad を使用したグループにおいて，独学の時間にお我々の研究では，ミューテーションテストのミュータ

ける学習効率が向上し，学習意欲の向上が見られた．

ントの生成工程のみを応用してシステムがランダム

Echeverria ら [11] は，プログラミング学習として協で行うか，教授者が指定することで，摂動の加わった調学習で行うことを提案し，その学習法を適用したプ

ソースコードを生成する．その上で，生成したソー

ロジェクトに参加した大学生に対して，学習効果と学スコードを実行した際の標準出力を答えさせる問題

習意欲に関する評価実験を行った．プロジェクトではを提示して学習させるものであり，ミューテーション

グループ学習としてアルゴリズムの設計と実装を行

テスト自体を初学者に行わせるものではない．彼ら

い，設計や実装段階で何回か他のグループに対してコの研究では Pascal Muntants を使用したグループはメントや評価を行う．プロジェクト終了後，実装した問題の正解率は良かったが，コンパイラを使用したプログラムの点数とそのプログラムに寄せられた他

グループよりも解答時間が長かったという課題があっのグループからのコメントを評価した結果，他のグ

た. 我々の研究では，写経型学習を繰り返し行ったグ

ループに与えたコメントが他のグループの成績と学

ループと，写経型学習に加えて摂動に基づく学習法を

習意欲向上に繋がり，コメントという数式やアルゴリ行ったグループにおいて，学習とテスト時間は全て同ズムの具体的な説明を促すことによって自身のグルー一のものであり，その条件下でも後者のグループの方

プの学習効果向上にも繋がったとした．学力的な側面が良いテスト結果が得られた．このことから，彼らのを評価するだけでなく，学習意欲の側面から評価する

ツールとは異なり，我々のツールでは通常の学習よりこともプログラミング支援の研究として重要であり，長い時間を費やさなくとも学習効果が向上した．

我々の評価実験でも学習意欲に関して評価を行った．
プログラミング学習支援ツールには，ブロックベー

6. 3 初学者に対するプログラミング支援

スのビジュアルプログラミング言語を使用するものがプログラミング初学者に対するプログラミング支

ある．ビジュアルプログラミング言語の利点として，

援の研究が，これまでに数多く行われている．プログ

コードはエディタからブロックとして選べばよく，構ラミング支援の手法として，ゲーム形式でユーザに学

文や文字の間違いによるエラーが起こりにくい点，色習させるような研究が行われている．

によるハイライトでコードが見やすくなる点などがLee ら [14] は，学習支援システムに擬人化の要素挙げられる [7]．Grover ら [12] は，ビジュアルプログを取り入れるようなゲームを開発した．Bishop ら [8]ラミング言語の 1 つである Scratch を使用しているは，プログラミング学習に対してユーザが積極的に中学生を対象として，演習問題を複数解かせ，変数，

時間を費やせるようなパズルのようなゲームを開発

式，ループなどの理解度を評価した．その結果とし

て，変数とは何か，ループがどのように機能するのか，ソースコードはどのような構造から出来ているのかなど，学生は深く理解してなかったことを問題点として挙げ，ビジュアルプログラミング言語の初学者の使用に関して，概念的な学習を組み合わせた教育が必要であると述べている．ビジュアルプログラミング言語を用いた学習と摂動に基づく学習法を併用することで学習効果が上がるかもしれない．

7 まとめ
本研究では，コードに微小な変更を加えることによる摂動に基づく学習法を提案し，その学習法に基づいてプログラミング支援ツールを開発した．開発したツールを使用して，提案学習法による初学者の学習への有効性について評価実験を行った．実験の結果，
提案学習法によって，写経型学習を繰り返すよりもプ
ログラミング初学者の学習効果および学習意欲を向上させる効果があることを確認した．今回は二項演算子のみが対象であったが，C のフルセットに対応し，コメント，マクロ，制御文字，文字列リテラル内の改行に対応しており，授業で問題なく使えるレベルにある．一方で，5. 3 節や 5. 4 節で述べたように，摂動の対象やその与え方，ツールの機能の追加などが今後の課題として挙げられる．
謝辞 芝浦工業大学在学時に，libclang を使って C
言語のプログラムの構文解析をすることを提案してくださった今泉良紀氏に感謝致します．

参 考 文 献[ 1 ] Clang: A C language family frontend for LLVM,
https://clang.llvm.org/.
[ 2 ] EJS – Embedded JavaScript templates, https://ejs.co/.
[ 3 ] libclang: C Interface to Clang, https://clang.
llvm.org/doxygen/group__CINDEX.html.
[ 4 ] The LLVM Compiler Infrastructure Project,https://llvm.org/.
[ 5 ] Node.js, https://nodejs.org/.
[ 6 ] Amer, H. and Ibrahim, W.: Using the iPadas a pedagogical tool to enhance the learning
experince for novice programing students, 2014
IEEE Global Engineering Education Conference(EDUCON), 2014, pp. 178–183.
[ 7 ] Bau, D., Gray, J., Kelleher, C., Sheldon, J.,

and Turbak, F.: Learnable programming: blocks
and beyond, Communications of the ACM, Vol. 60,
No. 6(2017), pp. 72–80.
[ 8 ] Bishop, J., Horspool, R. N., Xie, T., Tillmann,N., and de Halleux, J.: Code Hunt: Experience withCoding Contests at Scale, Proceedings of the 37th
International Conference on Software Engineering- Volume 2, 2015, pp. 398–407.
[ 9 ] Coles, H., Laurent, T., Henard, C., Papadakis,
M., and Ventresque, A.: Pit: A practical mutation
testing tool for Java, Proceedings of the 25th International Symposium on Software Testing and Analysis, ACM, 2016, pp. 449–452.
[10] DeMillo, R. A., Lipton, R. J., and Sayward,
F. G.: Hints on test data selection: Help forthe practicing programmer, Computer, Vol. 11,
No. 4(1978), pp. 34–41.
[11] Echeverrı́a, L., Cobos, R., Machuca, L., andClaros, I.: Using collaborative learning scenarios
to teach programming to non-CS majors, Computer applications in engineering education, Vol. 25,
No. 5(2017), pp. 719–731.
[12] Grover, S. and Basu, S.: Measuring student learning in introductory block-based programming: Examining misconceptions of loops, variables, and boolean logic, Proceedings of the 2017
ACM SIGCSE technical symposium on computerscience education, ACM, 2017, pp. 267–272.
[13] Just, R.: The Major mutation framework: Efﬁcient and scalable mutation analysis for Java,
Proceedings of the 2014 International Symposium
on Software Testing and Analysis, ACM, 2014,
pp. 433–436.
[14] Lee, M. J. and Ko, A. J.: Personifying programming tool feedback improves novice programmers’learning, Proceedings of the seventh international
workshop on Computing education research, ACM,
2011, pp. 109–116.
[15] Ma, Y.-S., Oﬀutt, J., and Kwon, Y.-R.: MuJava:A mutation system for Java, Proceedings of the 28th
International Conference on Software Engineering,
ACM, 2006, pp. 827–830.
[16] Miljanovic, M. A. and Bradbury, J. S.:
Robobug: a serious game for learning debugging
techniques, Proceedings of the 2017 ACM Conference on International Computing Education Research, ACM, 2017, pp. 93–100.
[17] Oliveira, R. A. P., Oliveira, L. B. R., Cafeo, B.
B. P., and Durelli, V. H. S.: Evaluation and Assessment of Eﬀects on Exploring Mutation Testingin Programming Courses, Proceedings of the 2015
IEEE Frontiers in Education Conference (FIE),
FIE ’15, 2015, pp. 1–9.
[18] 岡 本 雅 子, 喜 多 一: プ ロ グ ラ ミ ン グ の 「 写 経 型
学習」における初学者のつまずきの類型化とその考察, パイデイア: 滋賀大学教育学部附属教育実践総合センター紀要: memoirs of the Center for Educational Research and Training, Shiga University,

Vol. 22(2014), pp. 49–53.
[19] 辻仁志, 喜多一: プログラムによる計測・制御のための Raspberry Pi 用写経型学習教材の開発, 研究報
告コンピュータと教育 (CE), Vol. 2014, No. 4(2014),
pp. 1–9.

A 実験で使用した前半のテストの問題
実験のタスクである前半のテストの内容を述べるとともに，前半のテストで使用した問題を提示する．

かを確認する狙いがある．2 問目では，一部のソース
コードの変更や短いコード断片を追加した際の実行結果を解答する．ソースコード全体を理解したうえで，前半の学習で得られた知識を応用できるどうかを確認する狙いがある．論文中では，1 題目の設問 (2) を設問 1-2 のように表記する．設問 1-2 以外の各設問は完答で 1 点であるが，1-2 においては 1-1 の設問を間違えてしまうと完答できなくなってしまい，仮に 1-2

2 番目のタスクである前半のテストでは，12 分のテで正しい解答が一部存在していても不正解になってストを実施する．前半のテストの問題を図 6，図 7 にしまう．これは実験における実験協力者の理解度を確示す．テスト問題は A4 サイズ 2 枚の用紙に書かれており，実験協力者はその用紙に解答を記述する．この時，ディスプレイを見たり問題の手がかりを得るために Web ページや参考書で調べたり，周りの人と相談認する狙いとは異なる結果となってしまうため，1-2
は 1*2 点=2 点満点の配点とし，1-1 が不正解の場合
でも 1-2 で本来正解であるはずの解答が片方存在していた場合，1 点を配点する仕様となっている．

することを許可しなかった．テスト問題の二項演算子や代入演算子における引数は，全て整数値である．

B 実験で使用した後半のテストの問題

問題は 3 題あり，各題 2 問ずつの設問を設けている．

実験のタスクである後半のテストの内容を述べる

1 題目では，if 文における条件分岐および if 文の条件

とともに，後半のテストで使用した問題を提示する．

式における論理演算子を理解しているかどうかを確認する．2 題目では for 文による 2 重ループを，3 題
目ではフィボナッチ数列の再帰関数を理解しているかどうかを確認する．各題の 1 問目では，ソースコー
ドの実行結果を解答する．前半のテストの前に行う
前半の学習では，写経型学習によってこれらのテストに類似したサンプルコードの実行結果を見る学習となっており，各題 1 問目では前半の学習の効果がある

4 番目のタスクである後半のテストでは，前半のテス
トと同様に 12 分のテストを実施する．後半のテストのソースコードは，前半のテストにおける，一部の二項演算子及び一部の二項演算子の引数を変更したものである．後半のテストの設問は，前半のテストの設問における，一部の二項演算子及び一部の二項演算子の引数を変更したものである．

テスト A

2. 次のプログラムについて答えて下さい。

学籍番号:#include<stdio.h>

1. 次のプログラムについて答えて下さい。
#include <stdio.h>

int main(void){
int i, j;

int main(void) {for (j = 1; j <= 4; j++) {int num;
num = 2021;/*(2)で追加挿入する箇所*/

if(num % 4 == 0 && num % 100 != 0

for (i = 1; i <= 6; i++) {|| num % 400 == 0)

if((i * j) % 4 == 0)

printf("route A\n");printf("%d ", i * j);else if(num % 3 == 0 || num % 7 == 0)}

printf("route B\n");printf("\n");else}
printf("route C\n");return 0;}

return 0;（1） 上記プログラムの実行結果の出力}を記述して下さい。（コメントアウ
ト部の/* ～ */は無視してよい。
）（１）上記プログラムの実行結果の出力を記述して下さい。

（２）(1)の出力以外の”route ～”をそれぞれ出力させるにはどのような num の（２）上記の指定された挿入箇所に,if(j % 2 == 0)j++;

値をそれぞれ代入させればよいか。
2000≦num≦2020 で 1 つずつ、記述という文を追加で挿入したときのして下さい。

実行結果の出力を記述して下さい。

・routeのとき

num =・route

のとき

num =

図6

前半のテストの問題

学籍番号:（2） プログラム中のコメントアウトが
3.次のプログラムについて答えて下さい。

付随している段落#include <stdio.h>(9 行目 /* (2) */)で、
ans = 1; ではなく ans = 2; とした

int f(int n) {場合、プログラムの実行結果はどう

int ans;

なるか。その出力を記述して下さい。

if (n == 0)
ans = 1;else if (n == 1)
ans = 1;

/*

(2)

*/

else
ans = f(n - 1) + f(n - 2);
return ans;}
int main(void) {int i;for (i = 1; i < 6; i++)printf("%d ", f(i));
printf("\n");return 0;}（1）上記プログラムの実行結果の出力を記述して下さい。(上記のコメントア
ウト部/*(2)*/は無視してよい。)

図7

前半のテストの問題 (図 6 の続き)

テスト B

2. 次のプログラムについて答えて下さい。

学籍番号:#include<stdio.h>

1. 次のプログラムについて答えて下さい。
#include <stdio.h>

int main(void){
int i, j;

int main(void) {for (j = 1; j <= 4; j++) {int num;
num = 2028;/*(2)で追加挿入する箇所*/

if(num % 7 == 0 && num % 100 != 0

for (i = 1; i <= 4; i++) {|| num % 400 == 0)

if((i * j) % 4 == 0)

printf("route A\n");printf("%d ", i * j);else if(num % 4 == 0 || num % 5 == 0)}

printf("route B\n");printf("\n");else}
printf("route C\n");return 0;}

return 0;（1） 上記プログラムの実行結果の出力}を記述して下さい。（コメントアウ
ト部/* ～ */は無視してよい。
）（１）上記プログラムの実行結果の出力を記述して下さい。

（２）上記プログラムコード中の（２）(1)の出力以外の”route ～”をそれぞれ出力させるにはどのような num の指定された挿入箇所(/* (2) */)に,
if(j % 3 == 0)

値をそれぞれ代入させればよいか。

j++;2000≦num≦2020 の範囲で 1 つずつ、という文を追加で挿入したときの記述して下さい。

実行結果の出力を記述して下さい。

・routeのとき

num =・route

のとき

num =

図8

後半のテストの問題

学籍番号:
3.次のプログラムについて答えて下さい。
#include <stdio.h>（2） プログラムコード中のコメントア
ウトが付随している段落(7 行目 /* ～ */)において、int f(int n) {ans = 1; ではなく ans = 2; とした

int ans;

場合、プログラムの実行結果はどうなるか。その出力を記述して下さい。

if (n == 0)
ans = 1;

/*

(2)

*/

else if (n == 1)
ans = 2;else
ans = f(n - 1) * f(n - 2);
return ans;}
int main(void) {int i;for (i = 1; i < 6; i++)printf("%d ", f(i));
printf("\n");return 0;}（1）上記プログラムの実行結果の出力を記述して下さい。
(プログラムコード中のコメントアウ
ト部/* ～ */は無視してよい。)

図9後半のテストの問題 (図 8 の続き)