Zahlen aus Array sortieren



  • Hi,...

    Ich formuliere das mal so:

    Suche Dir 5 Zufallszahlen in einer festen Reihenfolge aus und schreibe diese auf ein Blatt Papier.

    Jetzt darfst Du nur immer 2 davon miteinander ihre plätze tauschen lassen.

    Tue dies so oft bis du eine Ordnung, (oder halt halbordnung) in deiner "Folge", feststellst.

    Nun Zähle mal wie oft Du Zahlen tauschen musstest und vergleiche dies mit deinem geposteten Algorithmus.

    Grüüße



  • Motors-Freak schrieb:

    Ich nochmal Leute 🙂
    Ich bin am Basteln und am Basteln, aber ich kriege es nicht hin. Entweder gibt er mir die zahlen ungeordnet aus oder komische zahlen.
    Ich weiß nicht, wie ich den von der Schleife angeordneten Array nun ausgeben soll. Alles andere habe ich glaube ich verstanden. Hier mein Quelltext:

    #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( z=0; z<5; z++)
    	{
    		
    		if(zahlen[i]>zahlen[i+1])
    		{
    			w=zahlen[i];
                zahlen[i]=zahlen[i+1];
                zahlen[i+1]=w; 
    			
    		}
    		i++;
    		 
    	} 
    	printf("%i", zahlen[i]);
    
    }
    

    So, zum Einen, sind da noch ne Menge Fehler drin, die das Ganze natürlich völlig irrsinnig machen.
    Damit du mehr Verständnis dafür aufbringst, möchte ich mal ganz langsam einige Dinge anführen, die offensichtlich aus mangelndem Verständnis der C-Sprach-Syntax entstanden sind.

    int zahlen[10];
    	int i;
    	int max=0;
    	int w=0;
    	int z;
    

    Das sieht schon ganz sauber aus.

    for(i=0; i<5; i++)
    	{
    		scanf("%i",&zahlen[i]);
    	}
    

    Hier hast du eine Schleife korrekt verwendet und liest auch korrekt ein.
    Sehr schön.
    Bedenke aber, i hat nun den Wert 5.

    Und nun wird es haarig:

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

    Du nimmst eine Schleife mit z und setzt i als Index ein...
    Am Ende erhöhst du i immer um 1.
    Die Schleife würde an für sich ja laufen, aber welchen Wert hat i denn vor der Schleife?
    Also solltest du vor dieser Schleife i=0; setzten.
    Eleganter wäre es aber generell:

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

    Das i++ ist nicht mehr nötig, weil die Schleife es nun selbst macht.

    Und auch nun wieder die Frage: Welchen Wert hat i nach der Schleife?
    Wieder 5??
    Denn für das folgende:

    printf("%i", zahlen[i]);
    

    Gibst du ja nur zahlen[5] aus.
    Da steht aber kein Wert drinne, weil du nur Index 0 bis 4 belegt hast.
    Kein Wunder, daß dann nur Mist ausgegeben wird.

    Korrekter wäre hier auch wieder eine Schleife zu kompletten Ausgabe deiner Indexfelder:

    for (i=0; i<5; i++) printf("%i", zahlen[i]);
    

    So, korrigiere mal deinen Code und schau dir an, was nun sortiert wird.
    Dann folgst du dem Vorschlag von zeusosc und wendest deine Algorythmus auf 5 beliebige Zaheln an.
    Beispiel:

    9 5 4 3 8

    So mal sehen: zähler = 0. Zahl 0 und 1 vergleichen.

    ist 9 größer 5 ? ja also tauschen und zähler erhöhen.

    5 9 4 3 8

    Zahl 1 mit Zahl 2 vergleichen.

    ist 9 größer 4 ? ja alsotauschen und zähler erhöhen.

    5 4 9 3 8

    usw. usw.

    Was passiert, wenn der Zähler am Ende ist?

    Viel Spaß erstmal beim Tüfteln..

    Gruß,
    DC



  • 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