• ベストアンサー

Visual C++ error なんで?

 将来プログラマーを目指して勉強中の中学生です。    おとといC言語を始めてやさしいCを半分ぐらい読み 数当てゲームを作ってみようと思い今製作中なのですが(ランダムに数字を出すとかはできない)どうしてもエラーがでてしまうのです。 googleなどでエラーを調べてもどうしても解決につながらないので、本当は自力で見つけてバグを直さなくてはいけないのはわかっているのですが、ここで質問させていただきます。 ※ソース見にくいかもしれませんがすいません。  この数当てゲームは、100から999までの数字で入力された数字が、あらかじめ用意されている答えより小さいか大きいかを判断して 答えに近づいていくゲームです。 ------------------ソース--------------------------- /*数当てゲーム*/ //9/13日:作成開始 //9/13日:全角の空白には注意!!!エラー発生。問題解決 //9/14日:エラー #include <iostream>//本当は<stdio.h>でやっています。 int main (void) { int anser,tasu1; anser=749; printf("数当てゲームです。私があらかじめ用意しておいた数を当てる単純なゲームです。答えは100から999での間です。\n"); printf("では100から999までの数字を入力してください。\n"); scanf("%d", &tasu1); //tasu1に入力された数字を格納 if(tasu1 == anser){ printf("正解です!おめでとうございます。\n");//入力された数字がanserと一致したときここを処理 } else if(tasu1>anser){ printf("答えは入力された数字より小さいです。\n");//tasu1がanserより大きい場合ここを実行 } else if(tasu1<anser){ printf("答えは入力された数字より大きいです。\n");//入力された数字がanserより小さいときにここを処理 } else if(tasu1<100){ printf("入力された数字が許容範囲を超えています。\n");//入力された数字が100未満のときここを処理 } else if(tasu1>999){ printf("入力された数字が許容範囲を超えています。\n");//入力された数字が999より大きいときここを処理 } else{ printf("入力された数字が不正です。\n");//それ以外はここを処理 } return 0; } 見にくいですが、どうぞ回答よろしくお願いします。

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

  • ベストアンサー
  • freetaka
  • ベストアンサー率53% (106/197)
回答No.5

よくifの処理順番を見ればわかると思いますよ 最初に答えが正解かどうかを判定 ↓ 次に答えより大きいか小さいか判定 ↓ 次に数値の許容範囲を判定 ↓ ・・・ という感じですが 答えの大小の判定と数値の許容範囲の判定は どちらが判断として先にこなければならないでしょうか? if文の場合は順番が違うだけで 後に続く判断が実行されなくなることがありますので 慎重に判断する順番を決める必要があります がんばってif構文をものにしましょう

kokakoara
質問者

お礼

おお!できました。 こんな簡単なことに気づかないとは・・・ 処理は上からされていくということを忘れていました。 ありがとうございました。 あとはこのソースにforを付け加えて10回繰り返すようにすれば いいだけです。(できるかなww)  回答ありがとうございました。 またなにかあったらよろしくお願いします。

その他の回答 (5)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

>問題は無事解決しました。 (新米に、悪い思想?を植え付けちゃおうかな・・・冗談) else のキライな年寄りは、下のようになります。 else って、例えば共学教室で、先生が、 「男子生徒、表に出ろ」と言った後、「《男子でない》女子生徒の皆さん、表に出て下さい」の《男子でない》のような気がする。 CPUが粗末だった頃は、確かにソフトがハードを補う工夫という面もあっただろう(膨大な量の被判断材料があるとき、1度判定して「適」となったものを、「再び」異なる判断の対象に含めないことで処理時間の短縮)けど、今はね、プログラムの視認性の悪さのほうが害は大きい、と思う。 とはいえ、「やさしいC」の著者や多くの人は(体に馴染んでいて)else がないと、私とは逆に「視認性が悪い」と言うかもしれない。 ☆質問者様のソースでも、else がなかったらどんな動作になるんだろう、と考えてみて下さい。  もし、有っても無くても同じなら、無い方が「視認性が良い」と思うのは年寄りだけかなぁ。 注:下のは、continue; や break; があるので、上とは別の意味で、else は不要。 #include <stdio.h> int main( void ) {  int anser, tasu1;  anser = 749;  printf( "数当てゲームです。私があらかじめ用意しておいた数を当てる単純なゲームです。答えは100から999での間です。\n" );  while( 1 ){   printf( "100から999までの数字を入力してください。\n" );   scanf( "%d", &tasu1 );   if( tasu1 < 100 ){    printf( "入力された数字が許容範囲外です。\n" );    continue; // 再入力   }   if( tasu1 > 999 ){    printf( "入力された数字が許容範囲外です。\n" );    continue; // 再入力   }   if( tasu1 == anser ){    printf( "正解です!おめでとうございます。\n" );    break;   }   if( tasu1 > anser ){    printf( "答えは入力された数字より小さいです。\n" ); //   continue; // 答えに近づいていく   }   if( tasu1 < anser ){    printf( "答えは入力された数字より大きいです。\n" ); //   continue; // 答えに近づいていく   }  }  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

