Hilfe für C



  • Hallo, ich muss bei dieser Hausaufgabe jeden Durchgang einzeln ausgeben und immer links von dem unsortierten Bereich das Wort 'Weihnachtsmann:' haben und ich komme einfach nicht weiter, egal wo ich versuche das auszugeben, ob innerhalb des Sortiervorganges oder außerhalb, es zeigt entweder die sortierte List oder garnichts. Und wie kann ich das Wort Weihnachtsmann immer links vom unsortierten Bereich angeben? Momentan (Code wie dargestellt) gibt der die komplett sortierte Liste aus. Könnt ihr mir helfen? Danke
    Mein Code ist:

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <time.h>
    int main()
    {
        srand(time(NULL));
        int i, swapped;
        int arr[10];
        for (int i = 0; i<10; i++)  //Creats Array with 10 Reindeers
        {
            arr[i] = (rand()%15+2)*2;   //Creats Even Random Number between 4 and 32
        }
    
        printf("Unsorted\n");
        for(int i=0; i<10; i=i+1)   //arr[i] wir von 0 bis zur 10 Stelle ausgegeben
        {
            printf("|%d|", arr[i]);
        }
    
        printf("\n\nSortedList \n");
    
        while(swapped=true)
        {
            swapped=false;
            for(int i=0; i<10; i++)
            {
                if(arr[i]>arr[i+1])
                {
                    int tmp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=tmp;
                    swapped = true;
                }
            }
            if(swapped==false)
            {
                break;
            }
        }
    
        for(i=0; i<10; i=i+1)
        {
            printf("|%d|", arr[i]);
        }
    }


  • @Martin1809 bitte bearbeite deinen Beitrag.
    rechts unten sind 3 Punkte. Draufklicken und bearbeiten wählen.
    Dann markierst du den gesamten Code und clickst dann auf das </> Symbol über dem Editorfenster.
    Den Erfolg kannst du rechts sehen.

    In C schreibt man, wenn man bis 9 zählen will nicht <= 9 sondern < 10. Dann sieht man sofort, dass es 10 Durchläufe sind, da bei 0 angefangen wird.

    Wenn das Wort, das in deinem Code nicht ein einziges mal vorkommt, am Zeilenanfang stehen soll, muss es nach jedem \n nochmal ausgegeben werden.



  • @DirkB Danke für den Tipp mit i<10. Warum das Wort Weihnachtsmann nicht in mein Code ist, weil ich jeden Durchgang des Algorithmus angeben soll und in jeder Ausgabe muss der Weihnachtmann ein weiter nach rechts rücken. Und ich weiß eben nicht wie ich das bewerkstelligen soll.



  • @Martin1809 sagte in Hilfe für C:

    while(swapped=true)

    das ist schonmal falsch.

    if(swapped==false)
    {
    break;
    }

    und das ist unnötig, weil du die bedingung ja im kopf der schleife prüfst.

    und die ausgabe erfolgt im regelfall nach der verarbeitung der daten, d.h. in diesem fall am ende der schleife

    und weil du einen bubblesort programmierst, macht es natürlich sinn, das wort weihnachtsmann an bzw. vor der position auszugeben, die gerade nach oben steigt.



  • @Wade1234 Ich verstehe nicht in wiefern

    while(swapped==true)
    

    falsche ist und wenn ich

    if(swapped==false)
    {
    break;
    }
    

    weg mache funktioniert es nicht mehr.



  • @Martin1809 Schalte die Compilerwarnungen auf die höchste Stufe und beachte diese.
    Behandele Warnungen wie Fehler. Behebe deren Ursache.

    Es wurde nicht swapped==true bemängelt, sondern swapped=true.
    Sehr großer Unterschied.

    Welchen Wert hat swapped beim Eintritt in die Schleife?

    In Zeile 26 darfst du nur bis 8 zählen, da du in der Schleife auf das Element i+1 zugreifst.
    Wenn i 9 ist, wäre das dann 10 und das Element existiert nicht.

    Gib mal ein Beispiel für die gewünschte Ausgabe.
    (auch als Code markieren, da sonst die führenden Leerzeichen entfernt werden)



  • @Wade1234 Wenn ich swapped==false habe funktioniert die Ausgabe nicht mehr, das heißt es wird nichts ausgegeben.
    Ein Beispiel für die Gewünschte Ausgabe:

    Unsorted:
    Weihnachtsmann: |4||8||12||12||14||26||...
    -----------------------
    |4| Weihnachtmann: |8||12||12||14||26||...
    ----------------------
    |4||8| Weihnachtsmann: |12||12||14||26||...
    -----------------------
    ...
    -----------------------
    |4||8||12||12||14| Weihnachtsmann: |26||...
    


  • @Martin1809 weißt du überhaupt, wie eine while-schleife funktioniert und was da im kopf eigentlich geprüft werden soll?



  • @Wade1234 Schuldigung, dass das Fett geschrieben ist ich kann das auch irgendwie nicht mehr ändern



  • @Martin1809 warum glaubst du, dass swapped == false im schleifenkopf stehen sollte? und was glaubst du, wie sich das auf den programmablauf auswirken würde? welchen wert hat swapped eigentlich beim eintritt in die schleife?



  • @Wade1234 swapped hat den Wert true



  • @Martin1809 Zähle die Durchläufe der while-Schleife ( z.B. mit der Variablen j.
    Wenn i == j ist, gibst du "Weihnachtsmann" aus.

    Lies bitte nochmal aufmerksam unsere Antworten bezüglich swapped=true durch. Und beachte die Anzahl der = dabei.



  • @Martin1809 sagte in Hilfe für C:

    @Wade1234 swapped hat den Wert true

    Wie kommst du darauf?



  • @Wade1234

    while(swapped==true);
       {
           swapped=false;
           for(int i=0; i<8; i++)
           {
               if(arr[i]>arr[i+1])
               {
                   int tmp=arr[i];
                   arr[i]=arr[i+1];
                   arr[i+1]=tmp;
                   swapped = true;
               }
           j++;
    for(i=0; i<10; i=i+1)
       {
           if(i==j)
           {
               printf("Weihnachtsmann:");
           }
           printf("|%d|", arr[i]);
       }
           }
    
       }
    

    Ist das so wie du meinst?



  • @Martin1809 in Zeile 3 zählst du gerade nur bis 7.

    Sollte der Weihnachtsmann nicht während des Sortierens ausgegeben werden?

    Das j macht so keinen Sinn, da es nach der while-Schleife nicht mehr verändert wird.

    Welchen Werte haben swapped und j beim Eintritt in die while-Schleife?

    Und wo wird swapped mal auf false gesetzt?



  • @DirkB for()... ist noch in der while schleife nach dem if geschlossen wird



  •     do
        {
            swapped=false;
            for(int i=0; i<8; i++)
            {
                if(arr[i]>arr[i+1])
                {
                    int tmp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=tmp;
                    swapped = true;
                }
                j++;
                for(i=0; i<10; i=i+1)
                {
                    if(i==j)
                    {
                        printf("Weihnachtsmann:");
                    }
                    printf("|%d|", arr[i]);
                }
            }
        }
        while(swapped==true);
    }
    

    Das ist jetzt die Ausgabe:

    SortedList
    |4||26||8||26||12||26||20||16||14|Weihnachtsmann:|14||4||26||8||26||12||26||20||16||14||14|



  • @Martin1809 sagte in Hilfe für C:

    @DirkB for()... ist noch in der while schleife nach dem if geschlossen wird

    ok. Die Einrückung war verwirrend.

    Die beiden verschachtelten for-Schleifen haben beide i als Laufvariable.

    und ein Newline (\n) ab und zu, macht die Ausgabe übersichtlicher.



  • @Martin1809 Vielleicht einfach erstmal richtig sortieren ohne den verda***** Weihnachtsmann?



  • do
        {
            swapped=false;
            for(int i=0; i<8; i++)
            {
                if(arr[i]>arr[i+1])
                {
                    int tmp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=tmp;
                    swapped = true;
                }
                j++;   
            }
        }
        while(swapped==true);
        for(int i=0; i<10; i=i+1)
        {
            printf("|%d|", arr[i]);
        }
    }
    

    So gibt er die Zahlen sortiert aus und das ist der einzige Weg den ich finde.


Log in to reply