情報科学概論
2002.5-28
出席に関する注意事項を説明しますので,その注意を良く聞いてから,電子メールにより出席の申告をしてください.「件名」は
gairon 5-28 attend s0240**
のように自分の学生番号を使って下さい.なお,入力ミスがあると出席として認
められないことになりますので,慎重に行ってください.文
字はすべて1バイト文字 (半角英数字) です.途中に入るスペースは一度に一個だけと
してください.スペースは全部で3個です.また,**の部分は自分の学生番号の下二桁
です.
前回のコンピュータセミナーの授業でXEmacsというエディタを紹介しましたが,
プログラミングを行う際には各種の便利なモードが用意されているので,使いこ
なせると便利です.ただし,機能が豊富すぎて覚えるまでが大変なので難しいこ
とでも評判のエディタです.
この授業ではRubyのスクリプトをたくさん作成していきますが,その際にも,便
利なモードが用意されているので,今後は,授業での操作は基本的にXEmacsを利
用していくこととします.まずは,そのための設定を行いましょう.
コンピュータセミナーの授業で行った設定ファイルのコピーが完了しているか確
認してください.ターミナルで以下の操作を行います.
$ ls -a ~ | grep emacs
その結果が
のように関連する4つのファイルを示しているとOKです.なお,XEmacsでファイ
ルを編集すると,保存する直前のバージョンを自動でバックアップします.その
際の名前は本来のものの末尾に ~ がついたものになっていますので,
先ほどの表示結果に最後がチルダのものがあっても気にしないでください.
$ rm "#hoge#"
のように,二重引用符で囲ってコマンド操作を行ってください.
マウスで選択した領域をXEmacs本来のキーバインドである Ctrl + w
でなく,BkSpキーなどに置き換える設定です.まだの人は,やはりセミナーのペー
ジを見て作業を行っておいてください.
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 を編集します.ま
ず,以下の記述をファイルの最後に加えます.
この後,Xemacsを起動して拡張子が .rbのファイルを読み込むとモー
ドラインにRubyという表示が出て,Rubyの編集モードとなります.うまくいかな
かった場合には記述のどこかが間違っているので,よく調べてください.
XEmacsにおける操作の基本は,常にモードラインとミニバッファを見ることです.
そこに表示されている内容は重要ですので,無視しないでください.また,その
ためにデフォルトのウィンドウサイズを調整する方法も先のセミナーのページに
ありますので必ず設定しておいてください.
次に重要なのは,マウスによる操作は不完全であるのでキー操作に重点をおくこ
とです.とは言っても,メニューやメニューボタンが並んでいますのでマウスを
使用したくなります.そこで,注意するのは,ファイルを開く際に「Open」ボタ
ンにより行うとき,ファイル名を選択したあと,ダイアローグの「OK」は押さな
いで,Enterキーを押すことです.このように,マウスで操作できそうに見えて
やり方が分かりにくいものがありますので注意してください.また,上のメニュー
から項目を選択したときにも,一番下のミニバッファに表示がいろいろと出てい
ますので注意しておいてください.
for 文のように一定条件の増分で繰り返しを行うのではなく,より自
由な条件判断で繰り返しを行う方法がこの while になります.
英語の意味から分かるように「〜の間」という意味ですから,ある条件
式が成り立っている間中処理を行います.以下に for の時に
も使用した整数の和の while 文バージョンを示します.
違いは, while の行にある終了条件と,変数 i の初期値や増分を自
分で指定するところです.増分が自分で指定できるので,奇数の和のような演算
は楽になります.
C言語の開発者である本人が書いたC入門の名著「プログラミング言語C」(共立出
版,1989)のループの最初に紹介されているのも実は for 文ではなく
while 文なのですが,その例をRubyに翻訳
すると次のようなものです.
これは、アメリカで通常用いられている温度単位の華氏(Fahrenheit)により表
示された温度を摂氏(Celsius)に変換するプログラムです.構造をわかりやす
くするためにいろいろと変数を定義したり用意したりしていますが,基本的な動
作はわかるでしょう.華氏について0度から300度まで20度おきに華氏と摂氏の
対応表を出力します.
整数型で演算を行うためにちょっとした工夫がなされているのに気づくでしょう
か?また, printf 文中にある \t は文字をそろえる機能の
「タブ」を意味する記号になっています.
前回 for 文で行った作業をすべて while 文に変換するのも
学習する上で効果があるでしょう.しかし,ここでは,また,少し違ったものを
紹介していきます.というのも,while 文においては繰り返す回数が
あらかじめ分かっていないような,曖昧な処理への対応が可能なためです.次の
例は前回にも紹介したファイルの中身を紹介する cat と同等なスクリ
プトです.
相乗平均もやってみましょう.
次の例がいかにも while らしい例だと思います.
この例は,1から始まる連続する整数の和を計算するのですが,求めるものはコマンドライン引数で与
えた数字をその和が越える時の整数の個数です.さらに変型すると次のようなこ
とも可能になります.
このスクリプトの実行は引数なしで行います.すると,ターミナルはコマンドプ
ロンプトが表示されないで,処理が続いている状態になります.そこに,数値
を入力してください.入力後はEnterキーを押します.この作業を繰り返して
行って,入力した数値の和が50以上になると,Stop inputting! と表示して終
了します.使用している exit は処理を中断して終了するコマンド
です.今の場合,入力が続いている限り,while 文は「真」である
ので,条件を満たしたときだけ exit で終了する構成になっていま
す.
上記の内容について,特に,while 文の使い方につ
いて実習してください.自分で様々に変型したスクリプトをつくって試すのが良
いでしょう.
授業の終りに宿題 (AクラスとBクラス別々) について説明しますので,アナウンスに注意してください.
.emacs
.emacs-color.el
.emacs.el
.xemacs.el
さらに,編集途中でXEmacsを終了すると一定期間ごとに自動でバックアップした
最後のものが残ります.ファイル名は#で挟まれたものになっています.ディレ
クトリにそのようなファイルが出来ていると言うことは,XEmacsを適正に終了し
なかった証拠ですので,以後は注意しましょう.また,その#で挟まれたファイ
ルを消去するには,
上記のファイルがまだ無い人はセミナーの授業にある説明にしたがってコピーし
てください.
(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))
n = ARGV[0].to_i
sum = 0
i = 1
while i <= n
sum += i
i += 1
end
puts sum
n = ARGV[0].to_i
sum = 0
i = 1
while i <= n
sum += i
i += 2
end
puts sum
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
ここで,gets というメソッドが出てきました.gets は改行
文字 \n を区切りとしてファイルから1行読むことを行うメソッドで
す.ファイルが何行あるかを知らなくても,while により終わるま
で1行ずつ読み込むことが可能です.上のスクリプトの1行目は次のように省略
して記述することも可能です.
while line = ARGF.gets
print line
end
平均値を求めるスクリプトも同様に可能です.
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)
sum = 0
i = 1
while sum < ARGV[0].to_i
sum += i
i += 1
end
printf "Number of integers is %d.\n", i-1
sum = 0
while value = gets
sum += value.to_i
if sum >=50
puts "Stop inputting!\n"
exit
end
end
目次ページに戻る