【基礎から学ぶプログラミング言語】 C言語/条件分岐をさせる方法 ~if文とelse文の使い方の応用とswitch文の使い方~

IT
スポンサーリンク
スポンサーリンク
スポンサーリンク

私たちは日常生活で何気なくパソコンやスマートフォンというコンピュータを使用しています。
これらのコンピュータが普通に動作しているのは、そのようにプログラミング言語が記述されているからです。
本記事は、そんなプログラミング言語について実際に学びながら要点をまとめていったメモという位置付けになります。
私は専攻が電気でプログラムに関しては全くの初心者ですので、同様に初心者の方には理解しやすくなっているかと思います。

今回は、「C言語/if文とelse文とswitch文で条件分岐をさせる方法」についての説明です。

1.初めに

前回、if文・else文・else if文などの使い方について説明しました。
そのちょっとした応用方法についてもまとめておこうと思ったのですが、基本的な部分をまとめただけで結構な文量になってしまったので、前編/後編のようなイメージで記事を分割しました。

なので、本記事は前回の続きのような位置付けとなります。

また、同様に条件分岐を設定できるswitch文についてもまとめています。

2.if文・else文に使える応用

if文を使用している際、こう思いませんでしたか?
『if文の条件付けに応用が利かないな』と。
前回は、【a < 0】や【a == 1】という単純な条件付けはしていましたが、実際に条件付けをするなら【0 < a < 2】のような範囲指定したりするような使い方もできて欲しいでしょう?

ということで、if文とelse文をより便利に扱うための小技を紹介していきます。

1つのif文に2つ以上の条件付けをする

以下のようにプログラムを書いてみます。

#include<stdio.h>

