ちぇりーの館

1−8 C言語プログラミング講座 プログラムの条件分岐 〜if文〜



こんにちは! 今回は、条件分岐処理について説明します。条件分岐処理とは、簡単に言うと

『もしも○○の条件が成り立つなら××の処理を行いなさい』

という意味です。それでは、以下のプログラムを書いて見ましょう。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char buffer[MAX_BUFFER];
	int  val1;

	printf("現在の降水確率を入力してください。\n");

	gets(buffer);
	val1 = atoi(buffer);

	if( val1 <= 40 )
	{
		printf("かさはいらないでしょう\n");
	}

	scanf("a");
	return 0;
}

if文のサンプルプログラム結果

このプログラムは、降水確率を入力することによって外出時に必要なものを表示してくれるプログラムです。 if文以外は前回に説明したので、わからない事があればそちらを参照してください。

●if文
 C言語で、『もしも…ならば』という文章を表現するためには、if文という構文を使います。
if( 条件 )
{
	条件が成り立つ時の処理
}

 if文ははじめに小文字で『if』と書きます。その次に"("と")"でくくられた『条件』が来ます。 条件は、必ず"("と")"でくくらなければなりません。また、条件で使われる式には以下のものがあります。

 演算子   意味   例文 
n > m nはmより大きい時処理を行う。 if( n > m ){ 条件 }
n < m nはmより小さい時処理を行う。 if( n < m ){ 条件 }
n >= m nはm以上の時処理を行う。nとmが等しい時は処理を行う if( n >= m ){ 条件 }
n <= m nはm以下の時処理を行う。nとmが等しい時は処理を行う if( n <= m ){ 条件 }
n == m nとmが等しい時処理を行う。 if( n == m ){ 条件 }
n != m nとmが等しくない時処理を行う。 if( n != m ){ 条件 }

条件文ではこれらの式が成り立つか、成り立たないかで条件が分岐する事になります。ちなみに、初心者の人がよく間違える事なのですが、 条件が等しい時に使われる"=="ですが、実は"="でもコンパイルエラーは出ません。しかし、"="の場合代入すると言う 意味になってしまうので正しく判定が行われなくなってしまいます。

○      if(n == m){条件}      nとmが正しく比較され、その結果によって条件が実行されます。
×      if(n = m){条件}      nにmを代入すると言う意味になります。nとmの条件比較はされません。

さて、if文の説明に戻ります。条件式の後には、"{"と"}"でくくられた部分に、条件が成り立った 時に実行される処理を書きます。"{"と"}"でくくられている部分では、複数個の処理を書く事が可能です。 また、"{"と"}"のなかに更にif文を書く事もできます。

if( val1 <= 40 )
{
	if( val1 <= 20 )
	{
		printf("かさはいらないでしょう");
	}
	if( val1 > 20 )
	{
		printf("かさはいるかもしれません");
	}
}


●else文
次は、if文の条件が成り立たない時に処理が実行されるelse文について説明します。以下のプログラムを書いてみて下さい。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char buffer[MAX_BUFFER];
	int  val1;

	printf("現在の降水確率を入力してください。\n");

	gets(buffer);
	val1 = atoi(buffer);

	if( val1 <= 40 )
	{
		if( val1 <= 20 )
		{
			printf("かさはいらないでしょう");
		}
		if( val1 > 20 )
		{
			printf("かさはいるかもしれません");
		}
	}
	else
	{
		printf("かさがいります!");
	}
	scanf("a");
	return 0;
}

else文のサンプルプログラム結果

if文の条件式が成り立たない場合に処理を行いたい場合はelse文を使います。else文は、 if文の処理が終わった後に書く事ができます。else文にはif文の処理が成り立たないと言う条件で、 処理が実行されるため、if文のように条件式を書く必要はなく"{"から"}"でくくられた中に 実行したい処理を書く事によって処理が行われます。

if( 条件 )
{
 条件が成り立つ時の処理
}else
{
 条件が成り立たない時の処理
}

if文が成り立たない時にelse文が実行されるのでif文の処理とelse文の処理は同時に実行される事はありません。 また、if文とelse文がある場合、プログラム実行時には必ずどちらかの処理が実行される事になります

