Wollte eine selection Sortier-Algorithmus programmieren: Hab ich das hiermit geschafft? Und wo könnte ich ihn verbessern? #include <stdio.h> int main() //start Hauptprogramm { int stelle,hilf,k, j ; //Deklaration int array[5]={2,4,3,1,0}; //initialisierung des arrays for (k = 0; k < (4); k++) // kleinstes Element finden { stelle=k; //Stelle wird zugewiesen for (j=k+1;j<5;j++){//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle if (array[stelle]>array[j]) stelle=j; } if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle hilf=array[k]; array[k]=array[stelle]; array[stelle]=hilf; } } for (k=0;k<5;k++){ printf("%i\n",array[k]); // Ausgabe } return 0; }
:
Verschoben durch Admin
1. Ja 2. Verbessern in Bezug worauf? Kommentare, die keine wesentliche Information hinzufügen, die kann man auch weg lassen. z.B. main = Hauptprogramm ... das weiß jeder Deklaration, Initialisierung des Arrays Die erste for-Schleife ist gar falsch kommentiert. Du willst dort nicht das kleinste Element finden, sondern das ist die Schleife, die auf das aktuell einzusortierende Element zeigt. Links von dieser Stelle ist schon alles sortiert, rechts davon ist der unsortierte Bereich. stelle ist auch ein seltsamer Name. Je besser die Namen der Variablen gewählt werden, um so besser ist der Code auch ohne zusätzlicher Kommentare zu lesen. ( Die Länge des Namens ist natürlich Abwägungssache, gegebenenfalls auch durch eine Programmiersprache begrenzt. ) idx_minimum wäre mal ein Beispiel. idx_minimum = k; // aktuellen Index als Minimum initialisieren Erst die nächste Schleife soll im unsortierten Bereich nachschauen, ob da noch ein kleinerer Wert zu finden ist. // Suche im unsortierten Bereich den Index, der die kleinste Zahl beinhaltet for (j=k+1;j<5;j++) { Eine Sortier-Funktion würde man üblicherweise auch wirklich als Funktion programmieren. Das heißt sie kann von anderen Teilen des Programms mit entsprechenden Parametern aufgerufen werden und führt die Sortierung mit beliebigen Arrays durch. Das heißt, dass die for-Schleifen keinen festen Wert als Abbruch-Kriterium beinhalten können. Die Ausgabe des Arrays wäre dann wieder Sache des Aufrufers und gehört nicht mit in die Sortier-Funktion. Hier kommt es halt darauf an, was mit der Übung erreicht werden soll. Auf jeden Fall könnte man z.B. auch im vorliegenden Programm schon mit sizeof() arbeiten, um besser mit Änderungen im Array umgehen zu können. Nur weil man nun 2 Zahlen dazufügt, sollte man nichts im Code ändern müssen, weil das Fehleranfällig ist.
Vielen Dank für das Feedback. Ich hatte bereits eine Version mit Eingabe gemacht und morgen versuche ich mich sicher mal an einer Abwandlung als Funktion. #include <stdio.h> int main() //start Hauptprogramm { int stelle,hilf,k, j, groesseArray ; //Deklaration int array[groesseArray]; for (k = 0; k < groesseArray; k++) printf ("%i ", array[k]); printf ("Anzahl der gewollten Elemente\n"); scanf ("%i", &groesseArray); printf ("%i Elemente eingeben\n", groesseArray); for (k = 0; k < groesseArray; k++) { scanf ("%i", &array[k]); } for (k = 0; k < (groesseArray-1); k++) //aktuelle Stelle { stelle=k; //Stelle wird zugewiesen for (j=k+1;j<groesseArray;j++){//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle if (array[stelle]>array[j]) stelle=j; } if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle hilf=array[k]; array[k]=array[stelle]; array[stelle]=hilf; } } for (k=0;k<groesseArray;k++){ printf("%i ",array[k]); // Ausgabe } return 0; }
Warum zwei Threads zum gleichen Thema?
Ah, der, der seine Hausaufgaben machen lässt, versucht es nochmals. Dieser Thread kann weg.
Überschrift und Text stossen übel auf. Vielleicht sollte man zunächst mal das Geschlecht klären. Ich stimme für der Algorithmus.
Wäre es zu viel verlangt, wenn du endlich den C-Quelltext in [ c ] und [ /c ] Tags (ohne Leerzeichen in den eckigen Klammern) einschließen würdest? Dann sähe das so wie unten aus und wäre für alle besser lesbar. Du wirst ja heute und morgen wohl noch ein paar Algorithmen programmieren und hier vorstellen wollen. Nur als Tipp: Zu "meiner Zeit" war das Standardwerk dazu "Robert Sedgewick: Algorithms". Das Buch ist auch in den weiten des Netzes als PDF zu finden.
1 | #include <stdio.h> |
2 | |
3 | int main() //start Hauptprogramm |
4 | {
|
5 | int array[20] = {14,17,12,18,6,13,5,19,119,56,77,88,99,22,34,56,76,11,0,1}; |
6 | |
7 | for (int k=0; k<20; k++) { // kleinstes Element finden |
8 | int stelle = k; // Stelle wird zugewiesen |
9 | for (int j=k+1; j<20; j++) { // Test ob stelle kleinsten Wert hat und ggf. anpassen |
10 | if (array[stelle] > array[j]) |
11 | stelle = j; |
12 | }
|
13 | if (stelle != k) { // Sortieren des kleinsten Elementes an die richtige Stelle |
14 | int hilf = array[k]; |
15 | array[k] = array[stelle]; |
16 | array[stelle] = hilf; |
17 | }
|
18 | }
|
19 | for (int k=0; k<20; k++) { |
20 | printf("%i ",array[k]); // Ausgabe |
21 | }
|
22 | printf("\n"); |
23 | return 0; |
24 | }
|
Hmmmm ... die Version mit der Eingabe hat aber schon noch einige Fehler. Was denkst du passiert denn im Deklarations-Teil? Du führst eine Variable groesseArray ein und dann ein Array von selbiger Größe. Aber welche Größe hat dann dein Array? Was soll der Compiler daraus machen? Bestenfalls ist groesseArray undefiniert und hat einen Wert der gerade zufällig im RAM steht. Schlimmstenfalls wird dir der Compiler groesseArray auf 0 initialisieren, dann hast du aber auch ein Array von der Größe 0. Und eine Eingabe eines anderen Wertes für groesseArray würde auch nichts daran ändern. Um das Programm so flexibel zu machen müsstest du erst mal wissen, wie man dynamisch Speicher anfordert (und am besten auch gleich, wie man den wieder freigeben kann). Bin mir nicht so ganz sicher, ob das für die Aufgabe schon gefordert wird. Bleib doch erst mal bei Arrays, die im Programm selbst definiert werden, passe aber die Sortier-Funktion so an, dass sie mit unterschiedlich großen Arrays umgehen kann. Ein Schritt nach dem Anderen.
Ich habe in deinem anderen Thread schon geschrieben: zu Sortieren gibt es einschlägige Literatur. Lies die doch erst mal durch! Inbesondere bevor die Frage zu Quicksort kommen.
Joachim M. schrieb: > int stelle,hilf,k, j, groesseArray ; //Deklaration > int array[groesseArray]; ließ sich das wirklich übersetzen?
Werner schrieb: > Joachim M. schrieb: >> int stelle,hilf,k, j, groesseArray ; //Deklaration >> int array[groesseArray]; > > ließ sich das wirklich übersetzen? Jepp. Und wenn man keine Warnungen aktiviert, kann man ungestört in seiner Traumwelt rumbasteln. Glaubt jemand, dass Joachim Warnungen aktiviert hat?
Also Warnungen sollten aktiviert sein. Aber dann lass ich das erstmal wollte mir nur überlegen wie es funktionieren könnte.
Ist das so möglichst flexibel oder geht das noch besser mit der Anpassbarkeit auf andere arrays? Ohne mit dynamischen speichern zu arbeiten.
1 | #include <stdio.h> |
2 | |
3 | int sortierung (int array[], int groesseArray){ |
4 | int stelle,hilf,k, j; |
5 | for (k = 0; k < (4); k++) // kleinstes Element finden |
6 | {
|
7 | |
8 | stelle=k; //Stelle wird zugewiesen |
9 | |
10 | for (j=k+1;j<5;j++)//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle |
11 | {
|
12 | if (array[stelle]>array[j]) |
13 | stelle=j; |
14 | }
|
15 | if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle |
16 | hilf=array[k]; |
17 | array[k]=array[stelle]; |
18 | array[stelle]=hilf; |
19 | }
|
20 | }
|
21 | }
|
22 | |
23 | int main() //start Hauptprogramm |
24 | {
|
25 | |
26 | int array[5]={2,4,3,1,0};//initialisierung des arrays |
27 | int groesseArray=5; |
28 | sortierung(array, groesseArray); |
29 | int k; |
30 | |
31 | for (k=0;k<5;k++) |
32 | {
|
33 | printf("%i ",array[k]); // Ausgabe |
34 | }
|
35 | |
36 | return 0; |
37 | }
|
verwende mal in deiner Funktion noch den Übergabeparameter groesseArray, sonst haut's dir das ganze um die Ohren, wenn das Array <5 ist, oder es funktioniert nicht, wenn >5 Elemente. zudem bin ich ein großer Fan von einheitlicher Sprache: wenn die Programmiersprache Englisch ist, dann sollten auch Funktions- und Variablennamen Englisch sein. Beim Kommentar kann man sich streiten. Aber Denglisch finde ich persönlich nicht gut.
Ich habs einmal in der Funktion und in der Ausgabe ausgetauscht. Abgesehen vom Denglisch dann aber ganz in Ordnung?
1 | #include <stdio.h> |
2 | |
3 | int sortierung (int array[], int groesseArray){ |
4 | int stelle,hilf,k, j; |
5 | for (k = 0; k < (groesseArray-1); k++) // kleinstes Element finden |
6 | {
|
7 | |
8 | stelle=k; //Stelle wird zugewiesen |
9 | |
10 | for (j=k+1;j<5;j++)//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle |
11 | {
|
12 | if (array[stelle]>array[j]) |
13 | stelle=j; |
14 | }
|
15 | if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle |
16 | hilf=array[k]; |
17 | array[k]=array[stelle]; |
18 | array[stelle]=hilf; |
19 | }
|
20 | }
|
21 | |
22 | }
|
23 | |
24 | |
25 | |
26 | int main() //start Hauptprogramm |
27 | {
|
28 | |
29 | int array[5]={2,4,3,1,0};//initialisierung des arrays |
30 | int groesseArray=5; |
31 | sortierung(array, groesseArray); |
32 | int k; |
33 | |
34 | for (k=0;k<groesseArray;k++) |
35 | {
|
36 | printf("%i ",array[k]); // Ausgabe |
37 | }
|
38 | |
39 | return 0; |
40 | }
|
Joachim M. schrieb: > oder geht das noch besser mit der > Anpassbarkeit auf andere arrays? Im Moment kann es wohl nur int sortieren. Kein Float, Zeichenketten, oder gar Strukturen. Es gibt in der CLib ja schon qsort() Wenn deine Funktion das gleiche Interface verwenden würde, wären nicht nur die Vergleichscallback untereinander austauschbar, sondern auch der Algorithmus selber.
Arduino Fanboy D. schrieb: > Joachim M. schrieb: >> oder geht das noch besser mit der >> Anpassbarkeit auf andere arrays? > > Im Moment kann es wohl nur int sortieren. > Kein Float, Zeichenketten, oder gar Strukturen. > > Es gibt in der CLib ja schon qsort() > Wenn deine Funktion das gleiche Interface verwenden würde, wären nicht > nur die Vergleichscallback untereinander austauschbar, sondern auch der > Algorithmus selber. Glaubst du ernsthaft, dass er das Interface richtig implementieren und nutzen kann? Da kommen da kommen Pointer drin vor ...
mh schrieb: > Glaubst du ernsthaft, dass er das Interface richtig implementieren und > nutzen kann? Ka! Ist mir auch völlig egal. Die Frage war: > oder geht das noch besser mit der > Anpassbarkeit auf andere arrays? Und die habe ich so beantwortet, wie ich sie mir selber beantworten würde, wenn das meine Aufgabe wäre. mh schrieb: > Da kommen da kommen Pointer drin vor ... Pointer gehören zum C Grundwortschatz, ohne diese zu kennen, hasste sowieso (über kurz oder lang) verschissen.
Arduino Fanboy D. schrieb: > mh schrieb: >> Da kommen da kommen Pointer drin vor ... > Pointer gehören zum C Grundwortschatz, ohne diese zu kennen, hasste > sowieso (über kurz oder lang) verschissen. Das gleiche könnte man zu Quicksort und Info-Studium sagen ;-)
m.n. schrieb: > Vielleicht sollte man zunächst > mal das Geschlecht klären. Hää.... Was hat das Geschlecht mit sortieren zu tun? Außer deinem offensichtlichem Hang zum Diskriminieren? mh schrieb: > Glaubst du ernsthaft, dass er das Interface richtig implementieren und > nutzen kann? Da kommen da kommen Pointer drin vor ... Auch hier.... Weiß nicht, wie es den anderen geht, aber ich empfinde solche Vorurteilsträchtigen Postings als sehr unangenehm.
Arduino Fanboy D. schrieb: > m.n. schrieb: >> Vielleicht sollte man zunächst >> mal das Geschlecht klären. > > Hää.... > Was hat das Geschlecht mit sortieren zu tun? > Außer deinem offensichtlichem Hang zum Diskriminieren? Lies dir den Titel dieses Threads nochmal genau durch, bevor du andere beschuldigst. > mh schrieb: >> Glaubst du ernsthaft, dass er das Interface richtig implementieren und >> nutzen kann? Da kommen da kommen Pointer drin vor ... > Auch hier.... > > Weiß nicht, wie es den anderen geht, aber ich empfinde solche > Vorurteilsträchtigen Postings als sehr unangenehm. Hast du dir diesen und den Zwillings-Thread durchgelesen? Das hat wenig mit Vorurteilen zu tun. Der TO hat deutlich bewiesen, dass er kein C beherrscht. Du willst ihm tatsächlich empfelen, sich mit Pointern und der damit verbundenen Fehlersuche zu beschäftigen, wenn er eigentlich Sortieralgorithmen für eine Informatikklausur lernen sollte?
Joachim M. schrieb: > Wollte eine selection Sortier-Algorithmus programmieren: Wozu neu erfinden. Was gefällt Dir an der C library function qsort() nicht?
Erstmal sehr angenehm dass jemand mal etwas dazu gesagt hat. Ich konnte das nicht, da ich ja keine Ahnung hab wie komisch der Titel war. Ich finde solche Kommentare auch sehr unangenehm. Zum Glück gibt es hier auch viele Leute die konstruktive Vorschläge gemacht haben und mir dabei geholfen haben das Thema etwas besser zu verstehen. Und zweitens wir haben uns mit verschiedenen Sortieralgorithmen beschäftigt und ich wollte dafür mal selbst welche machen, da man dadurch selbige besser versteht. Aus der biblio die Sachen kopieren kann ich natürlich auch. Und drittens: Ja ich beschäftige mich mit Pointern aber logischerweise noch nicht hier sondern in einfacheren Anwendungen. Dank auf jeden Fall für die Hilfe!
for (j=k+1;j<5;j++) Da müsste aber auch noch groesseArray mit rein. Sowas wäre dir sicher aufgefallen, wenn du dein Programm auch mal mit verschiedenen und verschieden großen Arrays ausgeführt hättest. Also was kann man besser machen: Testen, testen, testen ... ;o)
Hatte ich schon abgeändert. Aber Danke.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.