Fussball_Em-Daten in Vektor schreiben
-
Hallo Leute!
Ich hoffe ihr könnt mir hier helfen, denn ich kann den Fehler in meiner Arbeit einfach nicht finden...habe schon 3 mal Schreibtischtest gemacht, kann aber den Fehler einfach nicht sehen....er muss irgendwo beim Einlesen der Daten in den Vektor passieren, denke ich...Ich weiß es ist viel zu lesen, aber ich komme hier echt nicht weiter -,-
Ich hoffe jemand von euch kann mir helfen, bin hier schon am verzweifeln...
Folgende Aufgabenstellung gilt es zu lösen:-------------------------------------------------------------------
Schreiben Sie mit Hilfe des Scanners ein C++ Programm,
das die Ergebnisse der EM-Vorrundenspiele einliest, in einer entsprechenden Datenstruktur speichert und anschließend ausgibt.
Eingabebeispiel:( "Polen": 2:1, 3:2, 1:1
"Griechenland": 1:2, 0:1, 2:0
"Russland": 0:0, 2:3, 0:2
"Tschechien": 0:0, 1:0, 1:1
)
( "Niederlande": 1:1, 3:1, 3:0
"Dänemark": 1:1, 3:1, 1:0
"Deutschland": 2:2, 1:3, 0:1
"Portugal": 2:2, 1:3,
)Pro Mannschaft werden folgende Informationen ausgegeben: Platzierung, Name der Mannschaft, Anzahl der Spiele, Anzahl der geschossenen Tore, Tordifferenz, Punkte. Die Ausgabe soll also in folgender Form dargestellt werden:
Gruppe A
--------
1 Polen 3 6 2 7
2 Tschechien 3 2 1 5
3 Griechenland 3 3 0 3
4 Russland 3 2 -3 1Gruppe B
--------
1 Niederlande 3 7 5 7
2 Dänemark 3 5 3 7
3 Deutschland 3 3 -3 1
4 Portugal 3 3 -5 1------------------------------------------------------ENDE DER ANGABE
wie ich hier Tordifferenz ermittle etc ist erstmal unwichtig, das stimmt sicher ist ja ned schwer! Ich haeb aber ein Problem mit dem Einlesen in den Vektor allgemein!
Aktuell sieht meine Ausgabe noch etwa so aus ( die Funktion, welche die mannschaften nach Rängen sortiert fehlt hier noch, deshalb ist hier die Reihenfolge der Mannschaften noch anders als oben beschrieben):Gruppe A
--------
1Polen 3 6 2 7
2Griechenland 3 3 0 3
3Russland 3 2 -3 1
4 31717986916 0 3Gruppe B
--------
1Niederlande 3 7 5 7
2Dõnemark 3 5 3 7
3Deutschland 3 3 -3 1
4 31717986916 0 3WICHTIG!:
Wie man sehen kann wird bei mir jeweils die letze Nation nicht eingelesen...
oder liegts an der Ausgabe?
Ich poste euch jetzt einmal die verantwortlichen Funktionen meiner Lösung:-----------------------------------------------------------------
Grundsätzlicher Aufbau meiner Daten:
Header:struct PairOfValues{
int FirstValue;
int SecondValue;
};struct OneNation{
std::string Nation;
PairOfValues FirstMatch;
PairOfValues SecondMatch;
PairOfValues ThirdMatch;
};class OneGroup {
public:
// Default - CTOR
OneGroup();//DTOR
~OneGroup();void SetNations(OneNation const Nation, int NationCounter);
OneNation GetNations(int NationCounter);private:
OneNation mNation1;
OneNation mNation2;
OneNation mNation3;
OneNation mNation4;
};// Vektor enthält alle Gruppenobjekte, also alle Informationen aus dem Eingabestrom
typedef std::vector <OneGroup> DataVector;// ------------------Funktionen---------------------
// GetData
void GetData(std::string Datapath, DataVector & Vect);// Print
void Print(std::ostream & ost, DataVector Vect);// ------------------Konstanten---------------------
int const NumberOfMatchesTotal = 3;
int const MinMemberCounterSize = 1;
int const MaxMemberCounterSize = 4;int const MinMatchCounterSize = 1;
int const MatchCounterSize2 = 2;
int const MatchCounterSize3 = 3;
int const MatchCounterSize4 = 4;
int const MatchCounterSize5 = 5;
int const MaxMatchCounterSize = 6;--------------------------------------------------------------------HEADER ENDE
HIER LIEGT IRGENDWO DER FEHLER BEGRABEN:
--------------------------------------------------------------------
Print-Funktion und ReadData
--------------------------------------------------------------------void GetData(std::string Datapath, DataVector & Vect)
{
ifstream File(Datapath);if (!File) {
throw std::string("File does not exist at all!");
}
scanner scan(File);OneGroup Group; // Gruppe erstellen
OneNation Nation; // Nation erstellenint MemberCounter = 0;
int MatchCounter = 0;while (!scan.eof ())
{
if(scan.symbol_is_string() || scan.symbol_is_integer()){if(scan.symbol_is_string()){ // String in nation aufnehmen
Nation.Nation = scan.get_string();
++MemberCounter;
//scan.next_symbol();
}// Struktur füllen
if(scan.symbol_is_integer()) // NO MAGIC NUMBERS!
{
++MatchCounter;if(MatchCounter == MinMatchCounterSize){
Nation.FirstMatch.FirstValue = scan.get_integer();
}
else if(MatchCounter == MatchCounterSize2){
Nation.FirstMatch.SecondValue = scan.get_integer();
}
else if(MatchCounter == MatchCounterSize3){
Nation.SecondMatch.FirstValue = scan.get_integer();
}
else if(MatchCounter == MatchCounterSize4){
Nation.SecondMatch.SecondValue = scan.get_integer();
}
else if(MatchCounter == MatchCounterSize5){
Nation.ThirdMatch.FirstValue = scan.get_integer();
}
else if(MatchCounter == MaxMatchCounterSize){
Nation.ThirdMatch.SecondValue = scan.get_integer();
}
}// schreibe Nation auf entsprechenden PrivateMember
if(MatchCounter == MaxMatchCounterSize){
Group.SetNations(Nation, MemberCounter);
MatchCounter = 0;
}// Gruppe in Vektor einfüllen
if(MemberCounter == MaxMemberCounterSize){
Vect.push_back(Group);
cout << "Gruppe in Vektor legen" << endl;
cout << "Size des Vektors: " << Vect.size() << endl;
MemberCounter = 0;
}
}
scan.next_symbol();
}
File.close();
}void Print(std::ostream & ost, DataVector Vect){
char const chGroup = 'A';
ost << endl;
for(size_t counter = 0; counter < Vect.size(); ++counter){
char letter = (char) chGroup + counter; // cooler Trick

ost << "Gruppe " << letter << endl << "--------" << endl;
// was hier noch fehlt: Sortiere jeweils die Objekte nach Rang -----> Funtion schreiben!!
// Alle Mannschaften auf Outstream schreiben laut Angabe
for (int cnt = MinMemberCounterSize; cnt <= MaxMemberCounterSize; ++cnt){
OneNation Nat = Vect[counter].GetNations(cnt);
ost << setfill(' ') << right << setw(0) << cnt;
ost << setw(15) << left << Nat.Nation;
ost << setw(4) << right << NumberOfMatchesTotal;
ost << setw(4) << NumberOfGoals(Nat);
ost << setw(4) << DifferenceOfGoals(Nat);
ost << setw(4) << SumUpPoints(Nat) << endl;
}
ost << endl;
}
ost << endl;
}--------------------------------------------------------------------------ENDE
-
Lies bitte ganz ganz dringend mal den ersten Link in meiner Signatur und stell deine Frage noch mal so, dass man auch etwas damit anfangen kann.
-
Bitte benutze die cpp-Code-Tags.
Dann lese ich´s durch!
-
Sry hier noch einmal der ganze Post mit Tags und Form
-------------------------------------
Hallo Leute!
Ich hoffe ihr könnt mir hier helfen, denn ich kann den Fehler in meiner Arbeit einfach nicht finden...habe schon 3 mal Schreibtischtest gemacht, kann aber den Fehler einfach nicht sehen....er muss irgendwo beim Einlesen der Daten in den Vektor passieren, denke ich...Ich weiß es ist viel zu lesen, aber ich komme hier echt nicht weiter -,-
Ich hoffe jemand von euch kann mir helfen, bin hier schon am verzweifeln...
Folgende Aufgabenstellung gilt es zu lösen:-------------------------------------------------------------------ANGABE
Schreiben Sie mit Hilfe des Scanners ein C++ Programm,
das die Ergebnisse der EM-Vorrundenspiele einliest, in einer entsprechenden Datenstruktur speichert und anschließend ausgibt.
Eingabebeispiel:( "Polen": 2:1, 3:2, 1:1
"Griechenland": 1:2, 0:1, 2:0
"Russland": 0:0, 2:3, 0:2
"Tschechien": 0:0, 1:0, 1:1
)
( "Niederlande": 1:1, 3:1, 3:0
"Dänemark": 1:1, 3:1, 1:0
"Deutschland": 2:2, 1:3, 0:1
"Portugal": 2:2, 1:3,
)Pro Mannschaft werden folgende Informationen ausgegeben: Platzierung, Name der Mannschaft, Anzahl der Spiele, Anzahl der geschossenen Tore, Tordifferenz, Punkte. Die Ausgabe soll also in folgender Form dargestellt werden:
Gruppe A
--------
1 Polen 3 6 2 7
2 Tschechien 3 2 1 5
3 Griechenland 3 3 0 3
4 Russland 3 2 -3 1Gruppe B
--------
1 Niederlande 3 7 5 7
2 Dänemark 3 5 3 7
3 Deutschland 3 3 -3 1
4 Portugal 3 3 -5 1------------------------------------------------------ENDE DER ANGABE
wie ich hier Tordifferenz ermittle etc ist erstmal unwichtig, das stimmt sicher ist ja ned schwer! Ich haeb aber ein Problem mit dem Einlesen in den Vektor allgemein!
Aktuell sieht meine Ausgabe noch etwa so aus ( die Funktion, welche die mannschaften nach Rängen sortiert fehlt hier noch, deshalb ist hier die Reihenfolge der Mannschaften noch anders als oben beschrieben):Gruppe A
--------
1Polen 3 6 2 7
2Griechenland 3 3 0 3
3Russland 3 2 -3 1
4 31717986916 0 3Gruppe B
--------
1Niederlande 3 7 5 7
2Dõnemark 3 5 3 7
3Deutschland 3 3 -3 1
4 31717986916 0 3WICHTIG!:
Wie man sehen kann wird bei mir jeweils die letze Nation nicht eingelesen...
oder liegts an der Ausgabe?
Ich poste euch jetzt einmal die verantwortlichen Funktionen meiner Lösung:-----------------------------------------------------------------
Grundsätzlicher Aufbau meiner Daten:Header:
struct PairOfValues{ int FirstValue; int SecondValue; }; struct OneNation{ std::string Nation; PairOfValues FirstMatch; PairOfValues SecondMatch; PairOfValues ThirdMatch; }; class OneGroup { public: // Default - CTOR OneGroup(); //DTOR ~OneGroup(); void SetNations(OneNation const Nation, int NationCounter); OneNation GetNations(int NationCounter); private: OneNation mNation1; OneNation mNation2; OneNation mNation3; OneNation mNation4; }; // Vektor enthält alle Gruppenobjekte, also alle Informationen aus dem Eingabestrom typedef std::vector <OneGroup> DataVector; // ------------------Funktionen--------------------- // GetData void GetData(std::string Datapath, DataVector & Vect); // Print void Print(std::ostream & ost, DataVector Vect); // ------------------Konstanten--------------------- int const NumberOfMatchesTotal = 3; int const MinMemberCounterSize = 1; int const MaxMemberCounterSize = 4; int const MinMatchCounterSize = 1; int const MatchCounterSize2 = 2; int const MatchCounterSize3 = 3; int const MatchCounterSize4 = 4; int const MatchCounterSize5 = 5; int const MaxMatchCounterSize = 6;--------------------------------------------------------------------HEADER ENDE
HIER LIEGT IRGENDWO DER FEHLER BEGRABEN:
-------------------------------------------------------------------- Print-Funktion und ReadData -------------------------------------------------------------------- void GetData(std::string Datapath, DataVector & Vect) { ifstream File(Datapath); if (!File) { throw std::string("File does not exist at all!"); } scanner scan(File); OneGroup Group; // Gruppe erstellen OneNation Nation; // Nation erstellen int MemberCounter = 0; int MatchCounter = 0; while (!scan.eof ()) { if(scan.symbol_is_string() || scan.symbol_is_integer()){ if(scan.symbol_is_string()){ // String in nation aufnehmen Nation.Nation = scan.get_string(); ++MemberCounter; //scan.next_symbol(); } // Struktur füllen if(scan.symbol_is_integer()) // NO MAGIC NUMBERS! =D { ++MatchCounter; if(MatchCounter == MinMatchCounterSize){ Nation.FirstMatch.FirstValue = scan.get_integer(); } else if(MatchCounter == MatchCounterSize2){ Nation.FirstMatch.SecondValue = scan.get_integer(); } else if(MatchCounter == MatchCounterSize3){ Nation.SecondMatch.FirstValue = scan.get_integer(); } else if(MatchCounter == MatchCounterSize4){ Nation.SecondMatch.SecondValue = scan.get_integer(); } else if(MatchCounter == MatchCounterSize5){ Nation.ThirdMatch.FirstValue = scan.get_integer(); } else if(MatchCounter == MaxMatchCounterSize){ Nation.ThirdMatch.SecondValue = scan.get_integer(); } } // schreibe Nation auf entsprechenden PrivateMember if(MatchCounter == MaxMatchCounterSize){ Group.SetNations(Nation, MemberCounter); MatchCounter = 0; } // Gruppe in Vektor einfüllen if(MemberCounter == MaxMemberCounterSize){ Vect.push_back(Group); cout << "Gruppe in Vektor legen" << endl; cout << "Size des Vektors: " << Vect.size() << endl; MemberCounter = 0; } } scan.next_symbol(); } File.close(); } // Print erhält einen befüllten Vektor und schreibt auf einen Outstream void Print(std::ostream & ost, DataVector Vect){ char const chGroup = 'A'; ost << endl; for(size_t counter = 0; counter < Vect.size(); ++counter){ char letter = (char) chGroup + counter; // cooler Trick ;) ost << "Gruppe " << letter << endl << "--------" << endl; // was hier noch fehlt: Sortiere jeweils die Objekte nach Rang -----> Funtion schreiben!! // Alle Mannschaften auf Outstream schreiben laut Angabe for (int cnt = MinMemberCounterSize; cnt <= MaxMemberCounterSize; ++cnt){ OneNation Nat = Vect[counter].GetNations(cnt); ost << setfill(' ') << right << setw(0) << cnt; ost << setw(15) << left << Nat.Nation; ost << setw(4) << right << NumberOfMatchesTotal; ost << setw(4) << NumberOfGoals(Nat); ost << setw(4) << DifferenceOfGoals(Nat); ost << setw(4) << SumUpPoints(Nat) << endl; } ost << endl; } ost << endl; }--------------------------------------------------------------------------ENDE
-
Ach ja eventuell auch noch interessant sind die klasseninternen Funktionen SetNations und GetNations....
sehen folgendermaßen aus:
// NationCounter gibt an auf welchen Private-Member geschrieben wird void OneGroup::SetNations(OneNation const Nation, int NationCounter){ if (NationCounter == 1){ this -> mNation1 = Nation; } else if (NationCounter == 2){ this -> mNation2 = Nation; } else if (NationCounter == 3){ this -> mNation3 = Nation; } else if (NationCounter == 4){ this -> mNation4 = Nation; } else { cout << "Fehler bei der Funktion: SetNations) kein passendes Unterobjekt gefunden" << endl; } } // NationCounter gibt an, welcher Private-Member returniert werden soll OneNation OneGroup::GetNations(int NationCounter){ if (NationCounter == 1){ return this -> mNation1; } else if (NationCounter == 2){ return this -> mNation2; } else if (NationCounter == 3){ return this -> mNation3; } else if (NationCounter == 4){ return this -> mNation4; } else { cout << "Fehler bei der Funktion: GetNations) kein passendes Unterobjekt gefunden" << endl; return mNation1; // um etwas zu returnen } }
-
Die klasse kenne ich nicht.
scanner scan(file)sieht selbstgeschrieben aus und wäre interessant den code davon zu sehen. Wenn es eine klasse aus der Standardbib ist dann wüsste ich gern was ich dafür includen muss.
-
Der Scanner ist tatsächlich selbstgeschrieben, allerdings nicht von mir, sondern von einem unserer vortragenden Dozenten.
Dort liegt der Fehler aber ohnehin nicht, denn ich habe mit dem Scanner schon oft gearbeitet bislang ohne Probleme!
Es sind eingie Files und ein header-Include notwendig um ihn verwenden zu können.
Die von mir in diesem Beispiel verwendeten Funktionen des Scanners sind:
scan.next_symbol():
liest das nächste Symbol ein (leerzeichen werden überlesen)scan.symbol_is_integer():
Prüft, ob aktuell betrachtetes Symbol ein Integer istscan.symbol_is_string():
prüft, ob stringscan.eof():
prüft ob das Ende des Inputs erreicht ist------------------------------------
einzulesende Backus-Naur-Form (lautet vom Aufbau IMMER gleich)(
"Polen" : 2 : 1 , 3 : 2 , 1 : 1
"Griechenland" : 1 : 2 , 0 : 1 , 2 : 0
"Russland" : 0 : 0 , 2 : 3 , 0 : 2
"Tschechien" : 0 : 0 , 1 : 0 , 1 : 1
)(
"Niederlande" : 1 : 1 , 3 : 1 , 3 : 0
"Dänemark" : 1 : 1 , 3 : 1 , 1 : 0
"Deutschland" : 2 : 2 , 1 : 3 , 0 : 1
"Portugal" : 2 : 2 , 1 : 3, 0 : 3
)
-
Es handelt sich glaube ich eher um einen Logikfehler beim Einlesen in den Vektor oder bei der Ausgabe, da IMMER lediglich das letze Element(Mannschaft) einer Gruppe nicht eingetragen wird...
-
Dann geh doch mal mit einem Debugger durch das Programm. Dann kannst du sehen, ob der Fehler beim Ausgeben oder beim Einlesen liegt, da du direkt in die Datentstrukturen gucken kannst. Wenn du dann weißt, wo das Problem liegt, kannst du an der fraglichen Stelle genauer den Programmverlauf ansehen und nachvollziehen wann und warum das Programm vom von dir erwarteten Ablauf abweicht.
Für uns hingegen ist dein Problem praktisch nicht nachvollziehbar. Du zeigst viel zu viel Code, der vermutlich größtenteils irrelevant ist, trotzdem sind uns die entscheidenden Klassen nicht bekannt und compilieren und selber ausprobieren ist auch nicht drin. Da können wir nur Hilfe zur Selbsthilfe geben, siehe erster Absatz.
-
Ich denke auch nicht das die scanner-klasse das problem ist, jedoch würde ich es gerne Compilieren und dann mit dem debugger durchgehen, so findet der Fehler sich schnell.
SeppJ war schneller.