情報科学概論
2003.7.8

Back to index page



  1. 本日の作業内容

  2. 授業アンケート

    授業の最初に「授業アンケート」を実施します.注意を良く聞いて記入してくだ さい.

  3. 配列(1)

    配列とは値を入れる入れ物ですが,ただの変数とは異なり,値のならび,列とし て扱うことができます.基本的な考え方は図1に示すようなもので,値を入れる 入れ物が並んでいます.入れ物には番号が割り振られているので,何番目かを指 定して呼び出すと,その中に納められている値を返します.値は,数値でも文字 列でも,真偽値などでも構いません.繰り返しと合わせて使うことにより,大量 の規則性を持った変数を上手に扱うことが可能になります.

    図1 配列のイメージ

    これまで,例えば,三角関数の値などを求めて来ましたが,それらの値は,いわ ば,「使い捨て」でした.表示はするけれども,スクリプトの中で値を保持し続 けるわけではなかったので,後から別の処理を行うことはできませんでした.配 列を使うと,値を入れ物に保存して取っておくので,後からいつでも参照するこ とが可能になります.

    以下では,具体例を見て行くことにしましょう.

    • 基本

      配列を定義するときには,[ ] を使って表します.

      date_ary = [2003, 7, 8]
      
      puts date_ary
      

      1行目は代入です.この操作により配列が「初期化」されて,値を持ちます.名 前の付け方は別に決まりは無く,変数が要素であればアルファベットの小文字で 始まり,定数であれば大文字です.変数と配列では,名前の区別はありません.

      配列の中の個々の値を「要素」と呼びます.上の例では要素が3つの配列ですが, それぞれの値を個別に参照するときには,番号で呼び出します.番号は,0から 始まることに注意しましょう.

      date_ary = [2003, 7, 8]
      
      puts date_ary[0]
      

    • 値の代入

      配列の要素に値を代入するときには,要素の番号を指定して変数の場合と同じ様 に行います.

      date_ary = [2003, 7, 8]
      
      date_ary[2] = 15
      puts date_ary
      
      date_ary[3] = "Tuesday"
      puts date_ary
      

      代入により値は上書きされます.

    • ループとの組合せ

      早速,ループと組み合わせてみましょう.要素の個数が分かっていれば, for ループが楽です.

      date_ary = [2003, 7, 8]
      
      for i in 0..2
        print date_ary[i], "\n"
      end
      

      要素は文字列でも構いません.

      date_ary = ["July", "8", "2003"]
      
      for i in 0..2
        print date_ary[i], "\n"
      end
      

    • 配列の和

      配列の和は要素をつなぎ合わせます.次の例で見てみましょう.

      a = [1, 2, 3]
      b = [4, 5, 6, 7]
      
      puts a + b
      

      これまで,値の表示には,putsprint そして printf を用いて来ましたが,配列に関してはその状態を見るのには, p という命令が適しています.これは,値を表示するのでは なく,そのものの性質を示すようなものなので,計算の中などでは使用 しません.

      a = [1, 2, 3]
      b = [4, 5, 6, 7]
      
      p a + b
      

    • 配列の作成

      ループを利用して,規則性のある要素を持つ配列を作る例を試してみましょう.

      n = ARGV[0].to_i
      ary = []
      
      for i in 0..n
        ary[i] = i * i
      end
      
      p ary
      

      配列の要素の数はコマンドライン引数で設定します.2行目の

      ary = []
      

      は,要素の数も値も決めないで,入れ物である配列だけを用意するときに用いる 表現で,空の配列を作ります.作った当初は,nilが一つ入っているだけです.

    • 要素どうしの演算

      配列を加えると,要素の追加になると言うことを前に説明しました.配列の要素 どうしに四則演算を加える場合などは序数つきで指定すれば可能です.いっぺん に行う場合には,やはり,繰り返しと組み合わせましょう.

      a, b, sum, pro = [], [], [], []
      
      for i in 0..9
        a[i] = i + 1
        b[i] = i * 2
      end
      
      for i in 0..9
        sum[i] = a[i] + b[i]
        pro[i] = a[i] * b[9-i]
      end
      
      p sum, pro
      

      単純な順番では面白くないので,積の方はbの配列の並びを逆転して計算してい ます.このように序数を記入する部分には,計算式を入れることもできます.

    • トランプの札パターン表示

      先週の例題で実施したトランプの札の表示ですが,配列を使うと楽になりま す.また,11以上の札にJ,Q,Kなどの記号を使うこともできます.以下の例で 見てみましょう.

      suit = ["Diamonds", "Spades", "Hearts", "Clubs"]
      num = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
      
      for s in 0..3
        for n in 0..12
          printf "%-8s  %2s\n",  suit[s], num[n]
        end
      end
      

      新しい表現も少し出ています.これまで,浮動小数を printf で出力 するときには,小数点以下の桁数を指定する方法を紹介していましたが,今回は 文字列に対して適用可能な桁数表示です.これはまた,整数に対しても利用可能 です.

      %-8s

      とは,文字列を8文字分確保して表示することで,7文字以下の文字列があっても, 空白で埋められて8文字分の幅で出力されます.マイナス記号は,左揃えを指定 する記号です.

      %2d

      は右揃えの2桁確保です.先週のBクラスの宿題では,桁揃えを練習のために if を使って行うよう指定しています.宿題の方は,あくまで制約を守って提出して ください.

    • 例題1

      コマンドラインから入力した数値や文字列を格納する配列として ARGV が用意されています.例えば,次のスクリプトで見ると,

      #argv.rb
      
      p ARGV
      

      これだけのスクリプトがあるとして,コマンドラインから次のように操作します.

      $ ruby argv.rb 1 2 3 4 5

      結果は試してみればすぐ分かるでしょう.では,コマンドラインから入力した数 のうち,奇数だけを再表示するスクリプトはどうなるでしょうか.考えてみましょ う.

      配列の要素の個数は決まっていないので,ループを回す際の回数はなんらかの手 段で推定しなければ行けません.このような場合には while が適して いるでしょう.以前に紹介した shift と組み合わせます.

      shift というのは,配列の先頭の要素を取り出す操作になります.ま た,配列は先頭の要素が抜き取られるので,要素の数が一つ減ってしまいます.

      
      a = [1, 2, 3, 4]
      puts a.shift
      p a
      

      解答例は後程見えるようにします.

    • 例題2

      上の例では,配列の要素が決まらない場合に対して,配列の要素を順に移動させ, 無くなった段階でループを終了するように設定しました.それとは別に,要素の 個数を算出することも size というメソッドを使ってできます.次の 例は,配列に要素がいくつあるかを返すものです.

      puts ARGV.size
      

      これを利用して,先ほどの処理を for ループに変えてみましょう. for を使うときには,繰り返しの回数でループを制御するこ と,仮変数は必ず1ずつ増えることを思い出して,作成してください. 解答例は,後程示します.

  4. 小テスト

    授業の残り20分くらいでAクラスBクラス別々の小テストを行いますので,アナウンス に注意してください.

  5. 宿題

    授業の最後にAクラスBクラス別々の宿題の案内も出しますので,アナウンスに注意してください.


目次ページに戻る