Previous Top Next

第 02 回 条件分岐

多くのプログラムは、何らかの条件によってその動作を変える。 これをプログラムの条件分岐という。 C 言語では条件分岐を行うために if 文switch 文の 二つが用意されている。

ここではこれらの文の基本的な使い方を学ぶ。


条件分岐 - if 文


まずは簡単な例を見てみよう。

/* if */
#include <stdio.h>

int main(int argc, char *argv[])
{
  float x, y;

  printf("Input two numbers x and y : ");
  scanf("%f %f", &x, &y);
  if (x < y) 
  {
    printf("%f is smaller then %f\n", x, y);
  }

  return 0;
}
このプログラムは入力された二つの数 x, y を比較し、x が y よりも小さいときにメッセージを表示する。 数値の比較には以下の記号を用いることが出来る。 if (x < y) の後の {...} は、条件が真であるときに行ういくつかの命令をまとめるためにあり、 この例のように一つだけの命令ならば省略することが出来る。 また C 言語のソースでは (printf, scanf などの書式設定の部分以外の) 任意の位置に改行やスペースを入れることができ、 それらを入れても結果は変わらない。 上の例のように、対応する { と } を同じ位置に書いて、その中の部分を少し下げて書くと見やすいソースになる。 これをプログラムのインデントという。 インデントの付け方にはいくつかの流儀がある。 Emacs などのエディタではタブ・キーを押すことで自動的に適当なインデントをつけてくれて便利である。

上の例では条件が真となるときだけメッセージを表示したが、条件が偽となるときの命令も指定できる。 その場合には、真の場合の命令の後に else と書いて、その後に命令を書く。

#include <stdio.h>

int main(int argc, char *argv[])
{
  float x, y;

  printf("Input two numbers x and y: ");
  scanf("%f %f", &x, &y);
  if (x < y) {
    printf("%f is smaller then %f\n", x, y);
  } else {
    printf("%f is greater then or equal to %f\n", x, y);
  }

  return 0;
}
else の後に更に if を書けば、二つ以上の場合に異なる動作を行うプログラムを書くことができる。

課題 02.01
上のプログラムを "smaller than", "greater than", "equal to" の三つの場合によって異なるメッセージを 表示するようにせよ。

上の例では if の条件に二つの数の比較を用いたが、この部分は単に真か偽かが判定できればよく、 他の記述も出来る。 C 言語では 0 が偽を表し、0 でない数はすべて真を表す。 したがって、例えば "if (1)" と書けば、これは常に真と扱われる。

課題 02.02
整数 a を入力し、"if (a)" で条件分岐し、適当なメッセージを表示するプログラムを書け。

if で指定する条件には and や or を用いて複雑なものも書くことができる。 and は if ((x < y) && (y < z)) {...}、 or は if ((x < y) || (y < z)) {...} のように記述する。


条件分岐 - switch 文


条件分岐は if, else, else if を組み合わせて書くことができるが、 複数の場合に分けるときには switch 文を用いた方が分かり易くなる。 例を見てみよう。

/* switch */
#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;

  printf("Input two integers a, b : ");
  scanf("%d %d", &a, &b);
  printf("What do you want to compute ? (1 : a+b, 2 : a-b, 3 : a*b) : ");
  scanf("%d", &c);
  
  switch (c) {
  case 1 :
    printf("%d + %d = %d\n", a, b, a+b);
    break;
  case 2 :
    printf("%d - %d = %d\n", a, b, a-b);
    break;
  case 3 :
    printf("%d * %d = %d\n", a, b, a*b);
    break;
  default :
    break;
  } 

  return 0;
}
このプログラムは入力された二つの整数に対して、 何を行うのかを数値で指定して、指定された計算結果を表示する。 switch 文は if 文で書き直すこともでき、それほど多く用いられるわけではないと思うので、 詳しい説明は省略して、ここではこの例を示すだけにする。

課題 02.03
上のプログラムを実行せよ。 また同じ動きをするプログラムを if 文を用いて書け。


条件分岐 - 三項演算子


条件分岐とは言えないかもしれないが、 簡単な場合にはここで説明する三項演算子が有用である。

c = (a > b) ? a : b;
の右辺を見る。 はじめの (a > b) は条件である。 これが真の場合には次の値を、そうでなければその次の値を返す。 これは
if (a > b)
  c = a;
else
  c = b;
と同じことである。すなわち max(a, b) である。 複雑な処理には向かないが、簡単な場合の記述には重宝する。

課題 02.04
上記の三項演算子を用いた例を一つ書け。


Previous Top Next