Top > 授業 > Delphi プログラミング >Lesson 9a
Lesson 9a
(2004/10/07)
問合せ メール 戻る

Lesson 9 について

1.Lesson 9 は Lesson という形で行う最後にしようと思っています。ここまでで基本的な文法事項は終わっていると思います。むろんまだ解説していないことは沢山ありますが、ここまで来れば自分で調べながら学習するのは容易にだろうと思います。

2.Lesson 9 はバイナリファイルの使い方を練習します。他の計算と同様に、シミュレーションでは計算結果を記録に残す必要が生じます。テキストファイルで処理するのも1つの選択です。テキストファイルは中身をエディタで直接確認できるという利点があります。しかし一般には、この Lesson で試すように、データをレコード型で定義してバイナリファイルで扱うと入出力が簡単になります。

3.この Lesson 9 ではバイナリファイルの他にもう一つを feature します。ライフゲーム(Life Game)です。ライフゲームはセルラオートマタ(セルオートマトン、CA)の簡単な例です。CAとは、通常は平面の正方形で表現するセルが集まった空間を考え、特定セルの状態がそのセルの現在の状態と周囲のセルの状態から決まると考える状況です。この状況の理論上の意味は、セルに仮定したローカルなルールから、空間全体のマクロな、ないしグローバルな状態が生まれる(創発してくる)ことをデモンストレイトする点です。コンピュータシミュレーションではよく、このCAの定式を用いて行ういます。
 ライフゲームというのは、まずセルが2つの状態(alive/dead にしましょう)ととるとします。あるセルは8つのセルと隣接しています。あるセルが次の期間で alive であるのは、次の場合です。
  alive のセル ― 隣接するセルのうち alive のセルが2個か3個である
  dead のセル ― 隣接するセルのうち alive のセルが3個である
たぶん、生命が少ないところでは生命は死滅する、しかし多過ぎても食糧がなくなって死滅する、といった理屈を考えるのだと思います。でもまあ、ルールの中身はどうでもよい。重要なのは、こういうローカルなルールを仮定するとセル空間全体で特有のパタン、しかも動きのあるパタンが生まれる、という点が面白いでしょ、ということです。
 なお、以下のプログラムではセル空間を 'Torus' で定義します。Torus とは、セル空間の右端と左端、上の端と下の端がくっいている場合です。格好としてはドーナツ状の3次元の物体の表面に相当します。興味のある方は参考書を調べてみてください。

4.この Lesson 9 では5つのサンプルプログラム、P901〜P905 を用意します。最後の P905 は練習問題の解答例になっています。まず Lesson 9a の提出用の課題を提出してください。

5.以下のサンプルプログラムはダウンロードしてください(クリック)。ダウンロードしたファイル(lesson9a.exe)はDelphi7\Source に置いてクリックして解凍してください。提出マーク[提出]のついた練習問題のプログラムを、前回同様、圧縮した上で高木までメールで送ってください。
P901のポイント

a.このプログラムはライフゲームのデモをします
・このプログラムではファイルはまだ使っていません。
・このプログラムには特筆すべき点は一つもありません。変哲のないプログラムです。
・セル空間は Rectangle で矩形(正方形)を 30×30=900個描いているだけです。
・セル空間の状態を表示するために、boolean の配列のレコード型 CellSpace を定義しています。CellSpace で変数 alive を定義し、この alive をもとにセル空間を描画しています。

b.RadioGroup で条件を選択します
・MaxStep という RadioGroup で繰り返しの回数を指定します。
・Initial State という RadioGroup で初期状態を指定します。セルが alive か否かは乱数で決めます。P=数字は、セルが alive である確率です。なお、alive のセルが周期をもって移動する稀なセルの配置があります。'Glyder' を選択すると、まさにその場合となります。この 'Glider' は初期状態を乱数で決めても出現する場合があります。この Glider は、別の「生命」とぶつからない限り、継続して同じ格好で移動し続けます。

練習問題: alive セルが固まった領域が動きを止める、あるいは同じ格好で循環するのはいかなる場合かを考察せよ。
P902のポイント

a.このプログラムは30×30のセル空間の状態を示すデータ(配列のレコード型 CellSpace で定義された変数 alive)バイナリファイルとして記録します
・まず、手続きStartBtnClickの冒頭でファイル名を定数として次のように定義します。
const
 OutFileName : string = 'p902.dat';//■ファイル名
むろんファイル名は定数ではなく、変数に文字列を指定して定義することもできます。例えば、var でOutFileName : string;と書いた上で、
   OutFileName := 'p902.dat';
とします。
・次に、ファイル変数 FV_Out を次のように var で宣言しています。
FV_Out : file of CellSpace;//■ファイル変数
つまり、このファイルは alive と同じレコード型 CellSpace のデータのファイルと宣言されています。alive は30×30のデータですが、この定義によってファイルへの書き出しが一括してできるようになって便利です。
・ファイル名とファイル変数が定義した後、このファイル変数とファイル名を結びつけることが必要になります。その結びつきを、手続きOpenFile;の中の次のステートメントで行います。
  AssignFile(FV_Out,OutFileName);
