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).