C言語 if文で条件分岐に挑戦【完成編】

プログラミング

 

前回はif文による条件分岐の基本的なものを解説しました。

おさらいしておくと、

 

基本的なif文の書きかたは

if ( 条件式 ) 処理文 ;

で、カッコの中にある条件式を満たすなら処理文が実行されます。

 

そのほかに、条件式を満たさなかった場合に特定の処理をしてほしい時は

if ( 条件式 ) 処理文 ;

else  処理文 ;

と書くことで、もしif文内の条件式を満たさなかったらその次にあるelse文内の処理文が実行されます。

 

また、3つ以上の分岐をさせたいときは、else if を使って

if ( 条件式 ) 処理文 ;

else if ( 条件式 ) 処理文 ;

else  処理文 ;

if ( 条件式 ) 処理文 ;

else if ( 条件式 ) 処理文 ;

else if ( 条件式 ) 処理文 ;

else  処理文 ;

と書くことで、3つ以上の条件分岐をすることが出来ます。

 

これで条件分岐は完璧と思われますが、これだけではできないことがあります。それは、処理文に2つ以上の文を書くと言うことです。今までは処理文に当たる部分に1つしか文を入れていませんでしたし、それで事足りました。

 

しかし、現実ではそうはいきません。実行したい処理によっては、5個や9個以上の処理をさせたい場合が必ずあります。そして、そういった場合に使うのがif文に2つ以上の処理させるブロックという考えです。

 

ブロック(複合文)の考え方

 

なんてことはありません。なぜなら、実は今までもブロックという考え自体は使ってきたからです。

どこで使ったのか?それはメイン関数です。メイン関数は

int main ( void ){ }

という今までプログラムを書く際にひな型として使ってきた、C言語でなくてはならないメインの関数です。今まで、このメイン関数の { } の中にprintfやscanfなどの文を入れてきましたね。

 

このように { } の中に複数の文を入れて、それをひとつの処理としてまとめたものをブロックや複合文と呼びます。

if文は条件式のあとに続く1つの処理文しか実行しません。この時にブロックを使えば、いくつかの文をひとつのまとまった文としてif文に実行させることが出来ます。

 

つまり、

はそれぞれ独立した2つの文ですが、

とすると、2つの文を1つの文としてまとめることが出来ます。

 

まあ、具体的にif文を使った方がわかりやすいので、以下で実際に使ってみたプログラムを書きます。

 

ブロックを使った if 文

 

実際にブロックを使って if 文を書いていきましょう。今回作るのは「2つの値を比較して最大と最小を求める」プログラムです。

 

どう作るのかというと、まず比較する2つの値を入力してもらいます。

その次に if 文で2つの値を比較して、大きい方を変数maxに、小さい方を変数minに代入します。

最後にprintfで「最大は(maxに入っている値)で最小は(minに入っている値)」と表示します。

 

ではプログラムを書いていきます。

 

まず比較する2つの値を変数aとbとして宣言して、scanfで入力してもらいます。ここで後で使う変数maxとminも宣言しておきます。

int a,b,max,min;

printf (“a:”) ; scanf (“%d”,&a);

printf (“b:”) ; scanf (“%d”,&b);

 

次に、if 文で2つの値を比較して大きい方をmaxに、小さい方をminに代入します。

条件式は「もしaがbよりが大きければ」なので、( a > b )となります。

実行する処理文は、

max = a ;

min = b ;

となりますが、これをif文の直後に書くだけでは直後のmax=a;という1つの処理文として認識されてしまい、min=b;はif文に含まれていないと認識されます。これでは、min=bはif文に関係なく実行されることになります。

 

これではだめです。本来は「max = a ;min = b ;」を1つの文として、if文に認識させる必要があります。ここでブロックを使い、まとめたい文を{ }で囲みます。

 

なので、完成するif文は

if ( a>b ) {

max = a ;

min = b ;

}

となります。これにより「a>b」が満たされれば「max = a ;min = b ;」の2つの文が処理されます。

 

次に、逆のパターン「a<bの時にmax=b、min=a」を実行する文です。これはelse文に、先程と同じようにブロックを使って

else {

max = b ;

min = a;

}

と書くだけです。else文が実行されれば、「max=b、min=a」が1つのまとまった処理文として実行されます。

 

最後にprintfで「最大は(maxに入っている値)で最小は(minに入っている値)」と表示したいので、

printf(“最大は%dで最小は%d”,max,min);

と書きます。

 

よって最終的にできたプログラムは

 

実行結果は

 

OKですね。

 

入れ子でさらに複雑な if 文

 

先ほども言ったようにブロック{ }で囲んだ文は1つの文として処理されます。つまり、このブロックの中にif文を入れても文として処理されると言うことです。

 

if文ではよく、if文の処理文としてif文を入れる場合があります。どんな時に使うのかというと、「文の条件式を満たす値をさらに吟味したいとき」です。if

 

例えば、「最初に正の値か判断して、正なら偶数か奇数かを判断したい」というときに使います。この時プログラムを組むと「最初のif文に正であるかの条件式を書いて、満たすなら処理文内の新しいif文で偶数か奇数かを判断する」というものになります。

 

このように、if文の中にさらにif文があるような「ある構造のなかに同じ構造のものがある状態」のことを入れ子と言います。

 

では実際に入れ子で作ったプログラムを組んでいきます。

プログラムは先ほどの「最初に正の値か判断して、正なら偶数か奇数かを判断したい」を使います。

 

そんなに難しいことはありません。先程習ったブロックの中にif文を入れればいいだけです。

 

if ( a>0 ) {

if ( a%2 == 0 )

printf(“これは正の偶数です”) ;

else 

printf(“これは正の奇数です。”);

}

else

printf(“これは正の値ではありません”);

 

黄色いマーカーで表したのが最初のif文で、紫のマーカーで表したのが最初のif文に対応するelse文です。最初の段階で正でないことが分かればelse文で「それは正の値ではありません」と表示されます。

 

もし正の値だったら、中のif文で改めて「偶数か奇数か」を判断します。%は余りを求める際に使う演算子で5%2=1のように「左(5)を右(2)で割った際の余り(1)」を計算します。上のプログラムでは2で割った余りが0なら偶数という事実を利用した条件式を書きました。

 

全体のプログラムは

 

実際に実行してみると

奇数を入力すると

負の値を入力すると

 

となります。

 

入れ子は複雑な条件分岐を行う際にとても便利でよく使われますが、あまり複雑にしすぎるとどこかでエラーが発生したり、発生したエラーがどこにあるのかわからなくなる原因にもなるので、できるだけ単純なものをつくるようにします。

 

以上がif文でできることでした。ややこしいかも入れませんが、後に条件分岐で使う関数もif文と似たような働きをするので、これになれてしまえばもう怖くありません。ぜひ頑張ってください。

では。

コメント