2012-04-12 20 views
0

Dies ist ein Anfänger C++ - Hausaufgaben-Problem, ich weiß über Vektor, aber es ist nicht erlaubt, in diesem assigment zu verwenden. Ich suchte herum und fand, wie man eine array[] von unbekannter Größe auch macht. Aber es ist ein bisschen tricky (irgendwie). Das Beispiel, das ich lese, ist in etwa wie folgt: Erhalte eine Eingabe und erstelle dann die Array-Basis an dieser Eingabe (Größe n).Array unbekannter Größe basiert auf der Eingabedatei

Ich habe diese Studentenklasse erstellt, aber jetzt brauche ich eine array, um sie zu speichern. Ich weiß nicht im Voraus, wie viele Studenten dort sein werden. Ich habe nur eine Textdatei mit jedem Schüler in einer Zeile. Das Format ist unten, das Sample ist ungefähr 5, aber ich weiß nicht, wie viel der Lehrer verwenden wird, um mein Programm zu testen.

Eingabedatei wie folgt aus:

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

Aber das Problem ist, ich weiß nicht, wie viele Schüler gibt es, bis ich den ganzen Text Kachel gelesen haben (oder ich weiß nicht, ob es andere Art und Weise sind es zu tun). Mein aktueller Ansatz ist es, Zeile für Zeile zu lesen, einen Zähler studentCounter zu erhöhen, bis ich fertig bin, dann erstelle ich meine Student* myRoster = Student[studentCounter]. Aber dann, wenn ich anfangen muss, die Datei zu lesen wieder. Und gehen Sie Zeile für Zeile, um die Informationen zu analysieren und ein Student Objekt zu erstellen und lassen Sie eine myRoster[x] darauf hinweisen. Ich habe das Gefühl, dass ich die Arbeit zweimal mache, nur um die richtige Größe zu haben. Gibt es ein paar Tricks oder Dinge, die ich vermisse?

Vielen Dank.

+0

Ich nehme an, dass Sie dann nicht std :: list verwenden können. –

+0

sprechen Sie mit Ihrem Lehrer. Entweder sollte eine maximale Anzahl an Schülern vorhanden sein oder Sie sollten einen Standardcontainer verwenden können. Wenn Sie mit beiden Recht haben, finden Sie einen neuen Lehrer/eine neue Schule. –

+0

@MooingDuck Ich bekomme die gleiche Antwort wie diese in meiner letzten Frage: O ... – George

Antwort

4

Dies ist ein einfacher Ansatz unter Verwendung von Rekursion:

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; 
} 

Dann rufen Sie es wie folgt aus:

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

Die Idee ist, nur die Zeilen zu lesen, wie Sie tiefer gehen in die Rekursion. Wenn Sie das Ende der Datei erreicht haben, wissen Sie, wie viele Studenten zuzuweisen sind. Anschließend können Sie die Zeilen analysieren und das Array in umgekehrter Reihenfolge ausfüllen, wenn Sie die Rekursion verlassen. Sie erhalten auch die Anzahl der Schüler, die über den Ausgabeparameter zurückgegeben werden.

+1

Dies ist ein gebräuchlicher Ansatz in funktionalen und logischen Sprachen, in denen Rekursion häufig verwendet wird, aber nicht so häufig in prozeduralen Sprachen. –

+0

Ich sehe, danke! – George

1

Wenn Sie ehrgeizig genug sind, können Sie ungefähr das Gleiche tun wie vector tut - ein wenig Platz zuweisen, verfolgen, wie viel von diesem Raum Sie verwenden, und wenn/wenn es voll wird, reservieren Sie ein Größere Chunk (etwa 1 1/2 oder 2 mal so groß), kopieren Sie die Daten aus dem vorherigen Block in den neuen und starten Sie die neuen Daten in den neuen Block einfügen. Wiederholen Sie dies bei Bedarf.

+0

eine rekursive Antwort wäre einfacher Ich denke –

+0

@MooingDuck Er wurde dieses Problem als Hausaufgabe gegeben, so ist die eigentliche Frage, welche Art von Antwort ist sein Professor auf der Suche: eine Neuimplementierung von 'std :: vector', oder eine ursprüngliche Lösung mit Ein anderer Versuch. (Ich mag die Eleganz der rekursiven Lösung, aber ich würde mir Sorgen machen über Dinge wie Stapelüberlauf, wenn es für eine echte Anwendung wäre.) –

0

Ist die Eingabedatei etwas, das Sie definieren oder für die Übung definiert ist?

Wenn Sie die Struktur der Datei definieren, haben Sie zwei Möglichkeiten. Sie könnten entweder

a) Machen Sie die Felder mit unterschiedlicher Länge, dann erhalten Sie nur die Dateigröße sind die Start und machen Sie eine Division, um die Anzahl der Elemente zu erhalten.

oder

b) Die erste Zeile speichert die Anzahl der Elemente in der Datei.

+0

Die Eingabedatei wird vom Lehrer geliefert, die, die ich habe, enthält nur 3- 4 Studenten. Aber ich weiß nicht, wie viele sie benutzen wird. Es könnte eine Menge sein, da wir gebeten werden, sie nach dem Nachnamen nach Alter zu sortieren. (Mit unserer eigenen Sortimplementierung) ... – George

Verwandte Themen