質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2分探索木 数字当てゲーム

earth1362
earth1362

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2回答

0グッド

0クリップ

544閲覧

投稿2022/03/05 04:08

2分探索木を用いて数字当てゲームを作っています。
以下のコードで実行すると解答回数の上限で正解した場合でも
"残念!"が出てしまいます。
ex)
数値を入力してください:49
正解!残念!正解は49でした
どこを改善したら良いか教えていただけるとありがたいです。

C

1コード 2#include <stdio.h> 3#include <stdlib.h> 4#include<time.h> 5 6int main(void){ 7 srand(time(NULL)); 8 printf("レベルを選んでください\n"); 9 printf("(1)1~9 (2)1~99 (3)1~999 (4)1~9999\n"); 10 11 int i,k; 12 scanf("%d",&i); 13 int ans; 14 15 if(i == 1){ 16 k = 9; 17 ans == 1 + rand()%9; 18 } 19 if(i == 2){ 20 k = 99; 21 ans == 1 + rand()%99; 22 } 23 if(i == 3){ 24 k = 999; 25 ans == 1 + rand()%999; 26 } 27 if(i == 4){ 28 k = 9999; 29 ans == 1 + rand()%9999; 30 } 31 int count = 0; 32 do{ 33 k = k/2; 34 count++; 35 }while(k != 1); 36 37 int kaisuu =count; 38 int kaitou,miss; 39 miss = 0; 40 41 do{ 42 printf("数値を入力せよ:"); 43 scanf("%d",&kaitou); 44 if(kaitou == ans) 45 printf("正解!"); 46 else{ 47 if(kaitou > ans) 48 printf("もっと小さいよ\n"); 49 else 50 printf("もっと大きいよ\n"); 51 miss++; 52 }while(ans != kaitou &&kaisuu--); 53 if(count == miss) 54 printf("残念!正解は%dでした\n"); 55 return 0; 56}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/03/05 10:15

ご質問とは関係ないですが、 > 2分探索木を用いて数字当てゲームを作っています。 2分探索木がドコにあるでしょうか。
earth1362

2022/03/06 04:25

最初のdo while文で、回答者自身が2分探索で数値を当てようとした場合の回答数として適当なものを計算させました。 二分探索木とは違ったかもしれません。 ご指摘ありがとうございます。

回答2

1

最初のdo while文で、回答者自身が2分探索で数値を当てようとした場合の回答数として適当なものを計算させました。

c

1 int count = 0; 2 do{ 3 k = k/2; 4 count++; 5 }while(k != 1);

のことですね。
2で割っているので "2分" 風ではありますが、2分してどちらかを選択するような"探索"はしていませんので「2分探索」でも無いように思います。

c

1#include <stdio.h> 2 3//(正数の)最上位ビット位置(0~)を2分探索で得る. 4//0以下を指定すると -1 を返す. 5int getHighBitIndex(int k) { 6 if(k <= 0) return -1; 7 int i = 0; 8 int bitlen = 8 * sizeof(k); //2^n であること 9 for(int j=bitlen>>1; j>0; j>>=1) { 10 int mask = (1 << j) - 1; 11 if(k & (mask << j)) { k >>= j; i += j; } 12 } 13 return i; 14} 15 16int main(void){ 17 int v[] = { 0, 1, 9, 99, 999, 9999 }; 18 for(int i=0; i<sizeof(v)/sizeof(v[0]); i++) { 19 printf("0x%04x = %d\n", v[i], getHighBitIndex(v[i])); 20 } 21}

plain

10x0000 = -1 20x0001 = 0 30x0009 = 3 40x0063 = 6 50x03e7 = 9 60x270f = 13

投稿2022/03/06 07:44

jimbe

総合スコア10808

earth1362👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

earth1362

2022/03/08 05:49

確かに誤解していました。 ご指摘ありがとうございます。

1

ベストアンサー

いろいろとおかしいですね・・・

ans == 1 + rand()%9; では変数に代入できてないです。
do-while の対応も取れていないです。
kaisuuという変数が余計なことをしています。

ざっと修正してみました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include<time.h> 4 5int main(void){ 6 srand(time(NULL)); 7 printf("レベルを選んでください\n"); 8 printf("(1)1~9 (2)1~99 (3)1~999 (4)1~9999\n"); 9 10 int i,k; 11 scanf("%d",&i); 12 if(i == 1) 13 k = 9; 14 else if(i == 2) 15 k = 99; 16 else if(i == 3) 17 k = 999; 18 else 19 k = 9999; 20 int ans = 1 + rand()%k; 21 int count = 0; 22 for (; k != 1; k /= 2) 23 count++; 24 printf("挑戦回数 %d回\n", count); 25 26 int kaitou; 27 int miss = 0; 28 do{ 29 printf("数値を入力せよ:"); 30 scanf("%d",&kaitou); 31 if(kaitou == ans) 32 printf("正解!"); 33 else{ 34 if(kaitou > ans) 35 printf("もっと小さいよ\n"); 36 else 37 printf("もっと大きいよ\n"); 38 miss++; 39 } 40 }while(ans != kaitou && miss < count); 41 if(miss == count) 42 printf("残念!正解は%dでした\n", ans); 43 return 0; 44}

投稿2022/03/05 06:53

編集2022/03/05 07:05
shiracamus

総合スコア5394

earth1362👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

earth1362

2022/03/06 04:21

元の回答の while(ans != kaitou && kaisuu--) は、この行で条件判断をしてからkaisuuを1つ減らすという訳ではないということですか?
shiracamus

2022/03/06 04:45 編集

私のコードを kaisuu-- を使うように変更してみてください。 1回多く回答できて、miss == count のときに正解すると残念メッセージも表示されます。
earth1362

2022/03/08 05:41

2回目の do~while文で1回多く繰り返していることに気がつけました。 ありがとうございます!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。