Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Sortieren einer Tabelle

Empfohlene Antworten

Veröffentlicht

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

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.

Ja genau ich möchte die Inhalte sortieren nicht die Zeigeradressen. So ein mist. Dann schau ich mal wie man das mit strcmp macht. danke

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));

}

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'.

Super :) jetzt Funktioniert es wie es soll :o)) danke

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.