コンピュータリテラシー演習のページへ
Rubyによるはじめてのプログラミング

配列 - データをまとめて扱ってみよう

今までの解説では、データをバラバラに扱ってきました。 たとえば、3つの整数型のデータを扱う場合、変数a,b,cといった具合に3つの変数を使いました。多くのプログラミング言語では、これを1つにまとめて扱うことができます。このような仕組みの1つが配列です。

配列を使ってみよう

以下のプログラムを見てください。

array1.rb : 簡単な配列のプログラム
a = [90, 55, 26, 100]
print a[0], "\n"
print a[1], "\n"
print a[2], "\n"
print a[3], "\n"

このプログラムでは、90,55,26,100という4つのデータを配列aに入れています。 このように複数のデータをaという配列としてまとめて扱うことができます。 この場合、以下のように4つの箱があるようなイメージです。

       +-----+-----+-----+-----+
 配列a |  90 |  55 |  26 | 100 |
       +-----+-----+-----+-----+
        a[0]  a[1]  a[2]  a[3]

配列の1つの箱の中身を要素といいます。 例えば、この場合、配列aの一番最初(左)の要素は90です。 また、一番最後(右)の要素は100です。

各要素の値を得たり、変えたりする場合には添え字(インデックス)を使います。 例えば、a[0]は一番最初の要素を意味します。添え字はいわば、配列の何番目の 要素かを示していると言えます。ただし、Rubyの場合は添え字が0から始まります。 普通は、1番目、2番目、3番目という風に数えるのに、Rubyはいわば、0番目、1番目、2番目と数えているのです。CやJavaなど、最近の主流の言語の多くもRubyと同様です。

なぜ、添え字は0から始まるのか?

ものを数えるとき、普通は1,2,3…という風に1から始めます。 しかし、「何もない」という0個という概念があると都合が良いことが多いのです。 例えば、2つの変数xとyを足した値を添え字とする場合、xも先頭の値、yも先頭の値だとします。 添え字が1から始まる場合、xは先頭なので1、yも先頭なので1とすると、x+yでは2となるので 配列の先頭にはなりません。x+y-1としてつじつまを合わさないといけません。また、xとyの先頭を0として考えたとしても、x+y+1としなければなりません。

ところが、添え字を0から始めた場合、xが先頭なら0、yも先頭なら0とすると、x+yがそのまま配列の先頭となり、ぴったりです。

古代には数字は1からしかなく、0という概念はありませんでした。 0は5,6世紀ごろにインドで発見された、人類最大の発見の1つと言われています。 0の発見は数学に飛躍的な進歩をもたらしました。 上記の理由も0がもたらす恩恵の1つと言えるでしょう。

配列の大きさ

前の説明で触れた配列aは要素が4つあります。この場合、配列aを「4つの要素からなる配列」と言います。また、単に「大きさ4の配列」とも言います。 配列の大きさは、配列名.sizeで求めることができます。

array2.rb : 配列の大きさを表示するプログラム
a = [90, 55, 26, 100]
b = [1,2,3,4,5,6,7,8,9,10]
print "配列aの大きさは", a.size, "です\n"
print "配列bの大きさは", b.size, "です\n"

配列の要素を変えてみよう

以上の例では、配列の要素をprint文で表示しました。 では、配列の要素を違う値に変えるときにはどうすればよいのでしょうか。 以下のプログラムを見てください。

array3.rb : 簡単な配列のプログラム
a = [90, 55, 26, 100]
print a[0], "\n"
print a[1], "\n"
print a[2], "\n"
print a[3], "\n"
a[1] = 80
print a[0], "\n"
print a[1], "\n"
print a[2], "\n"
print a[3], "\n"

このように a[添え字] = 値といった具合に代入すれば良いのです。

繰り返しを使ってみる

さて、以上のプログラムで配列の要素がたくさんあった場合は大変です。

a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74]
print a[0], "\n"
print a[1], "\n"
…長いので省略…
print a[14], "\n"
print a[15], "\n"

繰り返しを使ってみるとすっきりします。

a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74]
for i in 0..(a.size-1)
  print a[i], "\n"
end

繰り返しの範囲が 0..(a.size-1) つまり0からa.size-1 になっていることに注意してください。

以下も同様なプログラムです。変数iの範囲が違います。

a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74]
for i in 1..a.size
  print a[i-1], "\n"
end

またRubyではもっと簡単に以下のように書けます。

a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74]
for b in a
  print b, "\n"
end

for文の0..(a.size-1)と書いていた部分を単に配列名を書きます。 この場合、for文で繰り返す度に、配列aの要素が順番にbに代入されます。

文字列の配列を作る

文字列の配列も同様に作ることが出来ます。

array10.rb : 文字列の配列のプログラム
a = ["France", "Italy", "England", "Spain"]
for b in a
  print b, "\n"
end

また、数値と文字列を混在することもできます。

a = ["France", 105, "Italy", "England", 200, "Spain"]
for b in a
  print b, "\n"
end

配列の内容を簡単に表示する

今まで、print文(printメソッド)を使って表示をしてきましたが、pメソッドというものを使うともっと手軽にデータの内容を知ることができます。以下のようにp 配列名と書けば、配列の内容が表示されます。
array12.rb : pメソッドを使ったプログラム
a = [90, "beef", "bread", 100]
p a

1行目で配列を作った時に同じような形式で[90, "beef", "bread", 100]と表示されたでしょう。改行も自動的にされていることに注意してください。

データを入れずに配列を作る

とりあえず配列を作って、後からデータを入れることができます。

array13.rb : 先に配列だけ作るプログラム
a = Array.new(4)
p a
a[0] = 90
a[1] = "beef"
a[2] = "bread"
a[3] = 100
p a
[nil, nil, nil, nil]
[90, "beef", "bread", 100]

この場合、Array.new(4)で大きさ4の配列を作っています。このようにして配列を作ると、全ての要素がnilという値で作られます。

また、以下のように最初は空の配列、つまり要素が1つもない配列として作ることもできます。

array14.rb : 先に空の配列だけ作るプログラム
a = []
p a
a[0] = 90
p a
a[1] = "beef"
p a
a[2] = "bread"
p a
a[3] = 100
p a
[]
[90]
[90, "beef"]
[90, "beef", "bread"]
[90, "beef", "bread", 100]

配列がだんだんと大きくなっているのに注目してください。 Rubyでは、現在の配列の大きさを越える要素に代入をすると、その分だけ配列が自動的に大きくなります。

課題

  1. 整数値を5個入力し、それを逆の順番にして表示するプログラムを作成せよ。
    a = Array.new(5)
    a[0] = gets.to_i
    a[1] = gets.to_i
    a[2] = gets.to_i
    a[3] = gets.to_i
    a[4] = gets.to_i
    print a[4], "\n"
    print a[3], "\n"
    print a[2], "\n"
    print a[1], "\n"
    print a[0], "\n"
    このようなプログラムで作成可能ではあるが、繰り返しを使うようにせよ。
  2. 課題1の問題で、整数値は何個入力するか決まっていないものとする。 0を入力すると入力終了とし、その前までに入力した整数値を逆の順番にして表示するプログラムを作成せよ。
  3. 課題2の問題で、整数値の代りに文字列を入力するようにせよ。 なお、"end"を入力したら入力終了とせよ。

東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)
<ohmi@rsch.tuis.ac.jp>