eine Struktur alphabetisch sortiern?
-
Hallo, ich habe ein Programm geschrieben, das die Daten nach dem Namen der Länder alphabetisch sortieren soll. Leider weiß ich nicht wo noch ein Fehler im Algorithnmus ist, denn ich bekomme bei der Ausgabe die Länder immr noch unsortiert ausgegeben.
Hier ist der Quelltext:
# include <stdio.h> # include <stdlib.h> struct tWrg { char Name[31]; char Landk[4]; char Waehrungsk[4]; double uKauf; double uVerkauf; }; int main() { int i, j , k; int size; struct tWrg vWrg[]= { #include "waehrung.dat" }; size = sizeof vWrg/ sizeof(struct tWrg); struct tWrg temp; for(i=0; i<size; i++) { for(j=i+1; j<size; j++) { for(k=0; vWrg[i].Name[k] == vWrg[j].Name[k];k++) if(vWrg[i].Name[k] > vWrg[j].Name[k]) { temp= vWrg[i]; vWrg[i]= vWrg[j]; vWrg[j] = temp; } } } // Ausgabe, jedoch unsortiert for(i=0; i<size; i++) { vWrg[i].uVerkauf= 0.92*vWrg[i].uKauf; printf("%-15s %-15s %-15s %-5f %-5f\n", vWrg[i].Name, vWrg[i].Landk, vWrg[i].Waehrungsk, vWrg[i].uKauf, vWrg[i].uVerkauf); } return 0; } /* Finnland SF FIM 0.301000 0.276920 Norwegen N NOK 0.238000 0.218960 Schweden S SEK 0.214000 0.196880 Daenemark DK DKK 0.259500 0.238740 Irland IRL IEP 2.460000 2.263200 Grossbritanien GB GBP 2.605000 2.396600 Niederlande NL NLG 0.903500 0.831220 Frankreich F FRF 0.298000 0.274160 Belgien B BEF 0.048000 0.044160 Tschechien CS CSK 0.062000 0.057040 Oesterreich A ATS 0.144000 0.132480 Schweiz CH CHF 1.143000 1.051560 Ungarn H HUF 0.023000 0.021160 Italien I ITL 0.001080 0.000994 Spanien E ESB 0.013050 0.012006 Portugal P PTE 0.011000 0.010120 Griechenland G GRD 0.008200 0.007544 Tuerkei TR TRL 0.000138 0.000127 */
Falls jemand einen Fehler findet oder eine andere Möglichkeit zum Sortieren kennt, wäre ich sehr dankbar.
Liebe Grüße Kitxxx
-
Hallo,
Kittxxx schrieb:
Falls jemand einen Fehler findet oder eine andere Möglichkeit zum Sortieren kennt, wäre ich sehr dankbar.
Liebe Grüße Kitxxxes gibt eine standard Sortierfunktion qsort, deklariert in stdlib.h
Gruß,
B.B.
-
for(i=0; i<size; i++)
{
for(j=i+1; j<size; j++)
{
for(k=0; vWrg[i].Name[k] == vWrg[j].Name[k];k++)if(vWrg[i].Name[k] > vWrg[j].Name[k])
{
temp= vWrg[i];
vWrg[i]= vWrg[j];
vWrg[j] = temp;
}
}
}Du hast hier versucht, einen als "Bubblesort" bekannten Algorithmus zu implementieren. Das funktioniert so nicht aber evtl. so;
ANSI-C bietet wie erwähnt zum Sortieren "qsort" an, der ist schneller aber komplett anders zu bedienen als dein Ansatz. Da du wohl was lernen sollst, lernst du beim eigenen Implementieren mehr.int found=1; while( found ) for(found=i=0; i<size-1; i++) if(strcmp(vWrg[i].Name,vWrg[i+1].Name)>0) { temp= vWrg[i]; vWrg[i]= vWrg[i+1]; vWrg[i+1] = temp; found=1; break; }
Hinweis: strcmp berücksichtigt Groß-Kleinschreibung.
-
Hallo,
die Bedingung in Zeile 33 wird niemals true ergeben, weil davor schon Deine Schleifenbedingung in Zeile 31 die Schleife abbricht. Daher wird nie irgendetwas vertautscht.
mfg Martin
-
mgaeckler schrieb:
Hallo,
die Bedingung in Zeile 33 wird niemals true ergeben, weil davor schon Deine Schleifenbedingung in Zeile 31 die Schleife abbricht. Daher wird nie irgendetwas vertautscht.
mfg Martin
Ganz abgesehen davon ist das Abbruchkriterium der Schleife in Zeile 31 fehlerhaft, weil das Stringende nicht berücksichtigt wird. Das kann einen schönen Pufferüberlauf geben.
mfg Martin