Zum Inhalt springen

Sortieren einer Tabelle


Psycho~zicke

Empfohlene Beiträge

Hallo ihr lieben,

ich habe folgendes Problem. Ich soll ein programm schreiben das Daten aus einer Tabelle einliest die Tabelle dann ordnet und in eine andere Datei ausgibt.

Bis auf das ordnen klappt auch alles wunderbar. Vllt wisst ihr ja wo mein fehler ist.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


#define MAX 15

#define MAXCHAR 50

#define True 1

#define False 0


void main()

{   

    /*

    Deklaration  FILE-Zeiger

    */ 

    FILE *fQuelle;

    FILE *fZiel;


    /*

    Daclaration der Variablen

    */

    char *sZeile2[MAX];

    char sZeile[MAXCHAR];

    int iZaehler;

    int iSortier;

    int iTausch;

    int Pos;

    int i;


    Pos = 0;

    iTausch = 0;

    /*

    öffnen der Datei

    */

    fQuelle = fopen("C:\\Kernig~1\\Lookup\\1-1-1.c","r");

    fZiel = fopen ("C:\\Kernig~1\\Lookup\\test.c", "w+");


    /*

    Überprüfung ob die Datei geöffnet werden kann

    */

    if (fQuelle == NULL)

    {

        printf("Fehler beim Oeffnen der Datei C:\\Kernig~1\\Lookup\\1-1-1.c\n");

    }


    for (iZaehler = 0;iZaehler < MAX ; iZaehler++)

    {

        /*

        Einlesen der aktuellen Zeile aus fQuelle

        */

        fgets(sZeile, MAXCHAR, fQuelle);


        /*

        entfernen des \n

        */

        sZeile[strlen(sZeile)-1] = 0;

        /*

        malloc macht einen Zeiger auf einen freien platz der sZeile +1 länge hat

        und übergibt den Zeiger an sZeile2[iZaehler]

        */

        sZeile2[iZaehler] = malloc(strlen(sZeile)+1); 

        /*

        Kopie wird von sZeile an sZeile2[iZaehler] gemacht

        */

        strcpy(sZeile2[iZaehler], sZeile);     

    }


    for (i = 1; i < MAX; i++)

    {

        iSortier = 0;    


        for(iZaehler = 0; iZaehler < MAX - i; iZaehler++)

        {

            if(sZeile2[iZaehler+1] < sZeile2[iZaehler])

            {

                iTausch = sZeile2[iZaehler];

                sZeile2[iZaehler] = sZeile2[iZaehler+1];

                sZeile2[iZaehler+1] = iTausch;

                iSortier = 1;

            }

        }

        if(!iSortier)

        {

            break; 

        }

    }

    for (iZaehler = 0; iZaehler < MAX; iZaehler++)

    {

        /*

        if abfrage damit nur einma die Tabellen überschriften erscheinen

        */

        if (Pos == 0) 

        {

        printf("\nName\t    Nachname\t    Alter\n");

        ++Pos;

        }

        /*

        Ausgabe der Datensätze bzw inhalte der Einzelnen Zeiger

        */

        printf("\n%s", sZeile2[iZaehler]);

        fputs (sZeile2[iZaehler],fZiel);

    }

} 

Danke schon mal im Vorraus.

Liebe Grüße die Zicke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Sortieren klappt hervorragend, falls es deine Absicht war, nach den Zeigeradressen zu sortieren, denn das tust du:

if(sZeile2[iZaehler+1] < sZeile2[iZaehler])

Hier vergleichst du zwei Zeiger, also zwei Speicheradressen. Das Ergebnis ist vom Inhalt dieser Strings natürlich unabhängig.

Du willst aber vermutlich nach dem Inhalt der Strings sortieren. Wenn es einfach nur eine alphanumerische Sortierung sein soll, muss da schon ein strcmp auftauchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super nun funktioniert es :o))

Habe aber trotzdem noch mal ne frage und zwar bekomme ich den ersten Datensatz (nach neuer reihenfolge) und den letzten Datensatz (nach alterreihenfolge doppelt ausgegeben. Woran kann das liegen?? Kann es leider nicht feststellen. Danke schon mal im Vorraus.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


#define MAX 15

#define MAXCHAR 50

#define True 1

#define False 0


int Vergleich(const void *s1, const void *s2);


void main()

{   

    /*

    Deklaration  FILE-Zeiger

    */ 

    FILE *fQuelle;

    FILE *fZiel;


    /*

    Daclaration der Variablen

    */

    char *sZeile2[MAX];

    char sZeile[MAXCHAR];

    int iZaehler;

    int iSortier;

    int iTausch;

    int Pos;

    int i;


    Pos = 0;

    iTausch = 0;

    /*

    öffnen der Datei

    */

    fQuelle = fopen("C:\\Kernig~1\\Lookup\\1-1-1.c","r");

    fZiel = fopen ("C:\\Kernig~1\\Lookup\\test.c", "w+");


    /*

    Überprüfung ob die Datei geöffnet werden kann

    */

    if (fQuelle == NULL)

    {

        printf("Fehler beim Oeffnen der Datei C:\\Kernig~1\\Lookup\\1-1-1.c\n");

    }


    for (iZaehler = 0;iZaehler < MAX ; iZaehler++)

    {

        /*

        Einlesen der aktuellen Zeile aus fQuelle

        */

        fgets(sZeile, MAXCHAR, fQuelle);


        /*

        entfernen des \n

        */

        sZeile[strlen(sZeile)-1] = 0;

        /*

        malloc macht einen Zeiger auf einen freien platz der sZeile +1 länge hat

        und übergibt den Zeiger an sZeile2[iZaehler]

        */

        sZeile2[iZaehler] = malloc(strlen(sZeile)+1); 

        /*

        Kopie wird von sZeile an sZeile2[iZaehler] gemacht

        */

        strcpy(sZeile2[iZaehler], sZeile);     

    }


    for (i = 1; i < MAX; i++)

    {

        for(iZaehler = 0; iZaehler < MAX - i; iZaehler++)

        {

            if (strcmp(sZeile2[iZaehler+1], sZeile2[iZaehler]) <0)

            {

                sZeile2[iTausch] = sZeile2[iZaehler];

                sZeile2[iZaehler] = sZeile2[iZaehler+1];

                sZeile2[iZaehler+1] = sZeile2[iTausch];

            }

        }

    }

    for (iZaehler = 0; iZaehler < MAX; iZaehler++)

    {

        /*

        if abfrage damit nur einma die Tabellen überschriften erscheinen

        */

        if (Pos == 0) 

        {

        printf("\nName\t    Nachname\t    Alter\n");

        ++Pos;

        }

        /*

        Ausgabe der Datensätze bzw inhalte der Einzelnen Zeiger

        */

    printf("\n%s", sZeile2[iZaehler]);

    fputs (sZeile2[iZaehler],fZiel);

    }

}


int Vergleich(const void *s1, const void *s2)

{

    return (strcmp(*(char **)s1, *(char **)s2));

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe aber trotzdem noch mal ne frage und zwar bekomme ich den ersten Datensatz (nach neuer reihenfolge) und den letzten Datensatz (nach alterreihenfolge doppelt ausgegeben. Woran kann das liegen??

Daran, dass du das erste Element deines Arrays als "Tauschelement" missbrauchst. Das, was da vorher drinstand, ist damit verloren, dafür hast du einen Eintrag verdoppelt.

P.S.:

"Voraus" mit einem 'r'.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...