• ベストアンサー

このプログラミングで。

#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; } これを実行して 等しくないときハァ?と表示させて、ふたたび、入力をさせる方法を教えてください。何度でも入力を求める方法もありましたら教えていただきたいです。 とても理解に苦しむような質問ですがよろしくおねがいします。

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

  • ベストアンサー
回答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