こんにちは。課題でどうしても解らないところがあるので教えてください。
次のプログラムは一桁の数(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);
}
という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。
No.3ベストアンサー
- 回答日時:
コンパイルエラーが出ていたと思います。
エラーになんて書いてあったか読みましたか?どこの行でエラーになっているかコンパイラが教えてくれますよ。さて、コンパイルが通らない原因ですが、
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;
}
No.4
- 回答日時:
コンパイルエラーの原因と、条件のつけ方の問題は既に他の方が書かれていますので省略して。
このままだと数字以外のものが入力されたときの挙動が保証できません。
scanf("%s",&string);
/* 数値として有効かチェックする */
num = atoi(string);
でやってみる手もあります。
No.2
- 回答日時:
>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);
を書いてみましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
C言語プログラムが理解できなくて…
-
getcの改行判定
-
行列をべき乗させるプログラム
-
c言語プログラミングで1から100...
-
C言語 数字以外を入力させない...
-
C言語で電卓を作成する。
-
C言語のwhile文を使った素数判...
-
プログラミングで二番目に大き...
-
while文について、c言語...
-
配列を関数に渡す方法
-
scanfが実行されません
-
教えてください
-
C言語階乗の総和を求める
-
for文
-
入力した数値を0~3乗するプロ...
-
プログラミング for文
-
C言語初心者です。次の問題で質...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
C言語 数字以外を入力させない...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
scanf関数を用いての加減乗除%...
-
c言語プログラミングで1から100...
-
while文について、c言語...
-
getcの改行判定
-
プログラミングで二番目に大き...
-
VHDLで、case文とwhen文のどち...
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
プログラミングに関して
-
階乗のプログラム!!
-
C言語についてですfor ifをつか...
おすすめ情報