条件分岐(if文)

    2012/05/17

    本章では下記の内容を学習します。

    • 条件分岐:  if, else, else if
    • 関係演算: 等しい、等しくない、小さい、大きい、以下、以上
    • 論理関係: かつ、または、否定

    if 文による条件判断

    if 文(もし ○○ ならば)

    #include <stdio.h>
    
    int main()
    {
      // 例1: if文
      int     val = 5;
    
      //  ( ) 内の条件が成り立っていれば、 { } ブロック内を実行
      if( val == 5 )
      {
          printf( "valは5でした\n" );
      }
    
      return  0;
    }
    

    条件に応じて行動を分けるという処理は、プログラミングの肝となる部分です。if 文は、このような条件判断を行って、処理を振り分ける構文の代表例になります。

    if 文は、( ) 内に書かれた条件が満たされていれば、その直下の { }ブロック内の処理を行うという構文です。例で書かれた条件は == なので、左と右の値が同じであれば、{ } ブロック内の処理を行うということになります。

    入力された値をチェック

    ユーザから整数を受け取って、その値が 7 であれば、『当たり!』と表示するようなプログラムを、printf 文、scanf_s 文、if 文を使って作成してください

    else 文(もし ○○ ならば、そうでなければ)

    #include <stdio.h>
    
    int main()
    {
      // 例2: if-else文
      int     age = 21;
    
      //  ( ) 内の条件が成り立っていれば、if文直下の { } ブロック内を実行
      // そうでなければ、else文直下の { } ブロック内を実行
      if( age >= 18 )
      {
          printf( "18歳以上ですね\n" );
      }
      else
      {
          printf( "18歳未満でしたか\n" );
      }
    
      return  0;
    }
    

    if 文は条件が成り立っていれば処理を行う構文でしたが、else 節を利用すると、条件が成り立っていなければ処理を行う、ということもできるようになります。

    else 文は、if 文の ( ) 内の条件が満たされなかった場合、else の直下の { } ブロック内の処理を行うという構文です。例では年齢が 18 歳以上であるかをチェックしています。もし 18 歳以上であれば if 文直下の { } ブロックが実行され、そうでなければ(= 18 歳未満であれば)else 文直下の { } ブロックが実行されることになります。

    練習問題: 電車の運賃

    おとな 400 円、こども 200 円の電車があり、12 歳以上がおとな料金になるとします。年齢を scanf_s 関数で入力してもらい、その結果に応じて、料金を表示するプログラムを作成してください。

    else if 文(○○ ではなくて、△△ ならば)

    #include <stdio.h>
    
    int main()
    {
      // 例3: else if文
      int     chuusen = 3;
    
      // この場合は、最初のif文は成り立たず、
      // 次の else if 文は成り立つので、その処理が実行される
      if( chuusen == 7 )
      {
          printf( "大当たり!\n" );
      }
      else if( chuusen == 3 )
      {
          printf( "あたり\n" );
      }
      else
      {
          printf( "ハズレ\n" );
      }
    
      return  0;
    }
    

    if-else 構文では、○○ という条件があった場合、そうであるか、そうでないか、の 2 択でしか選ぶことができません。それ以上に複雑な分岐を組みたい場合、たとえば ○○ ではないけど、△△ ではある場合、といったような場合は、else if 文を利用します。

    else if 文は、上にある条件が成り立たなかったときに、else if 文の ( ) 内の条件がチェックされ、それが成り立っていれば { } ブロック内の処理を行うという構文です。ですから if 文の下にしか配置されることはありません。

    else if 文は、いくつでも重ねることができます。たとえば 5 種類のパターンをチェックしたい場合は、else if が少なくとも 3 つ重なることになります。

    else if 文と、else 文は併用することができます。この場合、else 文は一番最後に配置され、すべての if 文と else if 文のチェックが成り立たなかった時に実行されます。

    else 文は記述しないこともできます。つまり if 文と else if 文のみで条件判断を構築することができます。いずれの条件も成り立たなかった場合は、一連の if 文のいずれも実行されることはありません。else 文があれば、一連の if 文のどれかは必ず実行されます。

    練習問題: 複雑な当せん判定
    1. 例 3 に付け加えて、『1 はリプレイ』を追加してください
    2. さらに付け加えて、『5 は小当たり』を追加してください
    3. 上記の抽せん番号を、ユーザが入力できるようにしてください

    関係演算子・論理関係演算子

    関係演算子

    #include <stdio.h>
    
    int main()
    {
      // 例4: 関係演算子
      int     a=5, b=3;
    
      // aとbが等しい → 成り立たない
      if( a == b )
      {
          printf( "成り立つ\n" );
      }
      else
      {
          printf( "成り立たない\n" );
      }
    
      return  0;
    }
    

    if 文での条件を記述するために、関係演算を利用することができます。関係演算の基本的なものとして、以下の関係演算子があります。

    関係演算子意味
    == 等しい
    != 等しくない
    < より小さい
    >  より大きい
    <= 以下
    >= 以上

    関係演算子は、左右の演算子を比較して、その結果を真偽のいずれかの値で返します。C 言語の場合、偽が 0、真が 1、で返されます

    練習問題: 関係演算の記述

    int a=5, b=3; という 2 つの変数があるとき、以下の条件を記述できる if 文をひとつずつ作成し、その結果を『成り立つ』『成り立たない』の 2 パターンで表示してください。

    1. a が b より大きい(成り立つ)
    2. a と b が等しくない(成り立つ)
    3. a が 4 以上(成り立つ)
    4. a が b 以下(成り立たない)

    論理関係演算子

    #include <stdio.h>
    
    int main()
    {
      // 例 5: 論理関係演算子
      int x=5, y=3;
    
      if( x==5 && y==5 )
      {
          // && はAND条件。両方成り立つ場合に、成立
          printf( "xもyも5でした\n" );
      }
      else if( x==5 || y==5 )
      {
          // || はOR条件。片方成り立てば、成立
          printf( "xかyのいずれかは5でした\n" );
      }
    
      return  0;
    }
    

    今までの条件式では、ひとつの条件のみをチェックしていましたが、 ( ) 内で複数の条件を組み合わせてチェックしたい場合もあるでしょう。たとえば、a>3 で b<5 の場合だとか、a>3 または b>3 である、などがあると思います。

    論理関係演算子は、関係演算を組み合わせて、複雑な条件を記述する際に利用する演算子です。論理関係演算子には、以下のようなものがあります:

    関係演算子意味
    && かつ
    || または(Shift+¥キーで入力できます)
    ! ではない(単項演算子で、成立したかをひっくり返す)

    論理関係演算子は、3 つ以上連結させて記述することもできます。より複雑な条件を記述する場合に便利になるでしょう。ただし、AND と OR を絡める場合は、書き順に気を配ってください。

    書かれた条件のチェックは、必ず左から順に行われます。例では、x==5 から比較が行われていきます。

    練習問題: 複数の条件を比較

    int x=5, y=3; という 2 つの変数があるとき、 以下の条件を記述できる if 文をひとつずつ作成し、その結果を『成り立つ』『成り立たない』の 2 パターンで表示してください。

    1. x+y が 8 で、かつ、x*y が 15 である(成り立つ)
    2. x が 4 ではなく、かつ、y が 8 ではない(成り立つ) 3.x が 2 である、または、y が 4 である(成り立たない)
    実践問題: if 文
    1. ユーザが入力した整数が、偶数か奇数かを判定して、その結果を表示してください
    2. ユーザが入力した 2 つの整数について、その大きさを比較して、結果を表示してください