Rubyによるプログラミング ほんの入り口

ここではプログラミング言語Rubyを用いて演習を行います。少ない履修時間でプログラムとは何であるかを原理的に理解することを目的としています。本格的なプログラミングを学ぶためにはそれぞれのプログラミング言語の演習を履修することをお勧めします。 例えば、総合人間学部・情報関係科目の演習科目を参照してください。

1.準備

メディアセンターの教育用システムの場合には、2種類のRubyの言語処理系を利用できます。(プログラミング)言語処理系とは、それぞれ特定のプログラミング言語で書かれたプログラムを計算機で実行するためのソフトウェア群のことです。ただし2種類といっても、動作するOSとバージョンが異なるだけで、元は同じ処理系ですので違いはさほどありません。

教育用システムのWindowsの場合には、スタートボタンをクリックしてすべてのプログラムのメニューからプログラミング言語、Rubyからコマンドプロンプトの方を選びます。ここで、ruby --version⏎と入力し、rubyの処理系のバージョンを確認してみてください。

> ruby –version⏎ (>」はプロンプト(入力促進記号)の右端の部分です)

ruby 1.9.3p194 (2012-4-20) [i386-mingw32]

などと表示されるはずです。また、対話的に処理を行うためのプログラムもインストールされています。

> irb --version⏎

irb 0.9.6(09/06/30)

最近はirbの代わりにpryという、より機能が高いプログラムを使う場合が増えているようです。ただしこちらはメディアセンターのPCには今のところインストールされていません。

Vine Linuxの場合には、仮想端末を動かせば、後はWindowsの場合とほぼ同じです。

$ ruby –version⏎ (Linuxの場合、「$」が入力促進記号の右端の部分の一つです)

ruby 1.8.7 (2011-12-28 patchlevel 357) [universal-darwin11.0]

$ irb –version⏎

irb 0.9.5(05/04/13)

この後、Rubyのプログラムを格納するディレクトリ(フォルダ)を作っておきます。

> cd (以下、プロンプトが異なる場合も含めています。また⏎を省略しています)

> mkdir ruby

ディレクトリを作る操作は次回からは必要ありません。今回も含めて次回からはコマンドプロンプトあるいは仮想端末で以下の操作を行って、rubyのディレクトリに移動しておきます。

> cd

> cd ruby

ディレクトリについての以上の操作はWindowsの場合とLinuxの場合で共通です。

また、rubyのプログラムを作成するためのエディタ(文章等を編集作成するためのプログラム)を選んでおきます。通常プログラムを作成する場合には、それ用の支援機能があるエディタを利用するのが普通ですが、今回はごく単純なプログラムしか作成しないということもあり、利用経験があるエディタを利用してください。Windowsの場合、Meadowやメモ帳などを利用できます。Linuxの場合にはemacsvimを利用できます。メモ帳はWindows標準のソフトウェアですので使い方はよく知られています。それ以外のソフトウェアの使用方法については例えば以下のリンクを参照してみてください。なおMeadowについてはemacsとほぼ使い方は同じです。

UNIXのツールの使い方

高機能テキストエディタ、Vimを使ってみる

2.課題の提出方法

課題の回答を作成したら学生用メールから電子メールで提出してください(次回以降も同様)

提出先: enshu-reportstdio.h.kyoto-u.ac.jp

Subject: 課題番号 課題提出用ID

Subjectの例: Subject: kadai09 e20000

左側の課題番号は毎回変わりますし、右側の課題提出用IDは各自異なります。

注意点:

3.最初のプログラム

以下のようなプログラムをエディタで作成し、test1.rbというファイル名で保存します。ここで.rbの部分は拡張子(extension)と呼ばれ、ファイルの種類(この場合はRubyのプログラム)を表します。Windowsを利用している場合には、拡張子を.txtから.rbに変更したつもりが実際には,rb.txtに変わっている場合もあるので注意してください。

puts 1+2

これは1+2を計算して結果を表示するプログラムです。このプログラムを実行するにはコマンドプロンプトまたは仮想端末で次のようにします。

> ruby test1.rb

3

3が結果です。putsは右側の式を改行付きで表示する命令です。1+2のところを様々な式に書き換えれば様々な計算を行えます。ここで「+」のように左右に式を取り演算を行う、式の構成要素を二項演算子と呼びます。puts以外にも出力する命令としてprintpもあり、これらは出力の形式が少々異なります。printは改行を出力しないのがputsと異なります。pは、データの形式がある程度わかるように出力します。

4.文字コードについての注意

次のプログラムを作成し、上のようにして実行してみてください。

test2.rb

puts ”abc”+”def”

結果はabcdefとなるはずです。”abc”や”def”は文字列です。この結果からわかるように、「+」は数値以外に文字列に対しても演算を行え、その結果は文字列の結合となります。ここで日本語の文字列を扱うこともできます。

test3.rb

puts ”京都”+”大学”

ここで日本語の文字が正しく出力されず、見慣れない記号の列となって表示される場合があります。この現象を俗に「文字化け」と呼びます。原因は、日本語の文字コードが何種類もあり、それらの指定が間違っているために異なる文字コードとして処理されているためです。例えば実行時に次のように指定することで文字コードを指定することが可能です。

> ruby -Ks test3.rb



なお上のように、コマンド入力時に「-」などの文字の後の様々な指定をオプションと呼びます。オプションを含めてコマンド入力の記述方法は次のようにして知ることができます。

> ruby –help

また、全角文字と半角文字を混同して使用するとプログラムがうまく動きません。注意してください。

5.対話的な動作

ここまでは、Rubyのプログラムを一度ファイルの中に格納してそれをrubyコマンドにより一括して実行していました。rubyRubyのプログラムを解釈実行するプログラムです。一般にプログラムを実行する方式にはインタプリタ方式とコンパイラ方式がありますが、rubyはインタプリタ方式です。

