2012-04-12 14 views
0

これは初心者のC + +の宿題の問題です。私はベクトルについて知っていますが、この同意では使用できません。私は周りを検索し、私はあまりにも不明なサイズのarray[]を作る方法を見つけた。しかし、それは少しトリック(並べ替え)です。私が読んだ例は、すべての行に沿っています:入力を取得し、その入力(サイズn)で配列ベースを作成します。入力ファイルの未知のサイズの配列の配列

私はこの学生クラスを作成しましたが、今はそれらを保存するためにarrayが必要です。私は事前にどれくらい多くの生徒がいるか分からない。私は各生徒に1行のテキストファイルを入力しているだけです。フォーマットは以下のとおりですが、サンプルは約5ですが、教師が自分のプログラムをテストするために使用するサンプル数はわかりません。このような

入力ファイル:

George Chan Computer_Science New York 23 
Johnny Chan Computer_Science New Jersery 22 
.... 

しかし、問題は、私は他の方法がある場合や、私は知りません(テキスト全体のタイルを読み終わるまでそこにどのように多くの学生がわからないですそれをするために)。私の現在のアプローチは、行ごとにそれを読んで、終了するまでカウンタstudentCounterをインクリメントしてから、Student* myRoster = Student[studentCounter]を作成します。しかし、その後、私はファイルを読むことを開始する必要があります再び。そして、行ごとに情報を解析し、Studentオブジェクトを作成し、myRoster[x]がそれを指し示すようにします。私はちょうどちょうど正しいサイズを持つために仕事を二度やっているような気がします。私が行方不明のいくつかのトリックやものはありますか?

ありがとうございます。

+0

std :: listを使用することはできません。教師に話してください。 –

+0

最大数の学生がいるか、標準のコンテナを使用できるはずです。両方のことについて正しいのであれば、新しい教師/学校を探してください。 –

+0

@MooingDuck私は最後の質問でこれと同じ答えを得ます:O ... – George

答えて

4

は、再帰を使用して1つの単純なアプローチです:

Student* readStudents(istream& infile,int& n_students) 
{ 
    string line = readLine(infile); 
    if (!infile) { 
    return new Student[n_students]; 
    } 
    int index = n_students++; 
    Student* students = readStudents(infile,n_students); 
    students[index] = parseLine(line); 
    return students; 
} 

は、その後、あなたはこのようにそれを呼び出す:

int n_students = 0; 
Student* students = readStudents(infile,n_students); 

アイデアは、ちょうどあなたが再帰に深くうとしているとして、ラインを読むことです。ファイルの終わりに達するまでに、割り当てられる学生の数が分かります。そして、再帰から出てくるように、行を解析して逆の順序で配列を塗りつぶすことができます。出力パラメータで返された生徒の数も取得します。

+1

これは、再帰が広範に使用されるが、手続き型言語では一般的ではない機能的および論理的言語における一般的なアプローチである。 –

+0

私は、ありがとう! – George

1

野心的だとすれば、vectorとほぼ同じことができます。スペースをいくつか割り当て、使用しているスペースの量を把握し、満杯になると、より大きなチャンク(1 1/2または2倍の大きさのようなもの)を作成し、前のブロックのデータを新しいブロックにコピーし、新しいデータを新しいブロックに挿入し始めます。必要に応じて繰り返します。

+0

再帰的な答えがより簡単になると思います –

+0

@MooingDuck彼は宿題としてこの問題を与えられました。実際の質問は、教授が探しているのはどのような答えですか: 'std :: vector'の再実装、別のアプローチ。 (私は再帰的ソリューションの優雅さが気に入っていますが、実際のアプリケーションの場合はスタックオーバーフローなどのことを心配しています) –

0

入力ファイルは、あなたが定義したものか、練習用に定義されたものですか?

ファイルの構造を定義する場合、2つの選択肢があります。

a)ファイルのサイズを取得してから、ファイルサイズを取得して、アイテムの数を取得することができます。

または

b)最初の行にファイルの項目数が格納されます。ここで

+0

入力ファイルは教師によって提供される予定ですが、 4人の学生。しかし、私は彼女がどれだけ多く使うのか分かりません。私たちは姓、年齢順に並べ替えるように求められているので、たくさんあるかもしれません。 ... – George