Sortieren



  • Hi , ich habe ein Programm(mit externen Unterprogrammen) geschrieben , wo man die Fussballbundesligatabelle eingeben kann. Der Code sieht folgendermaßen aus:

    /*********************************************
    projekt.h
    *********************************************/
    #include <stdio.h>
    #include <stdlib.h>

    struct test
    {
    char name[40];
    int spiele;
    int punkte;
    int geschossene_Tore;
    int kassierte_Tore;
    };

    void eingabe(struct test ,int mannschaften);
    void ausgabe(struct test ,int mannschaften);
    /
    ********************************************
    projekt.cpp
    ***********************************************7
    #include <stdio.h>
    #include <stdlib.h>

    struct test
    {
    char name[40];
    int spiele;
    int punkte;
    int geschossene_Tore;
    int kassierte_Tore;
    };

    void eingabe(struct test *,int mannschaften);
    void ausgabe(struct test *,int mannschaften);

    /*************************************************
    eingabe.cpp
    **************************************************/
    #ifndef _name
    #define _name

    #include "projekt.h"

    void eingabe(struct test *_eingabe,int mannschaften)
    {
    int i;

    for(i=1;i<=mannschaften;i++)
    {
    printf("\nName der Mannschaft = ");
    scanf("\n%s",&_eingabe->name);

    printf("\nAnzahl der Spiele = ");
    scanf("\n%d",&_eingabe->spiele);

    printf("\nAnzahl der Punkte = ");
    scanf("\n%d",&_eingabe->punkte);

    printf("\nAnzahl der geschossenen Tore = ");
    scanf("\n%d",&_eingabe->geschossene_Tore);

    printf("\nAnzahl der kassierten Tore = ");
    scanf("\n%d",&_eingabe->kassierte_Tore);

    printf("\n\n");
    _eingabe++;
    }
    }
    #endif

    /****************************************************
    ausgabe.cpp
    *****************************************************/

    #include "projekt.h"

    void ausgabe(struct test *_ausgabe,int mannschaften)
    {
    int i;
    printf("\n\n\nPlatz\tSpiele\tNamedesVereins\t\tPunkte\t\tTorverhaeltnis");

    for(i=1;i<=mannschaften;i++)
    {
    printf("\n%d\t%d\t%s\t\t\t%d\t\t\t%d:%d",i,_ausgabe->spiele,_ausgabe->name,_ausgabe->punkte,_ausgabe->geschossene_Tore,_ausgabe->kassierte_Tore);
    _ausgabe++;
    }
    printf("\n\n");
    }

    Ich will nun in einem weiteren externen UP einen Sortieralgorithmus schreiben,
    der die Tabelle , sortiert nach Punkten(bei Punktgleichheit, nach Tordifferenz) ausgibt. Da ich noch nicht lange programmiere , bekomme ich das nicht hin.

    Hat jemand eine Idee?



  • Zuallererst einmal sind für die Lesbarkeit des Programms etliche Schönheitskorrekturen an Deinem bestehenden Code nötig!
    Insbesondere solltest Du bedeutungsvolle Namen wählen - "Verein" statt "struct test"!!!
    Und benutze bitte Code-Tags.

    /*********************************************
    BundesLiga.h
    *********************************************/
    #ifndef BUNDESLIGA_H
    #define BUNDESLIGA_H
    
    typedef struct _Verein
    {
        char szName[40];
        int iSpiele;
        int iPunkte;
        int iGeschosseneTore;
        int iKassierteTore;
    } Verein;
    
    void BL_Eingabe(Verein*, int);
    void BL_Sortiere(Verein*, int);
    void BL_Ausgabe(Verein*, int);
    
    #endif /*BUNDESLIGA_H*/
    
    /**********************************************
    Main.c
    ***********************************************/
    #include "BundesLiga.h"
    
    #define BL_KLUBS 18
    
    void main(void)
    {
        Verein aVereine[BL_KLUBS];
        BL_Eingabe(aVereine, BL_KLUBS);
        BL_Sortiere(aVereine, BL_KLUBS);
        BL_Ausgabe(aVereine, BL_KLUBS);
    }
    
    /*************************************************
    BundesLiga.c
    **************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include "BundesLiga.h"
    
    static Verein* VglKlubs(Verein*, Verein*);
    
    void BL_Eingabe(Verein* _pVerein, int _iAnzKlubs)
    {
        int i;
        for(i = 1; i <= _iAnzKlubs; i++)
        {
            printf("\nName der Mannschaft = ");
            scanf("%s", _pVerein->szName); /* ohne & */
            printf("\nAnzahl der Spiele = ");
            scanf("%d", &_pVerein->iSpiele);
            printf("\nAnzahl der Punkte = ");
            scanf("%d", &_pVerein->iPunkte);
            printf("\nAnzahl der geschossenen Tore = ");
            scanf("%d", &_pVerein->iGeschosseneTore);
            printf("\nAnzahl der kassierten Tore = ");
            scanf("%d", &_pVerein->iKassierteTore);
            printf("\n\n");
            _pVerein++;
        }
    }
    
    void BL_Ausgabe(Verein* _pVerein, int _iAnzKlubs)
    {
        int i;
        printf("\n\n\nPlatz\tSpiele\tNamedesVereins\t\tPunkte\t\tTorverhaeltnis"); 
        for(i = 1; i <= _iAnzKlubs; i++)
        {
            printf("\n%d\t%d\t%s\t\t\t%d\t\t\t%d:%d", i, _pVerein->iSpiele, _pVerein->szName,
                _pVerein->iPunkte, _pVerein->iGeschosseneTore, _pVerein->iKassierteTore);
            _pVerein++;
        }
        printf("\n\n");
    }
    
    void BL_Sortiere(Verein* _aVereine, int iAnzKlubs)
    {
        /* Bei nur 18 Mannschaften ist z. B. Bubblesort nicht schlecht */
        /* Vergleiche immer zwei benachbarte Klubs */
        /* Wenn Klub2 besser ist als Klub1 [==> benutze VglKlubs()], vertauschen */
        /* Solange wiederholen, bis keine Vertauschung mehr noetig */
        ...
    }
    
    /* VglKlubs() : Vergleicht zwei Vereine nach Punkte und Tordiff.
     * Verein*    : Verein 1 oder Verein 2, je nachdem, wer besser ist
     * _pVerein1  : Verein 1
     * _pVerein2  : Verein 2
     */
    Verein* VglKlubs(Verein* _pVerein1, Verein* _pVerein2)
    {
        int iDiff1, iDiff2;
        if(_pVerein1->iPunkte > _pVerein2->iPunkte)
            return _pVerein1;
        if(_pVerein1->iPunkte < _pVerein2->iPunkte)
            return _pVerein2;
        iDiff1 = _pVerein1->iGeschosseneTore - _pVerein1->iKassierteTore;
        iDiff2 = _pVerein2->iGeschosseneTore - _pVerein2->iKassierteTore;
        if(iDiff1 < iDiff2)
            return _pVerein2;
        return _pVerein1;
    }
    


  • du kannst die funktion qsort verwenden
    (include <stdlib.h> ).
    qsort( tabelle, anzahlMannschaften, sizeof( struct test ), vergleichsfkt );

    wobei:
    int vergleichsfkt( const void* element1, const void* element2 )
    {
    return ((struct test*)element1)->punkte - ((struct test*)element2)->punkte;
    }
    die funktion gibt an wie qsort vergleichen soll (also nach punkten, toren,
    oder was auch immer).


Anmelden zum Antworten