条件分岐
プログラムは、順次処理、分岐処理、反復処理という3つの制御構造によって成り立っています。これらを適切に組み合わせることで、効率的なプログラムを作成することができます。
前回までのプログラムの説明では、コンピュータに実行させたい処理を順番に記述する「順次処理」を用いてきました。今回の章では、「分岐処理」に焦点を当てて説明します。
「分岐処理」とは、特定の条件に応じてプログラムの実行フローを変更することを指します。条件が真であれば一つの処理を、偽であれば別の処理を行うことが可能です。
C言語では、2方向分岐の「if文」、多方向分岐の「else if文」と「swtich」文が存在します。
if文
if文は、「もし〇〇ならば、△△する」という条件に基づいて異なる処理を行うために使われます。
以下のような構文で記述し、()内の条件式が真である場合に、{}で囲まれたブロック内の処理を実行します。
if (条件式) {
// 条件式がtrueの場合実⾏する処理
}
条件式では、比較演算子を使用して二つの値を比較することがよくあります。
比較演算子には以下ものがあります。
演算子 | 読み | 書き方 | 説明 |
---|---|---|---|
> | 大なり | a > b | aがbより大きいとき真 |
>= | 大なりイコール | a >= b | aがb以上のとき真 |
< | 小なり | a < b | aがbより小さいとき真 |
<= | 小なりイコール | a <= b | aがb以下のとき真 |
== | イコール | a == b | aとbは等しいとき真 |
!= | ノットイコール | a != b | aとbは等しくないとき真 |
以下は条件分岐を使用したサンプルです。
このサンプルでは、ageが18未満の値のとき条件式が真となり「未成年です」と出力されます。
if (age < 18) {
printf("未成年です\n");
}
・条件分岐の流れ図
if~else文
if文の後ろにelseを続けることで、条件式が偽の場合の処理を記述できるようになります。
構文は以下の通りです。
if (条件式) {
// 条件式が真の場合実⾏する処理
} else{
// 条件式が偽の場合実⾏する処理
}
if~else文を用いたサンプルを以下に示します。
このサンプルでは、ageが18未満の値のとき条件式が真となり「未成年です」と出力され、ageが18以上の値のとき条件式が偽となり「18歳以上です」と出力されます。
if (age < 18) {
printf("未成年です\n");
} else{
printf("18歳以上です\n");
}
・条件分岐の流れ図
else if文
複数の条件を持つ場合は、else ifを用いてそれぞれの条件に応じた処理を追加することが可能です。
構文は以下の通りです。
if (条件式1) {
// 条件式1が真の場合実⾏する処理
} else if (条件式2) {
// 条件式1が偽で条件2が真の場合実⾏する処理
} else {
// 条件式1も条件式2も偽のとき実⾏する処理
}
else if文を用いたサンプルを以下に示します。
このサンプルでは、x>yが真のとき「xはyより大きいです」と出力し、x<yが真のとき「xはyより小さいです」と出力し、どちらの条件も満たさない場合「xとyは等しいです」と出力します。
if (x > y) {
printf("xはyより⼤きいです");
} else if (x < y) {
printf("xはyより⼩さいです");
} else {
printf("xとyは等しいです");
}
・条件分岐の流れ図
論理演算子
「aの値が10以上かつ20以下である」というように、複数の条件を組み合わせて条件式を書く際には、「論理演算子」を用います。論理演算子には以下のものがあります。
演算子 | 名前 | 書き方 | 説明 |
---|---|---|---|
&& | 論理積(かつ) | if(a>0 && b>0) | 両方の条件が成立すれば真 |
|| | 論理和(または) | if(a>0 || b>0) | どちらかの条件が成立すれば真 |
! | 否定(ではない) | !(a>0) | 条件式が真のとき偽、偽のとき真 |
論理演算子を用いたサンプルを以下に示します。
if (x > 3 && x < 20){
printf("x は3より⼤きく20より⼩さい\n");
}
x の値が3より大きく、かつ、20より小さいとき条件式が真となります。
if (x > 10 || y < 20){
printf("x が10より⼤いか、y が30よりも⼩さい\n");
}
xの値が10より大きい、または、yの値が20より小さいとき 真となります。
if (!(x == 10)){
printf("xは10と等しくない\n");
}
xの値が10ではないとき真となります。
switch文
else ifを使用して多方向分岐を記載することができます。多数の分岐先が存在し、評価する値が整数である場合、switch文を使用して次のように記述することが可能です。
構文は以下の通りです。
switch(式) { // switchブロックの始まり
case 値1: // [式]の値が[値1]のときこれ以降の命令⽂が実⾏される
命令⽂1
break; // switchブロックを抜ける
case 値2: // [式]の値が[値2]のときこれ以降の命令⽂が実⾏される
命令⽂2
break; // switchブロックを抜ける
case 値3: // [式]の値が[値2]のときこれ以降の命令⽂が実⾏される
命令⽂3
break; // switchブロックを抜ける
default: // [式]の値が[値1]から[値3]ではないときこれ以降の命令⽂が実⾏される
命令⽂4
break; // switchブロックを抜ける
} // switchブロックの終わり
「式」の値と等しい値が書かれているcase句があれば、そのあとに続く処理をbreak句が現れるまで続けます。
case句はいくつあってもかまいません。どの値にも一致しない処理は、default句に記載します。
break句はswitch文のブロックを抜けるのに使用します。
switch~case文を用いたサンプルを以下に示します。
int b=2;
switch(b){
case 1:
printf("bは1です¥n");
break;
case 2:
printf("bは2です¥n");
break;
case 3:
printf("bは3です¥n");
break;
default:
printf("bは1,2,3以外です。¥n");
break;
}
int型の変数「b」が1、2、または3のいずれかの値に等しい場合、対応するcase句の処理を実行した後にswitch文を終了します。1、2,3のいずれの値とも一致しない場合、default句の処理を実行します。
また、break文をあえて記述しない場合もあります。
int month=3;
switch(month){
case 3:
case 4:
case 5:
printf("春です¥n");
break;
default:
printf("春ではありません。¥n");
break;
}
int型の変数「month」が3または4の場合、break句がないので次のcase句へと処理が続行されます。そして、5のcase句でbreak句が現れたので、ここでswitch文を抜けます。
コメント