34.2 条件分岐とループ

プログラムを作る上で,条件分岐とループの記述は欠かせません.これらの書き方を学びましょう.

ソースコードの実行

前節では,irb を使って一問一答式でプログラムを実行しました.ですが Ruby では,複数の命令をテキストファイルに書いておいて,いっぺんに実行することができます.ある程度以上複雑なことをやるときには,これが普通の使い方です.
試しに,次の3つの命令を書いたソースコード(文字で書いたプログラム)を mi などのテキストエディタに貼り付け, “a.rb” という名前で保存をしてください.print メソッドの中に出てくる “\n” は,改行の意味です.mi を使っていて,”\” (バックスラッシュ)を入力したいときは, ¥(コマンドキー+円記号キー(キーボード右上)) を押してください(もし,これで円記号が入力されたときは,コマンドキーを押さずに円記号キーを押してみてください).

x = 3 y = x * 9 print "y is ", y, "\n"

このプログラムを実行してみましょう.ターミナルを立ち上げ,a.rb を保存したディレクトリ(フォルダ)にカレントディレクトリを変更します(hwb14.4.2 ディレクトリの操作).そして,以下のように,「ruby (ファイル名)」とコマンドを入力します.ファイル名の前には半角空白を挟みます.
ruby a.rbreturn2
y is 27 ci00000m:~ 0000000000$

すると,書いた命令が実行され,print メソッドで出力した文字列が表示されました.プログラムを最後の行まで実行し終えると,再びシェルプロンプトの文字列に戻ります.このとき,x のようなプログラム内部で使った変数については何も表示されず,print メソッドで指定したものだけが表示されています.プログラムの実行結果を確認するには,上のプログラムのように,中身を確認したい式や変数を, print メソッドに与えることで表示してやる必要があるのです.

条件分岐

条件分岐とは「もしこの条件が成り立っていたらこうする」という命令のことです.Ruby プログラム内で条件分岐をさせるには if 文を使います.if 文の使い方は次の通りです.

if (条件) then (条件成立時に実行するコード) else (条件不成立時に実行するコード) end

試しに if 文を使ってみましょう.次のソースコードを mi などのテキストエディタに貼り付け “b.rb” という名前で保存をしてください.その際,文字コードは UTF-8 に,改行コードは LF にしてください.mi で設定する方法は hwb8.2.3 文字コード,改行コードの設定 に書いてあります.
a = ARGV[0].to_i if a%2==0 then print "a=" , a, " is an even number." else print "a=" , a, " is an odd number." end

見当が付くとは思いますが,これは数字の偶奇を判定するプログラムです.ターミナルを立ち上げ,ruby b.rb の後ろに整数を書くと,その数が偶数か奇数かを判定してくれます.
ruby b.rb 3return2
a=3 is an even number.
ruby b.rb -6return2
a=-6 is an odd number.

1 行目の a=ARGV[0].to_i は,ターミナルで ruby b.rb の後ろに書かれた数字を変数 a に代入するという意味です.その後 if 文の条件 a%2==0,つまり a を 2 で割った余りが 0 かどうかが判定され,それに応じたメッセージが出力されるわけです.ここで「a を 2 で割った余りが 0 と等しい」という条件で == が使われることにも気をつけてください.多くのプログラム言語ではただの等号 = を変数への代入の意味に使うので,等しいことを表すのに 2 つ重ねた等号 ==  を使います.

for ループ

ループとは,ソースコードの一部分を繰り返し実行するための構文です.まずは次のソースをテキストエディタで c.rb というファイルに保存してください.

for i in 1..5 do print i, "*", i, "=", i*i, "\n" end

このあとターミナルで c.rb を走らせると,1 から 5 までの階乗が出力されます.
ruby c.rbreturn2
1*1=1 2*2=4 3*3=9 4*4=16 5*5=25
return2

このように
for i in 1..n do (繰り返したいソースコード) end

と書くと,i=1 の時に do と end で囲まれたコードが実行され,次に i=2 となって do と end で囲まれたコードが実行され,この動作が i=n まで繰り返されます.
Ruby では for ループ以外にもループ構文が用意されてはいますが,一度に全部覚える必要はありません.まずは for ループを使えるようになりましょう.

FizzBuzz

if 文と for ループを使ったプログラムの練習問題として,FizzBuzz を紹介します.詳細は externalWikipedia にありますが,FizzBuzz は複数人で遊ぶゲームです.プレイヤーの間で順番を決めた後,次のルールに従って発言を繰り返します.最初に発言を間違えた人が負けとなります.

  • 最初の人は “1” と言います.
  • 誰かが発言したら,次の人は前の人の数字に 1 を足した数字を言います.ただしその数字が 3 で割れるときは “Fizz”, 5 で割り切れるときは “Buzz”, 15 で割り切れるときは “Fizz Buzz” と言います.

ですので順調にゲームが進めば,発言は次のように続くはずです.

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, …

そこで if 文と for 文を使い,100 までの Fizz Buzz の発言を出力するプログラムを書いてください.ここまでの節で扱った内容だけで,プログラムは書けるはずです.プログラムを書いていて行き詰まったら,次節 hwb34.3 デバッグの方法 を参考にしてください.