1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

qsort problem

  • AlexW
  • 17. April 2009 um 20:51
  • Unerledigt
  • 1
  • 2
  • 3
  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 18. April 2009 um 12:13
    • #21

    Wenn du einen String hast und die Zeichen im String sortieren willst ist deine erste Version wohl eher mehr Aufwand, da du jedes char extra mit \0 terminieren musst.
    Meinst du nicht eher sowas?

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int compare (const void * a, const void * b)
    {
        return ( *(char*)a - *(char*)b );
    }
    
    
    int main ()
    {
        char myString[] = "fadceb";
    
        qsort (myString, strlen(myString), sizeof(char), compare);
    
        int n;
        for (n=0; n < strlen(myString); n++)
            printf ("%c ",myString[n]);
    
        return 0;
    }
    Alles anzeigen

    lg

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 12:53
    • #22

    deine version is schon gut so, aber für float und double nicht verwendbar
    und die argc argv methode funktioniert für wörter, buchstaben, fließkommas, integer,....

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 13:16
    • #23
    Zitat von AlexW

    deine version is schon gut so, aber für float und double nicht verwendbar

    Wieso nicht?

    Nicht getesteter Code:

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int compareFloat (const void * a, const void * b)
    {
        return (int) ( *(float*)a - *(float*)b );
    }
    
    
    int main ()
    {
        float myFloats[] = { 3.14, 2.9, 1.0, 4.8 };
    
        qsort (myFloats, sizeof(float) * 4, sizeof(float), compareFloat);
    
        int n;
        for (n=0; n < 4; n++)
            printf ("%f ",myFloats[n]);
    
        return 0;
    }
    Alles anzeigen

    5 Mal editiert, zuletzt von Adok (18. April 2009 um 13:21)

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 13:25
    • #24

    ja so schon aber dann brauch ich für jeden Datentyp ne eigene compare Funktion und ich hab jetzt eine Funktion für alle Datentypen

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 13:29
    • #25

    Das ist richtig. Aber um strcmp zu verwenden, musst du alle Daten in Zeichenketten umwandeln. Das kostet Speicherplatz und erhöht die Laufzeit.

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 13:53
    • #26

    stimmt auch wida
    aba wir arbeiten zum glück noch nicht sehr ressourcen bewusst :grinning_squinting_face:

  • Paulchen
    1
    Paulchen
    Gast
    • 18. April 2009 um 13:58
    • #27
    Zitat von Adok

    Das ist richtig. Aber um strcmp zu verwenden, musst du alle Daten in Zeichenketten umwandeln. Das kostet Speicherplatz und erhöht die Laufzeit.

    Und liefert falsche Ergebnisse. 2 < 10, aber "2" > "10".

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 14:25
    • #28

    nunmal abgesehen vom qsort

    Wie kann ich nun eigentlich eine Datei in ein Array schreiben?

    FILE* und array sind ja nicht kompatibel

    Code
    FILE* datei;
    datei = fopen("test.txt", "r");
    while ((getc(datei)) != EOF)
    {
    array[i] = datei;
    i++;
    }

    funktioniert demnach nicht. Wie kann ich das anders lösen?

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 18. April 2009 um 14:39
    • #29

    Schau dir mal http://www.cplusplus.com/reference/clibrary/cctype/ an
    Wenn du natürlich von links parst musst du dir Gedanken machen wie du Zahlen baust: xyz123 z.B. Ende der Zahl finden, in char array kopieren und mit atoi oder atof konvertieren

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 14:51
    • #30

    nachdem ich die Angabe nun ja halbwegs verstanden habe
    stehen in keinem File Zahlen und Buchstaben gemischt nur entweder oder (z.B. die Datei besteht rein aus Fließkommazalen)

    wie können mir die cctype funktionen helfen eine Datei in ein Array zu schreiben?

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 18. April 2009 um 15:36
    • #31

    Ohne großartig zu checken:
    data.dat:
    3.545
    12.35
    5.456
    1.5456
    0.45656
    -3.5545

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    
    int compare (const void * a, const void * b)
    {
        return ( *(double*)a - *(double*)b );
    }
    
    
    int main ()
    {
        FILE * pFile;
    
    
        pFile = fopen("data.dat", "r");
        char buff[512];
        double array[512];
        size_t cnt = 0;
    
        while(!feof(pFile))
        {
            fgets(buff, 512, pFile);        
            array[cnt++] = atof(buff);        
        }
    
    
        fclose(pFile);
    
        --cnt;
    
        qsort (array, cnt, sizeof(double), compare);
    
        size_t n;
        for (n=0; n < cnt; n++)
            printf ("%lf ",array[n]);
    
        return 0;
    }
    Alles anzeigen
  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 15:44
    • #32
    Zitat von AlexW

    Wie kann ich nun eigentlich eine Datei in ein Array schreiben?

    Wenn du die Datei Byte für Byte einlesen willst, verwende die Funktion fgetc.
    Wenn deine Datei Daten von einem bestimmten Typ enthält, z. B. float, verwende fread.

  • damike
    8
    damike
    Mitglied
    Reaktionen
    11
    Punkte
    681
    Beiträge
    111
    • 18. April 2009 um 15:48
    • #33

    Ups stimmt - war ja binär ... Najo wie auch immer. Muss jetzt eh mal weiter lernen gehen. genug C für heut :winking_face:

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 15:49
    • #34

    woow so simple kanns gehen
    danke sehr
    bis auf size_t (muss ich mal eben googlen) hätt ich das wohl auch können sollen :hewa:

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 15:56
    • #35

    size_t ist der Datentyp von dem, was sizeof zurückgibt.

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 16:03
    • #36

    einfach und auf den punkt danke
    brauch ich nämlich bei lsearch auch nochmal :frowning_face:

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 17:00
    • #37

    schaut bei lsearch die compare funktion anders aus als bei bsearch weil beim funktionsaufruf gibt es anscheinend keinen Unterschied

    Zitat

    lsearch() soll von der Funktion und vom Aufruf her identisch sein mit bsearch(), außer daß das Feld für bsearch() sortiert sein muß. Für lsearch() ist dies nicht nötig.

    trotzdem geht die lsearch funktion (Code2) nicht

    C
    [COLOR=#000080]#include <stdio.h>
    #include <stdlib.h>
    
    
    int values[] = { 10, 20, 25, 40, 90, 100 };
    
    
    int compare (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    
    
    main ()
    {
      int * pItem;
      int key = 40;
      pItem = (int*) bsearch (&key, values, 6, sizeof (int), compare);
      if (pItem!=NULL)
        printf ("%d is in the array",*pItem);
      else
        printf ("%d is not in the array",key);
      return 0;
    }
    [/COLOR]
    Alles anzeigen
    C
    [COLOR=#000080]#include <stdio.h>
    #include <stdlib.h>
    
    
    int values[] = { 10, 40, 100, 20, 90, 25};
    
    
    int compare (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    
    
    main ()
    {
      int * pItem;
      int key = 40;
      pItem = (int*) lsearch (&key, values, 6, sizeof (int), compare);
      if (pItem!=NULL)
        printf ("%d is in the array",*pItem);
      else
        printf ("%d is not in the array",key);
      return 0;
    }
    [/COLOR]
    Alles anzeigen

    ich frage mich nun wieso?

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 17:42
    • #38

    Ich glaube zu wissen warum. Schau' dir die Parameter von lsearch noch einmal genau an. Siehe:
    http://www.codecogs.com/reference/c/search.h/lsearch.php

  • AlexW
    4
    AlexW
    Mitglied
    Punkte
    110
    Beiträge
    21
    • 18. April 2009 um 17:52
    • #39

    lfind und lsearch verwechselt?
    das beispielprogramm zu lsearch kapier ich nicht wirklich....

  • Adok
    20
    Adok
    Mitglied
    Reaktionen
    49
    Punkte
    4.199
    Beiträge
    714
    • 18. April 2009 um 17:55
    • #40

    Nein. Einer der Parameter von lsearch ist ein Pointer - im Gegensatz zu bsearch, wo dieser Parameter als Value übergeben wird.

    • 1
    • 2
    • 3

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern