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 Kitxxx

    es 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


Log in to reply