授業/C言語基礎/if文 のバックアップ(No.8)


フローチャート

処理の流れは、フローチャート(流れ図)という図で表すことができます。

記号名前
line.png
流れ線
arrow.png
矢印
terminal.png
端子
process.png
処理
decision.png
判断

流れ線は、制御の流れを表します。 横のときは左から右へ、縦のときは上から下へと進みます。

矢印も、制御の流れを表します。 矢印の向きに進みます。 他の流れ線や矢印に合流するときにも、矢印を使います。

端子は、開始と終了の場所を表します。 制御の流れは、一つの開始端子から始まり、一つの終了端子で終わります。

処理は、その名の通り、処理を表します。

判断は、条件によって制御の流れを分岐させます。

条件分岐

次のようなプログラムを考えてみましょう

試験の点数が60点以上なら「合格」と表示する。

つまり、点数が60点以上なら「合格」と表示し、そうでないなら何も表示しないようにします。

これをフローチャートで描くと、次のようになります。

if1.png

これをC言語風にすると、次のようになります。

if2.png

ここで、点数はint型の変数scoreに格納することとし、点数は適当に85点にしています。

判断のラベルが「はい」と「いいえ」から「0でない」と「0」に変わっていますが、これについてはもう少し後で説明します。

if文

C言語で条件分岐を行うには、if文を使います。

if文は、次の形をしています。

  if (条件) {
    処理
  }

if文は、( )内に指定された「条件」を評価し、「条件」を満たしているときだけ「処理」を行います。 「条件」を満たしていないときは、「処理」を行わずに次へ進みます。

「条件」を満たしているときに行う「処理」に含まれる命令文が一つだけのとき、波括弧 { } を省略できます。

  if (条件) 命令文;

(省略しなくてもかまいません。)

「条件」には、関係演算子関係演算子を使います。 関係演算子と関係演算子については、この下で詳しく説明します。

このif文を使ってC言語のプログラムを書くと、次のようになります(プログラム1)。

#include <stdio.h>

int main(void) {
  int score = 85;

  if (score >= 60) {
    printf("合格\n");
  }

  return 0;
}

演習1

プログラム1を作成し、実行結果を確認せよ。 また、点数を50点に変更し、実行結果を確認せよ。

条件を満たさないときにも処理を行う

続いて、次のようなプログラムを考えてみましょう。

試験の点数が60点以上なら「合格」、そうでないなら「再試験」と表示する。

これをフローチャートで描くと、次のようになります。

else1.png

このように、条件を評価した結果によって、異なる処理が実行されます。

そして、これをC言語風にすると、次のようになります。

else2.png

このような、条件を満たさないときに処理を行うには、次のようなif文を使います。

  if (条件) {
    処理1
  } else {
    処理2
  }

( ) 内の「条件」を評価し、条件を満たすときは「処理1」を実行し、満たさないときは「処理2」を実行します。

先ほどと同様に、「処理1」または「処理2」に含まれる命令文が一つだけのとき、波括弧 { } を省略できます。 条件を満たすときに行う処理と条件を満たさないときに行う処理に含まれる命令文が両方とも一つだけのときは、次のようになります。

  if (条件) 命令文1;
  else 命令文2;

同様に、条件を満たすときに行う処理に含まれる命令文が一つだけのときと、反対に、条件を満たさないときに行う処理に含まれる命令文が一つだけのときは、次のようになります。

  if (条件) 命令文1;
  else {
    処理2
  }
  if (条件) {
    処理1
  } else 命令文2;

このif文を使ってC言語のプログラムを書くと、次のようになります(プログラム2、if文の部分のみ)。

  if (score >= 60) {
    printf("合格\n");
  } else {
    printf("不合格\n");
  }

演習2

プログラム1をプログラム2に変更し、実行結果を確認せよ。 また、点数を50点に変更し、実行結果を確認せよ。

3つ以上に分岐する

さらに、次のプログラムについて考えてみましょう。

試験の点数が60点以上なら「合格」、20点以上60点未満なら「再試験」、それ以外なら「不合格」と表示する。
elseif1.png

最初の条件「点数が60点以上」を満たさないときに行われる処理が点線で囲まれたグレーの部分で、一つの条件分岐になっています。

問題文には「再試験」と表示するときの条件は「点数が20点以上60点未満」とありますが、フローチャートにおいて二つ目の条件が判定されるのは、最初の条件「点数が60点以上」を満たさないときに限られるので、必ず60点未満になります。 このため、二つ目の条件は「点数が20点以上」だけになっています。

このフローチャートをC言語風にすると、次のようになります。

elseif2.png

