Top > 授業 > Delphi プログラミング >Lesson 3
Lesson 3
(2004/09/02)
問合せ メール 戻る

Lesson 3 について

1.Lesson 3 では次の点を学習することを目指します。
・(引き続き)PaintBoxへの表示
・基本的なアルゴリズム(数値による並べ替え)
・「配列」の変数
・制御文 repeat ... until、case
・レコード型変数の処理

2.サンプルプログラムを眺め、練習問題を試してください。

3.サンプルプログラムはダウンロードしてください(クリック)。ダウンロードしたファイル(lesson3.exe)はDelphi7\Source に置いてクリックして解凍してください。5つのサンプルプログラム P301〜P305(とデータのテキストファイル) が出てきます。
P301のポイント

a.このプログラムは、テキストファイルから読み込んだデータを PaintBox に表示する

b.棒グラフを描く (矩形を描く命令 Rectangle)
Rectangleの使い方については Delphi のヘルプないし参考書を参照すること。

c.制御文 repeat ... until
制御文 while との違いを理解すること

d.配列の変数の使用(変数 xy)

練習問題:データの平均値を求め、その平均値のバーを PaintBix の棒グラフに追加せよ。
P302のポイント

a.このプログラムは、テキストファイルから読み込んだデータを点数の高い順に並べ換えて(降順)表示する

b.配列の変数(Name、TestScore)にデータを貯め込む

c.並べ換えのアルゴリズム
(このアルゴリズムも、数値計算のアルゴリズムの基本です)

d.制御文 for ... do 文による2重のループ
(for … do は2重、3重ループで使うことが多いです)

練習問題
1.データを点数の低い順に並べ換えよ(昇順)。
2.すべての for ... do 文を repeat ... until 文に置き換えよ。
P303のポイント

a.このプログラムは、 P302.dpr と全く同じ処理をしている
(異なる点は次のb)

b.レコード型の変数の配列(変数 Data)の使用
(レコード型と配列が重なる点に注目)

練習問題
1.すべての for ... do 文を while ... do 文に置き換えよ
2.読み込んだ点数データの平均値と標準偏差を求め、その数値を memo に表示せよ
P304のポイント

a.このプログラムは、3種類の数値(英語、数学、国語の点数)からなるデータを読み込み(データファイル名:data02.txt)、RadioGroup で選択した科目についてデータを降順に並べ替える
(data02.txt の中身の左から、英語、数学、国語の点数であるとする。)

b.レコード型(Student)の定義に配列を使う
(Student を使ってさらに配列型の変数 Data を定義している)

c.コンポーネント RadioBox1(RadioBox 型) の追加
(私は、シミュレーションで条件を指定するために RadioGroup をよく使います)

d.制御文 case の使用
  case 文に使っている RadioBox1.ItemIndex とは、RadioBox1 でクリックした項目を表わす。上からn番目の項目にチェックがある場合、RadioBox1.ItemIndex の値は n−1 である。

練習問題
1.RadioBox1 での選択を変えると並べ換えキー(英語/数学/国語)が変ることを確認せよ
2.case 文を if 文で置き換えよ
3.チェックした並べ換えキーの点数の平均値と標準偏差を計算して memo1 に表示するようなプログラムを書け
P305のポイント

a.このプログラムは、 P304.dpr と全く同じ処理をしている
(異なる点は次のb)

b.レコード型変数間の値の代入
P304.dpr では次のようにしてレコード型変数の値の代入をしていた。
  Temp.Name := Data[i].Name;
  for k := 1 to 3 do
    Temp.TestScore[k] := Data[i].TestScore[k];
P305.dpr では同じことを次のように処理している。
  Temp := Data[i];
つまり、レコード型変数では、内部がいかに複雑であっても、一括して値の代入をすることができる。

【補足】P305.dpr でも、データを読み込むところでは次のように、面倒な指定が必要になっている。
  read(InData, Data[n].Name);
  for i := 1 to 3 do
    read(InData, Data[n].TestScore[i]);
  readLn(InData);
なぜこのように、いちいちデータの読み込みをしないといけないかというと、テキストファイルから読み込んでいるからである。仮にデータファイルを、Data と同じレコード型のデータのバイナリファイルとして定義してあれば、1つの観測のデータは次の命令だけで一括して読み込むことができる。
  read(InData, Data[n]);
 後でこの点は確認することになると思う。

練習問題:特に無し。
次回に向けて

次回は主に以下を学びます。
a.手続き
b.手続きのパラメータ(引数。値パラメータと変数パラメータ)
c.関数
次回に扱う事項を終われば、ある程度、自分で考えた処理を自力でプログラムすることができるようになるはずです。