Zahlen aus Array sortieren



  • Stimmt. Ja mir fehlen wirklich noch viele Grundladen, deswegen bin ich hier im Forum um alles ein bisschen zu verfestigen.

    Setze mich morgen wieder ran und tüftel dran rum. Werde mich dann wieder melden.

    Riesen dank nochmal!



  • Ich glaub ich bin blöd für diese Welt... Ich kriege es einfach nicht hin.
    Mein einer Ansatz:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    void main()
    {
    	int zahlen[10];
    	int i;
    	int max=0;
    	int w=0;
    	int z;
    
    	for(i=0; i<5; i++)
    	{
    		scanf("%i",&zahlen[i]);
    	}
    
    	do
    	{
    		for( i=0; i<5; i++)
    		{
    			if(zahlen[i]>zahlen[i+1])
    			{
    				w=zahlen[i];
    				zahlen[i]=zahlen[i+1];
    				zahlen[i+1]=w;		
    			}
    		}
    		for (i=0; i<5; i++) printf("%i", zahlen[i]);
    	}while(zahlen[i]>zahlen[i+1] || zahlen[i+1]>zahlen[i+2] || zahlen[i+2]>zahlen[i+3] || zahlen[i+3]>zahlen[i+4]);
    
    }
    

    Er sortiert das erste mal den Aray [9 5 4 3 8]
    Er läuft also 5 mal durch, somit steht im Array [5 4 3 8 9]
    Dann kommt er zur while Bedingung. Er guckt ob eine Bedingung wahr ist. Als ob irgendeine Zahl im Array größer ist als die darauf folgende. Wenn ja geht er wieder in die for Schleife. Anschließend müsste im Array die Zahlenfolge
    [4 3 5 8 9]. Dann prüft er wieder usw...
    Funktioniert aber nicht 😞

    Meine andere Variante:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    void main()
    {
    	int zahlen[10];
    	int i;
    	int max=0;
    	int w=0;
    	int z;
    
    	for(i=0; i<5; i++)
    	{
    		scanf("%i",&zahlen[i]);
    	}
    
    	for( i=0; i<5; i++)
    	{
    		for( i=0; i<5; i++)
    		{
    			if(zahlen[i]>zahlen[i+1])
    			{
    				w=zahlen[i];
    				zahlen[i]=zahlen[i+1];
    				zahlen[i+1]=w;		
    			}
    		}
    
    	}
    	for (i=0; i<5; i++) printf("%i", zahlen[i]);
    }
    

    Er sortiert den Array sodass im Array anstatt[ 9 5 4 3 8] hinterher [ 5 4 3 8 9] steht. Er sortiert 5 mal den Array. Anschließend muss der Array eigentlich sortiert sein. Dann gibt er den sortierten Array aus...

    Warum funktioniert es nicht? Ich gebe mir doch schon so eine Mühe und es will einfach nicht... das muntert mich nicht grade auf 😞



  • In der ersten Variante: Welchen Wert hat i, wenn du hier:

    }while(zahlen[ i]>zahlen[i+1] || zahlen[i+1]>zahlen[i+2] || zahlen[i+2]>zahlen[i+3] || zahlen[i+3]>zahlen[i+4]);
    

    ankommst?

    In der zweiten Variante ist das hier problematisch:

    for( i=0; i<5; i++)
        {
            for( i=0; i<5; i++)
    

    Die äußere Schleife wird dabei nicht fünfmal durchlaufen, weil die innere mit ihrem Index herumspielt.

    Übrigens: main muss laut Standard int zurückgeben. Ich weiß nicht, woher du dieses "void main" hast, aber du solltest es dir schnellstens wieder abgewöhnen.



  • Genau, die äußere Schleife benutzt die gleiche Zählvariable wie die Innere.
    Das kann nicht gutgehen.

    Teste das doch mal, indem du für die äußere Schleife eine andere Variable benutzt. Vielleicht b.

    for( b=0; b<5; b++)
        {
            for( i=0; i<5; i++)
    

    Lass mal alles Andere wie es ist, ändere nur die äußere Schleife.
    (Natürlich vorher int b; zur Deklaration von b.)
    Und dann schau dir an, was er dann ausgibt. Vielleicht bist du der Lösung dann schon eine Schritt näher. 😉

    Gruß,
    DC



  • In der zweiten Variante ist das hier problematisch:

    for( i=0; i<5; i++)
        {
            for( i=0; i<5; i++)
    

    Die äußere Schleife wird dabei nicht fünfmal durchlaufen, weil die innere mit ihrem Index herumspielt.

    Wenn ich aber die äusere auf den Wert z lege funktioniert es auch nicht... 😞
    Dann ist das Ergebnis erstmal - und dann kommen x-Zahlen die unsinnig sind und dann die letzten 4 stück sind meine zahlen die sortiert sind, aber die 5te Zahl fehlt...



  • Bis du dir sicher, daß dein Code so aussieht?

    #include <stdio.h> 
    #include <string.h> 
    #include <math.h> 
    
    int main() 
    { 
        int zahlen[10]; 
        int i; 
        int max=0; 
        int w=0; 
        int z; 
    
        for(i=0; i<5; i++) 
        { 
            scanf("%i",&zahlen[i]); 
        } 
    
        for( z=0; z<5; z++) 
        { 
            for( i=0; i<5; i++) 
            { 
                if(zahlen[i]>zahlen[i+1]) 
                { 
                    w=zahlen[i]; 
                    zahlen[i]=zahlen[i+1]; 
                    zahlen[i+1]=w;        
                } 
            } 
    
        } 
        for (i=0; i<5; i++) printf("%i", zahlen[i]); 
    
    }
    

    Wenn nicht, dann schreibe ihn so, denn das ist DEIN Code, nur mit der äußeren Schleife mit z.

    Gruß,
    DC



  • Hat noch wer einen Tipp? 😞



  • Ja, gib deinen Code so ein, wie ich es in meinem vorherigen Post bereits sagte und schau was er macht.

    #include <stdio.h> 
    #include <string.h> 
    #include <math.h> 
    
    int main() 
    { 
        int zahlen[10]; 
        int i; 
        int max=0; 
        int w=0; 
        int z; 
    
        for(i=0; i<5; i++) 
        { 
            scanf("%i",&zahlen[i]); 
        } 
    
        for( z=0; z<5; z++) 
        { 
            for( i=0; i<5; i++) 
            { 
                if(zahlen[i]>zahlen[i+1]) 
                { 
                    w=zahlen[i]; 
                    zahlen[i]=zahlen[i+1]; 
                    zahlen[i+1]=w;         
                } 
            } 
    
        } 
        for (i=0; i<5; i++) printf("%i", zahlen[i]); 
    
    }
    

    ^^ Diesen dort.. Exakt diesen Code. Nur mit der äußeren Schleife unter Verwendung von z.
    Um es nochmals zu wiederhloen:

    for( z=0; z<5; z++)
    

    Das ist die äußere Schleife, und die ist nun mit z.

    Gruß,
    DC



  • Ja das habe ich getan. Es funktioniert nicht. Ich habe genau deinen Code eingefügt. Unten ein Link, wo ich einen Screenshot hochgeladen habe...
    Ich wieß leider auch nicht wo der Fehler ist

    http://img10.imageshack.us/img10/5314/unbenanntro.png



  • int zahlen[10]; 
    
    // wenn man 5 Werte eingibt, wenn das Array 10 beinhalten kann ...
    for(i=0; i<5; i++)
    {
        scanf("%i",&zahlen[i]);
    }
    
    // ... was kann dann bei Wert i+1 im letzten Durchlauf wohl drin stehen:
    if(zahlen[i]>zahlen[i+1])
    {
    

    //Edit deine Ausgabe mal mit Zeilenumbrüchen getrennt
    -858993460
    3
    4
    5
    6

    > 9 fällt weg, weil du nur 5 Werte ausgibst und 9 der Größte ist



  • BasicMan01 schrieb:

    int zahlen[10]; 
    
    // wenn man 5 Werte eingibt, wenn das Array 10 beinhalten kann ...
    for(i=0; i<5; i++)
    {
        scanf("%i",&zahlen[i]);
    }
    
    // ... was kann dann bei Wert i+1 im letzten Durchlauf wohl drin stehen:
    if(zahlen[i]>zahlen[i+1])
    {
    

    Okay das Erste macht sinn, war mein Fehler. Es hätte heißen müssen zahlen[5]. Aber das letzte kann ich dir nicht sagen. "was kann dann bei Wert i+1 im letzten Durchlauf drinnen stehen" Wieso die Frage? Im letzten Durchlauf müsste die letzte Zahl des Arrays am Ende stehen oder worauf möchtest du hinaus?

    Riesen dank nochmal an alle die fleißig helfen!
    Hier mein aktueller Code:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    int main()
    {
        int zahlen[5];
        int i;
        int max=0;
        int w=0;
        int z;
    
        for(i=0; i<5; i++)
        {
            scanf("%i",&zahlen[i]);
        }
    
        for( z=0; z<5; z++)
        {
            for( i=0; i<5; i++)
            {
                if(zahlen[i]>zahlen[i+1])
                {
                    w=zahlen[i];
                    zahlen[i]=zahlen[i+1];
                    zahlen[i+1]=w;        
                }
            }
    
        }
        for (i=0; i<5; i++) printf("%i", zahlen[i]);
    
    }
    

    EDIT:

    Korrekt. Wenn ich bei der Ausgabe 6 zahlen ausgeben lasse kommt die 9 mit raus, aber wieso komtm sie nur wenn ich 6 zahlen ausgeben lasse bwohl nur 5 im array sind und woher kommt die Sehr kleine Zahl davor?



  • Dein Array nach der Eingabe

    0 > 9
    1 > 5
    2 > 4
    3 > 3
    4 > 8
    5 > irgendwelcher Speicher mit irgendwelchen Werten oder sonst was

    i < 5 bedeutet, i wird maximal Wert 4 erreichen (in deinem Array der letzte Wert)
    i+1 wäre 5 und der zeigt nach Lampukistan



  • i läuft in der inneren Schleife zu weit. Wenn du zahlen[i] und zahlen[i + 1] bearbeitest, kommt dabei Blödsinn raus, sobald zahlen[i] der letzte verfügbare Wert ist.



  • BasicMan01 will damit sagen, daß, wenn du ein Array mit 10 Werten hast dann kannes passieren, je nach Compiler, daß wenn du nur 5 initialisierst im 6.Araay irgendwelcher Mist drin steht.

    Ist eigentlich auch keinb Problem.
    Das problem liegt hier:

    for( i=0; i<5; i++)
            {
                if(zahlen[i]>zahlen[i+1])
    

    wenn i von 0 bis 4 geht, dann zeigt zahlen[i+1] im letzten Durchlauf auf Array Nr.5. Das ist aber wenn man Pech aht, mit Mist gefüllt und wird aber mit in die Abfrage einbezogen und somit mitsortiert.

    Nun könnte man die Schleife dahingehen verändern indem man einfach nur bis Araay 3 zählt und damit nicht aufs 5.Array-Feld zeigt.

    for( i=0; i<4; i++)
    

    -edit-- Ohh da waren aber die andreren wieder fix. Dann spare ich mir hier auch die Rechtschreibkorrektur und lasse den Post so.

    Gruß,
    DC



  • Habe den Fehler gefunden. Habe ihn mit einem Kommentar mackiert. Ist auch ganz logisch im nachhinein. Die Schleife baut den Array nur 4 mal um und nicht 5 mal.

    Ich danke euch allen wirklich RIESIG !!!

    Ihr habt mir noch einmal deutlich gezeigt wo meine schwächen in C liegen. Falls noch einmal irgendwo Fragen auftreten weiß ich ja wo ich mich melden kann. Ist echt ein super Forum hier! 🙂

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    int main()
    {
        int zahlen[5];
        int i;
        int max=0;
        int w=0;
        int z;
    
        for(i=0; i<5; i++)
        {
            scanf("%i",&zahlen[i]);
        }
    
        for( z=0; z<5; z++)
        {
            for( i=0; i<4; i++) // Hier war der Fehler. Der Wert darf nur bis 4 laufen.
            {
                if(zahlen[i]>zahlen[i+1])
                {
                    w=zahlen[i];
                    zahlen[i]=zahlen[i+1];
                    zahlen[i+1]=w;        
                }
            }
    
        }
        for (i=0; i<5; i++) printf("%i", zahlen[i]);
    
    }
    


  • Und das Schöne ist, daß du dir das Ganze ziemlich selbst erarbeitet hast.
    Dann sind auch die Erfolgserlebnisse viel größer und es macht viel mehr Spaß..

    Mach weiter so..

    Gruß,
    DC



  • Don Carsto schrieb:

    Und das Schöne ist, daß du dir das Ganze ziemlich selbst erarbeitet hast.
    Dann sind auch die Erfolgserlebnisse viel größer und es macht viel mehr Spaß..

    Mach weiter so..

    Gruß,
    DC

    Korrekt!

    Ich hatte vorher auch schon die Variable Z genutzt. Da ich aber den Fehler mit dem einen durchlauf zu viel hatte, habe ich es wieder in i umgewandelt. Ich hatte die Lösung also quasi schon 🙂


Anmelden zum Antworten