2

私は、C++ を使用したテキストの原則と実践でいくつかの質問に取り組んでおり、問題が発生している特定の質問は次のとおりです。ユーザーは 1 から 100 までの数字を考える必要があり、コンピューターは一連の推測によって質問が何であるかを判断します。

現在のコードは、数値 1 を除いて機能します (2 で割るときに整数が切り捨てられるため)。これを修正する方法が思いつかないようです。

現在のソースコードは次のとおりです。

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 1;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while((high-low)!=1){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

system("pause");
return 0;
}
4

3 に答える 3

2

while((high-low)!=1)while 式として選択することの背後にある考えは何ですか?

highあなたのコードは基本的に言っています -との差lowが 1 の場合、正しい数は でなければなりませんhigh。そのため、誰かが最小値 (この場合は 1 ) を選択すると機能しません。

最低値lowが としてユーザーに表示されるようにする必要がありますguess

だから - あなたのコードをステップスルー:

MIN_VALUEあなたが1 を持っていて、プレーヤーが数の考えとして 1 を選択した例を使用してみましょう。ここで、highが 3 でguessが 2 の場合、while ループを通過し、プレイヤーは選択した数が より小さいか等しいかを尋ねられたときに「Y」と答えるため、最終的にguess2にhighなります。

興味深いことにguess、 は だけ減るので 2 のまま(high-low)/2です。これは 0 に切り捨てられguessます。これは、 が最低値に到達しないことを意味します。これは問題です。

続行 - 次に while 式を評価すると、false が返されます ( 2-1 == 1 であるため)。

そして、あなたは戻りますhigh(現在は 2 です)。

したがって、2つの問題があると思います。

1) 自分guessが 0 で減っていることに気付いた場合、プレーヤーの数に対する考えは である必要があり、これをコンピュータの推測としてユーザーに提示できるように にlow設定guessする必要があります。low

highそして 2)との差lowが 1の場合、while ループに入ることができるようにする方法を見つける必要がありguessますlow

誰かが投稿した

while(high > low)

私は大丈夫だと思います。

highただし、 a)との差がいつ 1 になるかを確認する必要もあります。なぜなら、a) 無限に 0lowだけ減らしたくないからです。b) 数の考え方は、この時点にある必要があります。guesslow

そう:

while((high>low){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n"` ;
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        if( high-low == 1)
        {
          guess = low;
        }
        else
        {
          guess -= ( high - low ) / 2; 
        }
    }
于 2013-11-14T15:48:24.997 に答える
1

このプログラムには 3 つの欠陥がありますが、単独では機能しない 1 つだけが修正されています。

  • ループの正しい終了条件は、推測された数が 1 および の場合を除いて、も終了while(guess>low)もありません。 while(high>low)while(guess!=high)guess=low

  • 最小値は 0 に設定するconst int MIN_VALUE = 0;必要があります。そうしないと、数字 1 に対して 8 つの推測が必要になりますが、7 つの質問しか許可されません。また、数値 1 の条件が満たされる前にループが終了するのを防ぎます。

  • 推測された数に達すると、推測が低く設定され、ループが終了します。

    if(high-low==1) guess=low;
    else guess -= ( high - low ) / 2;

以下の修正およびテスト済みのコードを参照してください。

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 0;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while(guess>low){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        if(high-low==1) guess=low;
        else guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

return 0;
}
于 2018-10-17T06:16:55.327 に答える
0

did you try:

while(high>low){
...
}
于 2013-11-14T15:00:25.283 に答える