Zahlen aus Array sortieren



  • Hallo
    Ich bin neu in diesem Forum. Ebenso neu in der Programmierung. Ich hoffe ich bin hier in der richtigen Abteilung des Forums gelandet. Ich studiere zur Zeit im ersten Semester, jedoch nicht Informatik. Informatik ist "lediglich" mit Teil unseres Studiums. Unsere Kenntnisse bis jetzt sehe ich sehr gering in Informatik. Wir Programmieren mit Visual Studio in C++.

    Aufgabenstellung:
    Nach Eingabe von 10 Zahlen sortieren Sie die Zahlen ihrer Größe nach.

    Ich verlange auf keinen Fall, dass mir hier jemand die Lösung zeigt. Ich benötige lediglich etwas Hilfe. Mein derzeitiges Problem ist die anordnung verschiedener zahlen in einem Array. Ich möchte also, dass meine 10 Zahlen die im Array gespeichert sind der größe nach von klein an geordnet und anschließend ausgegeben werden. Ich würde mich über einen Tipp sehr freuen, denn zur Zeit, gibt er mir lediglich meine eingegeben Zahlen in eingegebener Reihenfolge wieder aus.

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

    Achja, die oben angegeben Bibliotheken sind die einzigen die mir bekannt sind, also würde ich mich freuen, wenn die Aufgabe sich damit lösen lassen würde. Bitte gebt die Tipps so einfach wie möglich, da ich wirkliche in Anfänger bin und nur wenige Befehle in der Programmierung kenne.

    Hoffe ich habe genug Infos gegeben.

    Gruß



  • Suche mal nach Bubblesort, einfach für den Anfang aber nicht sehr performant. (In wikipedia ist eine Lösung)



  • Irgendwie hat das nix mit C++ zu tun, das ist C.

    #include <iostream>
    #include <vector>
    
    int main()
    {
    	std::vector<int> numbers(10);
    	for(int i = 0; i < 10; ++i)
    	{
    		int tmp;
    		std::cin >> tmp;
    		numbers.push_back(tmp);
    	}
    	numbers.sort();
    	for(std::vector<int>::const_iterator iter = numbers.cbegin(); iter != numbers.cend(); ++iter)
    		std::cout << *iter << std::endl;
    }
    

  • Mod

    Motors-Freak schrieb:

    Wir Programmieren mit Visual Studio in C++.

    Nein, ihr programmiert C.

    Falls du fertige Funktionen benutzen darfst: qsort aus stdlib.h

    Falls du es selber programmieren sollst: Angenommen ich gebe dir ein unsortiertes Kartenspiel und du sollst es sortieren. Wie würdest du vorgehen?

    HighLigerBiMBam schrieb:

    Suche mal nach Bubblesort, einfach für den Anfang aber nicht sehr performant. (In wikipedia ist eine Lösung)

    Wieso wird eigentlich immer Bubblesort als erstes vorgeschlagen? Das ist doch eigentlich ein Witz aus dem Informatikunterricht, bei dem man sich absichtlich viel Mühe gibt, einen schlechten Sortieralgorithmus zu programmieren, damit der hinterher in der Effizienzanalyse auseinander genommen werden kann.
    Ein Selection oder Insertion Sort ist doch viel einfacher zu verstehen und schon einmal ein ganzes Ende effizienter.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das wundert mich nicht, dass er denkt, dass es C++ ist. Die Fachinformatiker bekommen nämlich C++ genau so nach Lehrplan beigebracht. Das Niveau der Lehrer ist halt unterirdisch.



  • SeppJ schrieb:

    Wieso wird eigentlich immer Bubblesort als erstes vorgeschlagen? Das ist doch eigentlich ein Witz aus dem Informatikunterricht, bei dem man sich absichtlich viel Mühe gibt, einen schlechten Sortieralgorithmus zu programmieren, damit der hinterher in der Effizienzanalyse auseinander genommen werden kann.

    Ist das nicht eine wichtige Lektion die man lernen sollte?


  • Mod

    Tim schrieb:

    SeppJ schrieb:

    Wieso wird eigentlich immer Bubblesort als erstes vorgeschlagen? Das ist doch eigentlich ein Witz aus dem Informatikunterricht, bei dem man sich absichtlich viel Mühe gibt, einen schlechten Sortieralgorithmus zu programmieren, damit der hinterher in der Effizienzanalyse auseinander genommen werden kann.

    Ist das nicht eine wichtige Lektion die man lernen sollte?

    Schon, aber ist Bubblesort daher das was ein Ahnungsloser programmieren sollte? Wenn mich ein Ortsfremder in meiner Stadt nach dem Weg irgendwohin fragt, dann erkläre ich ihm keine tollen Abkürzungen über Schleichwege, sondern gebe ihm einfache Richtungsangaben über Hauptstraßen, auch wenn dies eventuell etwas weiter ist und länger dauert. Aber ich sage ihm nicht, dass er zusätzlich noch nach je zwei Schritten einen zurück machen soll und sich alle 10 Meter einmal im Kreis drehen muss, damit er daraus lernt, dass er schneller ankäme, wenn er dies nicht auf mich hören würde.



  • Am Anfang ist Irgendwiesort recht nützlich und lerndienlich.



  • Na, ich fange mal an mit einem kleinen Tip:

    if(zahlen[i]>zahlen[i++]) 
                zahlen[i++]=zahlen[i]; 
                zahlen[i++]=w; 
        } while (zahlen[i]>zahlen[i++]);
    

    An diesen Stellen würd ich nicht [i++] schreiben, sondern [i+1], was dazu führt, daß i nicht jedesmal wenn diese if-Vergleiche kommen um eins erhöht wird, sondern lediglich mit dem array i+1 verglichen wird, ohne daß i dabei jedesmal um eins erhöht wird.

    Gib mal sowas hier ein:

    i=0;
    printf("%d\n",i);  
    if (zahlen[i++]);
    printf("%d\n",i);  
    if (zahlen[i++]);
    printf("%d\n",i);
    

    Ausgabe:
    0
    1
    2

    Und dies hier:

    i=0;
    printf("%d\n",i);  
    if (zahlen[i+1]);
    printf("%d\n",i);  
    if (zahlen[i+1]);
    printf("%d\n",i);
    

    Ausgabe:
    0
    0
    0

    Worin liegt der Unterschied?
    Bei i+1 wird i nicht erhöht, sondern nur der index i+1 abgefragt.
    Bei i++ wird der index i abgefragt und anschließend i um eins erhöht.

    Dann noch ein fetter Fehler der auf Anhieb auffällt:

    zahlen[i]=w;
                zahlen[i++]=zahlen[i];
                zahlen[i++]=w;
    

    Zunächst einmal das i++ in i+1 ändern.

    zahlen[i]=w;
                zahlen[i+1]=zahlen[i];
                zahlen[i+1]=w;
    

    So, und nun die Frage, was soll denn w machen?
    Dient w nicht als Tauschvariable?
    Wenn du aber zahlen[i]=w schreibst, dann nimmt zahlen[i] den Wert von w an.
    Und ein anschließender Tausch mit zahlen[i+1]=w ist sinnlos.

    Was hältst du denn von:

    w=zahlen[i];
                zahlen[i]=zahlen[i+1];
                zahlen[i+1]=w;
    

    Hier wird korrekt vertauscht.

    Denke mal drüber nach und dann guck mal, was dann noch eventuell am Code geändert werden muß um es sortierfähig zu machen.

    Gruß,
    DC



  • SeppJ schrieb:

    Wieso wird eigentlich immer Bubblesort als erstes vorgeschlagen? ... Ein Selection oder Insertion Sort ist doch viel einfacher zu verstehen und schon einmal ein ganzes Ende effizienter.

    Weil man als Zehnjähriger am Schul- PET auf nichts Besseres gekommen und heute Informatik- Prof ist?
    Und nein, leichter zu verstehen sind andere Sortieralgos nicht wirklich, der ganze Kram hat sich dem werdenden Lehrenden erst erschlossen, wenn er die 64er gelesen hat oder die Eltern Dr. Dobb's abonniert haben. An dem Progress möchte er seine Studies teilhaben lassen.
    Ob das allerdings eine krankhafte Zwangshandlung darstellt, naja ... 😉

    Edit: Ich bin zwar nicht IT- Prof, aber meine erste selbstgeschriebene Highscore- Liste sah irgendwie nach Bubblesort aus. 🙄



  • Ersteinmal RIESEN DANK an Don Carsto.

    Und unser "Lehrer" ist ein Proffesor und hat uns keine vorgabe gemacht wie wir das ganze ausgeben sollen bzw welches Verfahren wir anwenden sollen.

    Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???

    Ich werde mich morgen nochmal genau dran setzen und gucken ob ich es hin bekomme.
    Würde mich über weitere Tipps sehr freuen.

    Danke nochmal an Alle für die nette Hilfe!



  • Motors-Freak schrieb:

    Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???

    Ist es nicht ein wenig frech, uns vorzuschreiben, was wir sagen dürfen? Es könnte doch was zwischen den Zeilen stehen, oder?
    🙂



  • mngbd schrieb:

    Motors-Freak schrieb:

    Ist absolut nicht böse gemeitn aber relative SInnlose Diskusionen könnt ihr bitte per PN klären okay???

    Ist es nicht ein wenig frech, uns vorzuschreiben, was wir sagen dürfen? Es könnte doch was zwischen den Zeilen stehen, oder?
    🙂

    Glaube nicht. Und wenn beantwortet es nun nicht meine Frage. Finde es halt bloß immer etwas unpassend wenn meine eine ganz klar definierte Frage stellt und alles vom Thema abweicht.

    Trotzdem ein riesen Dank an alle die geholfen haben udn helfen werden 🙂



  • 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]);
    
    }
    


  • 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.


Anmelden zum Antworten