これに対し、Rubyプログラムの一行一行をコマンドとして順にrubyのインタプリタが実行していくという動作を行うコマンドも用意されています。irbというコマンドです。こちらの方は、コマンドプロンプトあるいは仮想端末でirbコマンドを実行するとプロンプトが変わり、それ以降irbの動作が終了して抜けるまで、ユーザからの入力はRubyのプログラムとしてインタプリタにより実行されます。

なぜ対話的な動作を行うコマンドが用意されているかというと、その方がプログラムを少しずつ作成したり、動作を一部ずつ確かめることができるなど、はるかに使いやすい面があるからです。

> irb

irb(main):001:0> 1+2

=> 3

irb(main):002:0> puts ”京都”+”大学”

京都大学

=> nil

irb(main):003:0> exit

なおプロンプトはirbのバージョンによって異なります。対話的な動作では、プログラムの個々のステップがコマンドのように動作し、それぞれの結果が表示されます。

6.変数

変数はほとんどのプログラミング言語において重要な概念です。また、手続き型のプログラミング言語では変数の値をプログラムの実行途中で変更することができ、それがプログラムの実行過程を表します。変数の種類はプログラミング言語により変わるものであり、Rubyの場合には5種類あります(数え方によります)。しかしここではそれらのうちローカル変数と呼ばれる変数のみが出てきます。

irb(main):001:0> x = 11

=> 11

irb(main):002:0> y = 23

=> 23

irb(main):003:0> z = x*y

=> 253

irb(main):004:0> x

=> 11

irb(main):005:0> z*z

=> 52900

irb(main):006:0> x = 12

=> 12

irb(main):007:0> z = x*y

=> 276

irb(main):008:0> z += 3

=> 279

irb(main):009:0> z *= 2

=> 558

このように、変数には一時的に値を格納することが出来ます。その後の命令の列が全く同じでも、変数の値によって計算は変わってきます。変数 += 式 というのは変数の値に式の値を加えるという意味で、同様に*=の方は乗ずるという意味です。

7.コマンドラインからの入力

コマンドラインや仮想端末からrubyコマンドでプログラムを実行する場合、同じ行にプログラムに対する入力を記述し、それをプログラム中で参照することができます。

test4.rb

x = ARGV[0].to_i

y = ARGV[1].to_i

puts x*y

これを実行すると例えば次のようになります。

> ruby test4.rb 11 23

253

to_i」というのは文字列の後に「.」を加えて「.to_i」などとすると、その文字列を整数に変換するもので、このようなものをメソッドと呼びます。ARGVはコマンドラインに記述された入力を参照する配列(配列という言葉の説明をまだしていませんが、ここではただこのように使うものだと思っておいてください)です。ARGV[0]が最初の引数、ARGV[1]2番目の引数を表します。これらは文字列なので、数値として演算するにはまず数値に変換する必要があるためto_iというメソッドを使っています。また、ARGV.sizeARGVに対してsizeというメソッドを適用したもので、ARGVの大きさ、すなわちコマンドライン中の引数の個数を与えます。

8.条件判断

ここまではほとんど電卓と同じように計算を行ってきただけでした。しかし今から出てくる条件判断と繰り返しは、通常の電卓にはないものであり、計算機を有用な道具とするには必須のものです。

構文:

if 条件式 [then]

[else

]

end

ここで[]に囲まれている部分はあってもなくてもよい部分です。条件式の値がfalse以外であれば最初の文を実行し、falseの場合には存在すれば二番目の文を実行し、実行された文の値が全体の値となります。通常、条件式の部分には等しいかどうか、大小関係等やそれらの組み合わせ等、真偽値をとるような式を記述します。

irb(main):001:0> x = 10

=> 10

irb(main):001:1> if x == 1 then

irb(main):002:1* p 1

irb(main):003:1> end

=> nil

この例ではxの値が1とは異なるため、p 1は実行されません。

9.繰り返し

Rubyで繰り返し処理を記述する方法は多数あります。ここではそれらのうちの一つ、forによるものを紹介します。

irb(main):001:0> for i in 1..100

irb(main):002:1> print i,” “

irb(main):003:1> end

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 => 1..100



10.同時代入

代入の際に、「,」で区切って複数個の変数に同時に代入できます。これにより例えば変数の値の交換を簡単に記述できます。

x,y = y,x

11.コメント

Rubyプログラムの各行の「#」以降は無視されます(コード指定等例外があります)。すなわちコメントを書く際にはこれを使います。また、行頭の「=begin」から同じく行頭の「=end」まではすべて無視されます。

12.例題

フィボナッチ数列と階乗の計算をRubyのプログラムで行ってみます。

フィボナッチ数列とはfib(0)=1, fib(1)=1, fib(n)=fib(n-2)+fib(n-1)として再帰的に定義される数列です。自然界のいろいろなところで現れることが知られています。

fib.rb

x,y = 0,1

for i in 1..ARGV[0].to_i

x,y = y,x+y

end

puts x

階乗は同じくfact(0)=1, fact(n)=n*fact(n-1)として再帰的に定義されます。

fact.rb

y = 1

for i in 1..ARGV[0].to_i

y *= i

end

puts y

13.最初の課題

コマンドラインに入力した2つの整数を含めてそれらの間のすべての整数の和を求めるプログラムkadai09.rbRubyで記述せよ。ただし数値演算は和と差のみしか使ってはならない。課題の提出先は従来と同じ、課題提出用IDとkadai09という課題番号をSubjectと本文に入れること。

> ruby kadai09.rb 10 13

46

> ruby kadai09.rb 2 -1

2

> ruby kadai09.rb -100 0

-5050