目次に戻る  前のページへ  次のページへ


プログラムの流れを考える --条件分岐--

  1. プログラミングとは何をすることか

    さて,これまででだいぶ準備が出来て来ました.ここで,一度,プログラミング とは何をすることか,ということを考え直してみましょう.

    プログラミングとは,起りうるすべての場合を想定して,それぞれのケースに対 して処理を用意しておくことです.それは,人に買い物を頼む場合に似てい るかも知れません.たとえば,自動販売機で飲み物を買ってもらうとします.その場 合に想定するのは,次のようなことでしょうか.

    1. コーラがあればそれを買う
    2. コーラがなければスポーツドリンクにする
    3. スポーツドリンクもなければ冷たい緑茶にする
    4. 冷たい緑茶もなければ冷たいウーロン茶にする
    5. それもなければ,1ブロック先の自販機に行って上の作業を繰り返 す.

    他にも,自販機や飲料水のメーカを指定する場合があるかも知れませんが,とりあえず, 上のようなことが当然考えられます.ここで,重要なことは,あらかじめ想定さ れる場合を漏れなくあげることと,必要に応じて処理を繰り返すことです.

    このような流れを図1のように記述することも良く行われます.このような図を 「フローチャート」と言います.

    図1 自販機でのお使いの図

    コンピュータは全く融通が利かないので,大人に依頼するようにはいきません. よく,融通が聞かないことを「子供の使い」と言いますが,まさしく,そのもの です.ただし,コンピュータは疲れませんし,だだもこねません.言われたと おり,黙々と作業を続けます.間違って,いつまでも同じことを繰り返す処理を つくってしますと,プログラムが終わりません.(このようなものを「無限ルー プ」と言います.) そのため,本当に厳密に処理を考えておかないといけないわけです.ここではその中の場合 分けを扱う条件分岐について説明します.

  2. 真と偽

    条件を判断する上で,根拠となるのは「値」が「真」か「偽」かになります.プ ログラミング言語では,それらをtrueもしくはfalseとして表現しますが,言語 ごとに特徴があって,trueやfalseはそれぞれ「代表値」としてあつかわれます. Rubyでは,trueとはfalseやnilでは無いという意味になります.nilとは値が 「無い」ことを表す言葉です.例えば,次のような簡単な スクリプト で見てみましょう.

    puts a += 1
    

    このスクリプトを実行するとエラーが出ます.なぜなら,自己代入する先の変数 a の値がいくらなのか分からないままさらに1を足そうとし ているからです.なので,エラーメッセージの欄には,

    tmp.rb:1: undefined method `+' for nil (NameError)
    

    のように表示されます.即ち,値の無いもの,nil に対して足し算の メソッドを実行しようとしていることに問題があります.nilとはこのような値 の無いことを意味するものです.

  3. if

    最も基本的な条件判断を行うのが 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 文の構造

  4. 論理演算

    上の例は,値が存在するかどうかにより場合分けしましたが,値自体を議論する ことももちろんあります.つまり,ある数値よりも大きいか,小さいか,という ような場合わけです.二つの値を比較するときに使用するのが論理演算子で,表 1のようなものがあります.

    表1 論理演算子の例

    == 等しい
    > 大きい
    < 小さい
    >= 以上
    <= 以下
    != 等しくない

    他にも複雑なものがありますが,とりあえず上のものを知っておくと良いでしょ う. 使った例 を以下に示します.

    x = 1
    
    if x >= 0
      puts "Positive or Zero"
    else
      puts "Negative"
    end
    

    変数 x の値が正か負かを判断するスクリプトです.変数 x の値を変化させて実行してみてください.

  5. 複数の if 文の組み合わせ

    最初に紹介した自動販売機のお使いのように,複数の場合分けを実行する必要が ある場合には,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年生向けの授業で試したことがあり ます.参考にしてみてください.

  6. 複数の条件があるときの注意

    数学で変数の範囲を決めるときに,

    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 というメソッ ドを利用しています.このメソッドは表示する文章を一度二重引用符で括って 指定し,その中に%で始まるある変数オブジェクトを与え,後ろにそれに相当 する変数を記述すると言う形式になっています.次で詳しく見て行きましょう.

  7. printf

    printf は指定さ れた仮変数部分に後置された変数の値を入れて表示するものです.仮変数は表2 のような形式のものが使われます.

    表2 printf で使用する仮変数 (仮引数)

    %s文字列
    %d整数型の数値
    %f実数型の数値
    %e指数表現の数値

    この printf を使った例 を見てみます.

    gold = 8
    silver = 3
    nation = "日本"
    
    printf "%sの金メダルの個数は%d個で,銀メダルは%d個です.\n", nation,
    gold, silver
    

    printf を使うと,二重引用符の対が一つですんでいます.すなわち, 表示したい文字列を一通り記述して,仮引数で置いている部分に後に書いて ある変数の値が入れられているのです.仮引数の順番と変数の順番が対応して いないとエラーになってしまいますので,注意して下さい.図5に対応関係を示 しておきます.

    図5 printf 文の構文


 目次に戻る  前のページへ  次のページへ