★分岐構造:ネスト1★
前に作ったプログラムを「ネスト」を使ったプログラムに書き換えてみましょう。
入力した整数が、
負の数であれば、「入力データは負の数です。」
正の数であれば、「入力データは正の数です。」
ゼロであれば、「入力データはゼロです。」
と表示するプログラムを書き換えると、下のようになります。
<sample program 012-01>
#include <stdio.h>
int main( void )
{
int input;
printf( "整数を入力してください:" );
scanf( "%d", &input );
if( input < 0 ) {
printf( "入力データは負の数です。\n" );
}
else {
if( input > 0 ) {
printf( "入力データは正の数です。\n" );
}
else {
printf( "入力データはゼロです。\n" );
}
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数を入力してください:-1
入力データは負の数です。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数を入力してください:1
入力データは正の数です。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数を入力してください:0
入力データはゼロです。
続行するには何かキーを押してください・・・
前回と変わった箇所は、「負の数でない場合」に「正の数かどうか」を調べています。
「負の数でもなく」「正の数でもない」数値は「ゼロ」になります。
結果は前回と同じですが、考え方が少し違います。
上のプログラムの手順を書くと、
1.「負の数かどうか」調べます。
2.「負の数であれば」結果を表示してプログラムを終わります。(else文は実行されません。)
3.「負の数で無ければ」「正の数かどうか」調べます。
4.「正の数であれば」結果を表示してプログラムを終わります。(else文は実行されません。)
5.「正の数で無ければ」ゼロという結果を表示してプログラムを終わります。
となります。
前回のプログラムと比較します。
<sample program 011-02>
#include <stdio.h>
int main( void )
{
int input;
printf( "整数を入力してください:" );
scanf( "%d", &input );
if( input < 0 ) {
printf( "入力データは負の数です。\n" );
}
if( input > 0 ) {
printf( "入力データは正の数です。\n" );
}
if( input == 0 ) {
printf( "入力データはゼロです。\n" );
}
return 0;
}
|
前回のプログラムです。
これは、
1.「負の数かどうか」調べます。
2.「負の数であれば」結果を表示します。
3.「負の数であろうと無かろうと」「正の数かどうか」調べます。
4.「正の数であれば」結果を表示します。
5.「負の数であろうと無かろうと」「正の数であろうと無かろうと」「ゼロかどうか」調べます。
6.「ゼロであれば」結果を表示します。
7.プログラムを終了します。
となります。
言いたいことは、前回のプログラムは無駄が多いのです。
入力した数値が「負の数」であれば、「正の数かゼロか」は調べる必要がありません。
「負の数で無ければ」残りは「正の数かゼロか」しかありませんので、「正の数かどうか」のみ調べればすむことです。
「負の数でもなく正の数でも無ければ」、結果はゼロしかありえません。
では、もう1つ。
2つの整数「整数1」「整数2」を入力し、
「整数1」の方が小さければ、「整数1の方が小さいです。」
「整数1」の方が大きければ、「整数1の方が大きいです。」
2つの数が等しければ、「整数1と整数2は等しいです。」と表示するプログラムを書き換えましょう。
考えてみてください。
解答例です。
<sample program 012-02>
#include <stdio.h>
int main( void )
{
int input1;
int input2;
printf( "整数1を入力してください:" );
scanf( "%d", &input1 );
printf( "整数2を入力してください:" );
scanf( "%d", &input2 );
if( input1 < input2 ) {
printf( "整数1の方が小さいです。\n" );
}
else {
if( input1 > input2 ) {
printf( "整数1の方が大きいです。\n" );
}
else {
printf( "整数1と整数2は等しいです。\n" );
}
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数1を入力してください:15
整数2を入力してください:23
整数1の方が小さいです。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数1を入力してください:35
整数2を入力してください:23
整数1の方が大きいです。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数1を入力してください:18
整数2を入力してください:18
整数1と整数2は等しいです。
続行するには何かキーを押してください・・・
これも、整数1と2を比較した場合、
「整数1<整数2」が成立していれば、他の条件は比較しなくても良いです。
「整数1<整数2」が成立していなければ、「整数1>=整数2」のはずですから、
「整数1>整数2」が成り立つかどうかさえ調べれば、結果がわかります。
実際には、調べる順番は変わってもかまいません。
まず、等しいかどうか調べ、等しく無ければ、大きいか小さいかを調べてもOKです。
上の2つの例は、「ネスト」を使わなくても組めるプログラムを、「ネスト」を使って無駄なく書き換えることを行いました。
今度は、新しい問題を出しましょう。
国語と数学の得点を入力し、どちらか一方が80点以上あれば「合格」と表示するプログラムを作ってみてください。
解答例です。
<sample program 012-03>
#include <stdio.h>
int main( void )
{
int kokugo;
int suugaku;
printf( "国語の点数を入力してください:" );
scanf( "%d", &kokugo );
printf( "数学の点数を入力してください:" );
scanf( "%d", &suugaku );
if( kokugo >= 80 ) {
printf( "合格\n" );
}
else {
if( suugaku >= 80 ) {
printf( "合格\n" );
}
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:50
合格
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:80
合格
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:90
合格
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:50
続行するには何かキーを押してください・・・
実行結果を見ると、「どちらか一方の点数が80以上の時だけ」合格と表示されています。
この条件を作るには「ネスト」が楽です。
国語の点数が80以上であれば、すぐに合格と表示する。
80以上でなければ、数学の得点を調べ、数学の点数が80以上であれば、
合格と表示する。どちらも成り立たなければ、何も表示しない。
「ネスト」を使わずに作ると、下のようになるでしょうか。
<sample program 012-04>
#include <stdio.h>
int main( void )
{
int kokugo;
int suugaku;
printf( "国語の点数を入力してください:" );
scanf( "%d", &kokugo );
printf( "数学の点数を入力してください:" );
scanf( "%d", &suugaku );
if( kokugo >= 80 ) {
printf( "合格\n" );
}
if( suugaku >= 80 ) {
printf( "合格\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:50
合格
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:80
合格
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
国語の点数を入力してください:80
数学の点数を入力してください:90
合格
合格
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
国語の点数を入力してください:50
数学の点数を入力してください:50
続行するには何かキーを押してください・・・
どちらか一方だけ80以上であれば、正しく表示されますが、両方とも80以上の時に、合格が2回表示されています。
「ネスト」を使わなければ出来ないことも、「ネスト」を使えば正しく表示されます。
次は、3つの整数を入力し、3つとも同じ数であれば「3つの数は等しいです。」と表示するプログラムを作ってみましょう。
ただし、次のような書き方はできませんので、あらかじめ書いておきます。
<sample program 012-05>
#include <stdio.h>
int main( void )
{
int input1;
int input2;
int input3;
printf( "整数1を入力してください:" );
scanf( "%d", &input1 );
printf( "整数2を入力してください:" );
scanf( "%d", &input2 );
printf( "整数3を入力してください:" );
scanf( "%d", &input3 );
if( input1 == input2 == input3 ) {
printf( "3つの数は等しいです。\n" );
}
return 0;
}
|
条件式のところに、「==」が2つ使われています。
何となく意味は分かりますが、コンピュータには分かりません。
分からないのですが、「エラー」にならないのが問題です。
「エラー」ではないので、きちんと実行できます。
実行結果は、整数1と整数2が等しく、整数3が1であれば「3つの数は等しいです。」というメッセージが表示されます。
その他の数値は、どんな数値を入れてもメッセージは表示されません。
前回も説明しましたが、念のためもう一度書いておきます。
「==」演算子の実行順は左から右へです。※すべての演算子の優先順位と実行順については後述します。
まず整数1と整数2が比較されます。
同じであれば、成り立ちますから「1」が結果となりますし、
同じでなければ、成り立ちませんから「0」が結果となります。
次に、この結果「1か0」と整数3が比較されます。
整数1や整数2に何を入れても、「1か0」の結果になりますから、整数3は「1か0」としか比較されません。
ですから、正しく結果がでないのです。
整数1と整数2が等しく、整数3が1であればと書きましたが、整数1と整数2が同じ数であれば成り立ちます。
成り立つということは、「1」ということです。
整数3に1が入っていれば、同じ数ですから、メッセージが表示されます。
C言語では出来ないことを正しく理解することは、非常に大切なことです。
解答例です。
<sample program 012-06>
#include <stdio.h>
int main( void )
{
int input1;
int input2;
int input3;
printf( "整数1を入力してください:" );
scanf( "%d", &input1 );
printf( "整数2を入力してください:" );
scanf( "%d", &input2 );
printf( "整数3を入力してください:" );
scanf( "%d", &input3 );
if( input1 == input2 ) {
if( input2 == input3 ) {
printf( "3つの数は等しいです。\n" );
}
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:10
整数3を入力してください:10
3つの数は等しいです。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:5
整数3を入力してください:10
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:10
整数3を入力してください:5
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
整数1を入力してください:5
整数2を入力してください:10
整数3を入力してください:10
続行するには何かキーを押してください・・・
これも「ネスト」を使えばできます。
2つの数値の比較(大小や等しい)は1つずつしか出来ないということを頭に入れておきましょう。
最後に、上のプログラムを少し改良します。
3つ数値が同じ時に「3つの数は等しいです。」と表示し、1つでも違えば「3つの数は異なります。」とい表示するよう変更してみてください。
解答例です。
<sample program 012-07>
#include <stdio.h>
int main( void )
{
int input1;
int input2;
int input3;
printf( "整数1を入力してください:" );
scanf( "%d", &input1 );
printf( "整数2を入力してください:" );
scanf( "%d", &input2 );
printf( "整数3を入力してください:" );
scanf( "%d", &input3 );
if( input1 == input2 ) {
if( input2 == input3 ) {
printf( "3つの数は等しいです。\n" );
}
else{
printf( "3つの数は異なります。\n" );
}
}
else{
printf( "3つの数は異なります。\n" );
}
return 0;
}
|
<実行結果1 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:10
整数3を入力してください:10
3つの数は等しいです。
続行するには何かキーを押してください・・・
<実行結果2 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:5
整数3を入力してください:10
3つの数は異なります。
続行するには何かキーを押してください・・・
<実行結果3 VC++ Express Edition>
整数1を入力してください:10
整数2を入力してください:10
整数3を入力してください:5
3つの数は異なります。
続行するには何かキーを押してください・・・
<実行結果4 VC++ Express Edition>
整数1を入力してください:5
整数2を入力してください:10
整数3を入力してください:10
3つの数は異なります。
続行するには何かキーを押してください・・・
else文を書く場所を考えて書かないと、正しい結果が表示されません。
整数1と整数2が異なる場合、「3つの数は異なります。」と表示しなければなりません。
さらに、整数1と整数2が同じ場合でも、整数2と整数3が異なれば「3つの数は異なります。」と表示する必要があります。
つまり、2箇所にelse文を書かなければなりません。
最後に「インデント」を読んでおいてください。