解説10月(1)

今回は前回に引続きCGIのプログラムの仕組みの理解と作成を行います。

今回の学習項目です。


前回の解説資料 を参照して、CGIのプログラムの仕組みの理解と作成を行ってください。
もう終了した方は、以下にあげる追加課題にチャレンジしてみてください。

今回は、誰かと組んで、二人で協力して行っても構いません。その場合は、 報告は二人の名前と学籍番号も明記して提出してください。
ただし、3人以上でのグループ作業は推奨しません。


課題1-1 次に出るバスの時刻を表示するプログラムの基本設計と手順書の作成

今日の課題は、次のようなシステムを構築するための基本となる プログラムの基本設計を行い、プログラムの「手順書」を作成することです。

次のバスの時刻を表示するページ

このアプリケーションは、CGIのプログラムとしてRuby言語を使って実現されています。 今回は、このようなWeb上のアプリケーションプログラムを一から自分で作成する力をつけるために、このプログラムを実現するために必要となる基本の部分を作成します。

具体的には、その第一歩として、端末(コマンドプロンプトウインドウ)上に、次に出るバスの時刻を表示するプログラムを作ります。 まず、そのためのプログラムの構造を検討し、そのプログラムがどのような手順として実行されるのかを記述した手順書を作成します。

今回は、上の例のような出発地点やダイヤの変更などを考慮する必要はありません。 単に、大学発の平日ダイヤで次のバスの時刻を表示するだけのものでよい。 時刻も、現在の時刻を元にして次のバスの時刻を表示すればよい。
作成するnext_bus_fromU.rbというプログラムをコマンドプロンプトウインドウの中で実行すると、次のような出力を行うものを作成します。

H:>ruby next_bus_fromU.rb
次に大学から出るバスは10時23分です。

大学から出発するバスだけでは物足りなければ、次のようにnext_bus_fromJ.rbという プログラムを作って、浄水駅から出るバスの案内も試みてください。

H:>ruby next_bus_fromJ.rb
次に浄水駅から出るバスは10時25分です。
バスの時刻表は以下にあります。
バスの時刻表

なお、バスがいつAダイヤやBダイヤやCダイヤで運行されているかは、次を見ないと正確なところはわかりません。
バスの運行日程

以下の解説をまず読んで、協同で相談しながら、手順書を作成する作業を行ってください。

現実のプログラミングでは、きちんと働くプログラムが完成するまでに、多くの段階を経るのが普通です。 プログラミングのそれぞれの段階に従って、いろいろ異なった頭の使い方や作業が必要になります。 まず、要求される働きを実現するプログラムの基本的な構造はどのようなものかを検討する概念設計の過程があります。 次に、それを実際のプログラムとして書き下す過程もあります。 また、そのプログラムの誤りを修正しながら実際に働くプログラムに仕上げていく(これを虫取り、デバッグと言いますよね。)過程もあります。 それぞれ過程の頭の使い方、作業の仕方はだいぶ違うと言ってよいしょう。

プログラミングの初心者にとっては、この最初の設計の段階が難しいことがよくあります。 プログラミングについてはいろいろ学んでいるので、知識は持っているのですが、それをどう使って、プログラムを実現すればよいか、なかなか見当がつかないという状態です。

この設計の部分も、経験を積んでいけば上手にできるようになります。

この手順書を作成する演習課題は最初の設計の部分に焦点をあてています。 この過程は、(1)「問題を理解する」、(2)「問題解決の道筋を考え、計画を立てる」ことが中心になります。

(1)「問題を理解する」