●else if文
 ここまでで作ったプログラムに1500と入力してみてください。『かさがいります』と表示されてしまいました。 プログラム的には、正しく処理が実行されているのですが1500%などは通常あってはならない数字ですので、 エラーとなるようにしなければなりません。しかし、if文とelse文だけでは条件が成り立つか成り立たないかの二者択一 しか分岐ができません。そこで、さらに条件分岐を加えるためにelse if文を使います。 それでは、下記のプログラムをもう一度書いてみましょう。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char buffer[MAX_BUFFER];
	int  val1;

	printf("現在の降水確率を入力してください。\n");

	gets(buffer);
	val1 = atoi(buffer);

	if( val1 <= 40 )
	{
		if( val1 <= 20 )
		{
			printf("かさはいらないでしょう");
		}
		if( val1 > 20 )
		{
			printf("かさはいるかもしれません");
		}
	}
	else if( val1 < 0)
	{
		printf(""0〜100%の値を設定してください");
	}
	else if( val1 > 100)
	{
		printf(""0〜100%の値を設定してください");
	}
	else
	{
		printf("かさがいります!");
	}
	scanf("a");
	return 0;
}

else if文のサンプルプログラム結果

else if文は、if文の後で且つelse文の前に入れる必要があります。また、if文があればelse文が なくても使用する事ができます。else if文では、if文同様"("から")"に条件式を入れ、"{"から"}"で囲まれた部分に行いたい処理を書きます。

●『または』を表現する(||)
 分岐処理の基本的な形は以上で事が足りますが、これだけでは分岐条件が増えると非常に見づらくなります。 そこで、分岐後の処理結果が同じで条件が異なる場合には、||を使う事によって見易く書く事が 可能です。例えば、

else if( val1 < 0)
{
	printf(""0〜100%の値を設定してください");
}
else if( val1 > 100)
{
	printf(""0〜100%の値を設定してください");
}

この文は、条件式が異なるだけで処理結果は同じになります。従って、||を使い

else if(( val1 < 0)||( val1 > 100))
{
	printf(""0〜100%の値を設定してください");
}

と書く事によって条件式をすっきりと書く事ができます。"||"という記号は、日本語で言う所の『または』 という意味になります。つまり、"0以下または、100以上の時『0〜100%の値を設定してください』という 文字を表示しろ"という意味になります。

●『且つ』を表現する(&&)
 またはを表現できる事を説明したので最後に『且つ』について説明します。これは、ある条件とある条件 の両方が成り立った時に処理を実行したい場合に使います。複数の条件が成り立つ時に実行させるためには、 if文の中に更にif文を入れる事により実現できます。例として、"40%未満で且つ20%以上"などの場合、

if( val1 <= 40 )
{
	if( val1 > 20 )
	{
		printf("かさはいるかもしれません");
	}
}

とする事により表現できます。ただし、この場合、条件が細かくなるにつれて見にくい プログラムになってしまいます。このような場合、&&を使うと、

if(( val1 <= 40 )&&( val1 > 20 ))
{
	printf("かさはいるかもしれません");
}

シンプルにプログラムを表現する事ができます。それでは、最後に完成したこのプログラムを以下に示します。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char buffer[MAX_BUFFER];
	int  val1;

	printf("現在の降水確率を入力してください。\n");

	gets(buffer);
	val1 = atoi(buffer);

	if(( val1 < 0)||( val1 > 100))
	{//降水確率:0%以下または、100%以上
		printf("0〜100%の値を設定してください");
	}
	else if( val1 <= 20 )
	{//降水確率:0〜20%
		printf("かさはいるかもしれません");
	}
	else if(( val1 > 20 )&&( val1 <= 40 ))
	{//降水確率:20〜40%
		printf("かさはいらないでしょう");
	}
	else
	{//降水確率:40〜100%
		printf("かさがいります!");
	}
	scanf("a");
	return 0;
}


傘をもってく?プログラム完成!

最後に書いたこのプログラムでは、エラー処理を一番始めに持っていくように処理の順番を 変えています。これは、『プログラムの実行順番は上から下に流れる』という大原則があるため 条件分岐の実行順番を考慮してこのように変更しています。つまり、

if( val1 <= 20 )
{//降水確率:0〜20%
	printf("かさはいるかもしれません");
}
else if(( val1 < 0)||( val1 > 100))
{//降水確率:0%以下または、100%以上
	printf("0〜100%の値を設定してください");
}
else
{//降水確率:40〜100%
	printf("かさがいります!");
}

このように書いてしまうと、エラー処理の『0%以下』よりも先に『20%以下』という条件式 が動いてしまうので、-100と入力すると『かさはいるかもしれません』と表示されてしまいます。


 いかがでしたか? 以上で、今回の説明は終了です。今回の分岐の説明によって、かなり多くのプログラム を組む事ができるようになりました。次回は、多分岐時に使用するswitch文について説明します。 前回同様、内容が判り難かったり、疑問・質問等がありましたら時間の許す限りお答えしようと思いますので どしどしメールを送ってください。でわでわ、お疲れ様でした (^_^)/

< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system