Thinkers'Studio
JavaとC言語の自習ツール
break と continue を活用しよう ( C言語版 )

 forwhile は最初に、do-while は最後に、繰り返しを続けるかどうかの条件を判定します。
 場合によっては、繰り返しブロックの中で条件を判定し、 break文continue文 を呼び出す方が便利な場合があります。
 break はそこで繰り返しを抜ける指示、continue はそれより下に書いた処理をせずに次の繰り返しの先頭に進む指示です。

(上記を踏まえて、今回のクイズです)
 下は、生まれ月を指定すると誕生石を表示するプログラムです。 breakcontinue が下線の (a), (b) に入ります。
 数字以外を指定するとプログラムを終了し、1〜12以外を指定すると再入力を求められます。

#include <stdio.h>
main()
{
    int     month;
    char    *stones[] =
        { "ガーネット", "アメジスト", "アクアマリン", "ダイアモンド"
        , "エメラルド", "パール", "ルビー", "ペリドット", "サファイア"
        , "オパール", "トパーズ", "ターコイズ" };

    printf( "誕生石を調べるプログラムです(数字以外で終了)\n" );
    while( 1 ) {
        printf( "生まれ月を指定してください:" );
        if( scanf( "%d", &month ) != 1 ) {
              (a)  ;
        }
        if( month < 1 || month > 12 ) {
            printf( "月が正しくありません\n" );
              (b)  ;
        }
        printf( "%d月の誕生石は%sです\n", month, stones[month-1] );
    }
}

 (a), (b) それぞれには何が入りますか?
   (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え: マクロ DIV が正しい (前回の問題を見る
DIVのように、個々のパラメータと式全体にカッコをつけてマクロ定義します。 ( ) 中をひとつの値として取り扱いできるので、パラメータに式が渡されたり、マクロの前後に演算子があっても影響を受けません。
(各マクロの置換の様子)
マクロを使った式置換後実行結果期待していた値
ADD(4,2)/24 + 2/253
SUB(4,2)*5(4) - (2)*5-610
MUL(4-2,2)(4-2 * 2)04
DIV(4-2,2)((4-2) / (2))11
ADD や SUB の例では、マクロの後ろにある優先順位の高い演算子と先に結びついてしまいました。
 --> 式全体をカッコで囲む必要があります。
MUL(4-2,2) では、4-2 でなく -2 * 2 が先に演算されます。
 --> (4-2)が先に演算されるように個々のパラメータをカッコで囲む必要があります。