• ベストアンサー

Cプログラムの条件文  if,else if ,elseについて教えてください。

 こんにちは。課題でどうしても解らないところがあるので教えてください。  次のプログラムは一桁の数(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); } という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答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; }

july_8th
質問者

お礼

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

その他の回答 (3)

回答No.4

コンパイルエラーの原因と、条件のつけ方の問題は既に他の方が書かれていますので省略して。 このままだと数字以外のものが入力されたときの挙動が保証できません。 scanf("%s",&string); /* 数値として有効かチェックする */ num = atoi(string); でやってみる手もあります。

july_8th
質問者

お礼

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

  • sunasearch
  • ベストアンサー率35% (632/1788)
回答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); を書いてみましょう。

july_8th
質問者

お礼

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

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

if 条件A   処理A else if 条件B   処理B else   処理C です。 今回の場合、0未満・10以上を除外したいの であれば、条件Aに0未満・10以上を記述 するべきです。

july_8th
質問者

お礼

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

関連するQ&A

  • if-else文および標準演算子(*/+-%)の入力方法

    度々失礼します。 C言語超初心者のものです。QNo.3392139(回答してくださった皆さんありがとうございます。)でも質問させていただきましたが、詳細が足りないようなので、 ここで再度質問をさせていただきます。 プログラミング内容 (1)Enter first integer: 17 [好きな数値選択] (2)Enter operator:(*/+-%) [好きな演算子選択] (3)Enter second integer:5 [好きな数値選択] というように数字・標準演算子・数字の順でキーボードから入力し、 (4)17 / 5 = 3 を(1)~(4)までDOS画面?上に表示させるものです。 そして、if-else文を作成して、以下のようにプログラムを組んでみたのですが(標準演算子は”/”を選択するようにしています)、 else文のところで”parse erro before 'else' ”というエラーが出てしまいます。このエラーがなくなれば、プログラムはうまく起動すると思うのですが・・・。 どこが悪いのでしょうか? まあ、超初心者なので、使える言語はint、float、char、そして関数はscanf、if-else文、位です。 int main() { int num1, num2, num4, num5, num6; char chr; printf("Enter the first integer: "); scanf("%d",&num1); scanf("%c",&num5); printf("Enter an operator (* / + - %): "); scanf("%c",&chr); scanf("%c",&num6); printf("Enter the second integer: "); scanf("%d",&num2); if(chr == '/') num4 = num1 / num2; printf("%d / %d = %d\n", num1, num2, num4); else printf("Can not\n"); system("pause"); return 0; } 大変皆さんお忙しいとは思いますが、出来たらお願いします。 査閲ありがとうございます。

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • C言語の四則演算プログラムについて

    こんにちは。hayato2192といいます。 今回は、C言語についてのことを質問したいとおもいます。 MSN相談箱の質問の中で数ある四則演算プログラムに対する質問をみたのですが、僕がつくろうとしているプログラムとはまったくちがいました。 プログラムコードは以下です。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ #include <stdio.h> main() { int d1, d2; char op; printf("START PROGRAM : Arithmetic operation\n"); printf("ENTER THE NUMBER\n"); scanf(" %d", &d1); printf("ENTER THE OPERATOR\n"); scanf(" %c", &op); switch (op) { case '+': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1+d2); break; case '-': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1-d2); break; case '*': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1*d2); break; case '/': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1/d2); break; default: printf("NO ANSWER\n"); break; } return 0; } \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 使っている関数はscanf printf switchだけというとてもシンプルなプログラムなのです。 じっさい、このプログラムをBorlandのコンパイラでコンパイルすると、switch関数がまったく使われずに、演算子(このプログラムでいうOPERATORです)を入力するところで終了してしまいます。 どのように直せばよいのでしょうか。教えてください

  • Cプログラミング 

    素数を判定するプログラミングの作成で以下のプログラミングを作成したのですが、すべて 素数でないとでてしまいます。どなたか間違いをおしえていただけませんでしょうか。 #include<stdio.h> int main(void) { int num,i; printf("Please input a number:"); scanf("%d",&num); for (i=2; i < num ; i++){num % i; if (num % i == 0) break; } if (num % i == 0) printf("%d is not prime. \n" ,num); else printf("%d is prime. \n" ,num); return 0; }

  • ifと不等記号( < & > )のみを使って、最大数と最小数を求める (* 超初心者です)

    宿題でifと不等記号( < と>)のみを使って、3つの入力された整数の中から最大数と最小数を求めるプログラムを作っているのですが、コンパイルには成功してもいざ実行すると、恐らくエラーが起きていて、数字を入力しても何も出来ません。 下記の文字列はそのifの所のみを貼ったものですが、何が間違っているのでしょうか? ちなみにelseとかは使えません m(_ _)m 純粋にifと不等記号のみしか使ってはダメみたいです。 if( num1 > num2 > num3 ) { printf( "Smallest is %d\n", num3 ); printf( "Largest is %d", num1 ); } /* end if */ if( num1 > num3 > num2 ) { printf( "Smallest is %d\n", num2 ); printf( "Largest is %d", num1 ); } /* end if */ if( num2 > num1 > num3 ) { printf( "Smallest is %d\n", num3 ); printf( "Largest is %d", num2 ); } /* end if */ if( num2 > num3 > num1 ) { printf ( "Smallest is %d\n", num1 ); printf ( "Largest is %d", num2 ); } /* end if */ if( num3 > num1 > num2 ) { printf ( "Smallest is %d\n", num2 ); printf ( "Largest is %d", num3 ); } /* end if */ if( num3 > num2 > num1 ) { printf ( "Smallest is %d\n", num1 ); printf ( "Largest is %d", num3 ); } /* end if */

  • ”0”入力時、else文の中の”Can not perform by 0”表記を表示させたい。

    度々忙しい中失礼します。 C言語超初心者のものです。else文での表示について質問があります。 プログラミング内容 (1)Enter first integer: 17 [好きな数値選択] (2)Enter operator:(*/+-%) [好きな演算子選択] (3)Enter second integer:5 [好きな数値選択] というように数字・標準演算子・数字の順でキーボードから入力し、 (4)17 / 5 = 3 という回答を求めるものです。また、 (5)17 / 0 ”0”をキーボードから入力した時には”Can not divide by 0”という表記をDOS画面?上に表示させたいと思っているのですが、0を入力した後、enterキーを押すと、DOS画面?がフリーズして、「Send Error Report」または「Don't Send」の別表示が出てきてしまいます。 (3)Enter second integer:0以外の値 時にはプログラミングは正常に作用するので、else文に問題があるのは分かっているのですが、どこに問題があるのかが分かりません(カッコ内はnum2=0でもnum2==0でも不可でした)。もしその問題のありかが分かる方がいらっしゃいましたらアドバイスお願いします。 以下がそのプログラミングです。 int main() { int num1, num2, num4, num5, num6; char chr; printf("Enter the first integer: "); scanf("%d",&num1); scanf("%c",&num5); printf("Enter an operator (* / + - %%): "); scanf("%c",&chr); scanf("%c",&num6); printf("Enter the second integer: "); scanf("%d",&num2); if(chr == '/') {num4 = num1 / num2; printf("%d / %d = %d\n", num1, num2, num4); } else(num2=0) ; {printf("Can not perform (divide) by 0\n");} return 0; } また参考になるURLなどありましたら、それもご紹介願います。 大変皆さんお忙しいとは思いますが、出来たらお願いします。 査閲ありがとうございます。

  • 暗号化文 3択させるためのプログラム 何で??

    忙しい中失礼します。下記のプログラムをいじり、「欲しい動作」を完成させたい、と思っています。 ・・・が出来ないのです。 どうか教えて下さい。お願いします。 アドバイスでもいいです。お願いします。 欲しい動作 1.ユーザーに3択 [1ENCRYPT(暗号化)/2DECRYPT(標準化)/3QUIT(中止)] を尋ねる 2.ユーザーが1(ENCRYPT)を選択した場合、次に文章を入力し、 THE FOX BROWN エンターキー WKH IRA EURZQ 表示[暗号化:元の文字から3文字ずらして表示] というように表示させるプログラムを作成しています。 質問:ユーザーに尋ねる3択方法なのですが、どういったプログラムを組めば、1選択後にTHE・・・のような文章を入力後→エンターキー→暗号文といった動作が得られるのでしょうか? 私のプログラムでは、DOS画面上でどういうわけか 1 を選択した後、直ぐ(文章を入力することなく)、Press・・・continue となってしまいます。 何で??です? どこをどういじれば、希望する動作になるのでしょうか? お願いします。 私のプログラムは以下です。 #include <stdio.h> #include <stdlib.h> int main() { void mystery(char); char sen; int num1; printf("What do you want? Select the number\n"); printf(" 1.encrypt Cange decryption letters into encryption letters\n"); printf(" 2.decrypt Cange encryption letters into decryption letters\n"); printf(" 3.quit You don't need to write letters.\n"); printf("Enter the number: "); scanf("%d", &num1); if(num1 == 1) { printf("You select encrypt.\n"); printf("Enter your sentence: "); mystery(sen); } else if(num1 == 2) { printf("You select decrypt.\n"); } else { printf("You don't do anything.\n"); } system("pause"); return 0; } void mystery(char sen) { char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int c, i; int j=0; while((c = getchar()) != '\n') { for(i = 0; upper[i]; i++) { if(c == upper[i]) { c = upper[(i + 3) % 26]; break; } } if(j<20) putchar(c); j++; } }

  • 四則演算のプログラム

    自力で解きたかったのですが、二時間考えても、とけないので 投稿させていただきます。どこを直せばよいのでしょうか 実行するときは%プログラム名 + 5 12 と入力して実行したいです。加えて参照にしている部分の %の扱いについても教えていただけると幸いです。 #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ char kigou; double num1,num2; kigou=atof(argv[1]); num1=atof(argv[2]); num2=atof(argv[3]); if(kigou=='+'){ printf("%f+%f=%f\n",num1,num2,num1+num2); } else if(kigou=='-'){ printf("%f-%f=%f\n",num1,num2,num1-num2); } else if(kigou=='x'){ printf("%f*%f=%f\n",num1,num2,num1*num2); } else if(kigou=='/'){ printf("%f/%f=%f\n",num1,num2,num1/num2); } /* else if(kigou=='%'){ printf("%f%%f=%f\n",num1,num2,num1%num2); }*/ else{ printf("Please input +,-,x,%%.\n");} }

  • 続・C言語について

    http://okwave.jp/qa5241461.html 先ほど、このような質問をして、いただいた回答を参考に下記のようなプログラムを作ってみたのですが、実行結果は、数値の入力と最後の"\n"しか反映していません…。 このプログラムのどの部分がマズイのか、お教えいただけたら幸いです。 よろしくお願いいたします。 #include <stdio.h> void draw_even(int, int); void draw_odd(int, int); int main(void) { int kazu; int gyou=1; printf("数字2~9を入力してください:"); scanf("%d", &kazu); while(kazu < 2 || kazu >9) { printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &kazu); } while(gyou <= kazu) { if(kazu = 2*(kazu/2)) { gyou = kazu+1; draw_even(kazu, gyou); } else { gyou = kazu; draw_odd(kazu, gyou); } gyou++; } } void draw_even(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { if(keta!=(gyou+1)/2) { printf("*"); } else { printf(" "); } } } printf("\n"); } void draw_odd(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { printf("*"); } } printf("\n"); }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

専門家に質問してみよう