strcmp mit sortierfunktion Denkfehler

umx3511

Grünschnabel
Hallo zusammen,

ich lerne gerade C und hänge hier gerade etwas fest
ich hab ein testprogramm geschrieben mit dem ich einen mehrere Sätze einlesen will
diese sortieren will und wieder sortiert ausgebe damit ich die funktion strcmp etwas besser verstehe !!

hier mal mein Code

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char Z[100][100];
char zw[100][100];
int main()
{
    int i,a,k,er;
    
    system("color 0A");
    printf("\n\n\n\t\t\t   Programm Start ! ");
    printf("\n\n\n\t\t Wieviele Saetze wollen sie eingeben ? ");
    scanf("%i",&a);
    fflush(stdin);
    
    for (i=0; i<a;i++)
    {
    printf("\n\n\t\tBitte geben sie den %i. Satz ein ",i+1);
    scanf("%s",&Z[i]);
    fflush(stdin);
    
    }
    system("cls");
    
    printf("\n\n\n\t\t\t Vor der Umstellung \n");
    for (i=0;i<a;i++)
    {
        
        printf("\n\n\n\t\t       der %i. Satz war %s ",i+1,Z[i]);
        
        
        
        }
        
        for (i=0;i<a-1;i++)
        {
            for (k=0;k<a-1;k++)
            {
                er=strcmp(Z[k],Z[k+1]);
                if (er > 0)
                {
                       zw[k]=Z[k];
                       Z[k]=Z[k+1];
                       Z[k+1]=zw[k];
                }
            }                  
        }
        
       printf("\n\n\n\n\n\t\t   nach der Umstellung \n");
    for (i=0;i<a;i++)
    {
        
        printf("\n\n\n\t\t       der %i. Satz war %s ",i+1,Z[i]);
        
        
        
        }                                      
                    
printf("\n\n\n\n\n\n\n");
system("Pause");
}

das Programm läuft nicht die Sortierfunktion geht nicht

zw[k]=Z[k];
Z[k]=Z[k+1];
Z[k+1]=zw[k];

wo ist mein Denkfehler ohne die Sortierfunktion geht das Programm
 
Also dann so in der Weiße
Code:
for (i=0;i<a-1;i++)
        {
            for (k=0;k<a-1;k++)
            {
                er=strcmp(Z[k],Z[k+1]);
                if (er > 0)
                {
                       strcpy(zw[k],Z[k]);
                       strcpy(Z[k],Z[k+1]);
                       strcpy(Z[k+1],zw[k]);
                }
            }                  
        }

gibt´s da noch ne möglichkeit das zu machen
 
Also dann so in der Weiße
Ja, so in der Weise.
gibt´s da noch ne möglichkeit das zu machen
Ja, man könnte ein Array von Zeigern auf char verwenden, die muss man dann nicht die Strings kopieren, sondern kann sie zuweisen. Dann könnte man auch einfach die qsort Funktion verwenden. Zu beachten ist dann allerdings, das der Speicher dafür dynamisch alloziert und auch wieder ordentlich freigegeben werden muss.

Gruß
 
aha also mit zeigern hab ich es nicht so ganz ehrlich, so weit bin ich noch nicht um mich da durch zu kämpfen !

das Programm geht jetzt auch so wie ich es haben wollte hab da nur ein problem noch

wenn ich z.b zahlen sortieren lasse also
1,2,3,4,11,24,22,12,44,33,41

dann bekomme ich
das in der dieser Reihenfolge zurück

1, 11, 12, 2, 22, 24, 3, 33, 4, 41, 44

anstelle von 1,2,3,4,11,12,22,24,33,41,44

wie bekomme ich das hin oder muss ich jetzt damit leben das die 12 vor 2 kommt nach dem Sortieren

hier nochmals der Komplette Code von meinem Testprogramm

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>


char Z[100][100];
char zw[100][100];
int main()
{
    int i,a,k,er,h;
    char w,j;
    j=106;
    system("color 0A");
    printf("\n\n\n\t\t\t   Programm Start ! ");
    printf("\n\n\n\t\t Wieviele Saetze wollen sie eingeben ? ");
    scanf("%i",&a);
    fflush(stdin);
    
    for (i=0; i<a;i++)
    {
    printf("\n\n\t\tBitte geben sie den %i. Satz ein ",i+1);
    scanf("%s",&Z[i]);
    fflush(stdin);
    
    }
    system("cls");
    
    printf("\n\n\n\t\t\t Vor der Umstellung \n");
    for (i=0;i<a;i++)
    {
        
        printf("\n\n\n\t\t       der %i. Satz war %s ",i+1,Z[i]);
        
        
        
        }
        
        for (i=0;i<a-1;i++)
        {
            for (k=0;k<a-1;k++)
            {
                er=strcmp(Z[k],Z[k+1]);
                if (er > 0)
                {
                       strcpy(zw[k],Z[k]);
                       strcpy(Z[k],Z[k+1]);
                       strcpy(Z[k+1],zw[k]);
                }
            }                  
        }
        
       printf("\n\n\n\n\n\t\t\t nach der Umstellung \n");
    for (i=0;i<a;i++)
    {
        
        printf("\n\n\n\t\t       der %i. Satz war %s ",i+1,Z[i]);
        
        
        
        }
        getch();
        //system("cls");
        
        printf("\n\n\t\t\t Wollen Sie einen Satz Loeschen (j/n) ? ");
        fflush(stdin);
        scanf("%c",&w);
        if (w!=j)
        {
         printf("\n\n\n\t\t\t Programm Ende ");
          getch();
         return 0;      
        }
        
           // system("cls");        
            printf("\n\n\t\t\t Es sind %i Saetze vorhanden  ",a);
            printf("\n\n\t\t welchen Satz wollen sie Loeschen ? Nr: ");
            fflush(stdin);
            scanf("%i",&h);
            
            printf("\n\n\n\t %s",Z[h]);
                               
                 for (h=h-1;h<(a-1);h++)
                 {
                     strcpy(Z[h],Z[h+1]); 
                     }
a=a-1;
                 
  printf("\n\n\n\n\n\t\t\t nach dem Loeschen  \n");
    for (i=0;i<a;i++)
    {
        
        printf("\n\n\n\t\t       der %i. Satz war %s ",i+1,Z[i]);
        }
        
printf("\n\n\n\n\n\n\n");
getch();
}
 
Zuletzt bearbeitet:
aha also mit zeigern hab ich es nicht so ganz ehrlich, so weit bin ich noch nicht um mich da durch zu kämpfen !

das Programm geht jetzt auch so wie ich es haben wollte hab da nur ein problem noch

wenn ich z.b zahlen sortieren lasse also
1,2,3,4,11,24,22,12,44,33,41

dann bekomme ich
das in der dieser Reihenfolge zurück

1, 11, 12, 2, 22, 24, 3, 33, 4, 41, 44

anstelle von 1,2,3,4,11,12,22,24,33,41,44
Ja, das liegt daran, dass die strcmp Methode lexikografisch vergleicht und nicht numerisch. Du könntest dir natürlich eine eigene Vergleichsfunktion schreiben, die erkennt ob es sich um 2 Zahlen im String handelt und dann die Zahlenwerte vergleicht, ansonsten ein strcmp durchführt.

Übrigens ist es unnötig das zw Array 2-dimensional zu definieren. Es reicht wenn das ein char[100] ist.

Gruß
 
Zurück