1

**直接の答えやコード例はありません。これは私が学ぶ必要のある宿題です。開発する必要のあるアルゴリズムに関するヘルプを探しています。

クラスの作業の一部の解決策を考え出す際に論理エラーが発生しているようです。プログラムには複数のファイルが含まれていますが、関連する部分は次のとおりです。

バスケットボール選手の統計を保持するPlayerStatsファイルがあります。

  • リバウンド
  • ポイント
  • アシスト
  • ユニフォーム #

私の最初の反応は、whileループを作成し、これらをこれらの値を保持する一時構造体に読み込んでから、一時構造体の値をレコードの最初の配列とマージするマージ関数を作成することです。

struct Baller
{
   //other information on baller
   int rebounds;
   int assists;
   int uniform;
   int points;
   void merge(Baller tmp); //merge the data with the array of records
}

//in my read function..
Baller tmp; 
int j = 0;
inFile << tmp.uniform << tmp.assists << tmp.points << tmp.rebounds
while(inFile){
    ArrayRecords[j].merge(tmp);
    j++;
    //read in from infile again
}

キャッチ:ファイルは識別子の間に任意の数のスペースを含めることができ、情報は任意の順序にすることができます(背番号を除いて、常に最初になります)。例えば

PlayerStatsは

11 p3 a12 r5 //uniform 11, 3 points 12 assists 5 rebounds
//other info

また

   11 p    3 r  5  a      12 //same exact values

私が思いついたもの


ファイルからこれらの値を正しい順序で取得するアルゴリズムを考えることができないようです。私はこれらの線に沿って何かを考えていました。

inFile << tmp.uniform; //uniform is ALWAYS first
getline(inFile,str);  //get the remaining line
int i = 0;
while(str[i] == " ") //keep going until i find something that isnt space
    i++;

if(str[i] == 'p')  //heres where i get stuck, how do i find that number now?

else if(str[i] == 'a')

eles if(str[i] = 'r'
4

2 に答える 2

1

そのようなことをしてください:

int readNumber () {
  while isdigit (nextchar) -> collect in numberstring or directly build number
  return that number;
}
lineEater () {
  Read line
  skip over spaces
  uniform=readNumber ();
  haveNum=false;
  haveWhat=false;
  Loop until eol {
    skip over spaces
    if (isdigit)
      number=readNumber ();
      skip over spaces
      haveNum=true;
    else 
      char=nextChar;
      haveWhat=true;
    if (haveChar and haveNum) {
      switch (char) {
        case 'p' : points=number; break;
        ...
      }
      haveNum=false;
      haveWhat=false;
    }
  }

または、より野心的な場合は、入力用の文法を記述し、lex/yaccを使用します。

于 2012-12-07T08:51:23.427 に答える
1

1文字だけをチェックする場合は、のswitch代わりにステートメントを使用するif / elseと、読みやすくなります。

その時点で数値がどこから始まるかがわかっているstr[i+1]ので(ヒント:)、タイプに応じて、char配列の場合、または。の場合にstr[]使用できます。atoistd::stringstreamstd::string

私はあなたにいくつかのコードを与えたくなりますが、あなたもそうは言いませんでした。必要な場合はお知らせください。コードを使用して回答を編集します。

'merge'関数を使用する代わりに、'merge'を実行する代わりに、構造std::vectorだけを使用できるように使用してみてください。push_backさらに、マージ関数は基本的にコピー代入演算子であり、デフォルトでコンパイラによって作成されます(「マージ」関数を作成する必要はありません)=。データをコピーするために使用する必要があります。'merge'関数で何か特別なことをしたい場合は、'merge'関数の代わりにコピー代入演算子をオーバーロードする必要があります。シンプル。

于 2012-12-07T08:53:24.997 に答える