C プログラミング (C Programming)

[2017/09/27, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 3 の内容

二つの整数を読み込み,それらが異なる場合は大きい方を表示する.
同じ場合は,二つが同じであることを表示する.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4: 	 int x, y;
 5:
 6:      printf("整数を二つ入力してください:");
 7:      scanf("%d %d", &x, &y);
 8:  
 9:      if ( x > y ){
10:         printf("%d の方が大きいです\n", x);
11:      }
12:      else{
13:         if ( x < y ){
14:            printf("%d の方が大きいです\n", y);
15:         }
16:         else{
17:            printf("二つは同じです\n");
18:         }
19:      }
20:
21:      return 0;
22:   }

9-19 行目:外側の if ... else 文

 8:  
 9:      if ( x > y ){
10:         printf("%d の方が大きいです\n", x);
11:      }
12:      else{
13:         if ( x < y ){
14:            printf("%d の方が大きいです\n", y);
15:         }
16:         else{
17:            printf("二つは同じです\n");
18:         }
19:      }
20:

この問題では,次の三つの場合について適切に場合分けを行う必要があります.
  x と y の関係     printf での出力  
(1) x > y   x の方が大きいと出力  
(2) x < y y の方が大きいと出力
(3) x == y 二つは同じと出力

このサンプルプログラムでは,if - else 文が 2 段構成になっています.
まずは 1 段目(外側)を見てみましょう.

9 行目で x > y かどうかを確認しています.
これは上の表でいえば,(1) に該当するかどうかの確認です.

したがって,else { ... } の方は,
(1) に該当しない場合」 = 「(2) または (3) に該当する場合
を意味します.
   if ( x > y ){

      (1) の場合の処理  

   }
   else{

      (1) でない場合の処理.つまり,(2) または (3) の場合の処理   

   }

else{ ... } の中は (2) または (3) の場合に相当するのですが,
(2) と (3) では出力すべき内容が異なるので,ここでも if 文による場合分けが必要になってくるのです.

13-18 行目:内側の if ... else 文

 8:
 9:      if ( x > y ){
10:         printf("%d の方が大きいです\n", x);
11:      }
12:      else{
13:         if ( x < y ){
14:            printf("%d の方が大きいです\n", y);
15:         }
16:         else{
17:            printf("二つは同じです\n");
18:         }
19:      }
20:

9 行目の if 文で条件(x > y)が成立しない場合,この else 部分が実行されることになります.
  x と y の関係     printf での出力  
(1) x > y   x の方が大きいと出力  
(2) x < y y の方が大きいと出力
(3) x == y 二つは同じと出力

この時点で,(1) ではないことが確定しましたので,後は (2) なのか,それとも (3) なのかを判定すれば良いわけです.

ここで再度,if 文を使って (2) かどうかを確認します.

さて,この場合の else { ... } は何に対応するでしょう?
(2) ではない場合に対応するのは明らかですが,既に(1) ではないことも確定していることに注意してください.

つまり,(2) でも (1) でもない場合に該当するので,残った (3) の場合のみを意味します.
よって,わざわざ if ( x == y ){ ... } という三つ目の if 文を書く必要はないのです.