講義第10回:Pascal の基礎 --- 配列

今日は、たくさんのデータをまとめて扱うための道具である配列と、それに対 するいくつかの処理について学ぶ。

配列

program calculate_sum(input, output);
var n : integer;
  data: array[1..100] of integer;
 i,sum: integer;
begin
    write('How many numbers you want to input?');
    readln(n);
    for i := 1 to n do readln(data[i]);
    sum := 0;
    for i := 1 to n do begin
        sum := sum + data[i];
        writeln('data[', i:2, ']=', data[i]:5, ', sum = ', sum);
    end;
    readln;
end.
このプログラムでは、配列というものを使う。

var  data: array[1..100] of integer;
と変数宣言のところに書くと、100個の整数型変数ができ、それぞれが data[1] から data[100] までといった風に、番号で指定して操作 できる。この番号のことを、「専門用語」で「添字」(index)という。

配列の便利なところは、まず、変数宣言で var data1,data2,data3, .... data100:integer と書くよりずっと短くて済む(100万個変数が欲しかったら 大きな違いである)ということ、それから実行部も簡潔な繰り返しで書けると いうことである。特に大事なのは、番号(添字)に変数が使えるということで ある。このことのために、上のように、ループの中で配列の要素を順番に見る とか値をいれるとかいったことができる。

計算機が人間よりも得意なことは、「同じ処理を繰り返し大量のデータに対して 適用する」ということである。例えば

といったものがある。

実行例

How many numbers you want to input?5
2
3
4
5
6
data[ 1]=    2, sum =          2
data[ 2]=    3, sum =          5
data[ 3]=    4, sum =          9
data[ 4]=    5, sum =         14
data[ 5]=    6, sum =         20

ソート

上の例では、配列を使うとどんないいことがあるかというのがそんなによくは わからないと思う。これまでの講義内容がわかっていれば、配列を使わなくて もおおむね同じ実行結果を得ることはできるはずである。もう少し、配列を使 わないとできないようなことをしてみよう。

program sort_data_from_file(input, output);
var n : integer;
  data: array[1..100] of real;
  i,j : integer;
  work: real;
begin
    n := 0;
    while not eof(input) do begin
        n := n +1;
         readln(input, data[n]);
    end;
    writeln('Input data');
    for i := 1 to n do write(' ',data[i]:5:2); writeln;
    for i := 1 to n - 1 do begin
        for j := i + 1 to n do begin
            if data[i] > data[j] then begin
                work := data[i];
                data[i]:= data[j];
                data[j]:= work;
            end;
        end;
    end;
    writeln('Sorted data');
    for i := 1 to n do write(' ',data[i]:5:2); writeln;
end.
このプログラムは、入力した数を小さい順に並べ変えて出力する。並べ変える 原理は、以下のようなものである。
  1. まず、一番小さい数を先頭に持ってくる。そのために、配列の2番 目の要素から最後の要素までを順に見て、それが先頭の値よりも小さければ2 つを入れ換える。

  2. これで先頭にもっとも小さい数が来た。次に、2番目の位置に残りの 数の中で最小のものを持ってくる。これには、配列の3番 目の要素から最後の要素までを順に見て、それが2番目の値よりも小さければ2 つを入れ換える。

  3. 以下、同様に、 N-1 番目まで順にやっていく。
このプログラムを実行するには、まずデータファイルを別にエディタで作って おく。これは一行に一つ数字を書いておけばいい。このデータファイルの名前 を sample.dat、コンパイルしてできた実行ファイルの名前を ./simple_sort とすれば、

./simple_sort < sample.dat
とシェルウインドウで入力すれば結果が得られるはずである。

練習

  1. 最初の、合計を求めるプログラムを配列を使わないで書き直して みよ。また、合計だけでなく平均と標準偏差をもとめるように拡 張せよ。配列を使わないで標準偏差を求めることはできるだろう か。

  2. さらに、各入力データに対して偏差値を求め、表にして書き出す プログラムを作ってみよう。配列を使わないですますことは 可能だろうか。

  3. 単純ソートのプログラムを手続きを使う形に書き直してみよ。

レポート

これまでの「練習」の中から、2つ以上を選んで解き、 をまとめて提出すること。ただし、前週の「進んだ練習」2番は、それだけでは1問と認めな い。なお、提出は、メイルで、いままでと同様に TA の白石さんのアドレスに Subject を kadai-3 として提出すること。グラフィックスの出力結果を提出 する場合には、xvを使って gif ファイルにし、ファイル名(サブディレクト リに置いた場合はそのディレクトリ名もつけて)をレポート中に書くこと。 可能であれば、レポート自体を HTML 形式で書き、文書の中に図へのリンクを埋め込むのでも構わない。 なお、今回のレポートは、適当な時期に WWW 上で公開するかもしれないので、公開さ れても構わないような内容にすること。締切は、1/13日の、講義の開始時刻とする。

次回予告

次回は、再帰処理についていくつかの例で学び、単純ソートより賢いソーティ ングの方法など、多少高度なプログラミングに入っていくことにしたい。