Drei eingegebene Zahlen sortieren



  • Du brauchst nur drei Vergleiche und musst evtl. dann jeweils die zwei Zahlen tauschen.

    swap_if(c < a, a, c) bedeutet: Wenn c kleiner als a ist, vertausche die Inhalte von a und c.
    

    Entsprechend für die anderen Kombinationen.

    Am Ende sollte dann a <= b <= c sein.



  • Wie schon die alten Römer sagten: Teile und herrsche.

    Die Lösung solltest du schon selbst finden.



  • /* Zahlen_Sortieren.c */
    #include <stdio.h>
    
    main() {
    
           int zahl1, zahl2, zahl3, a, b, c;
    
           printf("Geben Sie drei Zahlen an. Diese werden dann sortiert wieder ausgegben.\n");
    
           printf ("Zahl 1:");
           scanf ("%d", &zahl1);
    
           printf ("Zahl 2:");
           scanf ("%d", &zahl2);
    
           printf ("Zahl 3:");
           scanf ("%d", &zahl3);
    
           if (zahl1 < zahl2) {
                     if (zahl2 < zahl3) {
                               printf ("%d, %d, %d\n", zahl1, zahl2, zahl3);
                     } else {
                            if (zahl1 < zahl3) {
                                      printf ("%d, %d, %d\n", zahl1, zahl3, zahl2);
                            } else {
                                   printf ("%d, %d, %d\n", zahl3, zahl1, zahl2);
                            }
                     }
           } else {
                     if (zahl1 < zahl3) {
                               printf ("%d, %d, %d\n", zahl2, zahl1, zahl3);
                     } else {
                            if (zahl3 < zahl2) {
                                      printf ("%d, %d, %d\n", zahl3, zahl2, zahl1);
                            } else {
                                   printf ("%d, %d, %d\n", zahl2, zahl3, zahl1);
                                   }
                            }
                     }
    system ("PAUSE");
    }
    

    Weniger Code, aber ist leider unübersichtlicher geworden. Was sagt ihr?
    Kann man das Programm noch kürzer fassen? Nur mit Hilfe von if/else?



  • Ich sage, du hast nichts umgesetzt von dem, was ich dir geraten habe. Weisst du, was eine Funktion ist?



  • Ein häufig unterschätztes Werkzeug beim Programmieren sind Zettel und Stift. Nimm dir erstmal beides und überlege dir, wie du das Problem lösen willst (Du hast 3 Zahlen, vergleichst zwei davon miteinander und überlegst, was du mit den beiden Zahlen machst usw.. Notiere dir, wie sich deine Variablen verändern).
    Erst, wenn du meinst, eine gute Lösung zu haben, machst du dich ans Programmieren.
    Mein Tip: Algorithmen entwickeln auf dem Papier, umsetzen am Rechner 🙂

    Gruß



  • @knivil Ich weiß nicht was eine Funktion ist. Bis jetzt haben wir das nicht durchgenommen. Wir sollen die Aufgabe nur mit Hilfe von if/else und den Schleifen (for, while, do...while) lösen. Ich kenne C erst seit einem Monat.
    Ich kann nicht mehr, als das was im Programm steht. Mehr Funktionen/Operationen kenne ich nicht. Also mit swap_if sollen wir das nicht lösen.

    @fibeline Ja, das wurde uns auch schon gesagt. Naja mal schauen, ich mag diese Methode nicht so sehr^^



  • Dann machste halt selber ein swap_if:

    DirkB schrieb:

    swap_if(c < a, a, c) bedeutet: Wenn c kleiner als a ist, vertausche die Inhalte von a und c.
    

    Heißt:

    if (c < a)
      // vertausche c und a
    

    Das vertauschen kriegste wohl selber hin. Tipp: Brauchst eine Zwischenvariable.
    -----
    Ich sollte mir mein Passwort merken, das nimmt hier langsam Zustände an. 🙄
    Verdammte "bei jedem Besuch automatisch anmelden" - Funktion, wenn sie nicht auf jedem Gerät ist.



  • Also ich glaube mit dem Skatspielen ist das wie mit dem Programmieren:
    Entweder man lernt es oder man lernt es nie. 😃
    Auch wenn ich jetzt virtuell gesteinigt werde hier eine Lösung ohne Funktion:

    #include <stdio.h>
    // 
    int main()
    {
        int a,b,c, swap;
    // 
        printf("Geben Sie drei Zahlen an. Diese werden dann sortiert wieder ausgegben.\n");
    //  
        printf ("Zahl 1:");
        scanf ("%d", &a);
    // 
        printf ("Zahl 2:");
        scanf ("%d", &b);
    // 
        printf ("Zahl 3:");
        scanf ("%d", &c);
    // 
        printf("Die Zahlen der Größe nach sortiert: ");
        // Zuerst schauen wir wies mit a aussieht
    	if(c < a) {swap = a;a = c;c = swap;} // swap_if(c < a, a, c)
    	if(b < a) {swap = a;a = b;b = swap;} // swap_if(b < a, a, b)
    	// Jetzt ist a definiv die kleinste Zahl
    	// Jetzt schauen wir noch was b und c machen
    	if(c < b) {swap = c;c = b;b = swap;} // swap_if(c < b, c, b)
    	// Und schwuppdiewupp haben wir eine sortierte Reihe
        printf(" %d %d %d\n", a,b,c);
    
        return 0;
    }
    


  • Danke für den Code!
    Spätestens nach Nathan_logoffs Kommentar wusste ich, was zu tun ist.
    Aber auf dieses Tauschen der Werte muss man erst einmal kommen 😃
    Für euch muss das bestimmt ganz simpel vorkommen. Aber wenn man noch nicht so lange programmiert bzw. sich mit Algorithmen beschäftigt, dann ist sowas doch schwieriger als es aussieht. Ich habe in eine ganz andere Richtung gedacht.
    Naja egal, vielen Dank euch Allen!



  • StudentOhneAhnung schrieb:

    Entwickeln Sie einen Algorithmus, welcher drei Zahlen vom Benutzer einliest und diese dann der Größe sortiert auf dem Bildschirm ausgibt.

    Das war Deine Eingangsaufgabe.

    Der von mehreren Teinehmern vorgeschlagene Algorithmus und mein Code lösen zwar das Problem recht elegant - aber es ist definitiv keine "saubere" Lösung...

    Wenn Du etwa eine grössere Zahlenreihe sortieren willst, kommen andere Algorithmen ins Spiel: Stichwort Bubble Sort, Quicksort etc. Zudem werden die Zahlen dann in Arrays gespeichert und in einer oder mehreren verschachtelten Schleifen abgearbeitet.

    Mein Posting mit dem Code war eigentlich nur deshalb, da ich der Meinung bin, dass man auch Studierenden nicht unbedingt aufzwängen sollte "das Rad" neu zu erfinden. Einem Einsteiger ins Skatspielen wird man auch nicht auferlegen, rauszufinden welche Strategie man etwa bei einem "Null" Spiel am Besten anwendet... 🙂



  • Jop, sehe ich auch so ^^



  • StudentOhneAhnung schrieb:

    Für euch muss das bestimmt ganz simpel vorkommen.

    Jupp. Es ist ein Standard-Vorgehen. Diese Kleinigkeit hat jeder Programmierer in der Trickkiste und kanns bei Bedarf reflexartig in die Tastatur einklimpern.

    StudentOhneAhnung schrieb:

    Aber wenn man noch nicht so lange programmiert bzw. sich mit Algorithmen beschäftigt, dann ist sowas doch schwieriger als es aussieht. Ich habe in eine ganz andere Richtung gedacht.

    Das kenne ich. Als mir zum ersten mal diese Aufgabe gestellt wurde, brauchte ich zwei Wochen dafür, um sie überhaupt zu lösen, und auf den den guten Trick mit dem Vertauschen bin ich selber gar nicht gekommen.



  • StudentOhneAhnung schrieb:

    Wir sollen die Aufgabe nur mit Hilfe von if/else und den Schleifen (for, while, do...while) lösen.

    Und ohne Arrays? Das ist schonmal der Anfang vom Ende... Man sollte erst Arrays lernen und dann sortieren, komisches ditaktisches Konzept. Das endet dann in den Programmen wo 10+x mal untereinander der gleiche Code kopiert wurde. Diese 3 Swaps von knivil sind im Grunde schon Bubblesort, den man normalerweise aber als Schleife ueber ein Array implementiert statt den gleichen Befehl drei mal untereinander zu kopieren.



  • TGGC schrieb:

    Und ohne Arrays? Das ist schonmal der Anfang vom Ende... Man sollte erst Arrays lernen und dann sortieren, komisches ditaktisches Konzept. Das endet dann in den Programmen wo 10+x mal untereinander der gleiche Code kopiert wurde. Diese 3 Swaps von knivil sind im Grunde schon Bubblesort, den man normalerweise aber als Schleife ueber ein Array implementiert statt den gleichen Befehl drei mal untereinander zu kopieren.

    Danke!

    Ich programmiere jetzt auch nicht jeden Tag einen Bubble Sort, aber das Schnellschussprogramm funktioniert:

    #include <stdio.h>
    //
    #define Z_MAX 3
    int main()
    {
        int zahl[Z_MAX], swap, anz = Z_MAX, i, j;
    //
        printf("Geben Sie %d Zahlen an. Diese werden dann sortiert wieder ausgegben.\n", anz);
    //  
    	for (i=0;i < anz; i++)
    	{
    		printf ("Zahl %d: ", i+1);
    		scanf ("%d", &zahl[i]);
    	}
    //
        printf("Die Zahlen der Größe nach sortiert: ");
    //
        for (i = 0; i < anz; i++) 
        {
    		for (j = 0; j < anz - i - 1; j++) 
    		{
    			if (zahl[j] > zahl[j + 1]) 
    			{
    				swap = zahl[j];
    				zahl[j] = zahl[j + 1];
    				zahl[j + 1] = swap;
    			}
    		}
        }
        for (i = 0; i < anz; i++) 
        { 
    		printf(" %d", zahl[i]);
    	}
        return 0;
    }
    

    @student Mit Z_MAX wird die Anzahl Elemente (Zahlen) gesteuert. Ich habe jetzt 3 gewählt - also gibt es 3 Eingabemöglichkeiten. Wenn Du dort statt 3 10 angibst und neu complierst, siehst Du den Effekt....

    So etwas kann eigentlich jeder Durchschnittsprogrammierer schreiben....

    Als ich den Thread so mitgelesen habe, habe ich mich auch gewundert, wie der verlaufen ist - daher auch mein erstes Posting mit der Auflösung der 3 Swaps.



  • #include <stdio.h>
    //
    #define Z_MAX 3
    int main()
    {
        int zahl[Z_MAX], swap, anz = Z_MAX, i, j;
    //
        printf("Geben Sie %d Zahlen an. Diese werden dann sortiert wieder ausgegben.\n", anz);
    //  
        for (i=0;i < anz; i++)
        {
            printf ("Zahl %d: ", i+1);
            scanf ("%d", &zahl[i]);
        }
    //
        printf("Die Zahlen der Größe nach sortiert: ");
    //
        for (i = 0; i < anz; i++)
        {
            for (j = 0; j < anz - i - 1; j++)
            {
                if (zahl[j] > zahl[j + 1])
                {
                    swap = zahl[j];
                    zahl[j] = zahl[j + 1];
                    zahl[j + 1] = swap;
                }
            }
        }
        for (i = 0; i < anz; i++)
        {
            printf(" %d", zahl[i]);
        }
        printf("\n"); // sorry - das fehlte natürlich
        return 0;
    }
    


  • knivil schrieb:

    Kann man den Code auch verkürzen?

    Ja: http://en.wikipedia.org/wiki/Sorting_network . Beim Beispiel fuer 4 Eingaenge den letzten weglassen. Pseudocode:

    swap_if(c < a, a, c)
    swap_if(b < a, a, b)
    swap_if(c < b, c, b)
    

    Wie kann man allgemeiner n Zahlen mit einer minimalen Anzahl von Vergleichen/swaps sortieren? Ich hatte das mal im "Rund um die Programmierung" gefragt und einen template-Code als Antwort bekommen, finde den Thread aber nicht mehr.



  • dsffsdfds schrieb:

    knivil schrieb:

    Kann man den Code auch verkürzen?

    Ja: http://en.wikipedia.org/wiki/Sorting_network . Beim Beispiel fuer 4 Eingaenge den letzten weglassen. Pseudocode:

    swap_if(c < a, a, c)
    swap_if(b < a, a, b)
    swap_if(c < b, c, b)
    

    Wie kann man allgemeiner n Zahlen mit einer minimalen Anzahl von Vergleichen/swaps sortieren? Ich hatte das mal im "Rund um die Programmierung" gefragt und einen template-Code als Antwort bekommen, finde den Thread aber nicht mehr.

    Gefunden: https://www.c-plusplus.net/forum/331825-full



  • dsffsdfds schrieb:

    Wie kann man allgemeiner n Zahlen mit einer minimalen Anzahl von Vergleichen/swaps sortieren?

    Man kann sie auch ohne Vergleiche sortieren.



  • TGGC schrieb:

    dsffsdfds schrieb:

    Wie kann man allgemeiner n Zahlen mit einer minimalen Anzahl von Vergleichen/swaps sortieren?

    Man kann sie auch ohne Vergleiche sortieren.

    Bogosort, oder wie? 😉



  • Ein Beispiel: mit Bittests. Hoechstwertiges Bit anschauen und gesamtes Set in zwei Haelften teilen mit bit gesetzt oder nicht. Rekursiv fortsetzen mit den Teilmengen mit dem naechstniedrigen Bit.

    Ich glaub Anzahl der Vergleiche ist kein gutes Kriterium. Ich kann mir z.B. Vergleiche sparen, indem ich Folgendes ausnuzte: Wenn a < b und b < c dann gilt a < c. Wenn ich alle Vergleichsergebnisse abspeichere und dann statt zu vergleichen vorher versuche das Ergebnis daraus zu folgern, wird der Algorithmus bestimmt nicht schneller, aber er brauche weniger Vergleiche.


Anmelden zum Antworten