Klassische Fußball-Tabelle nach Punkten bzw. nach Toren sortieren



  • Hi,

    ich bin in Sachen Programmierung noch ziemlich am Anfang, habe mal vor mit meinen Kenntnissen eine kleine Fussball-Tabelle zu programmieren, in der man selbst die Ergebnisse eintippt.

    Soweit funktioniert auch alles mit Structs if-Verzweigungen und das Übliche. Für den Anfang habe ich nur zwei Vereine deklariert, die ich zwei mal gegeneinander "spielen lasse". Bei mehreren Vereinen ändert sich vom Prinzip ja nichts.

    Dann kommt die Tabellenausgabe, die aber nur wie ich sie eben mit "cout" formatiert habe:

    //Ausgabe der Tabelle
    cout << endl;
    cout << "\t\t\tTabelle \t\t Tore \t Punkte" << endl;
    cout << endl;
    cout << "\t\t\t" << VfbStuttgart.Verein << "\t\t " << VfbStuttgart.Tore << ":" << VfbStuttgart.Gegentore << "\t " << VfbStuttgart.Punkte << endl;      
    cout << "\t\t\t" << BorussiaDortmund.Verein << "\t " << BorussiaDortmund.Tore << ":" << BorussiaDortmund.Gegentore << "\t " << BorussiaDortmund.Punkte << endl;
    

    Ich habe jetzt aber keine Ahnung, bzw. komme auch nicht drauf wie ich die Tabelle nach Punkten bzw. bei gleichen Punkten nach den Toren sortieren kann. Google zeigt nur Beiträge, in denen Algorythmen benutzt werden. Da ich soweit aber noch nicht bin,wollte ich mal nach anderen Möglichkeiten fragen ...

    Falls es keine gibt, hat jemand nen Link, in dem Algorythmen von Null an erklärt werden?

    MfG



  • Wie weit bist du denn wirklich mit dem Projekt und vor allem: Wie lernst du C++, wie weit bist du - oder was weiß ich ^^
    Das ist ja iwie nur ne (statische ^^) Ausgabe, die du da hast...

    Ich würde ja std::vector <deine_mannschafts_klasse> (#include <vector>) nehmen - und std::sort (#include <algorithm>) - aber das wird dir wo beides nich sonderlich einfach vorkommen ^^

    Hier mal 2 relativ gute Dokumentationen:
    http://www.cplusplus.com/reference/
    http://www.cppreference.com/wiki/

    Für Beispiele wirst du wohl google (oder eine andere suchmaschine deiner wahl ^^) benutzen müssen ^^

    in dem Algorythmen von Null an erklärt werden

    Was willst du denn da genau erklärt haben? Was Algorithmen sind sollte man eigtl schon wissen, bevor man anfängt, zu programmieren ^^ Ansonsten ist bei so nen Definitionen auch immer google -> "define: xyz" oder direkt wikipedia zu empfehlen...

    bb

    ach so:
    "Algorythmen" 🙄



  • Ja, ich meinte Algorithmen ^^

    Naja, weit bin ich noch nicht wirklich.

    Texteingabe, Textausgabe, if-Verzweigungen, Strukturen, Funktionen und noch ein, zwei Sachen. Ein ernstes Projekt ist es auch nicht, ich will nur ein wenig rumprobieren, was ja nich verkehrt ist.

    Ich kenne bisher auch nur die statische Ausgabe (so wie du es nennst -wie gesagt, bin erst am Anfang)

    Mit "von Null an erklären was Algorithmen sind" meinte ich wie sie deklariert, definiert (und was man eben noch so braucht) werden.



  • Ein erster Schritt ist es, deine Vereine in eine gemeinsame Variable zu packen, ein Array. Damit kannst du über einen Index auf jeden Verein zugreifen und nicht über den VariablenNamen direkt:

    struct Verein
    {
       // irgendwas
       // anstatt char name[] lieber std::string name, falls nicht schon passiert
    };
    
    Verein vereine[2];  // Ein array aus vereinen erstellen, in dem Falle zwei vereine
    
    vereine[0].name = "vfb";
    vereine[0].Punkte = 0;
    vereine[1].name = "xyz";
    vereine[1].Punke = 12;
    
    for(int i = 0; i < 2; i++)
    {
       // Ausgabe:
       cout << "Name: " << verein[0].Name << endl;
    }
    

    wenn du das hast, kannst du den nächsten Schritt gehen und zum Beispiel mit Bubblesort sortieren. siehe zb wikipedia



  • OK, danke. Das mit den arrays habe ich verstanden, klingt auch logisch. Aber warum die Schleife zweimal durchlaufen lassen?

    Gibt es eine Möglichkeit, anstatt i die vereine[] durchgehen zu lassen?

    DAs BubbleSort habe ich inzwischen gefunden, dachte nur, dass ich die Vereine irgendwie auf einen Nenner bringen muss, wahrscheinlich daher auch deinVorschlag mit den Arrays..



  • Blairwitch schrieb:

    Aber warum die Schleife zweimal durchlaufen lassen?

    Weil's in Maxi's Beispiel 2 Vereine gibt: vereine[ 0 ] und vereine[ 1 ] .

    Blairwitch schrieb:

    Gibt es eine Möglichkeit, anstatt i die vereine[] durchgehen zu lassen?

    Jein.
    Wenn Du einen Standardcontainer (<-googeln) verwenden würdest, zB std::vector , dann könntest Du durch den Container iterieren, mit einem Iterator (<-googlen):

    #include <iostream>
    #include <string>
    #include <vector>
    
    // ...
    
    struct Verein
    {
    	Verein( const std::string &Name, int Punkte )
    		: Name( Name ), Punkte( Punkte )
    	{
    	}
    
    	std::string Name;
    	int Punkte;
    };
    
    int main( )
    {
    	std::vector< Verein > vereine;
    
    	vereine.push_back( Verein( "vfb", 0 ) ); // hinten
    	vereine.push_back( Verein( "xyz", 12 ) ); // anhängen
    
    	for( std::vector< Verein >::iterator i = vereine.begin( );
    		i != vereine.end( );
    		++i ) {
    
    			std::cout << i->Name << ": " << i->Punkte << std::endl;
    	} 
    }
    

    Aber bis dahin wird dich wohl nur ein gutes Tutorial oder Buch bringen.

    cheers, Swordfish



  • Algorythmen benutzt werden. Da ich soweit aber noch nicht bin ...

    Du brauchst auf alle Faelle einen Algorithmus. Also freunde dich damit schon mal an.

    PS: Ich moechte mir den Blinddarm rausnehmen, das hat was mit Operieren zu tun. Leider kann ich das noch nicht. Wie kann ich es trotzdem selbst machen?



  • knivil schrieb:

    PS: Ich moechte mir den Blinddarm rausnehmen, das hat was mit Operieren zu tun. Leider kann ich das noch nicht. Wie kann ich es trotzdem selbst machen?

    Och.. raus bringst du das Ding sicher. 😉



  • Aber warum die Schleife zweimal durchlaufen lassen?

    Maxi hat einen kleinen Schreibfehler drin gehabt:

    for(int i = 0; i < 2; i++) 
    { 
       // Ausgabe: 
       cout << "Name: " << verein[i].Name << endl; // i statt 0 !!!
    }
    

    So werden die Namen aller 2 Vereine ausgegeben...

    Und für die Eingangsfrage nach dem Sortieren - dafür benötigst du eine Sortierfunktion:

    struct TableSort
    {
      // Rückgabewert ist 1, 0 oder -1
      int operator()(const Verein &v1, const Verein &v2) const
      {
        if(v1.Punkte > v2.Punkte)
           return 1;
        else if(v1.Punkte == v2.Punkte)
        {
           if(v1.Tore > v2.Tore)
             return 1;
           else if(v1.Tore == v2.Tore)
             return 0;
        }
    
        return -1;
      }
    }
    

    Und der Aufruf dann mittels std::sort:

    #include <algorithms>
    
    std::sort(&Vereine[0], &Vereine[2], TableSort());
    

    Und dann kannst du diese Vereinsliste auch ganz schnell auf z.B. 18 erhöhen...



  • Th69 schrieb:

    dafür benötigst du eine Sortierfunktion:

    Wobei man bei deinem Beispiel eigentlich eher von Funktor oder Funktionsobjekt spricht (aber klar ist der operator() eine Funktion).

    Allerdings würde ich das mit bool als Rückgabetyp und true und false als Literalen durchführen. Zudem hast du einen Logikfehler drin: Der Vergleich wird als wahr ausgewertet, wann immer die Punkte verschieden sind! Das verletzt das Strict Weak Ordering-Kriterium.

    Bei dem Beispiel würde also auch eine Funktion gehen:

    bool LinkerVereinBesser(const Verein& Left, const Verein& Right)
    {
        if (Left.Punkte == Right.Punkte)
            return Left.Tore > Right.Tore;
        else
            return Left.Punkte > Right.Punkte;
    }
    

    Angewandt sähe das dann so aus:

    std::sort(Vereine, Vereine + 2, LinkerVereinBesser);
    

    Allerdings würde ich hier unbedingt zu STL-Containern oder - wenns ein statisches Array sein soll - std::tr1::array raten.



  • Hi, bin auch anfänger, aber dies weis ich 😉 , hier der code:

    int main (/*...*/)
    {
        int Tab1[100];
        for (int i = 0; i<= 1000;i++)
        {
            for (int j = 0; j <= 100; j++)
            {
                if (Tab[j] == i)
                {
                    cout << Tab[j];
                }        
            }
        }
    }
    

    Ich hoffe das hilft ^^ fiel glück
    lk


Anmelden zum Antworten