Bubblesort???



  • Chibi schrieb:

    Ich habe es mal versucht das in mein Programm zu schreiben...aber da ich mich noch ueberhaupt nicht mit dem programmieren auskenne, weiss ich nicht wie es richtig funktioniert... 😕
    hier mein programm:

    ...
    int main(void)
    {
      char line[1024];  
      char *file_lines[20];
      int anz_bytes;
      int i;
      i=0;
      
        do
      {   
          printf("Bitte geben Sie den %d.von 20 String ein : \n",i+1);
          fgets(line,1024,stdin);
          anz_bytes = strlen(line);
          file_lines[i] = (char *)malloc(anz_bytes);
    

    Hier musst Du anz_bytes+1 allozieren, sonst passt das End-\0 nicht hinein.

    Chibi schrieb:

    strcpy(file_lines[i],line);
          i++;
          }while (i<=19);
          
          bubbleSort(line,anz_bytes);
    

    Du versuchst hier, die Eingabezeile zu sortieren, nicht deinen 20-Zeilen-Puffer...

    Chibi schrieb:

    ...
    void bubbleSort(int *line, int anz_bytes)
    

    "int *line"? Du willst doch ein Array von char-Arrays sortieren - dann musst Du das hier auch so übergeben.

    Chibi schrieb:

    ...
          for(i=anz_bytes-1;i<0;i--)
           for (j=0;j<i;j++)
             if(line[j] > line[j+1])
             {
                help = line[j];    // swap line[j] and line[j+1]
                line[j] = line[j+1];
                line[j+1] = help;
             }    
                  
             }
    

    Wenn Du die Sachen von oben korrigiert hast, kommt hier die Falle ⚠ Du vergleichst nur die Pointer auf die Zeichenketten miteinander, nicht die Zeichenketten. Du musst strncmp() benutzen oder eine der verwandten Funktionen.
    Das Vertauschen ist dann wieder okay. (help muss natürlich dann auch vom Typ char * sein)



  • danke.
    aber ich glaube ich stelle mich echt bloed an...ich steh total auf dem schlauch... 😞
    ich habe jetzt etwas geaendert...aber funktioniert nicht... 😕

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
      char line[1024];  
      char *file_lines[20];
      int anz_bytes;
      int i;
      i=0;
    
        do
      {   
          printf("Bitte geben Sie den %d.von 20 String ein : \n",i+1);
          fgets(line,1024,stdin);
          anz_bytes = strlen(line);
          file_lines[i] = (char *)malloc(anz_bytes+1);
          strcpy(file_lines[i],line);
          i++;
          }while (i<=19);
    
      printf("%s%s \n",line,file_lines);
    
          bubbleSort(line,file_lines[i]);
            {      
               int j;
               char *help;
               strcmp(line,file_lines[i]);
                   for(i=1;i<0;i--)
                    for (j=0;j<i;j++)
                      if(line[j] > line[j+1])
                      {
                        *help = line[j];    
                        line[j] = line[j+1];
                        line[j+1] = *help;
                        }    
    
            for (i=0;i<20;i++)
            printf("%d%s\n",&line[i],file_lines[i]);        
            }
      return 0;
    }
    


  • Chibi schrieb:

    danke.
    aber ich glaube ich stelle mich echt bloed an...ich steh total auf dem schlauch... 😞
    ich habe jetzt etwas geaendert...aber funktioniert nicht... 😕

    Na, na, jeder hat mal angefangen! 👍

    Chibi schrieb:

    ...
      printf("%s%s \n",line,file_lines);
    

    Die Ausgabe dieser Zeile sollte Dir zu denken geben: was kommt da, und was wolltest Du eigentlich haben?

    Chibi schrieb:

    bubbleSort(line,file_lines[i]);
            {
    

    Hier fehlt was. Entweder willst Du direkt hier sortieren - dann ist der Aufruf von bubbleSort falsch, oder Du willst die Funktion bubbleSort() aufrufen - dann gehört der Code dazu mit den {} darum woanders hin.
    BTW: Du willst doch alle 20 Eingabezeilen sortieren. Dann überlege Dir mal, wie ein bubbleSort-Aufruf dafür aussehen müsste, und was er zurückliefern soll.
    Ich würde an Deiner Stelle aber erstmal innerhalb von main() sortieren, und den Teil dann später mal in eine Funktion auslagern. Das vereinfacht die Sache für Dich jetzt erstmal.

    Chibi schrieb:

    strcmp(line,file_lines[i]);
    

    Das macht was, aber mit Sicherheit nicht, was Du möchtest. Lies' mal die manpage von strcmp!



  • du musst den rückgabewer von strcmp überprüfen, also if(strcmp(str1, str2) == 0) {// ist identisch!}

    //EDIT: too late....



  • [OT] sigtest..... [/OT]



  • ...er vertauscht schonmal etwas...aber noch nicht ganz so wie er soll...

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      {
      char *line[1024] ;  
      char *file_lines[20] ;
      int anz_bytes;
      int i;
      i=0;
      char *help;
      int j;
      int cmp;
      cmp=0; 
    
        do
      {   
          printf("Bitte geben Sie den %d.von 5 String ein : \n",i+1);
          fgets(*line,1024,stdin);
          anz_bytes = strlen(*line);
          file_lines[i] = (char *)malloc(anz_bytes+1);
          strcpy(file_lines[i],*line);
          i++;
          }while (i<=4);
    
          for(i=0;i<5;i++)
          {
                          printf("%d%s\n",&line[i],file_lines[i]);
                          }
              j=0;
               for(j=0;j<4;j++)
               {
    
               cmp=strcmp(file_lines[j],file_lines[j+1]);
               if (cmp==0)
               { 
               } else
               { if (cmp<0)
               {
               }
                      else
                       {
                          help = file_lines[j];
                          file_lines[j] = file_lines[j+1];
                          file_lines[j+1] = help;
                        }
                        }
                          }
                        for(j=0;j<5;j++)
                        {
                 printf(" %d %s\n",&line[j],file_lines[j]);                
                 }             
      return 0;
    }
    
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    /*  char *line[1024] ;  */
        char line[1024] ;  
        char *file_lines[20] ;
        int anz_bytes;
        int i;
        char *help;
        int j;
        int done;
        done=0;
        i=0;
    
        do  {  
          printf("Bitte geben Sie den %d.von 5 String ein : \n",i+1);
    /*      fgets(*line,1024,stdin); */
          fgets(line,1024,stdin);
    /*      anz_bytes = strlen(*line); */
          anz_bytes = strlen(line);
          file_lines[i] = (char *)malloc(anz_bytes+1);
    /*      strcpy(file_lines[i],*line); */
          strcpy(file_lines[i],line);
          i++;
          }while (i<=4);
    
          for(i=0;i<5;i++)
          {
              printf("%d %s\n",i,file_lines[i]);
          }
          while ( ! done ) { /* sortiert ists dann wenn keine vertauschungen */
              done=1;
              j=0; /* nicht notwendig wird in nächster zeile initialisiert */
              for(j=0;j<4;j++) { /* alle vergleichen */
                  if ( strcmp(file_lines[j],file_lines[j+1]) > 0 ) { /* wenn erster string groesser 2. string */
                     help = file_lines[j];
                     file_lines[j] = file_lines[j+1];
                     file_lines[j+1] = help;
                     done=0;  /* noch nicht fertig */
                  }
              }
           }
           for(j=0;j<5;j++) {
               printf("%d %s\n",j,file_lines[j]); 
               free(file_lines[j]); /* speicher freigeben */               
           }            
       return 0;
    }
    


  • @ZuK: schön, eine Lösung, aber lernt Chibi da viel draus? 😕



  • @Chibi muss es unbedingt ein bubblesort sein ich selbst haette einen einfacheren sortieralkoholrythmus geschrieben...

    @Zuk schoene lösung das muss man dir lassen 😃



  • Miq schrieb:

    @ZuK: schön, eine Lösung, aber lernt Chibi da viel draus? 😕

    Na das hoffe ich schon. Sein code war ja gar nicht mehr so schlecht, es hat ja nur mehr die schleife um die vertauschungen gefehlt. Ich tu mir halt leichter etwas mit code zu erkären als lange um den heissen brei herumzureden.
    Kurt



  • --linuxuser-- schrieb:

    @Chibi muss es unbedingt ein bubblesort sein ich selbst haette einen einfacheren sortieralkoholrythmus geschrieben...

    @Zuk schoene lösung das muss man dir lassen 😃

    womit hast du das denn gemacht?



  • --linuxuser-- schrieb:

    @Chibi muss es unbedingt ein bubblesort sein ich selbst haette einen einfacheren sortieralkoholrythmus geschrieben...

    Noch einfer als Bubblesort geht doch kaum noch.



  • Danke fuer eure Hilfe 🙂
    das programm funktioniert 😃 und ich habs verstanden denk ich 🙂

    jep sollte Bubblesort sein. Aber was waere denn einfacher?
    Es gibt doch auch noch qsort(oder so) hatte ich gelesen.Aber ist das nicht etwas anderes...oder.



  • Es gibt noch eine ganze Reihe von Sortieralgorithmen, so z.B. heapsort. Ich wüsste allerdings nicht, was noch einfacher sein sollte. 😞


Anmelden zum Antworten