★分岐構造:条件の連結1★
これまで、「ネスト」について色々と書いてきましたが、もう少し違った考え方を紹介します。
まずは、例題を出しましょう。
以前に出した問題の応用なのですが、
入力した整数が0以上、100以下であれば、「入力したデータは0以上100以下の範囲にあります。」と表示し、それ以外であれば、「範囲外です。」と表示するプログラムを作ってみてください。
以前、作ったプログラムを参考に改良を加えてみてください。
解答例です。
<sample program 015-01>
#include <stdio.h>
int main( void )
{
int input;
printf( "整数を入力してください:" );
scanf( "%d", &input );
if( input >= 0 ) {
if( input <= 100 ) {
printf( "入力したデータは0以上100以下の範囲にあります。\n" );
}
else {
printf( "範囲外です。\n" );
}
}
else {
printf( "範囲外です。\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数を入力してください:0
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数を入力してください:-5
範囲外です。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数を入力してください:100
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
整数を入力してください:101
範囲外です。
続行するには何かキーを押してください・・・
else文が2箇所にあります。
最初に、「0以上」かどうか調べます。
ここで、処理が2つに分かれます。
「0以上」であれば、「100以下」かどうか調べ、「0未満」であれば「範囲外」の表示を行います。
「100以下」であれば、「範囲内」のメッセージを表示し、「100より大きい」のであれば「範囲外」の表示を行います。
ですから、「0未満」の場合と、「100より大きい」場合の2箇所にelse文が必要になります。
これを次のように書き換えることが出来ます。
<sample program 015-02>
#include <stdio.h>
int main( void )
{
int input;
printf( "整数を入力してください:" );
scanf( "%d", &input );
if( input >= 0 && input <= 100 ) {
printf( "入力したデータは0以上100以下の範囲にあります。\n" );
}
else {
printf( "範囲外です。\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数を入力してください:0
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数を入力してください:-5
範囲外です。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数を入力してください:100
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
整数を入力してください:101
範囲外です。
続行するには何かキーを押してください・・・
実行結果は、最初のプログラムと同じになっています。
「ぱっ」と見て、else文が1つ減っていますよね。
そして、if文の中に条件が2つ書いてあります。
よく見ると、条件の間に「&&」という記号が書いてあります。
これが条件をつなぐための記号の1つです。
条件をつなぐための命令
2つ以上の条件を連結させるための記号(命令)は2種類あります。
「&&」 アンド と読みます。
「||」 オア と読みます。
オアはキーボードで見ると、右上の「BackSpace」キーの左側、「¥」キーのところにあります。
Shiftキーを押しながら、「¥」キーを押すと「|」が入力されます。
意味としては、
「&&」 アンド は、一方の条件が成立し「しかも」もう一方の条件も成立していたら・・・
「||」 オア は、一方の条件が成立しているか「または」もう一方の条件が成立していたら・・・
となります。
要は、
「&&」 アンド は、両方の条件が成立していた場合のみ「if文が成立」したことになります。
「||」 オア は、どちらか一方の条件が成立していた場合に、「if文が成立」したことになります。
似たような感じがしますが、間違うとひどい目にあいます。
例えば、<sample program 015-02>の「&&」を「||」に変えてみましょう。
<sample program 015-03>
#include <stdio.h>
int main( void )
{
int input;
printf( "整数を入力してください:" );
scanf( "%d", &input );
if( input >= 0 || input <= 100 ) {
printf( "入力したデータは0以上100以下の範囲にあります。\n" );
}
else {
printf( "範囲外です。\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数を入力してください:0
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数を入力してください:-5
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数を入力してください:100
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
整数を入力してください:101
入力したデータは0以上100以下の範囲にあります。
続行するには何かキーを押してください・・・
何を入力しても「入力したデータは0以上100以下の範囲にあります。」というメッセージが表示されます。
なぜでしょうか。(ちょっと考えてみてください)
「||」 オア は、どちらか一方の条件が成立していれば、「if文が成立」したことになります。
上のプログラムを見ると、
変数「input」の中身が、0以上「または」100以下であれば、「成立」したことになります。
どちらかが成立していれば良いので、「-1」は100以下ですし、「101」は0以上です。
つまり、どんな数値を入力しても「成立」するのです。
これを頭に置いて、<sample program 015-02>を見てください。
「&&」 アンド は、両方の条件が成立していた場合のみ「if文が成立」したことになります。
変数「input」の中身が、0以上で「しかも」100以下であれば、「成立」したことになります。
両方成立していなければならないので、「-1」は範囲外ですし、「101」も範囲外です。
これを使って、2つのプログラムを考えてみてください。
国語と数学のテストの得点を入力し、
1.両方とも80点以上で「合格」と表示
2.どちらか一方が80点以上で「合格」と表示
するプログラムです。
「&&」と「||」を使って作ってみてください。
1.の解答例です。
<sample program 015-04>
#include <stdio.h>
int main( void )
{
int kokugo;
int suugaku;
printf( "国語の点数を入力してください:" );
scanf( "%d", &kokugo );
printf( "数学の点数を入力してください:" );
scanf( "%d", &suugaku );
if( kokugo >= 80 && suugaku >= 80 ) {
printf( "合格\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:5
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:90
合格
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:50
続行するには何かキーを押してください・・・
2.の解答例です。
<sample program 015-05>
#include <stdio.h>
int main( void )
{
int kokugo;
int suugaku;
printf( "国語の点数を入力してください:" );
scanf( "%d", &kokugo );
printf( "数学の点数を入力してください:" );
scanf( "%d", &suugaku );
if( kokugo >= 80 || suugaku >= 80 ) {
printf( "合格\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:5
合格
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:90
合格
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:50
続行するには何かキーを押してください・・・
このように、2つ以上の条件をつなぐことができます。
ただし、「&&」と「||」を間違えると、まったく違った結果が出ますので、意味をしっかりと理解してください。
次回は、以前に作ったプログラムを書き換えて見ます。