配列によるデータ処理

今回は、多少なりとも実用(?)的なプログラムを作成すべく、データ処理プログラムを作ってみましょう。これは、キーボードからいくつか数値データを打ち込むと、そのデータ群に一定の処理を加えて出力する、という形式のプログラムです。入力したデータの平均値やら最大最小値やら偏差値やらといった統計的なデータを計算させても良いですし、データの中で順位付けをしたり、データがどういった傾向を持つか「分析」するプログラムを作ってみるのも面白いですね。
今回作成するプログラムが、そうした実用(?)的なデータ処理プログラムの骨格になるとよいのですが。

まず、数値データを入力する処理を考えてみましょう。INPUTで変数に数字を入力していく、という形になるのでしょうが、今回は一つではなくいくつもの数字を入れるんですよね。たとえば、3つのデータを入れるなら変数NUM1、NUM2、NUM3という変数を用意し

10 INPUT "1番目の数字:", NUM1
20 INPUT "2番目の数字:", NUM2
30 INPUT "3番目の数字:", NUM3

として数字を入力していく。4つならNUM1、NUM2、NUM3、NUM4という変数で同様のことを行い、5つなら……などとやるしかないのでしょうか?

いくらなんでも、入力する数字の数だけ変数を用意したりINPUTするのは面倒なので、今回は配列を使ってみることにしましょう。配列とは、いくつものデータを一つの名前(配列変数名)で利用できる仕組みです。この配列を使うと、3つの数字の集まりにNUMという配列の名前をつけて、それぞれの数字をNUM(0)、NUM(1)、NUM(2)として使うことができるようになります。つまり、「配列名(番号)」という形ですね。
この()の中の番号は「添え字」「インデックス」などと呼ばれ、N個のデータを持つ配列なら0からN-1の範囲で指定できます。添え字には変数を使うこともできるので、FOR文と組み合わせれば配列にまとめてデータを格納したり、配列内のデータ(「要素」などとも呼ばれます)をまとめて処理するのも楽になるでしょう。たとえば、4つのデータを配列NUMに格納するなら

10 FOR I = 0 TO 3
20 INPUT " " + STR$(I) + "番目の数:", NUM(I)
30 NEXT

と書くことができます(STR$()は、渡された数字を文字列に変換する関数)。ただし、配列を使う前には、DIMで配列の宣言をしておく必要があるので、実際のプログラムは以下のようになります。

10 DIM NUM(3)
20 FOR I = 0 TO 3
30 INPUT " " + STR$(I) + "番目の数:", NUM(I)
40 NEXT

プログラムを実行し、適当な数字を入れてみましょう。そして、その後

PRINT NUM(1)

などとして、実際に入力した数字が配列に記録されているか、確かめてみてください。

数字の入力ができたら、いよいよ入力した数字を使っていろいろな処理をやってみます。まず、入力された数字の合計でも求めてみましょうか。

入力された処理のデータでは、入力のとき同様FOR文で配列の各要素を処理する、という形が多いと思いますので、FOR文で変数SUMに配列の合計を求めるプログラムを書くと

50 SUM = 0
60 FOR I = 0 TO 3
70 SUM = SUM + NUM(I)
80 NEXT
90 PRINT "合計:" + SUM

といった感じになるでしょう。まぁ合計を求めるだけなら、別に配列を使う必要はない(70行の処理を数字を入れるときに行っておけばよい)んですけどね(^^;。

次に、入力された(配列内の)各数字の「順位」を求めてみましょう。入力された数字(配列)の中で一番大きなものを1位、2番目に大きな数字を2位、などと表示していくわけです。

配列の中にある数の「順位」とは、言い換えれば「配列の中にその数より大きな数がいくつあるか」ということですね。より大きな数が一つもなければ、その数が1位になりますし、大きな数が1つあれば2位になる。つまり、「より大きな数の個数+1」を順位とすればよいでしょう。
配列の中のある数NUM(I)に注目し、配列内にあるその数より大きな数の個数を求めるには、FOR文の中のIF文でNUM(I)より大きな数を探していきます。たとえば、4つの数字を配列に入力し、最初に入力された数(NUM(0))の順位を求めるプログラムは、以下のように書けます。

10 DIM NUM(3)
  20 FOR I = 0 TO 3
  30 INPUT " " + STR$(I + 1) + "番目の数:", NUM(I)
  40 NEXT
  50 I = 0
  60 JUNI = 1
  70 FOR J = 0 TO 3
  80 IF NUM(J) > NUM(I) THEN JUNI = JUNI + 1
  90 NEXT
 100 PRINT " " + STR$(I + 1) + "番目の数の順位:" + STR$(JUNI)

このプログラムを、50行目のIの値を1,2,3と変えながら実行してみましょう。また、Iの値を0から3まで順番に変える、つまりFOR文を使うと

  10 DIM NUM(3)
  20 FOR I = 0 TO 3
  30 INPUT " " + STR$(I + 1) + "番目の数:", NUM(I)
  40 NEXT
  50 FOR I = 0 TO 3
  60 JUNI = 1
  70 FOR J = 0 TO 3
  80 IF NUM(J) > NUM(I) THEN JUNI = JUNI + 1
  90 NEXT
 100 PRINT " " + STR$(I + 1) + "番目の数の順位:" + STR$(JUNI)
 110 NEXT

といった配列内の各要素の順位を順番に表示していくプログラムを書くこともできます。

戻る