情報科学概論
2003.7.22

Back to index page



  1. 本日の作業内容

  2. 期末試験解答用紙のダウンロード予行演習

    期末試験は,いつもの授業と同じ形式で実施します.コンピュータを利用してメー ルにより解答を提出しますが,体裁を揃えるために基本となる解答用紙をダウン ロードして,エディタで記入する形式です.方法になれておくために,一度試し てみて下さい.

    解答用紙ダウンロード予行演習

  3. 配列(3)

    • 指数

      配列の要素を指定するためには,要素の 順番を「指数」として利用します.指数は0から始まることに注意が必 要でした.

      ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
      
      puts ary[1]
      

      指数として負の数を入力すると,終わりから数えた順番で表示します.このとき は,0から始まるのではなく,1から始まります.

      ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
      
      puts ary[-1]
      

      for 文の範囲指定で利用している形式を利用すると,配列の中の範囲 も指定できます.

      ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
      
      puts ary[1..3]
      

      配列の指数として,配列の数よりも大きな数を指定すると,値が無いために nil を返しますが,上記の範囲指定で終わりの数を要素数以上に設定する と,一番最後の数を指定したのと同じ動作になります.

      ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
      
      puts ary[10]
      puts ary[4..10]
      

    • 集合

      配列の和は要素を結合したものになることを以前に紹介しました.論理演算を応 用して配列を集合として扱うことも可能です.

      ary1 = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
      ary2 = ["ginn", "sguu", "bacue", "freedom", "justice"]
      
      aryand = ary1 & ary2
      aryor = ary1 | ary2
      arydiff = ary1 - ary2
      
      p aryand, aryor, arydiff
      

    • 文字列の配列化

      スペースやカンマで区切られた文字列を自動的に配列に変換することが可能です. Rubyでは,次のような方法で変換できます.

      str = "A quick brown fox jumps over the lazy dog"
      
      ary = str.split
      p ary
      

      上の例文のように区切りが明白な場合には空白により自動で分割されます.次の 例は,区切り記号を指定して実行する場合です.

      str = "Kira Freedom:Athrun Justice:Mu Strike:Diakka Buster"
      
      ary = str.split(/:/)
      p ary
      

      このような方法が役に立つのは,あらかじめ存在しているデータを活用して計算 を行うような場合です.表計算というジャンルのソフトウェアは事務処理などで 良く利用されますが,そのデータはCSVと言う形式でカンマ区切りのテキストデー タに変換してやりとりされることが多くあります.それに似たデータを利用して 計算する例を次に考えてみましょう.

    • 成績データ

      例えば,10人の学生の試験成績データとして以下のようなものがあるとします. このデータはダウンロード可能です.

      Name,English,Mathematics,Physics
      Athrun,100,100,100
      Cagalli,80,60,60
      Dearka,95,90,80
      Kira,90,100,100
      Lacus,100,50,50
      Miriallia,80,80,75
      Nicol,100,80,80
      Ssigh,85,90,85
      Tolle,80,85,85
      Yzak,90,90,90
      

      このデータを record.txt という名前で保存した場合に,次のような スクリプトを実行してみましょう.

      #list.rb
      
      data = []
      
      i = 0
      while line = ARGF.gets
        data[i] = line.chomp.split(/,/)
        i += 1
      end
      
      p data
      

      実行は,引数でファイル名を与えます.

      $ ruby list.rb record.txt

      これで各行の内容がカンマで分割され配列になり,さらに,その配列を要素とす る配列 data が作成されています.なお,上で使っている chomp というメソッドは行末の改行文字を切り捨てるために使用してい るものです.

      これを元に各種の計算を実行してみましょう.

    • 平均点

      各教科の平均点を出してみます.データを縦に見て行くと言うことは,特定の指 数のついた要素を選んで和を求めて行くことになります.

      data = []
      
      i = 0
      while line = ARGF.gets
        data[i] = line.chomp.split(/,/)
        i += 1
      end
      
      sum_e = 0
      
      for i in 1..10
        sum_e += data[i][1].to_f
      end
      
      printf "英語の平均点は %1.1f です.\n", sum_e / 10
      

      学生ごとの平均点はどうなるでしょうか.今度は横に見てゆきます.

      data = []
      
      i = 0
      while line = ARGF.gets
        data[i] = line.chomp.split(/,/)
        i += 1
      end
      
      data[0][4] = "Average"
      printf "%-9s\s%s\n", data[0][0], data[0][4]
      
      for i in 1..10
        data[i][4] = 0
      end
      
      for i in 1..10
        for j in 1..3
          data[i][4] += data[i][j].to_i
        end
        printf "%-9s\s%5.1f\n", data[i][0], data[i][4] / 3
      end
      

  4. 実習作業

    1. 上の成績処理に関して,英語以外の平均点を求めるスクリプトを作成してみて下 さい.

    2. 各個人の平均点,各教科ごとの平均点,全体の平均点を表に追加して画面に 出力するスクリプトを作成してみましょう.例えば,次のように表示され るとします.

             Name     English Mathematics     Physics     Average 
      Athrun              100         100         100       100.0
      Cagalli              80          60          60        66.7
      Dearka               95          90          80        88.3
      Kira                 90         100         100        96.7
      Lacus               100          50          50        66.7
      Miriallia            80          80          75        78.3
      Nicol               100          80          80        86.7
      Ssigh                85          90          85        86.7
      Tolle                80          85          85        83.3
      Yzak                 90          90          90        90.0
      Average            90.0        82.5        80.5        84.3
      

  5. 小テスト

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

  6. 宿題

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


目次ページに戻る