これで、FV_Out で指定されるファイルは OutFileName で保存されるファイルであることになります。
・その後の rewrite(FV_Out); は、FV_Out で指定するファイルを書き出し用に使う、という宣言です。
・各Step で alive に格納されたセル空間のデータは、手続き WriteDataFile; で FV_Out が指定するファイルにか言い出されます。手続き WriteDataFile は次の1行だけで成り立ちます。
  write(FV_Out,alive);
この1つのステートメントで、30×30の alive のデータが一括してファイルに記録されます。このデータの記録は Step 数だけ繰り返されます。
・書き出しが終わったら、ファイルを閉じる必要があります。閉じていないファイルは誤操作で壊れることがあります。ファイルを閉じる宣言は、手続き Finale の中の CloseFile(FV_Out);です。
・まとめると、バイナリファイルの書き出しは次の流れで行います。
1.ファイル名、ファイル変数の宣言
2.AssignFile 命令
3.rewrite 命令
4.write(ファイル変数、書き込む変数…)による書き出し
5.CloseFile(ファイル変数)命令

練習問題: このプログラムで alive は boolean で定義される。alive を整数(byte, integer など)で定義すると、データを記録したファイルの容量が増えるか減るかを、確認せよ。

P903のポイント

a.このプログラムは P902 を実行して作成したバイナリファイルp902.datからデータを読み込み、画面上にそのデータを使ってセル空間の動きを再現します
・このプログラムではセル空間の計算をしていません。セル空間の情報はp902.datから受け取っています。つまり、P902 でのセル空間の動きを再現しています。
・ファイルを読む場合も書き出す場合と似たような命令系列を使います。次のごとくです。
1.ファイル名、ファイル変数の宣言
2.AssignFile 命令
3.reset 命令
4.read(ファイル変数、読み込む変数…)による書き出し
5.CloseFile(ファイル変数)命令
 つまり、書き込む場合と異なるのは、3の reset と 4のread です。
・手続き judgment で使っている eof(ファイル変数)という関数は、そのファイルが末尾まで来たら true を返します。eof とは end of file の略です。似たような変数は他の言語システムにも備わっています。eof を使えば、ファイルにどれだけのデータが収められているかを事前に知っている必要なない、ということです。eof が true になったときに読み込みを止めればよいのです。

練習問題[提出]: P902 と同様にライフゲームを実行しつつセル空間の状態をバイナリファイルに書き出し、ゲームが終了してからそのファイルを使ってゲームの展開をそのまま PaintBox のセル空間に再現する(プレイバックする)ようなプログラムを書け。 → P905
 ダウンロードしたファイルの中にある P905.exe は、高木が作成した解答例のプログラムの実行型ファイルである。参考にすること。
P904のポイント

a.このプログラムはバイナリファイルとテキストファイルを併用します。P902 を実行して作成したバイナリファイルp902.datからデータを読み込み、画面上にそのデータを使ってセル空間の動きを再現するとともに、結果の指標(alive のセル数、および1つ前のステップから状態が変化したセル数)をテキストファイル p904.txt に書き出します。
・このサンプルのように、バイナリファイルをテキストファイルを併用することはよくあります。私の場合、SPSSなどで結果を分析するときには、SPSS用のデータをテキストファイルとして書き出させることにしています。その他、テキストファイルには、中身を視覚的に確認しやすいという利点があります。
・テキストファイルの読み込みは Lesson 3 でやりました。ここではテキストファイルへの書き出しを練習しています。
・テキストファイルの場合も命令系統は、バイナリファイルへの書き出しと同じです。異なるのは2点。第1に、テキストファイルのファイル変数は、Delphi の場合、TextFile という型で宣言します(FV_Txt : textfile;)。第2に、テキストファイルはベタの領域に文字を書き出すだけですから、記録する値の変数をレコード型で読み込んだり書き込んだりはできません。テキストファイルは便利な面もありますが、入出力については面倒です。write文による書き出しの様子は手続きWriteTxtFileを見てください。なお、writeLn(FV_Txt);はテキストファイル内で改行を行う命令です。単にwriteLn(ファイル変数)なら、改行するだけです。writeLn(ファイル変数, 変数a)なら、変数aを書き出した後に改行します。

練習問題:テキストファイルに書き出す内容をそのまま、memo に書き出すようにプログラムを書け。
P905

・P903 の練習問題の解答例です。
・私が作った解答例は Lesson 9b で示します。
次回に向けて

 P903 の練習問題のプログラムを高木に送ってください。その後に、その練習問題の解答例にあたるプログラムを Lesson 9b の掲示でダウンロードできるようにします。
 Lesson 9 で、この Delphi Lesson は終了します。終了というより一区切り、ということで、Lesson 9 から先はシミュレーションに試作に入りたいと思っています。どういう形で行うか、ホームページ上で公開するかどうかは、これから考えます。