プログラムを作成するには、そのプログラムで何を実現しようとしているのか、またプログラムにどんな働きをさせようとしているのかを明確にすることが必要です。 これは、言い換えれば、まず、プログラムで実現しようとする問題をプログラムの実現のために、よく理解するということです。
 問題は言葉で説明されているのが普通ですから、問題が何を要求しているのかその「言葉」による説明を一言一言ていねいに理解していくことが基本です。
 その理解していくという作業の中で、具体的な場面、事例をイメージしてみることが役に立ちます。 「次に出る大学発浄水行きのバスの出発時刻を端末に表示する」という課題を理解することはそれほど難しくはないでしょう。 実際に動いている似たようなプログラムを動かしてみて見ることができれば理解は容易です。 (実際動かして、よく吟味してみましょう!)

問題を理解することの中には、問題をどのような前堤条件のもとに解決するかを明確にするということが含まれます。 今回の次に出るバスの時刻を表示する問題の重要な前堤条件として、バスの時刻表の情報がなんらかの形で必要になります。 そのようなことを検討していると、必要なものが何かがだんだん見えてくるでしょう。

(2)「問題解決の道筋を考え、計画を立てる」

問題を十分理解したら、次に、いよいよ、どんなプログラムを作ればよいか、その「設計」にとりかかります。 最終的な目標であるプログラムの「働き」を実現するためには、どんな部分的な仕事が必要かをトップダウンに考えていけばよいでしょう。 一旦、コンピューターを離れて、人間がコンピューターの代わりに仕事をするならどうするかを考えてみるのが役にたつでしょう。 人間だろうが、コンピューターだろうが、やらなければならないことは共通にあるはずです。 自分が、次に出るバスの時間が調べるには、どうします? 時刻表のようなものが必要で、それと今の時刻を見比べながら、次にバスが発車するの時刻を取り出しますよね。

次に出るバスの時刻を表示するプログラムの設計の基本構想

次に出るバスの時刻を表示するという働きを実現するためのプログラムがどのような情報をどんな順序で扱うのかという、手順を言葉で要領よく表現していください。

これを「手順書」と言います。 どのような情報をどのような順序で組み合わせれば目標の働きが実現できるのか、その概略をまず箇条書きにして、それをさらに検討して、プログラムを書けるように詳細化していきます。 まず、概略版を作り、次に詳細版を作るというようにすればよいでしょう。

必要な情報をどのようにして得るのか、(ファイルの中に保存しておくのか、外から取ってくるのか)、それをプログラムの中でどのように表現しておくのか(配列を使うのかどうかなど)、どのような繰り返しを使うのかなどを手順として表現していきます。

以下の例にあるように、手順を構成する大きな要素があれば、それを一まとまりにして表現し、その詳細は桁を下げて、表現すると分かりやすいものが出来ます。

課題2-1 次に出るバスの時刻を表示するプログラムの作成

課題1-1で作成した手順書に基づいて、実際に、次に出るバスの時刻を表示するプログラムを作成しなさい。

H:>ruby next_bus.rb
次のバスは11時5分です。    #大学発、平日、現在時刻の次のバスの時間

CGIのプログラムを作るのではなく、ターミナル上で動かして、時刻を表示するプログラムを作成すればよい。
時刻表のデータがファイルに入っている場合はそのファイルの内容も提出してください。

[現在の時刻を取り出す]

現在の時刻はTimeオブジェクトを使うことで取り出せます。
次のものを試してから、使ってください。

tm = Time.now

p tm.year
p tm.month
p tm.day
p tm.hour
p tm.min
p tm.sec

作成したプログラムが正しく動作するか確認するときは、現在時刻の代わりに任意の時刻を生成してテストするとよい。

#tm = Time.now    #現在時刻の取得の部分はコメントアウトしておく。
tm = Time.mktime(2013, 1, 1, 12, 59)    #代わりにテスト用の時刻を代入する。

課題2-2 上で作成した次に出るバスの時刻を表示するプログラムをCGIのプログラムに作り変えて、ウェブ上のアプリケーションプログラムにしなさい。



参考: http://nausicaa.cyber.sist.chukyo-u.ac.jp/newbus.html

プログラミングIIIのホームに戻る