情報科学概論
2002.5-28



  1. 本日の作業内容

  2. 出席確認

    出席に関する注意事項を説明しますので,その注意を良く聞いてから,電子メールにより出席の申告をしてください.「件名」は

    gairon 5-28 attend s0240**

    のように自分の学生番号を使って下さい.なお,入力ミスがあると出席として認 められないことになりますので,慎重に行ってください.文 字はすべて1バイト文字 (半角英数字) です.途中に入るスペースは一度に一個だけと してください.スペースは全部で3個です.また,**の部分は自分の学生番号の下二桁 です.

  3. XEmacs設定

    前回のコンピュータセミナーの授業でXEmacsというエディタを紹介しましたが, プログラミングを行う際には各種の便利なモードが用意されているので,使いこ なせると便利です.ただし,機能が豊富すぎて覚えるまでが大変なので難しいこ とでも評判のエディタです.

    この授業ではRubyのスクリプトをたくさん作成していきますが,その際にも,便 利なモードが用意されているので,今後は,授業での操作は基本的にXEmacsを利 用していくこととします.まずは,そのための設定を行いましょう.

    • 設定ファイルの確認

      コンピュータセミナーの授業で行った設定ファイルのコピーが完了しているか確 認してください.ターミナルで以下の操作を行います.

      $ ls -a ~ | grep emacs

      その結果が

      
      .emacs
      .emacs-color.el
      .emacs.el
      .xemacs.el
      

      のように関連する4つのファイルを示しているとOKです.なお,XEmacsでファイ ルを編集すると,保存する直前のバージョンを自動でバックアップします.その 際の名前は本来のものの末尾に ~ がついたものになっていますので, 先ほどの表示結果に最後がチルダのものがあっても気にしないでください.

      さらに,編集途中でXEmacsを終了すると一定期間ごとに自動でバックアップした 最後のものが残ります.ファイル名は#で挟まれたものになっています.ディレ クトリにそのようなファイルが出来ていると言うことは,XEmacsを適正に終了し なかった証拠ですので,以後は注意しましょう.また,その#で挟まれたファイ ルを消去するには,

      $ rm "#hoge#"

      のように,二重引用符で囲ってコマンド操作を行ってください.

      上記のファイルがまだ無い人はセミナーの授業にある説明にしたがってコピーし てください.

    • マウス選択領域削除キーの設定

      マウスで選択した領域をXEmacs本来のキーバインドである Ctrl + w でなく,BkSpキーなどに置き換える設定です.まだの人は,やはりセミナーのペー ジを見て作業を行っておいてください.

    • Rubyモードの設定

      Rubyでスクリプトを作成する際に,文法に従った標示の色分けやカッコの整合な どを見てくれるモードです.スクリプトの間違いなどを少なくして入力を支援し てくれるので是非設定しておきましょう.方法は,上の選択領域削除キーの場合 と同様に ~/.xemacs.el の最後に以下の設定を加えることにより行い ますが,その前に準備も必要です.

      まずはじめに行うのはruby-mode.elという設定ファイルの準備です.これは,

      /usr/doc/ruby-1.6.2/misc/

      ディレクトリにあるので,これを自分のホームディレクトリに用意した専用のディ レクトリにコピーします.方法は,まず,ディレクトリを作成し,コピーと言う 順番です..以下の作業を行います.

      $ mkdir -p ~/lib/emacs

      $ cp /usr/doc/ruby-1.6.2/misc/ruby-mode.el ~/lib/emacs

      これによりファイルが新たに作成した lib ディレクトリの中の emacs ディレクトリにコピーされます.次に,設定ファイルの編集です. エディタでホームディレクトリにある .xemacs.el を編集します.ま ず,以下の記述をファイルの最後に加えます.

      (setq load-path (append '("~/lib/emacs") load-path))
      (require 'font-lock)
      (autoload 'ruby-mode "ruby-mode")
      (setq auto-mode-alist
           (append (list (cons "\\.rb$" 'ruby-mode)) auto-mode-alist))
      (setq interpreter-mode-alist
           (append '(("ruby" . ruby-mode)) interpreter-mode-alist))

      この後,Xemacsを起動して拡張子が .rbのファイルを読み込むとモー ドラインにRubyという表示が出て,Rubyの編集モードとなります.うまくいかな かった場合には記述のどこかが間違っているので,よく調べてください.

    • 操作の基本

      XEmacsにおける操作の基本は,常にモードラインとミニバッファを見ることです. そこに表示されている内容は重要ですので,無視しないでください.また,その ためにデフォルトのウィンドウサイズを調整する方法も先のセミナーのページに ありますので必ず設定しておいてください.

      次に重要なのは,マウスによる操作は不完全であるのでキー操作に重点をおくこ とです.とは言っても,メニューやメニューボタンが並んでいますのでマウスを 使用したくなります.そこで,注意するのは,ファイルを開く際に「Open」ボタ ンにより行うとき,ファイル名を選択したあと,ダイアローグの「OK」は押さな いで,Enterキーを押すことです.このように,マウスで操作できそうに見えて やり方が分かりにくいものがありますので注意してください.また,上のメニュー から項目を選択したときにも,一番下のミニバッファに表示がいろいろと出てい ますので注意しておいてください.

  4. 制御構造 (繰り返し2)

    • while 文の基本

      for 文のように一定条件の増分で繰り返しを行うのではなく,より自 由な条件判断で繰り返しを行う方法がこの while になります. 英語の意味から分かるように「〜の間」という意味ですから,ある条件 式が成り立っている間中処理を行います.以下に for の時に も使用した整数の和の while 文バージョンを示します.

      
      n = ARGV[0].to_i
      sum = 0
      i = 1
      
      while i <= n
        sum += i
        i += 1
      end
      
      puts sum

      違いは, while の行にある終了条件と,変数 i の初期値や増分を自 分で指定するところです.増分が自分で指定できるので,奇数の和のような演算 は楽になります.

      
      n = ARGV[0].to_i
      sum = 0
      i = 1
      
      while i <= n
        sum += i
        i += 2
      end
      
      puts sum

      C言語の開発者である本人が書いたC入門の名著「プログラミング言語C」(共立出 版,1989)のループの最初に紹介されているのも実は for 文ではなく while 文なのですが,その例をRubyに翻訳 すると次のようなものです.

      
      lower = 0
      upper = 300
      step = 20
      
      fahr = lower
      while fahr <= upper
        celsius = 5 * (fahr - 32) / 9
        printf("%d\t%d\n", fahr, celsius)
        fahr += step
      end

      これは、アメリカで通常用いられている温度単位の華氏(Fahrenheit)により表 示された温度を摂氏(Celsius)に変換するプログラムです.構造をわかりやす くするためにいろいろと変数を定義したり用意したりしていますが,基本的な動 作はわかるでしょう.華氏について0度から300度まで20度おきに華氏と摂氏の 対応表を出力します.

      整数型で演算を行うためにちょっとした工夫がなされているのに気づくでしょう か?また, printf 文中にある \t は文字をそろえる機能の 「タブ」を意味する記号になっています.

    • while 文の応用

      前回 for 文で行った作業をすべて while 文に変換するのも 学習する上で効果があるでしょう.しかし,ここでは,また,少し違ったものを 紹介していきます.というのも,while 文においては繰り返す回数が あらかじめ分かっていないような,曖昧な処理への対応が可能なためです.次の 例は前回にも紹介したファイルの中身を紹介する cat と同等なスクリ プトです.

      
      while line = ARGF.gets
        print line
      end
      
      ここで,gets というメソッドが出てきました.gets は改行 文字 \n を区切りとしてファイルから1行読むことを行うメソッドで す.ファイルが何行あるかを知らなくても,while により終わるま で1行ずつ読み込むことが可能です.上のスクリプトの1行目は次のように省略 して記述することも可能です.

      
      while line = gets
      
      平均値を求めるスクリプトも同様に可能です.

      
      sum = 0
      i = 0
      
      while value = ARGV.shift
        sum += value.to_f
        i += 1
      end
      
      printf "Averaged value is %1.2f.\n", sum / i
      

      相乗平均もやってみましょう.

      
      sum = 1
      i = 0
      
      while value = ARGV.shift
        sum *= value.to_f
        i += 1
      end
      
      printf "Geometric mean is %1.2f\n.", sum**(1.0/i)
      

      次の例がいかにも while らしい例だと思います.

      
      sum = 0
      i = 1
      
      while sum < ARGV[0].to_i
        sum += i
        i += 1
      end
      
      printf "Number of integers is %d.\n", i-1
      

      この例は,1から始まる連続する整数の和を計算するのですが,求めるものはコマンドライン引数で与 えた数字をその和が越える時の整数の個数です.さらに変型すると次のようなこ とも可能になります.

      
      sum = 0
      
      while value = gets
        sum += value.to_i
        if sum >=50
          puts "Stop inputting!\n"
          exit
        end
      end
      

      このスクリプトの実行は引数なしで行います.すると,ターミナルはコマンドプ ロンプトが表示されないで,処理が続いている状態になります.そこに,数値 を入力してください.入力後はEnterキーを押します.この作業を繰り返して 行って,入力した数値の和が50以上になると,Stop inputting! と表示して終 了します.使用している exit は処理を中断して終了するコマンド です.今の場合,入力が続いている限り,while 文は「真」である ので,条件を満たしたときだけ exit で終了する構成になっていま す.

  5. 実習作業

    上記の内容について,特に,while 文の使い方につ いて実習してください.自分で様々に変型したスクリプトをつくって試すのが良 いでしょう.

  6. 宿題

    授業の終りに宿題 (AクラスBクラス別々) について説明しますので,アナウンスに注意してください.


目次ページに戻る