アプリ版:「スタンプのみでお礼する」機能のリリースについて

 こんにちは。課題でどうしても解らないところがあるので教えてください。
 次のプログラムは一桁の数(0~9)が偶数(EVEN)か奇数(ODD)かを表示するものです。

 #include <stdio.h>

main() {
int num;
printf("please enter a number[0~9]:");
scanf("%d",&num);
if (num % 2 ==0)
printf("%d is an EVEN. \n", num);
else
printf("%d is an ODD. \n", num);
}
というプログラムをコンパイルして実行すると、ちゃんと実行されるのですが、10以上の数や負数を入力しても動作してしまうんです。

 そこで0~9の範囲以外の数が入力されていないかを確認して、その場合を偶数、奇数の判断や表示をせず、エラーメッセージだけを表示して終了するプログラムに書き換えなくてはならないのですが、まず
 (1)判断する条件式(変数numの内容が0~9の範囲にあるか)で、num >= 0 && num <= 9 をどこに入れればいいか。
 (2)please enter a number[0~9]: 8
8 is an EVEN.  (←例えば8を入れると普通こうなるのですが)
  please enter a number[0~9]:12
  ERROR:12 is in out of range!!  (←0~9以外ののものだったら、この様にエラー表示にしたいのです。

 私が考えたプログラムは
 #include <stdio.h>

main() {
int num;
printf("please enter a number[0~9]:");
scanf("%d",&num);
if (num % 2 ==0)
printf("%d is an EVEN. \n", num);
if else
printf("%d is an ODD. \n", num);
else(num >= 0 && num <= 9)
printf("ERROR:%d is in out of range!! \n",num);

}
という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

A 回答 (4件)

コンパイルエラーが出ていたと思います。

エラーになんて書いてあったか読みましたか?どこの行でエラーになっているかコンパイラが教えてくれますよ。

さて、コンパイルが通らない原因ですが、

printf("%d is an EVEN. \n", num);
if else
printf("%d is an ODD. \n", num);

犯人はこの、if else です。書くなら else if にしましょう。

しかし、コンパイルが通ってもこのままではプログラムは希望通りには動きません。なぜなら、エラーチェックを入れる部分が拙いからです。

エラーチェックは出来る限り前に持ってきましょう。エラーチェックが済んだ後で正常系の処理に進むのが定石です。それに、
else(num >= 0 && num <= 9)
も拙いですね。

私なら、

#include <stdio.h>
#include <stdlib.h>

int main(void) {
int num;
printf("please enter a number[0~9]:");
scanf("%d",&num);

/* エラーチェック:0~9以外の数字が入力されたら
 エラーメッセージを出してプログラムを終了する。
*/
if( (num < 0) || (9 < num) ){
printf("ERROR:%d is in out of range!! \n",num);
exit( EXIT_FAILURE );
}

/* 以下、正常系の処理を続ける。*/
if(0 == (num % 2))
printf("%d is an EVEN. \n", num);
else
printf("%d is an ODD. \n", num);

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2005/06/25 20:08

コンパイルエラーの原因と、条件のつけ方の問題は既に他の方が書かれていますので省略して。



このままだと数字以外のものが入力されたときの挙動が保証できません。

scanf("%s",&string);
/* 数値として有効かチェックする */
num = atoi(string);

でやってみる手もあります。
    • good
    • 0
この回答へのお礼

遅くなりました。ありがとうございました。

お礼日時:2005/06/25 20:07

>else(num >= 0 && num <= 9)



これは、else if(num >= 0 && num <= 9)
にしないと、コンパイルは通らないですね。

ただ、ここに条件文を書いてしまうと、それ以前の偶数奇数の判断が先に行われてしまうので、意味がありません。

入力を受けた直後に、
if(num >= 0 && num <= 9)として、
条件を満たすなら、最初のプログラムをそのまま実行して、
条件を満たさない場合を
else以下に、
printf("ERROR:%d is in out of range!! \n",num);
を書いてみましょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2005/06/25 20:09

if 条件A


  処理A
else if 条件B
  処理B
else
  処理C

です。
今回の場合、0未満・10以上を除外したいの
であれば、条件Aに0未満・10以上を記述
するべきです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2005/06/25 20:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!