情報科学概論
2003.7.15

Back to index page



  1. 本日の作業内容

  2. 配列(2)

    • 配列の基礎 (復習)

      配列を作成するのは,変数に値を代入するのと同じ様に行えました.配列の全体 を表示するためには p という出力命令を利用しましたが,個々の要素 の値は序数をつけて指定しました.

      fruits = ["apple", "banana", "kiwi", "melon", "orange"]
      p fruits
      printf "My favorite fruits is %s\n", fruits[2]
      

      要素を順に表示したりするような処理には繰り返しとの組合せが利用されます.

      fruits = ["apple", "banana", "kiwi", "melon", "orange"]
      
      for i in 0..4
        printf "My favorite fruits is %s\n", fruits[i]
      end
      

    • 要素間の逐次比較

      配列に格納された値の最大値や最小値を求める作業では,各要素の値を順に比較 する作業も行いました.それを応用して,要素を大きい順や小さい順に並べ直すこともできま す.

      ary = [1, 5, 3, 6, 4, 8, 11, 9]
      
      for i in 0..7
        for j in i..7
          ary[i], ary[j] = ary[j], ary[i] if ary[i] >= ary[j]
        end
      end
      
      p ary
      

      ここでは,多重代入のときに学習した,変数の値の入れ換え手法が使われていま す.また,この方法では,元からあった配列 ary の中身は変更されて しまいます.

    • 曜日計算

      コマンドライン引数で月と日を与えると曜日を返すスクリプトの2003年版を作っ てみましょう.考え方としては,1月1日の曜日が分かれば,指定された日付がそ の何日後かを計算するだけです.

      month = [0,31,28,31,30,31,30,31,31,30,31,30]
      day = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]
      a = 2
      
      for i in 0..ARGV[0].to_i-1
        a += month[i]
      end
      
      print "その日は ", day[(a + ARGV[1].to_i) % 7], " です\n"
      

      これまでに学習した知識を総動員すると,上の曜日のスクリプトを応用して別ページに示すようなカレ ンダー表示を行うことができます.シェルのコマンドである cal に似 た動作をします.コマンドライン引数として今年の月を数字で与えることになっ ています.ちょっと難しいとは思いますが,プログラミングの初心者でもこれく らいはできると言うことです.

    • 多重配列

      2次元的に考える必要のあるデータに対しては,配列も2次元的に作ることにより データを分かりやすく整理することができます.行列要素を表示するときに,添 字を2つつけて表示するのと同じ様に,序数を二つ使って表現します.

      ary = [[1, 2, 3], [1, 3, 5], [2, 4, 6], [2, 4, 8]]
      
      for i in 0..3
        for j in 0..2
          print  ary[i][j], " "
        end
        print "\n"
      end
      

      まずは,多重配列の表記法ですが,上のように,配列の要素自体が配列になって います.これは,何重になっても構いません.また,要素の個数が不揃いでも構 いません.画像データなどは (xy) 座標で指定される画素の色 や明るさを数値で表現したもので構成されています.白黒がランダムに散らばっ た2次元画像を模擬的に作ってみましょう.

      ただし,以下の例では多重配列にはなっていませんね.これを保存する際には, 1次元の通常の配列でも可能ですが,2次元の配列にする方が後の取扱いが楽にな ります.保存するのならば,どうすれば良いかまた自分で考えてみましょう.

      bw = ["■", "□"]
      
      for y in 0..15
        for x in 0..15
          print bw[rand(2)]
        end
        print "\n"
      end
      

      動かすたびに異なる画像が表示されるのが分かるでしょう.出力行の部分の bw の引数を次の ような例に変更してみて実際の動作との関係を見てみましょう.

      x % 2
      y % 2
      (x + y) % 2

      動作の意味が分かりましたでしょうか.

  3. 実習作業

    • 例題1 並べ替え

      先ほど行った要素の大きい順の並べ替えについて,小さい順に変えることを考え てみましょう.

    • 例題2 コマンドライン引数の並べ替え

      さらに,コマンドライン引数から入力された数値を並べ替えてみましょう.

    • 例題3 並べ替え用の配列を新規作成

      先ほどの例では,配列要素の並べ替えにより,配列自体が書き換えられてしまい ました.大きい順や小さい順に要素を並べ直す配列を別に用意する方法を考えま しょう.

    • 例題4 規則的なビットパターンの例

      次のように表示されるビットパターンを作成するための,出力の規則性を探して みましょう.

      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      ■■■■■■■■□□□□□□□□
      
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      
      ■■■■■■■■■■■■■■■■
      □■■■■■■■■■■■■■■■
      □□■■■■■■■■■■■■■■
      □□□■■■■■■■■■■■■■
      □□□□■■■■■■■■■■■■
      □□□□□■■■■■■■■■■■
      □□□□□□■■■■■■■■■■
      □□□□□□□■■■■■■■■■
      □□□□□□□□■■■■■■■■
      □□□□□□□□□■■■■■■■
      □□□□□□□□□□■■■■■■
      □□□□□□□□□□□■■■■■
      □□□□□□□□□□□□■■■■
      □□□□□□□□□□□□□■■■
      □□□□□□□□□□□□□□■■
      □□□□□□□□□□□□□□□■
      
      □□□□□□□□□□□□□□□■
      □□□□□□□□□□□□□□■■
      □□□□□□□□□□□□□■■■
      □□□□□□□□□□□□■■■■
      □□□□□□□□□□□■■■■■
      □□□□□□□□□□■■■■■■
      □□□□□□□□□■■■■■■■
      □□□□□□□□■■■■■■■■
      □□□□□□□■■■■■■■■■
      □□□□□□■■■■■■■■■■
      □□□□□■■■■■■■■■■■
      □□□□■■■■■■■■■■■■
      □□□■■■■■■■■■■■■■
      □□■■■■■■■■■■■■■■
      □■■■■■■■■■■■■■■■
      ■■■■■■■■■■■■■■■■
      

      下の二つの例については,if ... else ... end 構文を使います.

    • さらに上級編

      □□□□□□□□□□□□□□□□
      □□□□□□■■■■□□□□□□
      □□□□■■■■■■■■□□□□
      □□□■■■□□□□■■■□□□
      □□■■□□□□□□□□■■□□
      □□■■□□□□□□□□■■□□
      □■■□□□□□□□□□□■■□
      □■■□□□□□□□□□□■■□
      □■■□□□□□□□□□□■■□
      □■■□□□□□□□□□□■■□
      □□■■□□□□□□□□■■□□
      □□■■□□□□□□□□■■□□
      □□□■■■□□□□■■■□□□
      □□□□■■■■■■■■□□□□
      □□□□□□■■■■□□□□□□
      □□□□□□□□□□□□□□□□
      
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□■■■■■■■■■■□□□
      □□□■■■■■■■■■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■□□□□□□■■□□□
      □□□■■■■■■■■■■□□□
      □□□■■■■■■■■■■□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      □□□□□□□□□□□□□□□□
      

  4. 小テスト

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

  5. 宿題

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


目次ページに戻る