• ベストアンサー

このプログラミングで。

#include <stdio.h> int main(void) { int x; printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど"); } else if(x == 2){ printf("フーン"); } else if(x == 3){ printf("やっぱり?"); } else if(x != 1){ printf("ハァ?"); } else if(x != 2){ printf("ハァ?"); } else if(x != 3){ printf("ハァ?"); } return 0; } これを実行して 等しくないときハァ?と表示させて、ふたたび、入力をさせる方法を教えてください。何度でも入力を求める方法もありましたら教えていただきたいです。 とても理解に苦しむような質問ですがよろしくおねがいします。

  • dfksh
  • お礼率64% (756/1164)

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

  • ベストアンサー
回答No.9

基本的な考え方は、 1)選択肢以外の入力があった時は、繰返し入力を求めるループ構造をつくる 2)選択肢に該当する入力があれば、そのループ構造を抜ける。該当無しならループ構造で入力を求める。 です。 試みに書いたのはこんな感じですが・・・ #include <stdio.h> int main(void){   int iInput,iIndex,iMax;   const   char* aszSelect[][2] = /* 表示文字列と反応を対応配列とする */   { {"天の川", "なるほど",},     {"三途の川","フ~ン"},     {"谷川", "やっぱり",},   };   iMax = (sizeof(aszSelect)/sizeof(char*))/2; /* aszSelect配列の一次元要素数を求める */   while(1){ /* 1)でいうループ構造を作った */     /* プロンプトメッセージ */     printf("長い河はどれ?\n");     for(iIndex=0;iIndex<iMax;iIndex++) {       printf("%d.%s\t",iIndex+1,aszSelect[iIndex][0]);     }     printf("\n");     /* 入力受付 */     scanf("%d", &iInput);     /* 入力判定 */     for(iIndex=0;iIndex<iMax;iIndex++) {       if(iInput==(iIndex+1)) { /* 該当があったら */         puts(aszSelect[iIndex][1]); /* 反応文字列の表示 */         break;       }     }     /* 2)でいう、該当無しならループ継続。該当ありならループ脱出 */     if(iIndex>=iMax) puts("ハァ?"); /* 該当無し */     else break; /* 該当あり */   }   return 0; } それ以外のところは趣味?で改造してみました。 a)選択肢と反応の対を予め配列しました。・・・選択肢が増えた時に追加が容易  →aszSelect配列。   選択肢の4つめが増えて、4.竜田川、反応は「からくれないに水くくるとは!」になったら、   aszSelectに、     {"竜田川", "からくれない水くくるとは",},   の一行を最後に追加すれば、それで済みます。   ループの最大回数は自動的に更新されるようになっています。    b)a)の結果として、switch~caseの判定文を止め、配列を走査して判定するようにしました。 ≪質問を受け付け中のまま放置するのは止めましょう≫

dfksh
質問者

お礼

すごいですね。これが上級者の作るプログラムなんだと思いました。 参考にさせていただきます。 すみません

その他の回答 (10)

  • motipan
  • ベストアンサー率0% (0/1)
回答No.11

do{ scanf("%d",&x); }while(x!=1); のような記述がいいと思います。 これはx=1になるまでscanf("%d",&x)をします。 while(x!=1){ scanf("%d",&x); } ではwhileに入る前に、xの値が初期化されてなければコンパイルエラー、x=1ならscanf("%d",&x)をしません。 do~whileは必ず1回はscanf("%d",&x)をするので、この場合良いかと^^; また、while( x!=1 || x!=2 )とすればx!=1またはx!=2のときwhileの中を繰り返します。 while( x!=1 && x!=2 )とすればx!=1かつx!=2のときwhileの中を繰り返します。 がんばってください^^;

dfksh
質問者

お礼

回答ありがとうございました。 すみません。まだdoとか||は意味がわからないので・・・。 しかし、勉強するつもりなので。

dfksh
質問者

補足

がんばります^^;

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.10

