• ベストアンサー

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% (2126/6288)
回答No.2

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

kokakoara
質問者

お礼

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

回答No.1

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

kokakoara
質問者

お礼

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

関連するQ&A

  • error C2143: 構文エラー : ';' が '{' の前にありません。

    #include <stdio.h> int main(void) {   int in;   printf("20以上の数字を入力してください\n");   scanf("%d", &in);   if(in >= 20){     printf("20以上の数字です。\n");     printf("終了します\n\n");}   else if(in <= 5){     printf("5以下の数字が入力されました\n");     printf("20には程遠いです\n\n");}   else(in <= 19){     printf("20以上の数字ではありません\n");     printf("20以上の数字を入力してください\n\n");}   return 0; } C言語でVisual C++ Expressを使っています このコードでビルドすると (16) : error C2143: 構文エラー : ';' が '{' の前にありません。 と表示されてしまいます。何がいけないのでしょうか?

  • 高(1)男子 初めてC言語でコードを書きました!!

    C言語を独学し始めた高校一年男子です。 「猫でもわかる C言語プログラミング」という本で勉強しています。 その本のポインタなどの難しいところを除いて 一通り読んで1~100までの数を当てる数当てゲームを作ってみました! これまでは、本に書かれていることを写してやっていたので、自分で組むのは初めてです。 これからは、もっと高度なプログラムやゲームを作っていきたいと思っています。 それを踏まえて、今後どのようなことを気をつけて書いていけばいいかなどの アドバイスをコードを見てしてもらいたいのですが、 だれか、お願いできないでしょうか? これが、そのコードです↓ //<if,goto,rand関数を使った数当てゲーム>// #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { printf("いまから数当てゲームをします\n"); R: printf("0~100のうちどれが答えなのか当ててください\n"); int Q,A,Y,i; srand((unsigned)time(NULL)); Q=rand()%100+1; for(i=1; i<6; i++) {printf("あと%d回で当ててください!\n",6-i); scanf("%d",&A); if(Q<A){printf("もっと小さい数です\n"); } else if(Q>A){printf("もっと大きい数です\n"); } else{printf("正解です!!(^O^)/\nもう一回やりますか??\nはい→1\nいいえ→それ以外の数字\n選択してください\n"); scanf("%d",&Y); if(1==Y){goto R;} if(1!=Y){}break;}} printf("\n「「「終了します」」」\n"); return 0; } 長くなりましたが、アドバイスお願いします m(._.)m

  • C言語で数当てゲーム

    私は最近5月からCのプログラミングを学び始めた中3なんですが じゃんけんゲームと丁半ゲームを今までに作りました で今回数当てゲームを作ってみたのですが何回作り直しても エラーが出ます(コンパイラのエラーではなくWindows?のエラーのようなもの) じゃんけんゲームなどと同じように作ったつもりなのですが・・・・ どうなっているのでしょうか? ソースは↓です #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> int main() { int kazu,i,x; printf("数当てゲーム!!\n"); srand(time(NULL)); x=0; i=0; do { kazu=rand()%9+1; printf("数を入力してください(1~9)\n"); scanf("%d",i); if(i<10){ if(i==kazu) { printf("当たり!!\n続けるなら0やめるなら0以外を入力"); scanf("%d",x); } else {printf("残念・・・はずれ\n続けるなら0やめるなら0以外を入力"); scanf("%d",x);} } else {printf("入力ミスです\n続けるなら0やめるなら0以外を入力"); getch();} }while(x==0); return 0; } 一応コンパイラのエラーは出ていないのですが・・・ 初心者なのでわかりません。 どこが原因なのか詳しくおしえてください

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • C言語の課題が分からなくて困っています。

    http://www.picamatic.com/view/5868047_かかか/ URLの画像のような数当てゲームのプログラムを作成しているのですが、(1)~(5)の部分が分からなくて困っています。 面倒だとは思いますが、教えていただけないでしょうか。 #include<stdio.h> #include<stdlib.h> #include<time.h> int mani(void){ int i,x,y; srand((unsigned int)time(NULL)); (1) //1~1000の数をランダムに作成   y=0; //入力回数yを0にセットする for(;;){ //break文があるまで以下の処理を繰り返す printf("1以上1000以下の整数を入力してください。\n"); (2) //答えの入力 y=y+1; //入力回数yを1を増やす (3) //あたりの場合 printf("%d回目で当たりました。\n",y); (4) } else{ //外れの場合    (5) printf("違います。もっと大きな数です。\n"); else printf("違います。もっと小さな数です。\n"); } } return 0; }

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • エラー処理

    万年カレンダーを作っています。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf("   月>"); scanf("%d",&month); /*月入力*/ if(year>0 && month>0 && month<13){     break; } else{ printf("正しく入力してください\n"); } 上記のように、数字のエラー処理をしたのですが、これに数字以外のモノが入力された場合のエラー処理も追加しなければなりません。

  • 文法エラー

    { int a; int b; printf("正の整数:"); scanf("%d",&b); for(a%b ==0) { break; } printf("は素数",b); if(a == b) { printf("です。\n"); } else if { printf("でない。\n"); } return 0; } else if の前のところがエラーとして報告されます。 どこが間違っているのか解りません。 よろしくお願いします。

  • 文字と数字の判定について

    c言語を学び始めたばかりの者です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> main(){ printf("数当てゲームを開始します。\n"); int a,count,n,b; srand((unsigned)time(NULL)); printf("1~10の中から1つ数字を選びます。\n"); a = (rand()%10)+1; printf("選びました\n"); for(count=0;;count++){ printf("その数字はズバリ:"); scanf("%d",&n); //もし数字でなければという文にしたい!! if (?){ printf("数字を入力してください。\n"); continue; } else{ if(n<a){ printf("もっと大きな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } if(n==a){ printf("正解です!!\n"); b=0; exit(0); } if(n>a){ printf("もっと小さな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } } } } というプログラムなのですが数字の判定の仕方が分からなくて最初のifの条件に何をいれればいいのか分からないので分かるかたいましたら教えてもらえないでしょうか?

専門家に質問してみよう