Array an Klasse übergeben



  • 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 18

    Ligastatistik 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 Punkten

    Es 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::copy gibts auch... 🙄



  • Swordfish schrieb:

    std::copy gibts 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.


Anmelden zum Antworten