kokakoara
質問者

補足

>タブに一括変換して下さい。 よくわからないので全部打ち込みました。 実行すると1000や9999といった数字は、入力された数字は許容範囲外です。とちゃんとでました。 ですが、147など答えでない数字を入力すると「正解です!おめでとうございます。」となってしまいます。 これはなんででしょうか?

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

コンソールアプリケーションでビルドしてみましたがstdio.hで何もエラーは出ませんよ。

kokakoara
質問者

お礼

すいません。 解決しました。 回答ありがとうございました。 今度何かあったときもよろしくお願いします。

  • freetaka
  • ベストアンサー率53% (106/197)
回答No.3

いちおうコピペしてコンパイルしてみました エラーというか警告がでるということですね 「Warning C4996」というのは これからVisualC++でC言語記述のソースをコンパイルすると 頻発すると思いますが これは標準C言語の関数の利用が非推奨になり VisualC++内に用意されたより安全な関数が推奨になったためです たとえは今回のソースをコンパイルすると 「scanf」で警告がでますが「scanf_s」というふうに 用意されている推奨関数に置き換えるとエラーがでなくなります 他にも「strcpy」などなどいろいろな関数を使用した時に発生します その場合は「strcpy_s」みたいに「_s」をつけることで たいていエラーが回避されます 試しにやってみてください C言語の勉強をするのであれば警告がでても とりあえずコンパイルできて結果がでるのであれば そのまま標準の関数でコーディングして問題ないです それとこのソースについて気づいたことですが 最初に100から999の答えの幅(数値範囲)を判断しない為 50や1000以上の数をいれても大きい小さいの判断しちゃいますね 以上です 勉強がんばってください

kokakoara
質問者

お礼

ほうほう。勉強になりました。 ありがとうございました。 問題は無事解決しました。 回答ありがとうございました。 今度何かあったときもよろしくお願いします。

kokakoara
質問者

補足

>それとこのソースについて気づいたことですが >最初に100から999の答えの幅(数値範囲)を判断しない為 >50や1000以上の数をいれても大きい小さいの判断しちゃいますね >以上です こういうときってどうすればいんでしょうか? 本にものってないようですし・・・ 返答いただけるとうれしいです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>else if(tasu1<100){ ここに到達するのは、 tasu1 == anser が成立せず、かつ、 tasu1 > anser が成立せず、かつ、 tasu1 < anser が成立しないときですね。 ところが、tasu1 と anser の大小関係は、 両者が等しい tasu1 の方が大きい tasu1 の方が小さい のいずれかで、かつ、必ずいずれかが成り立ちます。 つまり、最初に書いたelseのところには、どうあがいても到達しません。 エラーが出る、とおっしゃっているのは、こういうことですか?

kokakoara
質問者

お礼

自分でも数字入力してみて今気づきました・・・ こういうときどうすればいいんでしょうね? できれば返答お願いします。 回答ありがとうございました。

回答No.1

どの位置ででどんなエラーが出るかくらいは書いてくださいよ。

kokakoara
質問者

お礼

次質問するときは気をつけます。 すいません。 解決しました。 回答ありがとうございました。 今度何かあったときもよろしくお願いします。

関連するQ&A