2

私は絞首刑執行人プログラムに取り組んでおり、推測するたびにステータスレポートをユーザーに出力したいと思います。クラスを使用しているので、「friend」キーワードを使用する必要があります。クラスや友達の概念は大丈夫ですが、プログラムに適切に実装するのに苦労しています。

主な問題は、母音の数がカウントされておらず、ユーザーが試すことができる文字の数が更新されていないことです。毎回完全なアルファベットが表示されます。

私のプログラムのコードはかなりのものであり、ここにすべてを投稿するつもりはありません。私が抱えている問題は関数に関するものremainingLetters()です; およびvowelCount()。関連するコードスニペットを添付しました。このコードは明らかにコンパイルされません。私が見逃した明らかな間違いを誰かが見られることを願っています。

**Hangman.h:**
{
public:
...
int vowelCount()const; //to be implemented
char* remainingLetters()const;//to be implemented
friend ostream& operator<< (ostream &out, Hangman &game);

private:
...
int vowel_count;
char secretWord[MAXWORDLENGTH];
char* remaining_letters;
}

**hangman.cpp:**
{
...
int Hangman::vowelCount()const
{
  int vowel_count = 0;
  int i;
  secretWord[i];

  for(i=0; i<strlen(secretWord); i++)
  {


if(secretWord[i]=='a'||secretWord[i]=='e'||secretWord[i]=='i'||secretWord[i]=='o'||secretWord[i]=='u')
    {
      vowel_count++;
    }
  }
  return vowel_count;
}

char* Hangman::remainingLetters()const
{
  char alphabet[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  char *remaining_letters=new char[ALPHABETSIZE];

  for(int i=0; i<strlen(secretWord); i++)
  {
  for(int j=0; j<ALPHABETSIZE; j++)
    {
       if(secretWord[i]!=alphabet[j])
       {
     remaining_letters[j]=alphabet[j];
       }
    }
  } 
 return remaining_letters;
}

ostream& operator<< (ostream &out, Hangman &game)
{
    out << "Number of guesses remaining is: " << game.numGuessesAllowed-game.numWrongGuesses << endl
     << "Number of incorrect guesses so far is: "<<game.numWrongGuesses <<endl
     << "Letters remaining are: "<<game.remaining_letters <<endl
     << "Hint: The secret word contains "<<game.vowel_count <<" vowels"<<endl;

    return out;
}
}

**main.cpp**
{
...
 cout << game;
...
return 0;
}
4

2 に答える 2

2

vowelCount()関数を呼び出し、remainingLetters()対応する変数を計算する必要があります(それらを出力できるようにするため)。

また、char *remaining_letters=new char[ALPHABETSIZE];文字にメモリを割り当て、各位置を0で初期化します。これは文字列の終了値でもあります。したがって、最初の位置(文字'a')が設定されていない場合、out<<game.remaining_letters何も出力されません

さらに、この関数は、クラス内の変数(メンバー変数)を非表示にvowelCount()するローカル変数vowel_countを定義するため、メンバー変数は更新されません(vowelCount()そのメンバー変数にの戻り値を明示的に割り当てない限り)ローカル変数宣言を削除することをお勧めします関数からvowelCount()、それはあなたが必要とするものであるメンバー変数を使用します

前の段落は、メンバー変数にも適用されますremaining_letters

もう1つ、割り当てられたメモリnewは自動的に割り当て解除されません。関数呼び出しから戻ると、割り当てられたメモリは、割り当てられない限り失われます(再度アクセスする方法はありませんが、メモリを使用します)。関数が戻ったとき。new[]各呼び出しを対応する呼び出しとパリにする必要がありdelete[]ます。さらに良い方法:クラスのコンストラクターにメモリを割り当て、メンバー変数のデストラクタでメモリを削除します

注:このロジックには、さらに別のバグがあります。

for(int i=0; i<strlen(secretWord); i++) 
{ 
  for(int j=0; j<ALPHABETSIZE; j++) 
  { 
    if(secretWord[i]!=alphabet[j]) 
    { 
      remaining_letters[j]=alphabet[j]; 
    } 
  } 
}

アルファベットを循環し、秘密の単語の現在の文字が一致しないたびに、に割り当てますremaining_letters。現在のsecretWordの文字と一致しないアルファベットの文字があるため、この割り当ては毎回行われます。

これを修正するには、次のようなことを行う必要があります(ループの反転に注意してください)。

int secret_len = strlen(secretWord); // cache length, so we don't recalculate it
                                     // every time: secretWord does not change
for(int j=0; j<ALPHABETSIZE; j++) 
{ 
  bool found = false; // assume the current ABC letter is not in secretWord
  for(int i=0; i<secret_len; i++) 
  { 
    if(secretWord[i]!=alphabet[j]) 
    { 
      found = true; // but it was
    } 
  } 
  if (!found) // if it wasn't
  {
    remaining_letters[j]=alphabet[j]; 
  }
}
于 2012-04-11T17:37:55.933 に答える
1

あなたの主な問題は、クラスメンバーの母音数を維持しないことですvowel_count。ローカル変数に格納してvowel_count返しますが、クラスメンバーは更新されません。

于 2012-04-11T17:38:17.997 に答える