条件を満たさないときに条件分岐を行うので、これをC言語のプログラムにすると、次のようになります(プログラム3、if文の部分のみ)。

  if (条件1) {
    処理1
  } else {
    if (条件2) {
      処理2
    } else {
      処理3
    }
  }

一つ目のif文の条件を満たさないときの処理に含まれるのは二つ目のif文だけなので、このif文を囲む波括弧 { } は省略することができ、次のように書くことができます(プログラム4、if文の部分のみ)。

  if (条件1) {
    処理1
  } else if (条件2) {
    処理2
  } else {
    処理3
  }

演習3

プログラム2をプログラム3に変更し、点数が85点、50点、10点のときの実行結果を確認せよ。 また、プログラム3をプログラム4に変更し、点数が85点、50点、10点のときの実行結果を確認せよ。

関係演算子

if文の条件には、多くの場合、関係演算子を用います。

関係演算子には、次のものがあります。

優先順位演算子使用例意味
7<a < b左辺の値が右辺の値より小さいとき1、そうでないとき0
<=a <= b左辺の値が右辺の値より小さいか等しいとき1、そうでないとき0
>a > b左辺の値が右辺の値より大きいとき1、そうでないとき0
>=a >= b左辺の値が右辺の値より大きいか等しいとき1、そうでないとき0
8==a == b左辺の値が右辺の値と等しいとき1、そうでないとき0
!=a != b左辺の値が右辺の値と等しくないとき1、そうでないとき0

関係演算子の結果は、int型の1か0になります。

等しいかどうかを判定する演算子が、= ではなく == であることに注意しましょう。 = は代入演算子です。

if文は、条件として指定された式を評価した結果が0のときは (false)、つまり、条件を満たさない、そうでないときは (true)、つまり、条件を満たすと判断します。

演習4

試験の点数が100点なら「満点」と表示するプログラムを作成し、実行せよ。

論理演算子

if文の条件が複数の条件の組み合わせとなるときは、論理演算子を用います。

論理演算子には、次のものがあります。

優先順位演算子使用例意味
2!!a値が0のとき1、そうでないとき0(論理否定)
12&&a && b左辺の値が1かつ右辺の値が1のとき1、そうでないとき0(論理積)
13||a || b左辺の値が1または右辺の値が1のとき1、そうでないとき0(論理和)

論理演算子の結果も、int型の1か0になります。

優先順位に注意しましょう。

演習5

数学の試験の点数が60点以上、かつ、英語の試験の点数が60点以上なら「合格」、そうでないなら「不合格」と表示するプログラムを作成し、英語と数学の両方が85点のとき、英語が85点で数学が50点のとき、英語と数学の両方が50点のときの実行結果を確認せよ。

演習6

数学の試験の点数が60点以上、または、英語の試験の点数が60以上なら「合格」、そうでないなら「不合格」と表示するプログラムを作成し、英語と数学の両方が85点のとき、英語が85点で数学が50点のとき、英語と数学の両方が50点のときの実行結果を確認せよ。

条件に関係演算子と論理演算子を用いないif文(おまけ)

if文は、条件として指定された式を評価した結果が0のときは (false)、つまり、条件を満たさない、そうでないときは (true)、つまり、条件を満たすと判断します。

結果がint型の値になる式であれば、if文の条件として使うことができます。

たとえば、次のif文は、条件の値が常に0なので、if文に含まれる処理が実行されることはありません。

  if (score >= 60) {
    printf("合格\n");
  } else if (score >= 20) {
    printf("再試験\n");
  } else {
    printf("不合格\n");
  }

プログラムの一部を実行しないようにするためにこのテクニックを用いることがあります。 (コメント・アウトすると、コンパイル時に無視されてしまいますが、こうしておくと、構文が正しいことを確認できます。)

反対に、次のif文は、条件の値が常に1なので、if文に含まれる処理は必ず実行されます。

  int x = 0;
  if (x = 1) {
    printf("Yes\n");
  } else {
    printf("No\n");
  }

条件式を後で考えて、先に条件を満たすときの処理のプログラムを作りたいときなどに、このテクニックを用いることがあります。

また、if文は、条件式を評価した結果が「0でない」ときは真、つまり条件を満たすと判断されるので、その結果がint型であれば0または1のいずれかでなくてもかまいません。

次のif文は、条件式 a * b の結果が0でなければ「Yes」と表示し、0であれば「No」と表示します。

  double x = 12.3;
  if (x >= 0 && x < 10) {
    printf("Yes\n");
  } else {
    printf("No\n");
  }

aとbの値が0または1のとき、このif文の結果は、論理積 a && b を用いたif文の結果と同じになります。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS