sortieren von struct array mit quicksort
-
hallo leute!
ich hab problem beim sortieren von einem struct array!!!
http://rafb.net/paste/results/TJt16453.htmlich will die struct arrays nach personalnummern sortieren!!!
cu
-
Ich habs mit nicht angesehen, aber die sortierfunktion aus <algorithm> kannst du mit ner eigenen Vergleichfunktion versorgen. Das ollste dein Problem lösen.
-
hi! danke es funzt schon;-)
ich poste gleich den code...muss noch bissi kommentieren;-)thx@all
cu
-
main programm: -------------------------------------------------------------------------------- #include <string.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <assert.h> #include <iostream.h> #include <string.h> #include "Buchhaltung.h" // Feldgroesse const unsigned mitarbeiter_max=30; void main() { unsigned anzahl_der_initialisierten_Elemente=0; // Feld deklarieren struct Mitarbeiter alleMitarbeiter[mitarbeiter_max]; // Feld initialisieren anzahl_der_initialisierten_Elemente = initialisierung(alleMitarbeiter); // Funktionstests assert(anzahl_geschlecht_mitarbeiter(alleMitarbeiter, anzahl_der_initialisierten_Elemente, true)==1); assert(anzahl_geschlecht_mitarbeiter(alleMitarbeiter, anzahl_der_initialisierten_Elemente, false)==2); assert(personalnummer_sortiert(alleMitarbeiter, anzahl_der_initialisierten_Elemente)==false); // Gehaelter erhoehen gehalterhoeung(alleMitarbeiter, anzahl_der_initialisierten_Elemente, 3.0f, 100); // Unsortiertes Feld ausgeben ausgabe(alleMitarbeiter, anzahl_der_initialisierten_Elemente); // Feld mit Quiksort sortieren sort(alleMitarbeiter, anzahl_der_initialisierten_Elemente); // Sortiertes Feld ausgeben ausgabe(alleMitarbeiter, anzahl_der_initialisierten_Elemente); } funktionen: ------------------------------------------------------------------------------- #include <string.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <assert.h> #include <iostream.h> #include <string.h> #include "Buchhaltung.h" void quickSort(Mitarbeiter array[], int left, int right); void swap(Mitarbeiter in_array[], int i, int j); unsigned initialisierung(Mitarbeiter Mitarbeiter_Feld[]) { unsigned i=0; strcpy(Mitarbeiter_Feld[i].vorname,"Hans"); strcpy(Mitarbeiter_Feld[i].nachname,"Haider"); Mitarbeiter_Feld[i].personalnummer=2; Mitarbeiter_Feld[i].alter=32; Mitarbeiter_Feld[i].gehalt=100; Mitarbeiter_Feld[i].geschlecht=true; strcpy(Mitarbeiter_Feld[++i].vorname,"Irene"); strcpy(Mitarbeiter_Feld[i].nachname,"Blabla"); Mitarbeiter_Feld[i].personalnummer=1; Mitarbeiter_Feld[i].alter=28; Mitarbeiter_Feld[i].gehalt=1000; Mitarbeiter_Feld[i].geschlecht=false; strcpy(Mitarbeiter_Feld[++i].vorname,"Tina"); strcpy(Mitarbeiter_Feld[i].nachname,"Wert"); Mitarbeiter_Feld[i].personalnummer=3; Mitarbeiter_Feld[i].alter=31; Mitarbeiter_Feld[i].gehalt=1250; Mitarbeiter_Feld[i].geschlecht=false; return ++i; } unsigned anzahl_geschlecht_mitarbeiter(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl, bool geschlecht) { unsigned anzahl=0; for(unsigned i=0; i<mitarbeiter_anzahl; i++) { if(Mitarbeiter_Feld[i].geschlecht==geschlecht) anzahl++; } return anzahl; } bool personalnummer_sortiert(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl) { unsigned anzahl=0; for(unsigned i=0; i<mitarbeiter_anzahl-1; i++) { if(Mitarbeiter_Feld[i].personalnummer < Mitarbeiter_Feld[i+1].personalnummer) { anzahl++; } } if(anzahl==(mitarbeiter_anzahl-1)) return true; return false; } void gehalterhoeung(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl, float prozentsatz, unsigned sockelbetrag) { for(unsigned i=0; i<mitarbeiter_anzahl; i++) { Mitarbeiter_Feld[i].gehalt += (Mitarbeiter_Feld[i].gehalt * prozentsatz/100) + sockelbetrag; } } void ausgabe(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl) { for(unsigned i=0; i<mitarbeiter_anzahl; i++) { printf("Vorname: %s",Mitarbeiter_Feld[i].vorname); printf("\nNachname: %s",Mitarbeiter_Feld[i].nachname); printf("\nPersonalnummer: %d",Mitarbeiter_Feld[i].personalnummer); printf("\nAlter: %d",Mitarbeiter_Feld[i].alter); printf("\nGehalt: %0.01f",Mitarbeiter_Feld[i].gehalt); printf("\nGeschlecht: %d\n\n",Mitarbeiter_Feld[i].geschlecht); } printf("\n\n"); } void sort(Mitarbeiter Mitarbeiter_Feld[], unsigned feldgroesse) { quickSort(Mitarbeiter_Feld,0, feldgroesse - 1); } void quickSort(Mitarbeiter array[], int left, int right) { int current, last; if (left >= right) return; swap(array, left, (left+right)/2); last = left; for (current = left + 1; current <= right; current++) { if (array[current].personalnummer < array[left].personalnummer) swap(array, ++last, current); } swap(array, left, last); quickSort(array, left, last-1); quickSort(array, last+1, right); } void swap(Mitarbeiter in_array[], int i, int j) { struct Mitarbeiter temp; memcpy(&temp, in_array+i, sizeof(struct Mitarbeiter)); memcpy(in_array+i, in_array+j, sizeof(struct Mitarbeiter)); memcpy(in_array+j, &temp, sizeof(struct Mitarbeiter)); } header-datei: -------------------------------------------------------------------------------- struct Mitarbeiter { char vorname[100]; char nachname[100]; unsigned personalnummer; unsigned alter; bool geschlecht; float gehalt; }; unsigned anzahl_geschlecht_mitarbeiter(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl, bool geschlecht); unsigned initialisierung(Mitarbeiter Mitarbeiter_Feld[]); bool personalnummer_sortiert(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl); void gehalterhoeung(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl, float prozentsatz, unsigned sockelbetrag); void ausgabe(Mitarbeiter Mitarbeiter_Feld[], unsigned mitarbeiter_anzahl); void sort(Mitarbeiter Mitarbeiter_Feld[], unsigned feldgroesse);
funzt nun ganz prima;-))
was meint ihr dazu?cu