Entry

プログラミング教えるメモ - プログラミングを教える時のお題の選び方

2009年01月14日

この頃,プログラミングを人に教える話ばかりしているんですけれど,なんでかというと,あたしが人に教える機会が増えたからです。別にえらくなったわけではないっつのが,悲しいところなんですが。

もっとも,あたしの場合,教えるといっても,手取り足取り教えているとこっちの仕事が進まないので,お題を出してそれに合ったプログラムを作ってもらう形にしています。このお題の作り方が,結構難しい。コツとしては,こんなお題が喜ばれてるみたい。

  • できるプログラムが実用的であること。
  • 解法を各自で工夫できること(アルゴリズム調べるだけとかってのはダメ)。
  • 基本的なプログラムから,段階的にに難しい機能・仕様を追加していけること。

例えば,今考えているのは,こんなお題です。

C++ のクラス宣言のプロトタイプを作成するプログラム(classproto)を C++ で作ってください。仕様は以下の通りです。

  • コマンドライン上でクラス名を引数に与えて実行する。
  • 引数のクラス名が,あらかじめ用意しておいたクラス宣言(下記参照)に埋め込まれて,標準出力に出力される。
  • コマンドライン引数の数はクラス名の1つのみとする。
  • クラス名が C++ の文法上有効な識別子かは検査しない。
  • 引数が不正なときは,使用方法(Usage)を標準エラー出力に出力し,プログラムを終了する(ステータスコードは任意でよい)。

あらかじめ用意しておくクラス宣言は以下の通りです。

class [ClassName] {
public:
    [ClassName]();
    [ClassName](const [ClassName]& other);
    virtual ~[ClassName]();
public:
    [ClassName]& operator=(const [ClassName]& other);
public:
    // TODO: add operations.
private:
    // TODO: add members.
};

[ClassName]に,引数のクラス名を埋め込んでください。埋め込まれればいいので,[ClassName]の文字列をそのまま使用するかは問いません。また,テンプレートをソースコードに埋め込んでも構いません。

クラス宣言って,プロトタイプは同じようなもんが多いので,テンプレートにしておこうという話。今時は IDE に似たような機能があるけれども,外部コマンドにしておけば,外部プロセスを起動できるエディタ間で使い回すことができて,微妙に便利だったりします。かなり簡単なお題なので,あまり時間稼ぎににはならないと思うんですが。

で,こんな具合に難しくしていく。

  • -n オプションを新たに設けて,コピーコンストラクタと operator=() を private メンバにするように変更してください(コピーと代入を許さないクラスを作る)。
  • 第2引数で継承元のクラスを指定できるようにしてください(public 継承とします)。引数1つのときは,これまでと同じ動作とします。
  • "TODO:"の文字列に現在の日付とログインユーザ名を自動入力するようにしてください("TODO: [YYYYMMDD aian] add operations."のようにする)。
  • クラス名が文法規約上有効な識別子かチェックする機能を追加してください。識別子が不正な場合は,"invalid class name"のエラーメッセージを標準エラー出力に表示して,プログラムを終了します。
  • -l オプションを使い,外部ファイルのクラスリストを読み込んで,プロトタイプを一度に複数作成できるようにしてください。ひとつのクラス名でエラーがある場合も処理は続行します。クラスリストのフォーマットは問いません。
  • -f オプションを使い,外部ファイルのテンプレートを読み込めるようにしてください。初めから外部ファイルを読み込むように実装していた場合は,-f オプションなしでデフォルトのテンプレート,-f オプションで任意のテンプレートを使うように変更してください。

ここまで作ってもらったら,このお題は打ち止め。後は自分で工夫して改造していってもらいたいなぁ……と。以前同じようなお題を出したことがあるんですけど,自分の手になじむように道具を工夫するのは楽しいらしく,後は勝手に練習して好きな機能を付け足しているようです。道具を作るための道具を作るのも,技術のうちだと思いますしね。Eclipse のあの機能がないと死ぬ,とか,VS にはあの機能ねいのかよ!とかいったヘタれたことを言う前に,自分で作業しやすい環境を作り上げていけるようにもなるようで,そのたくましさにオジサンは目を細めるのだった(一昔前は当たり前だったんだけど)。

それにしても,こゆお題は考えるのが大変です。上のお題にしても,C++ の機能を意識したわけじゃないので,LL で書いた方が早かったりもする。他のプログラミング言語にはなじみはあるけれど,C++ は初めてとかいった人向けか。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN