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

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

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

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

Q&A

解決済

2回答

1071閲覧

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

earth1362

総合スコア11

C

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

0グッド

0クリップ

投稿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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/03/05 10:15

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

2022/03/06 04:25

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

回答2

0

最初の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

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earth1362

2022/03/08 05:49

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

0

ベストアンサー

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

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

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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回多く繰り返していることに気がつけました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問