Komandozeilenparameter (Sortier Algorithmus)



  • Hallo,

    ich habe viele positive Kritik über diese Community-Seite gehört und ich hoffe, auch mir kann man hier helfen.

    Und zwar muss ich für Infopraktikum ein Programm (SortierAlgorithmus) programmieren. Ich habe eigentlich so ziemlich alles geschafft, es fehlen mir noch ein paar Feinarbeiten der Aufgabenstellung.

    Hier die Aufgabenstellung:

    "Implementieren Sie den SortierAlgorithmus Bubblesort in einem CProgramm MySort.exe mit mehreren Modulen und Funktionen. Ihr Programm soll die zu sortierenden Daten per Zufallsgenerator erheben und die Menge der zu sortierenden Daten dabei als Komandozeilenparameter einlesen.
    Ein zweiter Kommandozeilenparameter soll optional den Namen einer Datei enthalten, in der das Ergebnis zusätzlich zur Ausgabe auf dem Bildschirm gespeichert wird. Der Aufruf könnte so aussehen: > MySort 25 erg.txt

    Der Quelltext soll aus mehreren Modulen und Funktionen aufgebaut sein. Fangen Sie alle möglichen Fehlerquellen ab. "

    Hier mein bisher geschriebenes C-Programm:

    "

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX_N 25
    
    /* ---- Funktionsdeklarationen ---------------------------------------- ---------------- */
    
    void bubble(int *a, int n);
    void (*(sort_funk[1]))(int *a, int n)={ bubble};
    
    /* ---- main() ---------------------------------------- -------------------------------- */
    int main(void)
    {
    int a[MAX_N], i, auswahl;
    FILE *fIn, *fOut;
    
    srand(time(NULL));
    
    if( NULL == (fIn = fopen( "zahlen.txt", "w")) )
    
    {
    	printf( "\nError! Datei kann nicht geoeffnet werden %s \n", "zahlen.txt" );
    
    return( -1);
    }
    
    if( NULL == (fOut = fopen( "szahlen.txt", "w")) )
    
    {
    	printf( "\nError! Datei kann nicht geoeffnet werden %s \n", "szahlen.txt" );
    return( -2);
    }
    
    /* Feld mit Zufallszahlen initialisieren */
    
    printf("Anfaenglich initialisiertes Feld:\n");
    
    for(i=0; i<MAX_N; ++i)
    
    {
    	printf("%d, ", a[i]=rand()%100+1);
    	fprintf( fIn, "%d, ", a[i]);
    }
    	printf("\b\b  \n\n");
    	printf(	"Um den Sortieralgorithmus zu starten, druecken Sie 1!\n" " (1) Bubble Sort\n");
    do
    
    {
    printf(" > ");
    scanf_s("%d", &auswahl);
    }
    
    while(auswahl<1 || auswahl>1);
    
    sort_funk[auswahl-1](a, MAX_N);
    
    printf("Sortiertes Feld:\n");
    for(i=0; i<MAX_N; ++i)
    
    {
    printf("%d, ", a[i]);
    
    fprintf(fOut, "%d, " , a[i]);
    }
    
    printf("\b\b \n\n");
    
    fclose( fIn);
    fclose( fOut);
    
    return 0;
    }
    
    /* ---- bubble sort ---------------------------------------- --------------------------- */
    /* - in einer äußeren Schleife wird das Feld von hinten nach vorn durchlaufen, in der - */
    /* - inneren Schleife werden die Elemente des Restfeldes von vorn nach hinten der - */
    /* - Reihe nach betrachtet und mit dem Nachfolger vertauscht, wenn sie größer sind - */
    /* - Algorithmus benötigt im Durchschnitt N^2/2 Vergleiche und N^2/2 Austausche - */
    /* - im ungünstigsten Fall werden ebensoviele Operationen benötigt... - */
    /* ---------------------------------------- ---------------------------------------- ---- */
    void bubble(int *a, int n)
    {
    	int hilf, i, j;
    	for(i=n-1; i>0; --i)
    	for(j=0; j<i; ++j)
    	if(a[j]>a[j+1])
    
    	{
    		hilf=a[j]; a[j]=a[j+1]; a[j+1]=hilf;
    	}
    }
    

    "

    Mein Problem ist die Menge der zu sortierenden Daten dabei als Komandozeilenparameter einlesen zu lassen.

    vielen Dank, Isi



  • Bitte benutze die Tags damit man den Quelltext einfacher lesen kann.

    Du hast schon einen blassen Schimmer, was Kommandozeilenparameter sein
    könnten? Warum setzt du deine Kenntnisse nicht um im Quelltext?
    Wenigstens so ein kleiner Ansatz sollte dir möglich sein:

    int main( .... )
    

    anstatt der Punkte schreib da mal das richtige rein 😉

    MfG f.-th.



  • du solltest in deinem bubblesort noch eine ready-flag implementieren..

    das macht den algorithmus schneller und spielt auch seine stärken besser aus.

    am besten die erste for in eine do-while ändern hierfür.

    auf gut deutsch: sollte kein dreiecktausch mehr stattfinden ist das array fertig sortiert.

    :xmas2: :xmas1: :xmas2:



  • ps: du ziehst auch die arraygrenze nicht nach...



  • faster 2 schrieb:

    ps: du ziehst auch die arraygrenze nicht nach...

    ups schwachsinn



  • hi,

    die kommandozeilenparameter kannst du so auswerten

    // Die kommandozeilenparameter stehen in argv und die anzahl der parameter in argc
    // in argv[0] steht der Programmaufruf
    int main(int argc, char **argv)
    {
        int zahl;
        // Prüfen ob die anzahl korrekt ist
        if (argc != 1)
        {
            // parameter dann weiter verarbeiten
            // atoi wandelt einen string zu einem int
            zahl = atoi(argv[1]);
        }
        // Weiterer code
    }
    

    Hoffe es hilft dir



  • Hallo,

    vielen Dank für die Hilfe bis hierhin. Ich bin schon ein Stückchen weiter gekommen. Hab nur noch ein Problem mit dem Debugger. Das Programm funktioniert bis (MySort 25.exe) so, wie ich es mir gedacht habe, erhöhe ich jedoch diese Zahl über 25, dann meldet sich der Debugger.

    (Vielleicht sollte ich erwähnen, dass ich sowohl Microsoft Visual Studio und Dev-C++ gleichzeitig auf dem PC installiert habe)...

    Hier mein geschriebenes C-Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void bubble(int *a, int n);
    void (*(sort_funk[1]))(int *a, int n)={ bubble};
    
    // Die kommandozeilenparameter stehen in argv und die anzahl der parameter in argc 
    // in argv[0] steht der Programmaufruf 
    int main(int argc, char **argv)
    {
    int zahl;
    int a[zahl], i, auswahl;
     FILE *fIn, *fOut;
    
        // Prüfen ob die anzahl korrekt ist 
       if (argc != 1) 
        { 
            // parameter dann weiter verarbeiten 
            // atoi wandelt einen string zu einem int 
            zahl = atoi(argv[1]); 
        } 
    
    srand(time(NULL));
    
    if( NULL == (fIn = fopen( "UnSort.txt", "w")) )
    
    {
    	printf( "\nError! Datei kann nicht geoeffnet werden %s \n", "UnSort.txt" );
    
    return( -1);
    }
    
    if( NULL == (fOut = fopen( "erg.txt", "w")) )
    
    {
    	printf( "\nError! Datei kann nicht geoeffnet werden %s \n", "erg.txt" );
    return( -2);
    }
    
    printf("Anfaenglich initialisiertes Feld:\n");
    
    for(i=0; i<zahl; ++i)
    
    {
    	printf("%d, ", a[i]=rand()%100+1);
    	fprintf( fIn, "%d, ", a[i]);
    }
    	printf("\b\b  \n\n");
    	printf(	"Um den Sortieralgorithmus zu starten, druecken Sie 1!\n" " (1) Bubble Sort\n");
    do
    
    {
    printf(" > ");
    scanf("%d", &auswahl);
    }
    
    while(auswahl<1 || auswahl>1);
    
    sort_funk[auswahl-1](a, zahl);
    
    printf("Sortiertes Feld:\n");
    for(i=0; i<zahl; ++i)
    
    {
    printf("%d, ", a[i]);
    
    fprintf(fOut, "%d, " , a[i]);
    }
    
    printf("\b\b \n\n");
    
    fclose( fIn);
    fclose( fOut);
    
    system("Pause");
    return 0;
    }
    
    void bubble(int *a, int n)
    {
    	int hilf, i, j;
    	for(i=n-1; i>0; --i)
    	for(j=0; j<i; ++j)
    	if(a[j]>a[j+1])
    
    	{
    		hilf=a[j]; a[j]=a[j+1]; a[j+1]=hilf;
    }
    }
    

Anmelden zum Antworten