情報学部 菅沼ホーム

C/C++ 自学自習システム( C_Game )

  1. 目的

    既存の e-Learning システムにはいくつかの問題点が存在する.その一つは,面白くないことである.よほどの目的意識,気力がないと最後までやり遂げることが困難である.そのため,メンターの存在が不可欠になり,教える側としては,対面授業の方が楽であるといった結果になってしまうことも少なくない.

    e-Learning システムの利点は,「いつでも」,「どこでも」,「自分の能力に合わせて」学べる点にある.現在,ほとんどの e-Learning システムは,書籍の内容を Web 上で表現しただけのものとなっている.もちろん,他のページへの参照が容易,演習問題の答えをコンピュータがチェックしてくれる,など,書籍にはない利点を多く持ってはいるが,学習する速度という点を除けば,必ずしも,「自分の能力に合わせて」学べるシステムにはなっていない.理想的には,コンピュータが学習者の能力を把握し,学習者の能力に合わせた指導をしてくれることが望まれる.そのためには,コンピュータが,学習者の学習履歴からその学習者に対する学習者モデルを作成していく必要があるが,現時点では,決定的な解決策はないと言って良い.

    これらの問題に対する解決策を探るために開発したシステムが,C_Game である.C_Game は,ゴールへ到達する早さを競うなど,C/C++ をゲーム感覚で学べることを目的としたシステムとなっている.また,課題について学んでから演習問題を行うといった従来型の方法とは異なり,PBL( Problem Based Learning )に基づいたシステムとなっている.つまり,まず問題が与えられ,その問題を解くための知識を自分で学ぶといった方法を採用している.さらに,簡単な学習者モデルを持ち,学習者のレベルに合わせて問題を提出し,レベルに合わせた指導が可能なシステムを目指している.

  2. 学習者モデル

    学習者モデルとして,オーバーレイモデルを採用する.つまり,学習者の理解度を教師の知識の構造化された部分集合とみなし,まだ学習が済んでいない場合,または,問題を解かせて正解が得られなかった場合,これを知識の欠損とみなす.

    C/C++ に対する教師の知識は以下に示すようなものであるとする.各レベルの知識は,対応する演習問題の集合とみなし,それらの演習問題の半数程度以上が解けたことによって,その知識を習得したとみなしている.

    1. レベル 0: データ型(C/C++ と Java 3.2 節
    2. レベル 1: 演算子(算術演算子と代入演算子)(C/C++ と Java 3.3 節
    3. レベル 2: 簡単なプログラム(入出力を含む)(C/C++ と Java 3.4 節
    4. レベル 3: その他の演算子(アドレス,比較,論理,ビットシフト)(C/C++ と Java 第 4 章
    5. 制御文
      1. レベル 4: 条件分岐(C/C++ と Java 5.1 節
      2. レベル 5: 繰り返し(C/C++ と Java 5.2 節
    6. 配列とポインタ
      1. レベル 6: 配列とポインタ(C/C++ と Java 6.1 節,6.2 節
      2. レベル 7: 多次元配列と new 演算子(C/C++ と Java 6.3 節,6.4.2 節
    7. 関数
      1. レベル 8: 標準関数(C/C++ と Java 7.0 節
      2. レベル 9: 簡単な関数と変数の有効範囲(C/C++ と Java 7.1 節,7.2 節
      3. レベル 10: 関数とデータの引き渡し(C/C++ と Java 7.3 節
      4. レベル 11: main 関数,関数名のオーバーロード(C/C++ と Java 7.4 節,7.5.2 節
    8. レベル 12: 構造体(C/C++ と Java 8.1 節
    9. クラス
      1. レベル 13: クラス宣言(C/C++ と Java 第 10 章
      2. レベル 14: 演算子のオーバーロード(C/C++ と Java 第 11 章,第 12 章
      3. レベル 15: テンプレート(C/C++ と Java 第 14 章
      4. レベル 16: 派生クラス(C/C++ と Java 第 13 章

  3. システムの動作

    本システムにとって最も困難な部分は,ゲームとしての面白さもさることながら,学習者の知識レベルに合わせて適切な問題を選択し,かつ,その解答結果に従って適切な指導を行うことである.人間による一対一の指導を行っているときでさえ,学習者の知識や理解度を正確に把握することは困難である.まして,本プログラムにおいて採用している学習者モデルと演習問題に対する解答結果だけで,学習者の知識や理解度を正確に把握することはほとんど不可能であるといって良い.

    そこで,学習者の知識や理解度に対する曖昧さをカバーするため,学習者に提示する演習問題を,学習者モデルから決まる特定の範囲の問題に限定せず,学習対象となっている範囲を中心に,既に修得した知識(下位レベルの知識)から,将来学習しようとする知識(上位レベルの知識)をも含めた広い範囲からランダムに選択するものとする.そして,既に修得したはずの知識に対応する問題が解けなければ学習レベルを下げ,逆に,上位レベルに対応する問題が解ければレベルを上げるといった処理を行うことにする.

    具体的には,現在のレベルに対応する問題を 3 題,1 つ下のレベルに対応する問題を 2 題,2 つ下のレベルに対応する問題を 1 題出題する.また,上位レベルの問題に対しても,1 つ上のレベルに対応する問題を 2 題,2 つ上のレベルに対応する問題を 1 題出題する.学習者は,これら 9 つの問題から 1 題選択することになる(選択方法に関しては後述).もちろん,最初は,レベル 0 から始まるため,出題される問題の数は 6 となる.例えば,現在のレベルが 4 であり,「条件分岐」に関して学習中であるとすると,以下に示すような問題が出題される.

    問題が対象とする知識 出題数 学習状況
    簡単なプログラム 1 学習済み
    その他の演算子(アドレス,比較,論理,ビットシフト) 2
    条件分岐 3 学習中
    繰り返し 2 未学習
    配列とポインタ 1

    ゲームがスタートすると,右図のような画面になる(この図は,砲が発射され,命中したところ).画面上では,原則として 9 つの星(ターゲット)が様々な位置から現れ,様々な方向へ進む.画面の端に隠れて見えなくなると,別の場所から新たに出現する.各ターゲットには,以下に示すように,対応するレベルの問題が関連づけられており,まだ解いてない問題群の中からランダムに選択される(解いてない問題が存在しない場合は,既に解いたことがある問題からランダムに選択される).

    • 緑の星: 2 つ下のレベルに対応する問題
    • 黄緑の星: 1 つ下のレベルに対応する問題
    • 黄色の星: 現在のレベルに対応する問題
    • 橙の星: 1 つ上のレベルに対応する問題
    • 赤の星: 2 つ上のレベルに対応する問題

    画面上部には,「<< 減速」,「加速 >>」の文字が表示され(図の緑の星の近く),これらの文字をクリックすると,星の動きが遅くなったり,速くなったりする.画面下部には,砲台が表示され,「 z 」キー及び「 x 」キーによって左右に移動させることができる.また,砲の発射は「 shift 」キーを押すことによって行う.

    学習者は,砲台を操作することによって,適当なターゲット(星)を攻撃する.ターゲットに命中すると(右上図),そのターゲットに関連づけられた問題が表示される(右下図).なお,問題を解くための時間制限はなく,また,画面上方の「説明」ボタンをクリックすると,「 C/C++ と Java」の対応箇所の説明が表示される.

    表示された問題を学習者は解くことになるが,学習者の対応によって以下に示すような処理が行われる.このように,基本的には,学習者が選択した問題に解答することによって学習は進行するが,以下に示すように,正解またはギブアップした後に,ターゲット自身が砲台に向かい,強制的に下位レベルの問題を解かざるを得なくなる場合がある.このようにすることにより,学習者モデルでは既に学習済みになっているにもかかわらず十分理解できていない知識を見いだすことができ,学習者モデルの不完全性を補うことができる.

    1. 解答後,「送信」ボタンを押し,その結果が正解であった場合

      解答した問題が,過去に解答したことがない問題の場合は,解答した問題がデータベースに保存される.それ以外の処理は,解答した問題のレベルによって,以下に示すように異なる.

      1. 下のレベルに対応する問題の場合(緑または黄緑の問題)

        特別な処理は行われない.

      2. 現在のレベルに対応する問題の場合(黄色の問題)

        ある確率で,下位レベルの問題を強制的に解かせるか否かの判定を行う.また,現在のレベルの問題を解いた個数が規定個数以上になった場合は,レベルを 1 だけ上げる.

      3. 上のレベルに対応する問題の場合(橙または赤の問題)

        解いた問題より下のレベルに対して,規定個数以上の問題を解いたことにし(解いたことに設定する問題はランダムに選択),レベルを解答した問題のレベルに変更する.このようにすることによって,既に理解できている部分をスキップして学習を効率的に進めることが可能になる.なお,現在のレベルに対応する問題に正解した場合と同様,下位レベルの問題を強制的に解かせるか否かの判定を行う.

    2. 解答後,「送信」ボタンを押し,その結果が不正解であった場合

      学習者は,誤りを見つけ,再度解答することになる.なお,解答回数に対する制限は設けてない.

    3. 「ギブアップ」ボタンをクリックした場合

      上位レベルの問題の場合は,単に問題選択画面に戻るだけであるが,他のレベルの問題に対しては,選択した問題を解く助けとなるような補助問題を表示する.補助問題は,各問題毎に当初から用意しておく.補助問題が解けた場合は,その情報をデータベースに保存し,元の問題に戻る.また,ギブアップした場合は,その補助問題の補助問題が提示される.なお,その際,データベースを修正するなど,特別な処理は行わない.

      たとえば,最初に選択した問題が A で,その補助問題が B と C,さらに,C に対する補助問題が D であったとする(右図).まず,問題 A に対してギブアップすると,問題 B または C が選択される(ランダムに選択).ここでは,問題 B が選択されたものとする.問題 B に正解,または,ギブアップすると,問題 A が再び表示される.再びギブアップすると,補助問題 C が表示される.補助問題 C に正解すると,問題 A が再び表示され,ここでギブアップすると最終的なギブアップとなる.また,補助問題 C にギブアップすると,補助問題 D が表示される.問題 D に正解,または,ギブアップすると,補助問題 C が再び表示される.問題 C に正解,または,ギブアップすると,問題 A が再び表示され,これが最終的な表示となる.つまり,すべての問題にギブアップした場合は,以下に示すような順序で,問題が表示されていく.

        A → B → A → C → D → C → A

      最終的に,選択した問題に対してギブアップした場合は,問題のレベルによって処理は異なる.現在のレベル,または,下のレベルに対応する問題の場合は,下位レベルの問題を強制的に解かせるか否かの判定を行う.さらに,下のレベルに対応する問題の場合は,そのレベル以上で,かつ,現在のレベルより下のレベルに対して,既に解答した問題を 1 つずつデータベースから削除する.その結果,あるレベルに対して,解いた問題の個数がそのレベルの規定個数を下回った場合は,レベルをそこまで下げる.

  4. まとめ

    このページを公開してほぼ1年が経過した.そこで,その利用状況に基づき,C_Game の評価を行ってみる.評価を行うに当たって,最も反省すべき点は,C_Game を作成する際に,C_Game と同じ C++ に対する e-Learning システムである「 C/C++ 自学・自習」の利用状況をほとんど評価すること無しに C_Game を作成してしまった点である.そこで,ここでは,「 C/C++ 自学・自習」の利用状況に対する評価も同時に行っていく.

    「 C/C++ 自学・自習」は,2002 年 8 月に公開した C/C++ に対する e-Learning システムで有る.「 C/C++ と Java 」と同様,教科書風に記述してあるが,演習問題に対する正解/不正解のチェックはコンピュータによって行われ,その際,メールアドレスなどのユーザを認証する記号(ユーザ ID )の入力が要求される.その結果,正解であった場合に,ユーザ ID,演習問題番号,及び,回答された年月日がサーバに保存される.

    各システムの評価に先立ち,Web 上における両システムの利用可能性について述べておく.2009 年 8 月 5 日現在,Yahoo! において「 C/C++ 自習」というキーワードを用いて検索すると,63,700 件中,「 C/C++ 自学・自習」は 1 位,また,C_Game は 3 位の位置に表示される.さらに,「 C/C++ Java 」というキーワードを用いて検索すると,134,000,000 件中 1 位に表示される「 C/C++ と Java 」からも両ページに対するリンクが張ってある.このように,少なくとも現時点においては,両システムとも Web 上から同じようなチャンスで利用可能であると考えられる.

    各システムの利用者数は,C_Game が 45 人( 2008/8 ~ 2009/7 ),また,「 C/C++ 自学・自習」は 494 人( 2002/8 ~ 2009/7 )であった.C_Game の公開時期が遅いことを考慮すると,両システムとも年間ほぼ同じ程度の人が利用していることになる.しかし,2008/8 ~ 2009/7 におけるアクセス数は,C_Game が 3,754 回,また,「 C/C++ 自学・自習」は 420,866 回,と大きな差がある.これは,C_Game では,ユーザ ID を入力しない限り中へ入ることができないが,「 C/C++ 自学・自習」では,演習問題を解かない限り,自由に入ることができることによるものと思われる.

    解答した演習問題の数
    C_Game   C/C++ 自学・自習
    演習問題の数 人数(人) 割合(%)   演習問題の数 人数(人) 割合(%)
    5 問以下 23 51.1   5 問以下 346 70.0
    6 ~ 10 問 14 31.1   6 ~ 10 問 65 13.2
    11 ~ 20 問 6 13.3   11 ~ 20 問 37 7.5
    21 問以上 2 4.4   21 ~ 50 問 29 5.9
    合計 45 100.0    51 ~ 100 問 12 2.4
       101 問以上 5 1.0
       合計 494 100.0

    学習日数(C/C++ 自学・自習)
    学習日数 人数(人) 割合(%)
    1 日 369 74.7
    2 日 55 11.1
    3 日 25 5.1
    4 日 12 2.4
    5 日 5 1.0
    6 ~ 10 日 15 3.0
    11 ~ 20 日 7 1.4
    21 日以上 6 1.2
    合計 494 100.0
    上に示すのは,両システムにおいて,各人が解答した演習問題の数である.C_Game では 55 問解いた人が 1 人,「 C/C++ 自学・自習」では 197 問解いた人が 1 人存在する.また,右に示すのは,「 C/C++ 自学・自習」における学習日数である( C_Game では,設計上のミスにより実行した年月日を保存しなかったが,学習日数は恐らく 1 日か 2 日であろう).最大の学習日数は 38 日であり,1 人存在する.

    「 C/C++ 自学・自習」における章は,「 C/C++ と Java 」の構成と同じになっており,C_Game におけるレベルとの関係は以下に示すようになっている.

    第1章 情報の表現
    第2章 プログラム作成手順
    第3章 簡単なプログラム ( レベル 0 ~ 2 )
    第4章 演算子 ( レベル 3 )
    第5章 制御文 ( レベル 4 ~ 5 )
    第6章 配列とポインタ ( レベル 6 ~ 7 )
    第7章 関数 ( レベル 8 ~ 11 )
    第8章 構造体と共用体 ( レベル 12 )
    第9章 プリプロセッサ
    第10章 クラス ( レベル 13 )
    第11章 演算子のオーバーロード ( レベル 14 )
    第12章 代入と初期化 ( レベル 14 )
    第13章 派生クラス ( レベル 16 )
    第14章 テンプレート ( レベル 15 )
    第15章 クラスメンバーに対するポインタ
    第16章 入出力クラス

    以下に示すのは,両システムにおける学習者の達成レベル(C_Game)と最終学習章(C/C++ 自学・自習)である.ただし,「C/C++ 自学・自習」において,演習問題が準備されているのは第 14 章までであるため,第 14 章まで行った学習者はほぼゴールに到達したと見なすことができる.また,「C/C++ 自学・自習」においては,途中の章から開始することも可能であるため,全く同じレベルでは比較できない.

    達成レベル(C_Game)と最終学習章(C/C++ 自学・自習)
    C_Game   C/C++ 自学・自習
    達成レベル 人数(人) 割合(%)   最終学習章 人数(人) 割合(%)
    レベル 1 20 44.4   1 章 99 20.0
    レベル 2 7 15.6   2 章 127 25.7
    レベル 3 11 24.4   3 章 125 25.3
    レベル 4 3 6.7   4 章 37 7.5
    レベル 5 3 6.7   5 章 42 8.5
    レベル 6 0 0.0   6 章 18 3.6
    レベル 7 0 0.0   7 章 12 2.4
    レベル 8 1 2.2   8 章 3 0.6
    合計 45 100.0   9 章 0 0.0
      10 章 22 4.5
      11 章 1 0.2
      12 章 2 0.4
      13 章 0 0.0
      14 章 6 1.2
      合計 494 100.0

      以上の結果から明らかなように,非常に多くの人が 1 度学習を体験しただけで,学習の継続を断念している.このことは,「最後までやり遂げるようなシステムを作成する」という C_Game の目的が達成されなかったことになる.公開期間が短いことにもよるが,「 C/C++ 自学・自習」では,数人の人が,多くの日数を掛けて最初から最後までやり遂げているが,C_Game では,レベル 8(第 7 章)へ到達した人が 1 人存在するだけである.以下,その理由と解決策について述べる.

    1. ゲーム自体が面白くない.  残念ながら,私の能力では,この問題に対する解決策を提案できない.

    2. 強制的に学習させられるよりも,「 C/C++ 自学・自習」のように,自由に学習したい人が多い.  C_Game による学習者が皆無でなかったことを考えると,C_Game 方式( PBL,ゲーム,コンピュータ指導など)の方を好む人も存在すると思われる.従って,改良を加えた後,「 C/C++ 自学・自習」とともに,C_Game も存続させる.

    3. 途中からスタートできない.  途中からスタートできるように修正する.

    4. ゴールが見えない.  現在の C_Game では,自分が現在どのレベルにいて,ゴールまでどのくらいあるのかがはっきりしない.レベルが変化する毎に,何らかのメッセージを出し,学習を促すようにする.

    5. 解説が分かりにくい.  「 C/C++ 自学・自習」及び「 C/C++ と Java 」の解説内容を見直す.

    6. 演習問題が適当でない.  演習問題の内容を見直す.

    以上の点を考慮しながら,早急に,「 C/C++ 自学・自習」,及び,「 C/C++ と Java 」の改良を含め,C_Game の新しいバージョンの開発に着手する予定である.

情報学部 菅沼ホーム