void main() {
int a;
printf(“1から4の間で数値を入力してください。”);
scanf(“%d” , &a);
if(1 <= a && a <= 4) {
printf(“Good!\n”);
}
else {
printf(“Bad!!\n”);
}

図1

7行目のif文に【&&】という見覚えのないものが存在しますよね?
この【&&】は、前文の記載内容と後文の記載内容の両方が成り立っていることを表す記号です。
「且つ」とか「論理積」を表しているということです。

つまり、ここでは【1 <= a】と【a <= 4】の両方の条件を満たしていることになります。
「<=」とは「≦」のことですので、【1 ≦ a ≦ 4】という範囲を指定していることがわかります
余談ですが、「>=」なら「≧」のことを表します。
イコールは後ろに付けてください。

このように、【&&】を使用することで、1つのif文で2つの条件付けを行うことができます。

このプログラムの場合、1,2,3,4の数字を入力すると【Good!】、それ以外の数字を入力すると【Bad!!】と表示されるようになっています。

図2 5と入力した場合

ちなみに、【||】にすると「または」「論理和」【!】にすると【否定】になります。
「!=」も「≠」の意味だったので、基本的に「!」は否定なんですかね?
仮に否定を使いたい場合、【if(!(○○));】というように「!」の後ろの()内に記述した内容を否定することになります。
若干使いにくいですね。

if文の中にif文を使用する

if~else文では、「条件Aの場合は○○を実行」・「条件Bの場合は△△を実行」という条件分けができました。
それとは別に、if文の中にif文を使用することで条件を追加することも可能です。
このような処理のことを入れ子・ネストと呼びます。

#include<stdio.h>

void main() {
int a;
printf(“1から4の間で数値を入力してください。”);
scanf(“%d” , &a);
if(1 <= a && a <= 4) {
if(a == 1 || a == 3 ) {
printf(“入力した数値は奇数です。\n”);
}
else {
printf(“入力した数値は偶数です。\n”);
}
}
else {
printf(“1~4の数値を入力してください。\n”);
}
}

図3

まずは先ほどの例のようにif文で【1 ≦ a ≦ 4】という条件付けを行います。
その直後のif文では、【||】を使用することで【a = 1またはa = 3】という条件付けをしています。
こうすることで、【1 ≦ a ≦ 4】であり、その上で【a = 1またはa = 3】の場合という条件付けをしていることになります

注意点は、if文がどこにかかっているかです。

このプログラムの場合、【1 ≦ a ≦ 4】のif文①と、【a = 1またはa = 3】のif文②が存在します。
これらのif文は中括弧で囲んでいる範囲にかかっているので、if文①は8~17行目、if文②は9~13行目にかかっています。
その為、11~13行目のelse文はif文②の【a = 1またはa = 3】ではない場合の処理15~17行目のelse文はif文①の【1 ≦ a ≦ 4】ではない場合の処理となります。

その結果、以下のような条件分けができています。

  • 【1 ≦ a ≦ 4】であり【a = 1またはa = 3】ならば、「入力した数値は奇数です。」と表示される。
  • 【1 ≦ a ≦ 4】であり【a ≠ 1またはa ≠ 3(a = 2またはa = 4)】ならば、「入力した数値は偶数です。」と表示される。
  • そもそも【1 ≦ a ≦ 4】でないなら「1~4の数値を入力してください。」と表示される。
1と入力した場合
2と入力した場合
0と入力した場合

見た目は非常にややこしくなるので、使用する場合はしっかりと中括弧の位置には気を付けるようにしましょうね。

3.switch文の使い方

条件分岐をする場合は基本的にはif文・else文を使用しますが、同じようなことをswitch文というもので実現することが可能です。

前回、以下のようなプログラムが出てきました。

#include<stdio.h>

void main() {
int a;
printf(“0,1,2から好きな数値を入力したらEnterキーを押してください。”);
scanf(“%d” , &a);
if(a == 0) {
printf(“入力されたのは0です。\n”);
}
else if (a == 1) {
printf(“入力されたのは1です。\n”);
}
else if (a == 2) {
printf(“入力されたのは2です。\n”);
}
else {
printf(“0か1か2を入力しろよ。\n”);
}

図4
0と入力
1と入力
2と入力
3と入力 ※0,1,2以外は全部これになる。

このプログラムと同じ動きをするプログラムをswitch文で作ってみます。

#include<stdio.h>

void main() {
int a;
printf(“0,1,2から好きな数値を入力したらEnterキーを押してください。”);
scanf(“%d” , &a);
switch(a) {
case 0:
printf(“入力されたのは0です。\n”); //入力値が0の場合に実行される
break;
case 1:
printf(“入力されたのは1です。\n”); //入力値が1の場合に実行される
break;
case 2:
printf(“入力されたのは2です。\n”); //入力値が2の場合に実行される
break;
default:
printf(“0か1か2を入力しろよ。\n”); //入力値が0,1,2以外の場合に実行される
break;
}
}

図5

これで全く同じ動作をします。

何となく眺めていればルールがわかる人もいそうですが、一応解説しますね。

switch文は、switchの直後の()内に入力した数値について条件分岐を実施することができます。
ここではscanfで初期化した整数“a”を入れているので、キーボード入力した“a”という数値が何なのかを判定しているわけです。

次に、【case 0:】・【case 1:】・【case 2:】についてですが、これはそれぞれ【a == 0】・【a == 1】・【a == 2】の場合のことを指しています。
[case]という英単語の意味が[場合]なので、そのままの表現ですね。
こうして【case ○○:】と記述してから【break;】と記述するまでの間に書かれた処理を、それぞれの場合において実行します。
なので、【case 0:】なら「入力されたのは0です。」と表示され、【case 1:】なら「入力されたのは1です。」と表示され、【case 2:】なら「入力されたのは2です。」と表示されるというわけです。

そして、else文に当たるのが【default:~break】の部分です。
[default]という英単語の意味は[既定]なので、特記した【case】に当てはまらない時に実行する既定値を決定しているというわけです。

else if文の時は結構ごちゃごちゃしていましたけど、switch文を使うと結構スッキリしたでしょう?
このように、場合によってはswitch文の方が単純な記述に抑えられるので、if文の他にもswitch文というものもあるんだということは覚えておくと良いかと思います。

breakが無いとどうなるのか?

switch文の説明は終えたので、補足として「もしbreakがついていなかったらどうなるのか?」を検証しておきます。

試しに、図5の10行目のbreakをコメントにして認識できなくしてみます。

図6

この状態でプログラムを実行すると、エラーは発生しません。
ただ、【case 0】の場合だけ動きがおかしくなります。

具体的には、“a”が0の時は以下のように表示されてしまいます。

図7

【case 1】も発動していますね。

単純な話、【case 0】の【break】をコメントアウトしたので、そのまま真下にある【case 1】も実行されちゃっているんです
【case 1】はしっかりと【break】が書かれているので、そこまでは実行されているんです。

もし“a”を1にすると、11行目の【case 1】からプログラムは実行されるので、「入力されたのは0です。」という文は表示されなくなります。
【break】が無いとそこで区切られなくなるんですね。

これはこれで使い道はありますので、ルールとして覚えておきましょう。

以上、「C言語/if文とelse文とswitch文で条件分岐をさせる方法」についての説明でした。