先頭へ戻る

複数の条件で分岐させる 解答ページ | Programming Place Plus C言語編 第13章

Programming Place Plus トップページC言語編第13章

先頭へ戻る

問題①

問題① 次の2つの if文を、1つの if文に書き直してください。

#include <stdio.h>

int main(void)
{
    int num;
    char str[20];

    puts( "整数を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &num );

    if( num > 100 ){
        if( num < 300 ){
            puts( "OK!" );
        }
    }

    return 0;
}


書き換える前のソースコードには、if文が 2回登場します。 これを1つに直すので、条件式を合体してやる必要があります。 使える演算子は、&&演算子か、||演算子のどちらかです。

今回の場合、外側の if文が真にならないと、内側の if文に行き着きません。 もし、||演算子でつなげたとすると、外側の条件式が偽になったとしても、内側の条件式の判定に進んでしまいますから、 正しいのは &&演算子の方です。

従って、書き直すと次のようになります。

#include <stdio.h>

int main(void)
{
    int num;
    char str[20];

    puts( "整数を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &num );

    if( num > 100 && num < 300 ){
        puts( "OK!" );
    }

    return 0;
}

実行結果:

整数を入力してください。
199
OK!

ところで、今回のような条件式を次のように書くことがあります。

if( 100 < num && num < 300 ){
    puts( "OK!" );
}

別に意味は変わりませんが、この書き方を好むプログラマーもいます。この書き方の場合、左から数字が小さい順に並びます。並ばなければ偽です。また、関係演算子の向きが統一されるので美しいという考え方をする人もいます。逆にこの書き方をあまり好まない人もいるようです。あまり神経質になるほどのものではないと思うので、好きな方で書いて構わないと思います。

問題②

問題② 2つの文字列が一致しているかどうかを、strcmp関数と論理演算子を使って判定する if文を書いてください。


#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[80];
    char str2[80];

    puts( "文字列を入力してください。" );
    fgets( str1, sizeof(str1), stdin );

    puts( "もう1度入力してください。" );
    fgets( str2, sizeof(str2), stdin );

    if( !strcmp( str1, str2 ) ){
        puts( "一致しています。" );
    }
    else{
        puts( "一致していません。" );
    }

    return 0;
}

実行結果:

文字列を入力してください。
abcde
もう1度入力してください。
abcde
一致しています。

strcmp関数は、2つの文字列が一致するときに 0 を返します。従って、一致していたのに偽が返されるという不思議な関数なのです。(大小関係まで調べるので仕方がないのですが)。

一致しているときに偽を返すので、上の解答例のように !演算子を使って一致判定を行えます。 これを不自然だと考える人も多く、素直(?) に「 == 0」と書くことが好まれる場合もあります。

問題③

問題③ 標準入力から受け取った整数が、次の条件をすべて満たすときに、標準出力へ「OK!」と出力するプログラムを作ってください。


#include <stdio.h>

int main(void)
{
    int num;
    char str[20];

    puts( "整数を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &num );

    if( num % 2 != 0 ){
        if( 200 <= num && num < 500 ){
            puts( "OK!" );
        }
    }

    return 0;
}

実行結果:

整数を入力してください。
303
OK!

3つの条件式をすべて1つの if文にまとめてしまうことも可能ですが、あまり詰め込むと見辛いかもしれません。今回の場合なら、「200以上 500未満」というのは、「範囲内に入っているか」という条件だと考えられるので、ここを、&&演算子を使って1つにまとめてやるのが無難でしょう。

問題④

問題④ 標準入力から受け取った西暦年が、閏年かどうか判定するプログラムを作成してください。
※閏年の定義を正確に知っていますか?「4年に1度」だけでは不正解です。


閏年の定義は、

というものです(グレゴリオ暦の場合)。 これを踏まえると、次のようなプログラムになります。

#include <stdio.h>

int main(void)
{
    char str[40];
    int year;


    puts( "西暦年を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &year );

    if( (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) ){
        puts( "閏年です。" );
    }
    else{
        puts( "閏年ではありません。" );
    }

    return 0;
}

実行結果:

西暦年を入力してください。
1900
閏年ではありません。


参考リンク


更新履歴

’2018/6/5 第18章から練習問題⑥を移動してきて、練習問題④とした。

’2018/2/6 全面的に文章を見直し、修正を行った。

’2018/1/31 画面という表現を、標準出力に改めた。

’2009/3/16 新規作成。



第13章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー