今回の目的
if 文を利用して、条件分岐が書けるようになることが目的です。
プログラムの構造化定理
プログラムは次の3つの構造の組み合わせで、どんなことでも表現できることが数学的に証明されています。
- 連接 (順次)
- 分岐 (選択)
- 繰り返し
連接は、上から下にへ、書かれた順番でプログラムを実行するという意味です。
これは、今までのプログラムで無意識に利用してきました。
今日は、2番目の分岐にあたる構造を勉強します。
分岐とは
分岐とはどのようなものか、簡単な例で例えてみましょう。
学校がある日に、台風が来たと仮定します。
その時、朝起きたあなたは次のような行動を取るでしょう。
- 暴風警報が出ているか調べる
- 暴風警報が出ている
自宅待機 - 暴風警報が出ていない
仕方ないので学校へ行く
- 暴風警報が出ている
これをC言語で表現すると、次のようになります。
if(暴風警報が出ている場合){
自宅待機;
}
else {
仕方ないので学校へ行く;
}
C言語で分岐を実現するためには、上の例のように if 文と呼ばれるものを使用します。
if 文では、このように、「もし~なら~をする。」といった処理を行うことができます。
if 文の形式
if 文は次のような形式で使用します。
- 形式1
if(条件){ 条件が成り立った時に実行する文; }
- 形式2
if(条件){ 条件が成り立った時に実行する文; } else { 条件が成り立たないときに実行する文; }
- 形式3
if(条件1){ 条件1が成り立った時に実行する文; } else if(条件2){ 条件2が成り立った時に実行する文; } else if(条件3){ 条件3が成り立った時に実行する文; } ... else { 条件が1つも成り立たないときに実行する文; }
形式 1, 2, 3 とありますが、形式 1, 2 は形式 3 を省略したものです。
形式 3 では、条件が 3 つ指定してありますが、これはいくつでも構いません。
形式 3 で、最後の else を省略することも可能です。
また、条件が成り立った時、成り立たなかった時に実行する文は1行でなくても構いません。
関係演算子
条件を表す際には関係演算子と呼ばれるものを利用します。
関係演算子は、名前の通り2つの値の関係を表すものです。
それに対して、四則演算に使う演算子のことを、算術演算子と呼びます。
関係演算子では、2つの値を比較し、その結果を真と偽で表します。
一般的に、真の場合は 1、偽の場合は 0 が比較結果になります *1。
C言語では、0 以外の値は、すべて真として扱われます。
関係演算子の一覧
C言語 | 数学での表現 | 意味 | C言語の例 | 例の意味 |
== | = | 等号 | a == b | a と b は等しい |
!= | ≠ | 不等号 | a != b | a と b は等しくない |
> | > | 大なり | a > b | a のほうが b より大きい |
< | < | 小なり | a < b | a のほうが b より小さい |
>= | ≧ | 以上 | a >= b | a は b 以上である |
<= | ≦ | 以下 | a <= b | a は b 以下である |
数学で使う記号と類似しているためすぐに覚えられると想いますが、
初心者は == を間違えやすい傾向にあります。
C言語では、= は代入を表します。== には代入の意味はありません。
= と == では意味は全く異なりますので注意してください。
if 文の例
if の使用例です。
どうしてこうなるのか、自分で実行して考えてみてください。
例1
ゼロ未満の数が入力されたら、エラーを表示する。
int n;
scanf("%d", &n);
if(n < 0){
printf("ゼロ以上の数を入力してください。");
}
例2
ユーザーが入力した数が、ゼロであるか表示する。
int n;
scanf("%d", &n);
if(n == 0){
printf("ゼロです。\n");
}
else {
printf("ゼロではありません。\n");
}
例3
ユーザーが入力した数が、0 より大きいか、0 より小さいか表示する。
int n;
scanf("%d", &n);
if(n > 0){
printf("ゼロより大きいです。\n");
}
else if(n < 0){
printf("ゼロより小さいです。\n");
}
else {
printf("ゼロです。");
}
論理演算子
複数の条件を組み合わせてひとつの条件にしたい場合、論理演算子と呼ばれるものを使います。
論理演算子には次の3つがあります。
条件式 | 意味 | 例 | 例の意味 |
条件1 && 条件2 | AND (かつ) | x > 0 && y == 0 | x が 0 より大きい、かつ y が 0 |
条件1 || 条件2 | OR (または) | x == 1 || y == 3 | x が 1 もしくは y が 3 |
!条件 | NOT (否定) | !(x < 0) | x が 0 未満でない |
次のように使用します。
if(a == 0 && b == 0){
printf("a も b もゼロです。\n");
}
これら論理演算子は、複数組み合わせることができます。
if(a == 0 && b == 0 && (c == 0 || d == 0)){
printf("a,b が 0 であり、c か d のどちらかも 0 です。\n");
}
課題
課題1
int 型の変数 a を用意し、標準入力から読み込み、その数が偶数であるか奇数であるか判定しなさい。
実行例
./a.out 3 奇数です
./a.out 4 偶数です
課題2
標準入力 で作成した2次方程式のプログラムを改造し、重解の場合は 1 つだけ表示するようにしなさい。重解の判定には、判別式を用いること。
実行例
./a.out 1 1 -6 2.000000 -3.000000
./a.out 1 8 16 -4.000000
挑戦課題
- AOJ 10003: Small, Large, or Equal
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10003
- AOJ 10004: Sorting Three Numbers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10004