in ANSI C arays nach einer Spalte sortieren



  • Hallo Leute,

    bin neu hier und ein absoluter anfänger. Möchte eine Liste in ein variables Feld schreiben. Nachdem ich einige Werte eingelesen habe soll das Prog aus den Werten etwas berechnen. Diese Ergebnisse soll er zusammen mit dem zuvor eingegebenen in einer Tabelle (Feld) ausgeben. Allerdings soll er die Tabelle nach einer Spalte des Feldes ( die Spalte in der die Ergebnisse stehen) sortiert ausgeben. Zu meinen Fragen. Kann man Felder variabel machen. Sprich, die Feldgröse. Und kann man ein z.b. 5*5 großes Feld nach der 3. Spalte sortieren



  • Also:

    Ein 1D- feld (Array) hat nur eine Spalte.
    Ein 2D- Feld (Array) hat sozusagen mehrer Spalten,aber jedes Feld vom gleichen Typ.

    Array sind statisch, d.h. die dimensionen bzw. größe der dimensionen sind hardcodiert im code.

    Was stellst du dir unter dynamisch vor? Weist du von anfang an, bevor du die Daten einliest wieviel Datensätze es geben wird?

    Wenn ja, legst du ein dyn. Feld via "malloc" aufm Heap an.

    Wenn nein, solltest du eine Liste verwenden, welche dynamisch während der laufzeit wachsen kann.

    Ich nehme an, die Spalten und deren Typen sind fest definiert oder?

    Dann kannst du bspw. sowas machen:

    typedef struct{
    
     int iID;                 //Erste Spalte
     char[50] acText;         //Zweite Spalte
     double dValue;           //Dritte Spalte
    
    } DATASET;
    

    nun kannst du ein Feld dieser datensätze aufm Heap anlegen:

    int iZeilen= ???;
    struct DATASET *pTable = malloc(sizeof(struct DATASET) * iZeilen);
    

    und so einfügen:

    pTable[n].iID= ...;
    ..
    ..
    

    Bei ner liste wird es bischen komplizierter... :xmas1:

    EDIT:

    Sortieren kannst du dann natürlich die einzlenen Datensätze (musste sie dann umkopieren, oder erstellst ne liste aus DATASET pointern, welche du umbiegst...
    Sortieren, siehe bspow. bubblesort

    P.S: können fehler drin sein, schon länger kein C mehr programmeirt



  • Hallo Boris,

    danke erst einmal für deine schnelle Hilfe. Nur habe ich keinen schimmer was dein code macht bzw. wie es angewandt wird. Bin wie schon gesagt ein blutiger anfänger in C. Kann ich dir mein Quellcode per email senden und du schaust es dir einfach mal an. Möchte es ungern hier veröffentlichen (Hausaufgabe). Wäre echt sehr nett von dir. Muss es bis Freitag abgeben!



  • Sortieren, siehe bspow. bubblesort

    Oder lieber gleich bogosort.

    Möchte eine Liste in ein variables Feld schreiben.

    Nur habe ich keinen schimmer was dein code macht bzw. wie es angewandt wird.

    Variable Felder in C sind immer damit verbunden, explizit Speicher
    anzufordern: siehe man: malloc und man: free.
    Wenn du davon noch nichts gehört hast, aber das ganze für Freitag
    haben musst, hast du vielleicht die Aufgabe falsch verstanden.

    Kann ich dir mein Quellcode per email senden und du schaust es dir einfach mal an.

    Emails sind hier erfahrungsgemäß eher verpönt.

    Kann man Felder variabel machen.

    Die Möglichkeit besteht seit C99, da kommt man dann auch ohne malloc()
    aus. Darfst du C99-Features nutzen?



  • Ja das kann schon sein. Ich bin mir ja auch nicht einmal sicher ob ich das überhaupt so brauche. habe eine printf Ausgabe wie sie unten steht.

    for(i=0; i<K; i++)
            {   j=0;
                while (j<R)
               {     a=(double)zk[i];
                     b=(double)zr[j];
                   printf("%6d%17d%18.2f%26.2f cm \n",zk[i],zr[j],a/b,(a/b)*s);
                    j++;
               }    
             }
    

    ich möchte nun die Tabelle nicht nach K sondern nach 18.2f sortieren. Also nach a/b. Gibt es da eine einfachere möglichkeit.



  • Halloooooooooooo????

    ist noch jemand da?



  • Halloooooooooooo????

    ist noch jemand da?

    Aber sicher, doch irgendwann muß man auch schlafen/arbeiten, ob man nun will
    oder nicht.

    ch möchte nun die Tabelle nicht nach K sondern nach 18.2f sortieren.

    Verstehe leider nicht, was mit K gemeint ist.
    Das ist doch die Länge der Liste, oder?

    Ganz allgemein:
    Bubblesort ist ein recht dummer
    Algorithmus, aber er funktioniert, für kleine Listen sogar ganz gut.
    Quicksort verwende ich meistens, weil fast genauso einfach, aber ein "richtiger" Algorithmus,
    der auch bei langen Listen nicht verzweifelt.



  • Also das Problem ist, dass ich nach etwas sortieren möchte was erst beim Ausgeben berechnet wird. nach dem Ergbnis praktisch. Ich füge einmal den Quellcode ein. dann könnt ihr es mal laufen lassen und sehen was man machen muss.

    #include <stdio.h>
    int anzR(int a);
    int anzk(int b);
    
    int main()
    
    {   
        int R=-2;int K;
         int  sort1 = 0; 
         int  sort2 = 0;
         long hilf;
         float b=1,a=1;
          int s;
          char ja;
           replay4:
         K=anzK(K);
         int zk[K],i;
         replay1:
         printf("Geben Sie jeweils feur die %d Kettenblaeter die anzahl der Zaehne an <22-56>:\n",K);
         for(i=0; i<K;i++)
               scanf("%i",&zk[i]);
    
               for(i=0; i<K; i++)
                  while(zk[i]<22 || zk[i]>56)
                 {
                   printf("\n >>>>>>>>>>>>>>ERROR<<<<<<<<<<<<<<<<<<<\nDie anzahl der Zaehne ist  nicht erlaubt!\n");
                    goto replay1;
      }    
              while( !sort1)         // Solange die Zahlen noch 
             {                     // nicht sortiert sind.
                 sort1 = 1;
    
                for( i = 1 ; i < K ; ++i)   // Benachbarte Zahlen
                      if( zk[i-1] > zk[i])      // vergleichen.  
                    {
                      sort1  = 0;
                      hilf      = zk[i];        // Tauschen 
                      zk[i]   = zk[i-1];
                      zk[i-1] = hilf;
                   }       
    
          }
    
           R=anzR(R);
         int zr[R],j;
         replay2: 
         printf("Geben Sie jeweils feur die %d Ritzel die anzahl der Zaehne an <11-34>:\n",R);
         for(j=0; j<R;j++)
    
               scanf("%i",&zr[j]);
          for(j=0; j<R; j++)
                  while(zr[j]<11 || zr[j]>34)
                 {
                   printf("\n >>>>>>>>>>>>>>ERROR<<<<<<<<<<<<<<<<<<<\nDie anzahl der Zaehne ist  nicht erlaubt!\n");
                    goto replay2;
                  }
                  while( !sort2)         // Solange die Zahlen noch 
          {                         // nicht sortiert sind.
                 sort2 = 1;
    
                for( i = 1 ; i < R ; i++)   // Benachbarte Zahlen
                      if( zr[i] > zr[i-1])      // vergleichen.  
                    {
                      sort2  = 0;
                      hilf      = zr[i-1];        // Tauschen 
                      zr[i-1]   = zr[i];
                      zr[i] = hilf;
                   } 
          }
    
                  replay3:
                  printf("Geben Sie die Entfaltung bei einer Kurbelumdrehung unter Gewichtsbelastung \nin cm an <160-210> :\n");
                  scanf("%d",&s);
                  while(s<160 || s>210)
                  { 
                      printf("\n >>>>>>>>>>>>>>ERROR<<<<<<<<<<<<<<<<<<<\nDiese Entfaltung ist  nicht erlaubt!\n");
                      goto replay3;
                  } 
    
             printf("Kettenblatt        Ritzel         Uebersetzung              Entfaltung\n");
             printf("______________________________________________________________________\n");
            for(i=0; i<K; i++)
            {   j=0;
                while (j<R)
               {     a=(double)zk[i];
                     b=(double)zr[j];
                   printf("%6d%17d%18.2f%26.2f cm \n",zk[i],zr[j],a/b,(a/b)*s);
                    j++;
               }    
             }    
           system("PAUSE");
    
    }
    
    // ******************************************** UnterProgramme ************************************************************************************************************
    
    int anzK(int b)  
    {   while (b<1 || b>3 )
       {            fflush(stdin);
                    printf("Geben Sie die Anzahl der Kettenblaetter an <1-3>:\n");
                   scanf("%d",&b);
               if (b<1 || b>3)
              {
              printf("\n >>>>>>>>>>>>>>ERROR<<<<<<<<<<<<<<<<<<<\nDie anzahl der Kettenblaeter ist nicht erlaubt!\n");
              }      
        } return b;
    }
    
    int anzR(int a)  
    {   while (a<5 || a>10 )
       {            fflush(stdin);
                    printf("Geben Sie die Anzahl der Ritzel an <5-10>:\n");
                   scanf("%d",&a);
               if (a<5 || a>10)
              {
              printf("\n >>>>>>>>>>>>>>ERROR<<<<<<<<<<<<<<<<<<<\nDie anzahl der Ritzel ist nicht erlaubt!\n");
              }      
        } return a;
    }
    

    in dem folgenden Bereich gebe ich die Tabelle aus. Diese wird aber nach den Kettenblättern sotiert. ich bekomme es nicht hin es nach dem Übersetztungsverhältniss sortieren zu lassen. Bitte helfen!!

    printf("Kettenblatt        Ritzel         Uebersetzung              Entfaltung\n");
             printf("______________________________________________________________________\n");
            for(i=0; i<K; i++)
            {   j=0;
                while (j<R)
               {     a=(double)zk[i];
                     b=(double)zr[j];
                   printf("%6d%17d%18.2f%26.2f cm \n",zk[i],zr[j],a/b,(a/b)*s);
                    j++;
               }    
             }
    

    Danke!



  • Also das Problem ist, dass ich nach etwas sortieren möchte was erst beim Ausgeben berechnet wird. nach dem Ergbnis praktisch.

    Folgende Frage bevor ich den Code lese:

    Das Feld, nach dem du sortieren willst, steht nicht in der Tabelle, sondern
    wird erst bei der Ausgabe berechnet? (ich denke, das ist so)

    Da kommt's dann darauf an: wenn's nur um a/b geht: das kann man
    in die Vergleichsbedingung im Algorithmus einbauen.
    Wenn dabei aber Nebenwirkungen auftauchen, geht das so natürlich nicht mehr.

    Das wäre dann in Zeile 34.
    (Und noch einmal in Zeile 63, das ist eine schlechte Sache: bau dir lieber
    eine Sortier-Funktion)



  • Wenn du das Prog ausführen würdest, würdest du ganz schnell merken was mein Problem ist. Die Tabelle soll nach der Übersetung sortiert ausgegeben werden. Ich habe es nur soweit geschafft, dass es zwar nach der Übersetung sortiert aber nur innerhalb eines Kettenblatts. Es soll aber unabhängig von Kettenblatt und Ritzel nach der Übersetzung sortiert ausgegeben werden. Nur wie.



  • Hallo,

    Ist denn niemand da, der mir helfen kann?


Log in to reply