1.問題を表示する 2.入力を待つ 3.入力に応じて反応を表示する 3a.正しい入力の場合、終了する 3b.誤った入力の場合、1に戻る という動作ですね。 4bの「戻る」はgotoを使ってもいいのですが、あまりお勧めしません。 私ならwhile(TRUE)(while(1))を使います。 while(TRUE) {  // 1.問題を表示  // 2.入力待ち  if(x == 1) {   // 3.反応表示   // 3a.ループを抜ける  } else if(x == 2) {   // 3.反応表示   // 3a.ループを抜ける  } else if(x == 3) {   // 3.反応表示   // 3a.ループを抜ける  } else {   // 3.反応表示   // 3b.戻る  } }

参考URL:
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j2005/3eprg/nw22ny/loop3.html
dfksh
質問者

お礼

回答ありがとうございます さっそくやってみます

回答No.8

"scanf"が、ちょっとなんですが、 #include <stdio.h> int main(void){ int x; do{ printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n->"); scanf("%d", &x); switch(x){ case 1: puts("なるほど"); break; case 2: puts("フ~ン"); break; case 3: puts("やっぱり?"); break; default : puts("ハァ?"); break; } }while(x < 1 || 3 < x); return 0; }  

dfksh
質問者

お礼

こんなプログラムもあったんですか。 ありがとうございました

  • s1439
  • ベストアンサー率0% (0/1)
回答No.7

#include <stdio.h> int main(void) { int x = 0; while((x != 1) && (x != 2) && (x != 3)){ printf("長い河はどれ?\n 1 天の川 2 三途の川 3 谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど\n"); break; }else if(x == 2){ printf("フーン\n"); break; }else if(x == 3){ printf("やっぱり?\n"); break; }else{ printf("ハァ?\n"); } } return 0; } もうちょっと良いプログラムがありそうですがね(笑 一応実行は出来るはずです。。 質問文のプログラムが何故、実行できないかというと、 例えば、入力値xが"2"の時、 if(x == 2) にも当てはまりますが、 if(x != 1) や if(x != 3) にも当てはまるため 矛盾が生じたからだと思われます。 xが1でも2でも3でもない場合に ループし続けるWhile文を設置します。 1 ~ 3 を選んだ場合、各コメントを表示してループ終了。 それ以外はwhile文の頭に戻る、といった具合ですね。 もうちょっと良いプログラムはあるはずですが・・・(笑

dfksh
質問者

お礼

もっと良いプログラムを作ってみようと思います。 ありがとうございました

noname#22058
noname#22058
回答No.6

こんな感じでしょうか。 #include <stdio.h> int main(void) { int x; while (1) { printf("長い河はどれ?\n 1天の川 2三途の川 3谷川(0で終了)\n"); scanf("%d", &x); switch (x) { case 0: return 0; case 1: printf("なるほど\n"); break; case 2: printf("フーン\n"); break; case 3: printf("やっぱり?\n"); break; default: printf("ハァ?\n"); break; } } }

dfksh
質問者

お礼

whileの文ではこのようになるのですか。 とても勉強になりました。 ありがとうございました

  • l-c-l
  • ベストアンサー率33% (2/6)
回答No.5

int x;より下すべてを無限ループにすればよいと思います。そして条件判定がxが1、2、3の時はそれぞれprintf();の次にbreak;を入れることで、ループを抜け出すことができます。それ以外の時には抜け出したくないのでbreak;を入れないでおきます。こうすればxが1、2、3以外の時には、またprintf("長い河は…");まで戻ります。 あと、質問とは直接関係ありませんが、xが1、2、3以外のときというのは、 else{ printf("ハァ?"); } でひとつにまとめることができると思います。 文章書くの下手ですみません…。

dfksh
質問者

お礼

いえいえ。とてもわかりやすいです。 私はとても無駄なことをしていましたね。 ありがとうございました

回答No.4

入力された数字が1や2や3じゃないときハァ?と表示させる、というのは単に else{ printf("ハァ?"); } でいいのではないのでしょうか?

dfksh
質問者

お礼

ありがとうございました ハァ?と表示した後、また入力を求めるようにしたかったのです。 すみませんでした。

  • fantom
  • ベストアンサー率31% (30/94)
回答No.3

goto文で制御すると簡単だと思います。 int main(void) { RESTART://追加 int x; printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど"); } else if(x == 2){ printf("フーン"); } else if(x == 3){ printf("やっぱり?"); } else if(x != 1){ printf("ハァ?"); goto RESTART;//追加 } else if(x != 2){ printf("ハァ?"); goto RESTART;//追加 } else if(x != 3){ printf("ハァ?"); goto RESTART;//追加 } return 0; }

dfksh
質問者

お礼

gotoという文もあるんですか。 とても勉強になりました。 ありがとうございました。

  • alphion
  • ベストアンサー率19% (27/136)
回答No.2

while文を使って、breakでループから抜けるようにすれば良いのでは?

dfksh
質問者

お礼

回答ありがとうございました すみません。はじめたばっかりでwhileのことはまだわかりません。しかし、早速勉強してみます。

noname#22058
noname#22058
回答No.1

「等しくないとき」とは、何と何とが 等しくないときですか?

dfksh
質問者

補足

else if(x != 1){ printf("ハァ?"); } else if(x != 2){ printf("ハァ?"); } else if(x != 3){ printf("ハァ?"); } 入力された数字が1や2や3じゃないときハァ?と表示させるようにしていますよね(もしかして違っていますか??) 表示させているようにして、その後このままこのプログラムは終了されるのですが終了せずまた入力を求めるようにしたいのです。何度も求めるようにできればその方法も教えていただきたいのです。 すみません。表現のしかたが悪いですよね。でもよろしくおねがいします。

関連するQ&A

  • プログラミング

    ランダムの数値を入力してその数値より大きければ正解より大きいと表示して小さければ小さいと表示し正解なら正解ともだすプログラムをつくっています 正解まで何回かかったかとも表示したいと思います 上手く実行できないのでご教授ください #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int i,x,y; srand((unsigned int)time(NULL)); printf("%\n",i); i=rand()%100; //0以上100以下の整数を生成 y=0; printf("1以上100以下の整数を入力してください。\n"); scanf( "%d", &x ); /* 数値を入力させる */ printf("1以上100以下の整数を入力してください。\n"); y=y+1; if( x == i ) { printf("%d回目で当たりました。\n",y); printf("%d回目で当たりました。\n",y); break; /* 無限ループ */ } else{ if ( x < i ) //printf("正解より大きいです。\n"); printf("正解より大きいです。\n"); else //printf("正解より小さいです。\n"); printf("正解より小さいです。\n"); } } //return0;

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }

  • プログラミングについての質問です

    C言語で詰将棋のプログラミングをしたのですが、実行して答えを入力してもうまくいきません。どこがまちがってるのか教えていただけませんか?なおprintfを使って場を表現した部分が長すぎて4000文字に収まらないので、そこは割愛しています。 #include<stdio.h> int main(int argc, const char * argv[]){ int yoko,tate,yoko2,tate2,yoko3,tate3; char koma,koma2,koma3; printf("詰め将棋をしましょう\n"); ~printf略~ printf("持ち駒:なし\n相手の駒は玉(1二)、歩(1三)、角(1四)、飛(2五)、あなたの駒は龍(3二)、と(3一)、角(2二)です。\n\n残り3手ですが、何を動かしますか?\n"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n", &koma); if(koma == '龍'){ printf("どこに動かしますか? (例:「9九」なら「9 9」と入力):"); scanf_s("%d %d\n",&yoko,&tate); if((yoko==2)&&(tate==1)){ ~printf略~ printf("王手です。玉を守りましょう。最長手となるように動かしてください。\n\n残り2手ですが、何を動かしますか?\n"); printf("玉、歩、角、飛のいずれかを入力:"); scanf_s("%c\n",&koma2); if(koma2=='玉'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko2,&tate2); if((yoko2==2)&&(tate2==3)){ ~printf略~ printf("残り1手です。この1手で相手を詰みにしてください。何を動かしますか?:"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n",&koma3); if(koma3=='角'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko3,&tate3); if((yoko3==4)&&(tate3==4)){ ~printf略~ printf("あなたの勝ちです!\n"); } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } return 0; }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語のプログラミングがうまくいきません!

    先日のプログラムを作り直しました。アドバイスのおかげでエラーは減りましたが、まだ完ぺきではないようです。恐らく、elseのところがいけないと思うのですが、どうしたらいいか分かりません。 ご指摘お願いします。 #include <stdio.h> #include <math.h> void main(void) { double x ,y ,z ,error ,menseki ; double ans; printf("x ?"); scanf("%lf", &x); printf("y ?"); scanf("%lf", &y); printf("z ?"); scanf("%lf", &z); if(x<y+z || y<x+z || z<x+y) { ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); } if(x==y && y==z && z==x) { printf("正三角形です"); printf("面積は%lfです" , menseki); } else if(x==y || y==z || z==x) { printf("二等辺三角形です"); printf("面積は%lfです" , menseki); } else { printf("三角形です"); printf("面積は%lfです" , menseki); } else { printf("error"); } }

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); 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); } これで合っているかよろしくお願いします。

  • C言語で困っています。

    正の整数を入れたときに、階乗を求めるプログラムを作りたいのですが、 ↓のプログラムを起動させたら、最終的な答えが1(kaizyo=1)になって、非常に困っています。 何故なのでしょうか?それと、どこを直せばいいですか? #include<stdio.h> main() { int x; int kaizyo=1; printf("整数を入力して下さい:"); scanf("%d",&x); if(x<=0) { printf("値が不適当です。"); } else { while(x<1) { kaizyo=kaizyo*x; x=x-1; } printf("%dの階乗は%dです。",x,kaizyo); } }

  • C言語のプログラミングがうまくいきません!

    とりあえず、自分でプログラムしましたが、どこか間違っているようです。僕のプログラムを載せますので、どこが間違っているのか教えて下さい。あと、正しいプログラムを書いていただければ幸いです。 3つの辺の長さをx、y、zに代入して三角形が成立すれば、その形状と面積をヘロンの公式を使って求める。 #include <stdio.h> #include <math.h> { double x ,y, z ,error ,menseki ,ans; printf("x ?") scanf("%f" , &x); printf("y ?") scanf("%f" , &y); printf("z ?") scanf("%f" , &z); ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); if (x === y || y == z || x == z) { printf ("正三角形です"); printf("面積は%dです" , menseki); } else if (x == y || y == z || z == x) { printf("二等辺三角形です"); printf("面積は%dです" , menseki); } else { printf("三角形です"); printf("面積は%dです , menseki); if(x<y+z || y<x+z || z<x+y) { printf("error"); } }

  • プログラミングについて教えてほしいんですが・・・

    プログラミングについて教えてほしいんですが・・・ プログラミングで四則演算プログラムをやっているのですが余りの求め方がわかりません。足し算の求め方は /*lesson2.c*/ #include<stdio.h> int add(int,int); int main(){ int a,b,c; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); c=add(a,b); printf("a+b=%d\n",c); } int add(int x, int y){ return x+y; } というやり方で求めることができたのですが、余りは上のプログラムのどこを変えたらいいのでしょうか? 誰かわかる人がいたら教えてください。お願いします。

専門家に質問してみよう