Array an Klasse übergeben
-
Wie lautet die Aufgabenstellung denn genau?
Und wo hast du die Aufgabe her?
-
Silverlane schrieb:
In der Aufgabenstellung ist das Array so vorgegeben. Das mit dem std::vector und std::array kenn ich leider garnicht
Ist dein Lehrer jemand der vor 40 Jahren mal COBOL gelernt hat, seither bloß mal ein bisschen C++ Syntax gelernt hat und euch nun wie ein König regiert, der keine Widerrede duldet? Oder würde er sich freuen, auch mal richtiges C++ beigebracht zu bekommen?
edit: Falls die Aufgabe nicht von einem Lehrer kommt, sondern aus einem Tutorial oder Buch: Wegwerfen.
-
Ist ne Klausuraufgabe vom letzten Jahr.
Programmiere eine komplette Klasse Ligastatistik, um Informationen über
Abschlusstabellen von Fußballligen in den Jahren 2000 – 2009 zu speichern und
auszuwerten. Dabei soll für jedes Jahr gespeichert werden, wie viel Punkte auf einem Tabellenplatz erreicht wurden.Für eine Beispielliga liegen die Initialisierungsdaten bereits im Hauptprogramm vor.
- Dem Konstruktor sollen diese Daten übergeben werden, die Bezeichnung der Liga
und die Anzahl der Vereine. Dabei sollen „echte“ Kopien der Daten im Objekt
abgespeichert werden, nicht nur Verweise auf die entsprechenden Variablen im
Hauptprogramm. Die Anzahl der Vereine in der Liga soll flexibel sein (maximal 32), also nicht wie im Beispiel auf 18 beschränkt sein.- In einer Ausgabemethode soll nach Übergabe von Jahr und Platz als Parameter
ausgegeben werden, wie viel Punkte auf diesem Tabellenplatz erreicht wurden.- In weiteren Berechnungsmethoden sollen folgende Größen ermittelt und
ausgegeben werden:
1. Durchschnittspunktzahl für einen bestimmten Platz (gemittelt über alle Jahre),
2. Minimalzahl der Punkte, die auf einem bestimmten Platz auftraten,
3. Anzahl der Mannschaften, die in allen Jahren mindestens eine als Parameter
übergebene Punktzahl erreicht haben.Folgendes Hauptprogramm soll möglich sein:
int main(void)
{ // Jahr 2000 01 02 03 04 05 06 07 08 09
int pt [19][10]= {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Dummy
{63, 70, 75, 74, 77, 75, 70, 76, 69, 70}, // Platz 01
{62, 69, 59, 68, 63, 70, 68, 66, 67, 65}, // Platz 02
{58, 68, 58, 65, 59, 68, 66, 64, 64, 61}, // Platz 03
{57, 61, 56, 64, 58, 61, 60, 54, 63, 59}, // Platz 04
{56, 61, 54, 56, 58, 52, 51, 54, 61, 57}, // Platz 05
{55, 56, 52, 55, 57, 48, 48, 52, 59, 55}, // Platz 06
{53, 56, 49, 50, 55, 46, 45, 51, 55, 52}, // Platz 07
{50, 50, 46, 49, 51, 44, 45, 49, 50, 50}, // Platz 08
{47, 50, 45, 44, 48, 43, 44, 46, 49, 47}, // Platz 09
{46, 46, 45, 42, 45, 42, 44, 44, 45, 46}, // Platz 10
{44, 40, 43, 39, 43, 38, 44, 43, 40, 42}, // Platz 11
{43, 39, 42, 39, 42, 38, 42, 41, 39, 39}, // Platz 12
{41, 35, 41, 38, 40, 37, 41, 40, 33, 38}, // Platz 13
{39, 34, 40, 37, 38, 36, 40, 36, 32, 35}, // Platz 14
{38, 34, 40, 36, 36, 34, 37, 34, 31, 33}, // Platz 15
{35, 30, 36, 32, 35, 33, 34, 31, 30, 31}, // Platz 16
{35, 29, 30, 32, 30, 30, 34, 30, 29, 28}, // Platz 17
{27, 22, 30, 23, 18, 27, 26, 29, 28, 24}};// Platz 18Ligastatistik bundesliga("Fussballbundesliga", 18, pt);
bundesliga.ausgabe(2008, 5); // Punkte für Platz 5 im Jahr 2008
bundesliga.average(1); // Durchschnitt für Platz 1
bundesliga.minimum(16); // Minimum für Platz 16
bundesliga.anzahlProPunkte(70); // Anzahl der Teams mit mindestens 70 PunktenEs soll etwa folgende Ausgabe erzeugen:
Punkte fuer Platz 5 im Jahr 2008: 61
Durchschnitt der Punkte fuer Platz 1: 71.9
Minimum der Punkte fuer Platz 16: 30
Anzahl der Teams mit mindestens 70 Punkten: 9
-
#include <iostream> #include <cstdlib> #include <windows.h> #include <vector> using namespace std; //------------------------------------------------------------------------------ class Liga { public: Liga (vector<vector<short>> a) :tab(a){} inline void platz_ausgabe(); inline void p_durchschnitt (); inline void p_minimum (); inline void anz_punkte (); private: vector<vector<short>> tab; static const int platz=5; static const int jahr=2008; static const int platz_d=1; static const int platz_m=16; static const int punkte_min=70; }; //------------------------------------------------------------------------------ inline void Liga::platz_ausgabe(){ cout << "Punkte fuer Platz " << platz << " im Jahr " << jahr << " :\t" << tab.at(platz).at(jahr-2000) << endl; } //------------------------------------------------------------------------------ inline void Liga::p_durchschnitt (){ float p_durchs; for (int i=0; i<10; i++){ p_durchs += tab.at(platz_d).at(i); } cout << "Durchschnittliche Punkte fuer Platz " << platz_d << ":\t" << p_durchs/10 << endl; } //------------------------------------------------------------------------------ inline void Liga::p_minimum (){ int p_mini; for (int i=2; i<tab.at(platz_m).size(); i++) if (tab.at(platz_m).at(i) < tab.at(platz_m).at(i-1)) p_mini=i; cout << "Minimale Punkte fuer Platz " << platz_m << ":\t" << tab.at(platz_m).at(p_mini) << endl; } //------------------------------------------------------------------------------ inline void Liga::anz_punkte (){ int anz=0; for (int i=0; i<10; i++) for (int j=1; j<tab.size(); j++) if (tab.at(j).at(i) <= punkte_min) ++anz; cout << "Anzahl der Teams mit ueber " << punkte_min << " Punkte:\t" << anz << endl; for (int i=0; i<tab.size(); i++){ for (int j=1; j<10; j++) cout << " " << tab.at(i).at(j); cout << endl; } } //------------------------------------------------------------------------------ int main(void) { // Jahr 2000 01 02 03 04 05 06 07 08 09 int pt[19][10]= {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Dummy {63, 70, 75, 74, 77, 75, 70, 76, 69, 70}, // Platz 01 {62, 69, 59, 68, 63, 70, 68, 66, 67, 65}, // Platz 02 {58, 68, 58, 65, 59, 68, 66, 64, 64, 61}, // Platz 03 {57, 61, 56, 64, 58, 61, 60, 54, 63, 59}, // Platz 04 {56, 61, 54, 56, 58, 52, 51, 54, 61, 57}, // Platz 05 {55, 56, 52, 55, 57, 48, 48, 52, 59, 55}, // Platz 06 {53, 56, 49, 50, 55, 46, 45, 51, 55, 52}, // Platz 07 {50, 50, 46, 49, 51, 44, 45, 49, 50, 50}, // Platz 08 {47, 50, 45, 44, 48, 43, 44, 46, 49, 47}, // Platz 09 {46, 46, 45, 42, 45, 42, 44, 44, 45, 46}, // Platz 10 {44, 40, 43, 39, 43, 38, 44, 43, 40, 42}, // Platz 11 {43, 39, 42, 39, 42, 38, 42, 41, 39, 39}, // Platz 12 {41, 35, 41, 38, 40, 37, 41, 40, 33, 38}, // Platz 13 {39, 34, 40, 37, 38, 36, 40, 36, 32, 35}, // Platz 14 {38, 34, 40, 36, 36, 34, 37, 34, 31, 33}, // Platz 15 {35, 30, 36, 32, 35, 33, 34, 31, 30, 31}, // Platz 16 {35, 29, 30, 32, 30, 30, 34, 30, 29, 28}, // Platz 17 {27, 22, 30, 23, 18, 27, 26, 29, 28, 24}};// Platz 18 vector<vector<short>> pt1; for(short a=0;a<19;a++)pt1.push_back(vector<short>::vector()); for(short a=0;a<19;a++) for(short b=0;b<10;b++) pt1.at(a).push_back(pt[a][b]); Liga Bliga(pt1); Bliga.platz_ausgabe(); Bliga.p_durchschnitt(); Bliga.p_minimum(); Bliga.anz_punkte(); for (int i=0; i<19; i++){ //Testausgabe des pt-Arrays for (int j=1; j<10; j++) cout << " " << pt1.at(i).at(j); cout << endl; } }So besser
?
-
Wow, vielen dank für die Mühe!!
Und funktionieren tuts prima. Nur weiß ich natürlich jetzt nicht warum :D.
Wär ganz nett wenn du mir eine Frage dazu beantworten könntest.
Ich würd den Teil jetzt so verstehen, dass das Array in ein Vector umgewandelt wird, und der Vector heißt pt1?
vector<vector<short>> pt1; for(short a=0;a<19;a++)pt1.push_back(vector<short>::vector()); for(short a=0;a<19;a++) for(short b=0;b<10;b++) pt1.at(a).push_back(pt[a][b]);
-
Silverlane schrieb:
Wär ganz nett wenn du mir eine Frage dazu beantworten könntest.
Ich würd den Teil jetzt so verstehen, dass das Array in ein Vector umgewandelt wird, und der Vector heißt pt1?
vector<vector<short>> pt1; for(short a=0;a<19;a++)pt1.push_back(vector<short>::vector()); for(short a=0;a<19;a++) for(short b=0;b<10;b++) pt1.at(a).push_back(pt[a][b]);Ja. pt1 wird mit den Werten aus pt belegt.
P.S.: Der Fehler, den du in deinem ersten Post in Zeile 78 gemacht hast :
Die Werte waren falschherum genutzt. Zuerst j, dann i - nicht umgekehrt.
-
Aaah, okay vielen Dank. Ist das denn dann auch ein zweidimensionaler Vektor? Steig da grad noch nicht so ganz mit dem pt1 und dem pt1.at(a)
-
Silverlane schrieb:
Aaah, okay vielen Dank. Ist das denn dann auch ein zweidimensionaler Vektor? Steig da grad noch nicht so ganz mit dem pt1 und dem pt1.at(a)
Verständlicher ist es vielleicht so:
// 19 mal einen vector<short> mit jeweils 10 Elementen vector<vector<short>> pt1( 19, vector<short>(10) ); // Einfaches rüberkopieren for(short a=0;a<19;a++) for(short b=0;b<10;b++) pt1[a][b] = pt[a][b];
-
Jau danke. Nu hab ichs geschnallt. Oh man, lange Leitung heute.
-
std::copygibts auch...
-
Swordfish schrieb:
std::copygibts auch...

-
Für Anfänger finde ich die Schleifen erstmal verständlicher, damit besser. Eine braucht man ja auch mit std::copy.
Ich persönlich hätte eher boost::assign::list_of genommen, dann braucht man gar nicht erst kopieren. Vielleicht kriegt man auch was schönes mit std::array hin, wenn die Dimensionen eh konstant sind.