目次に戻る | 前のページへ | 次のページへ |
さて,これまででだいぶ準備が出来て来ました.ここで,一度,プログラミング とは何をすることか,ということを考え直してみましょう.
プログラミングとは,起りうるすべての場合を想定して,それぞれのケースに対 して処理を用意しておくことです.それは,人に買い物を頼む場合に似てい るかも知れません.たとえば,自動販売機で飲み物を買ってもらうとします.その場 合に想定するのは,次のようなことでしょうか.
このような流れを図1のように記述することも良く行われます.このような図を 「フローチャート」と言います.
図1 自販機でのお使いの図
条件を判断する上で,根拠となるのは「値」が「真」か「偽」かになります.プ ログラミング言語では,それらをtrueもしくはfalseとして表現しますが,言語 ごとに特徴があって,trueやfalseはそれぞれ「代表値」としてあつかわれます. Rubyでは,trueとはfalseやnilでは無いという意味になります.nilとは値が 「無い」ことを表す言葉です.例えば,次のような簡単な スクリプト で見てみましょう.
puts a += 1 |
このスクリプトを実行するとエラーが出ます.なぜなら,自己代入する先の変数 a の値がいくらなのか分からないままさらに1を足そうとし ているからです.なので,エラーメッセージの欄には,
tmp.rb:1: undefined method `+' for nil (NameError) |
のように表示されます.即ち,値の無いもの,nil に対して足し算の メソッドを実行しようとしていることに問題があります.nilとはこのような値 の無いことを意味するものです.
最も基本的な条件判断を行うのが if 文です.「文」とはプログラム 中に記述されている命令で,「式」と呼ぶこともあります. 次の例 を見てみましょう.
a = 1 if a then puts "OK" else puts "NG" end |
if というのは英語の「もしも」ですから,意味はすぐに分かると思い ます.変数 a が何らかの値を持てばtrueですので,条 件が成立していることになり,OKが表示されます.しかし,値がなければtrueで はないので,else の方に処理が移ります.else は「それ以 外」の意味ですから,条件が成立しなかった場合の処理をそのあとに記述します. 条件文の最後は end をつけておきます.このスクリプトはこのままで は何回実行しても「OK」になります.そこで,次のように1行目を修正します.
a = nil |
また,次のような例も試してみましょう.結果が理解できるでしょうか.
a = "nil" |
処理の文は「字下げ」 をするのが通例です.Rubyでは,字下げは2文字分が推奨されています.そうなっ ていなくても別に動作に影響はありませんが,他の人に見てもらう場合には,き ちんと字下げをしておくのがマナーです.上の例の then は省略可能です.また,else の処理は無くても良ければ記述しなくても構いません.
上の例のように,if 文は図2に示すような構文になります.
図2 if 文の構造
上の例は,値が存在するかどうかにより場合分けしましたが,値自体を議論する ことももちろんあります.つまり,ある数値よりも大きいか,小さいか,という ような場合わけです.二つの値を比較するときに使用するのが論理演算子で,表 1のようなものがあります.
== | 等しい |
> | 大きい |
< | 小さい |
>= | 以上 |
<= | 以下 |
!= | 等しくない |
x = 1 if x >= 0 puts "Positive or Zero" else puts "Negative" end |
変数 x の値が正か負かを判断するスクリプトです.変数 x の値を変化させて実行してみてください.
最初に紹介した自動販売機のお使いのように,複数の場合分けを実行する必要が ある場合には,if 文を入れ子にして使うことも可能ですし, elsif を使うことも可能です.それぞれ,end により 指定する範囲を注意してスクリプトを作成する必要があります.構文を図3に示 します.
図3 if 文の入れ子(a)とelsif 構文(b)
x = 1 if x > 0 puts "Positive" elsif x < 0 puts "Negative" else puts "Zero" end |
選択肢が3つになった場合分けが出来ます.
さらに複雑な例を考えてみましょう.西暦年を 与えた場合にその年が閏年に該当するかどうかの判別を行う流れを図4に示しています. 今度はこれを考えてみてください.結果は一応用意していますが,まずは自分で 考えてみましょう.
図4 西暦から閏年を判定する流れ
さらに,複雑な例としては,西暦から元号に直すこと もかつて大学1年生向けの授業で試したことがあり ます.参考にしてみてください.
数学で変数の範囲を決めるときに,
0 < x < 1
のような表現をしました.これは x が0より大きく,かつ,1より小さい, と言う意味ですが,つい,x が0と1の間,と読みかえてしまいがちです. その感覚が抜けないと,if 文でも間違いをすることが良くあります. 先ほどの x の範囲の例で行くと,
x = 1 if x > 0 if x < 1 str = "in" else str = "out of" end else str = "out of" end printf "The number is %s the range.\n", str |
のように二つに分けないと処理できません.これをついうっかり,
x = ARGV[0].to_f if 0 < x < 1 str = "in" else str = "out of" end printf "The number is %s the range.\n", str |
のように記述してしまうと,間違いです.ただし,二つの条件をいちいち分けて 記述するのも面倒なので,論理和や論理積というものも用意されています.上のスクリプ トは,次のように書くこともできます.
x = 1 if x > 0 && x < 1 str = "in" else str = "out of" end printf "The number is %s the range.\n", str |
&& の記号が「かつ」を意味します.「または」に相当するの は,|| です.また,これらは,それぞれ and と or をそのままスクリプト中に入れても可能ですが,他の言語と共通の記号な ので,記号の方を覚えておきましょう.
大抵の言語において,これらの演算子は,左側だけで判定が可能な場合には右側 の判定を行いません.そのため,短絡演算子とも言われます.なお,ここでは最初の方で利用方法を省略した printf というメソッ ドを利用しています.このメソッドは表示する文章を一度二重引用符で括って 指定し,その中に%で始まるある変数オブジェクトを与え,後ろにそれに相当 する変数を記述すると言う形式になっています.次で詳しく見て行きましょう.
printf は指定さ れた仮変数部分に後置された変数の値を入れて表示するものです.仮変数は表2 のような形式のものが使われます.
%s | 文字列 |
%d | 整数型の数値 |
%f | 実数型の数値 |
%e | 指数表現の数値 |
gold = 8 silver = 3 nation = "日本" printf "%sの金メダルの個数は%d個で,銀メダルは%d個です.\n", nation, gold, silver |
printf を使うと,二重引用符の対が一つですんでいます.すなわち, 表示したい文字列を一通り記述して,仮引数で置いている部分に後に書いて ある変数の値が入れられているのです.仮引数の順番と変数の順番が対応して いないとエラーになってしまいますので,注意して下さい.図5に対応関係を示 しておきます.
図5 printf 文の構文
目次に戻る | 前のページへ | 次のページへ |