Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Bubblesort mit Array
amazing - Mo 02.06.08 22:42
Titel: Bubblesort mit Array
Hallo folgendes
In der Schule, musste ich ein Referat über Bubblesort halten und dazu ein kleines Programm zur Veranschaulichung schreiben.
Ich hab das so gemacht, dass ich in einem Memofeld x zufällige Zahlen ausgebe, jede Zahl in einer Zeile z.B
5
8
3
4
7
Das ist ja kein Problem, aber ich weiß nicht wie das alles in eine Zeile ausführe also: 5 8 3 4 7 und später jede einzelne Zahl vergleichen kann.
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 02.06.2008 um 22:51
Hidden - Mo 02.06.08 23:20
Hi,
IMHO nicht unbedingt nützlich, alles in einer Zeile. Auf die Inhalte einzelner Zeilen kannst du mit der Eigenschaft Lines des TMemo zugreifen, somit wäre das Einlesen: StrToInt(Memo1.Lines[i]).
Ansonsten müsstest du immer die Position des nächsten Leerzeichens nehmen und die Zahl dazwischen einlesen.
mfG,
Martok - Di 03.06.08 01:46
Ich würde das andersrum aufziehen: eine Liste intern im Speicher halten und mit dieser Rechnen, und aus dieser dann die Zeilen generieren die ins Memo sollen.
amazing - Di 03.06.08 14:57
Das wird wahrscheinlich eine Klausuraufgabe werden.
Also brauch ich dafür ein array? Kann mir das jemand erklären? Hab das mit dem array nicht ganz verstanden.
nagel - Di 03.06.08 19:53
Was mit welchem Array hast du nicht verstanden?
amazing - Di 03.06.08 21:00
Naja wann ich den überhaupt benutzen muss, besonders jetzt in meinem Fall denn in meinem Ursprünglichen Programm hab ich auch keinen gebraucht
amazing - Mo 09.06.08 14:38
Ich hab es versucht in einer Reihe zu ordnen, funktioniert aber nicht
Ich habe 9 verschiedene Zahlen nebeneinander im Memofeld drin, was ist hier falsch? Grobe Fehler?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); var zahlfeld: array [1..9] of integer; zahl,i,d,hilf:integer; begin
zahl:=strtoint(memo1.lines.text); zahlfeld[i]:=zahl; for d:=0 to 8 do for i:=1 to 8 do if zahlfeld[i] > zahlfeld[i+1] then begin hilf:=zahlfeld[i]; zahlfeld[i]:=zahlfeld[i+1]; zahlfeld[i+1]:=hilf; end
end;
end. |
Xentar - Mo 09.06.08 14:41
Also spätestens in Zeile 8 sollte eine Kompilerwarnung stehen, so von wegen "I ist nicht initialisiert worden".
Geh den Quellcode mal zeilenweise durch und überleg dir, was da passiert. Schau dir außerdem mal an, was in den Variablen drin steht (Haltepunkt mit F5 setzen -> Wenn der Debugger da anhält, Maus über die Variable halten).
amazing - Mo 09.06.08 21:37
Finde den Fehler leider nicht, wie gesagt ich bin nicht grade vertraut mit dieser Art
oldmax - Di 10.06.08 06:54
Hi
Vielleicht solltest du mal genau nachdenken, wie du eine Zahlensortierung vornehmen würdest. Nimm dir eine beliebige Anzahl von Zetteln und schreib Zahlen von .. bis drauf, misch das ganze und fang an.
Bedingung: Du darfst dir nur 2 Zettel ansehen.
Nun zu deinem Code
Wenn zwei Schleifen benutzt, so sind diese versetzt und die 2. Schleife benutzt den Wert der ersten Schleife als Anfangswert.
Delphi-Quelltext
1: 2:
| For i:=1 to Menge-1; For j:=i+1 to Menge; |
Nun zum Vergleich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| If Wert_in_Array[i]>Wert_In_Array[j] then begin Merke:=Wert_In_Array[i]; Wert_In_Array[i]:=Wert_in_Array[j]; Wert_in_Array[j]:=Merke; end; |
So wird zuerst der Wert in dem Arrayfeld i mit der kleinsen Zahl belegt. I ist im ersten Durchlauf 1 und j läuft von 2 ( oder besser gesagt von i+1 ) bis zum letzten Arrayfeld. Dabei wird jedesmal die kleinste Zahl nach unten geschrieben, wobei unten mit i zu definieren ist
Zuletzt zu deinem Code.
Gewöhn dir an, nach begin einzurücken. Es ist hier schon oft angesprochen worden, so daß es langsam auch mal in die Köpfe sollte. Wenn du deinen Code entsprechend eirückst, wirst du auch durch diesen blicken. Ein Programm ist kein Hexenwerk, sondern einfach nur eine akribisch genaue Anweisung vieler kleiner Schritte.
gruß oldmax
amazing - Di 10.06.08 10:35
Xentar hat folgendes geschrieben: |
Also spätestens in Zeile 8 sollte eine Kompilerwarnung stehen, so von wegen "I ist nicht initialisiert worden".
Geh den Quellcode mal zeilenweise durch und überleg dir, was da passiert. Schau dir außerdem mal an, was in den Variablen drin steht (Haltepunkt mit F5 setzen -> Wenn der Debugger da anhält, Maus über die Variable halten). |
Das stimmt "i wurde nicht initialisiert" wird als Fehler angezeigt, aber warum?
nagel - Di 10.06.08 10:39
Weil i nicht initialisiert wurde ;) . Du benutzt es als Arrayindex in zahlfeld[i]:=zahl;, hast i aber vorher keine Zahl zugewiesen.
amazing - Di 10.06.08 11:02
Also i:=1 setztn?
Das hab ich gemacht, aber da ist noch ein Fehler und zwar sagt er mir die Zahlen im Memofeld seinen kein gültiger Integerwert.
Narses - Di 10.06.08 11:09
Moin!
Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät - mittlerweile sind wir ja bei Arrays und Sortieren angelangt. ;) Hier der entsprechende Absatz aus den
Richtlinien [
http://www.entwickler-ecke.de/richtlinien.html]:
1.2 Beiträge: |
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...] |
Einfach oben bei Deinem ersten Beitrag auf

oder

klicken und den Titel ändern. Danke Dir!
cu
Narses
amazing - Di 10.06.08 23:52
Ok hab ich getan, ich komm aber leider nicht weiter in meinem Programm, hab die kleinere Fehler berichtigt, aber warum die Zahlen kein gültiger Integerwert sind weiß icht nicht, würde vermuten, dass ich nicht memo1.lines.text nehmen darf, aber was sonst?
Edit: Ich bin mir ziemlich sicher, dass die Zeilen 7 und 8 flasch sind, aber ich weiß nicht wie man in einer Memo-Zeile auf verschiedene Zahlen zugreifen soll, ich habe z.B 5 und 2 nebeneinander stehen, wie kann ich die jetzt miteinander ergleichen vom Prinzip her?
Narses - Mi 11.06.08 00:22
Moin!
amazing hat folgendes geschrieben: |
Ich bin mir ziemlich sicher, dass die Zeilen 7 und 8 flasch sind, |
Ist der Code da oben noch aktuell? Wenn nicht, bitte aktuellen Code liefern. :idea:
cu
Narses
amazing - Mi 11.06.08 00:37
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var zahlfeld: array [1..9] of integer; zahl,i,j,hilf:integer; begin i:=1; zahl:=strtoint(memo1.lines.text); zahlfeld[i]:=zahl; for i:=1 to 8 do for j:=i+1 to 9 do if zahlfeld[i] > zahlfeld[j] then begin hilf:=zahlfeld[i]; zahlfeld[i]:=zahlfeld[j]; zahlfeld[j]:=hilf; |
Wie gesagt, das Problem ist, dass ich nicht weiß wie ich auf einzelne Zahlen in _einer_ Memo-Zeile zugreifen kann, deshalb ist Zeile 6-8 auch falsch denk ich mir Mal.
Narses - Mi 11.06.08 00:44
Moin!
Hier mal dein Code in einer etwas mehr als "Standard" zu bezeichnenden Formatierung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var zahlfeld: array [1..9] of Integer; zahl,i,j,hilf: Integer; begin i := 1; zahl := strtoint(memo1.lines.text); zahlfeld[i] := zahl; for i := 1 to 8 do for j := i+1 to 9 do if (zahlfeld[i] > zahlfeld[j]) then begin hilf := zahlfeld[i]; zahlfeld[i] := zahlfeld[j]; zahlfeld[j] := hilf; end; |
Das ist weniger Korinthenkackerei, als besserer Überblick. :idea: ;)
amazing hat folgendes geschrieben: |
Wie gesagt, das Problem ist, dass ich nicht weiß wie ich auf einzelne Zahlen in _einer_ Memo-Zeile zugreifen kann, deshalb ist Zeile 6-8 auch falsch denk ich mir Mal. |
Du hast schon Recht, mit der Text-Eigenschaft kommst du da nicht weiter. :| Hm :?
Muss es denn unbedingt eine Memo-Feld und mehrere Zahlen in einer Zeile sein? Könntest du auch mit einer Listbox leben? :nixweiss: Das wäre nämlich erheblich viel einfacher (für den Anfang, wie man so schön sagt)... :)
cu
Narses
Martok - Mi 11.06.08 00:59
Ich bleib dabei: halte die Werte in einem Array und gib jeweils nach jedem Sortierschritt den aktuellen Zustand aus. Ungleich einfacher...
amazing - Mi 11.06.08 09:08
Soweit komme ich ja nicht, ich bleibe beim einlesen der Zahlen hängen
oldmax - Mi 11.06.08 09:33
Hi
Nun will ich dir mal erklären, wie du dem Fehler auf die Spur kommen kannst.
Nimm ein Memo und tipp ein paar zahlenwerte ein. Dann setzt du erst mal eine Stringlist in die Form und versuchst völlig ohne großartigen Programmieraufwand die Zahlen aus eimem Memo in eine Listbox einzutragen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| TMyForm.FormCreate(Sender : TObject); Var i : Integer; Begin For i:=0 to Memo1.Lines.Count-1 do Begin Listbox1.Items.Add(Memo1.Lines[i]); end; end; |
Wenn du dir das Erggebnis anschaust, findest du die Zahlenwerte aus deiner Memo in der Listbox wieder. Die letzte Zeile ist allerdings eine Leerzeile, daher würde bei
Delphi-Quelltext
1: 2: 3: 4:
| For i:=0 to Memo1.Lines.Count-1 do Begin Listbox1.Items.Add(IntToStr(StrToInt(Memo1.Lines[i]))); end; |
ein Fehler gemeldet. Also hilft
Delphi-Quelltext
1: 2: 3: 4:
| For i:=0 to Memo1.Lines.Count-2 do Begin Listbox1.Items.Add(IntToStr(StrToInt(Memo1.Lines[i]))); end; |
Das geht. Nun Sollte auch die Sortierung kein Problem mehr sein, denn wie du sicherlich gemerkt hast, greif ich hier indiziert auf die Lines, du aber mit Lines.Strings ohne Index, das kann nicht funktionieren.....
Den Rest solltest du nun aber hinbekommen.
Gruß oldmax
amazing - Mi 11.06.08 13:09
Ich bekommes trotzdem nicht hin, jetzt eigentlich noch weniger, du greifst doch auch nur auf eine Zeile algemein ein, nicht auf die Zahlen die da drin stehen, wenn jetzt in jeder Zeile eine Zahl wäre und ich die sortieren sollte wäre es ja kein Problem, aber so hab ich keine Ahnung.
oldmax - Mi 11.06.08 13:35
Hi
Ok, da hab ich was falsch verstanden. Trotzem ist da kein großer unterschied....
Versuch mal folgendes :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| TMyForm.FormCreate(Sender : TObject); Var i : Integer; TestStr : String; ZahlStr : String; Begin TestStr:=Memo1.Lines[0]; ZahlStr:=''; For i:=1 to Length(TestStr) do Begin if TestStr[i]=' ' then begin if ZahlStr<>'' then begin Listbox1.Items.Add(ZahlStr); ZahlStr:=''; end; end else ZahlStr:=ZahlStr+TestStr[i]; end; end; |
Dieses Beispiel verhindert nicht, das Buchstaben nicht mit in die Zahlenkette geraten, aber das überlass ich dir, dies auszuwerten, bzw. zu verhindern. Was du nun mit den Zahlen anfängst, bleibt dir überlassen. Natürlich kannst du nun die Werte in ein Array schreiben, oder innerhalb der Listbox aufarbeiten. Letzteres würd ich so machen, da du nun auch ganz gut die Sortierung nachvollziehen kannst. Natürlich gehört diese Routine nicht in die FormCreate, aber du kannst dafür auch eine eigene Procedure schreiben und diese dann per Button aufrufen.
Gruß oldmax
sorry fürs Edit, hab die Delphi Tags vergessen
Narses - Mi 11.06.08 13:58
Moin!
Ich greife nochmal meine Frage von weiter vorne auf:
muss es denn unbedingt das Einlesen aus einem Memofeld sein? Ich dachte, du sollst ein Referat über Bubble-Sort und nicht über Zahlen-Einlesen machen... :roll:
Vorschlag:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
implementation
procedure TForm1.Button1Click(Sender: TObject); var Eingabe: String; begin if InputQuery('Neue Zahl hinzufügen','Zahl:',Eingabe) then ListBox1.Items.Add(Eingabe); end; |
Damit kannst du dich nun auf das Sortieren konzentrieren, und nicht auf das Einlesen. :idea: ;)
cu
Narses
amazing - Mi 11.06.08 14:44
Achso ehm das Referat hab ich schon gehalten, da hab ich auch ein Programm zu geschrieben, mit jeweils einer Zahl pro Zeile, das geht auch.
Nur jetzt am Freitag schreibe ich eine Klausur und da glaube ich, dass wir mehrere Zahlen in einer Zeile ordnen sollen.
Narses - Mi 11.06.08 15:40
Moin!
amazing hat folgendes geschrieben: |
Achso ehm das Referat hab ich schon gehalten, da hab ich auch ein Programm zu geschrieben, mit jeweils einer Zahl pro Zeile, das geht auch. |
Ah, OK. ;) (hab ich irgendwie bisher nicht gepeilt, aus deinen Beiträgen... :?)
amazing hat folgendes geschrieben: |
Nur jetzt am Freitag schreibe ich eine Klausur und da glaube ich, dass wir mehrere Zahlen in einer Zeile ordnen sollen. |
Das ist allerdings ein komplett anderes Thema, als Sortieren, denn hier geht es um Textanalyse und Konvertierung. Bist du sicher, dass das Thema sein wird? :shock: Ich vermute, du bist da auf dem Holzweg (ich kann mir das einfach nicht vorstellen, dass der Lehrer übergangslos von Sortieren zu Textanalyse übergeht, das muss irgendwie vorbereitet worden sein :nixweiss:)
cu
Narses
amazing - Mi 11.06.08 17:06
Nachdem ich jetzt gesehen habe wie das funktioniert, kann ich mir das auch nicht vorstellen, aber der Lehrer hat gesagt, er gibt uns ein unfertiges Programm vor, dass wir fertig schreiben sollen, da hat der uns schonmal so ein Beispiel gezeigt, da waren die Zahlen in einer Reihe, damit man jeden einzelnen Schritt sehen kann.
Gibt es da vielleicht noch ein besonderes Feld, wo das einfacher geht?
Aber ich weiß ja wie Bubblesort funktioniert und wie ich es schreiben muss, zur Not schreib ich das einfach um.^^
Narses - Mi 11.06.08 18:41
Moin!
amazing hat folgendes geschrieben: |
Nachdem ich jetzt gesehen habe wie das funktioniert, kann ich mir das auch nicht vorstellen, |
Gut, dann sind wir da ja schonmal einen Schritt weiter. ;)
amazing hat folgendes geschrieben: |
aber der Lehrer hat gesagt, er gibt uns ein unfertiges Programm vor, dass wir fertig schreiben sollen, da hat der uns schonmal so ein Beispiel gezeigt, da waren die Zahlen in einer Reihe, damit man jeden einzelnen Schritt sehen kann. |
Das bezweifele ich auch kein Bischen, aber ich schätze einfach mal, dass es nur um die
Ausgabe der Zahlen in z.B. einem Memofeld geht, wärend die zu sortierenden Zahlen selbst als Integer in einem Array abgelegt sind. :idea: Das macht sehr viel mehr Sinn, als die
Eingabe einer Zahlenfolge per Memo. :think:
amazing hat folgendes geschrieben: |
Gibt es da vielleicht noch ein besonderes Feld, wo das einfacher geht? |
Hm,
einfacher als ein
array of Integer kann ich mir kaum vorstellen... :gruebel: :nixweiss:
amazing hat folgendes geschrieben: |
Aber ich weiß ja wie Bubblesort funktioniert und wie ich es schreiben muss, zur Not schreib ich das einfach um.^^ |
Mach das.
Fein, ich denke, dann haben wir das Thema ja doch noch "fertig" bekommen. :)
cu
Narses
amazing - Mi 11.06.08 21:10
Wie sähe das denn us, wenn die Zahlen in einem Array abgelegt sind, die müssen ja irgentwo her kommen, hast Du ein Beispiel?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var rand,anzahl : integer; i : integer; begin anzahl := strtoint(edit1.text); for i := 0 to anzahl do begin rand := random(50)+1; memo2.lines.add(inttostr(rand)); end; end;
procedure TForm1.Button2Click(Sender: TObject); var zahlen: array [0..5] of integer; i,j : integer; zahlfeld : integer; begin end;
end. |
Also, ich gebe eine bestimmbare Anzahl an zufälligen Zahlen in Memo2 aus.
In Memo1 soll pro Zeile ein Tauschdurchgang ausgegeben werden.
Ich hab mir den Kopf zerbrochen, wie ich die Zahlen aus Memo2 auf den Array spiele und dann den ersten Sortierdurchgang mache. Ich habe jetzt mal [0..5] genommen also gehen 6 Zahlen drauf, soviel weiß ich, aber wie zu anfang des Threads schon gesagt hab ich eigentlich noch nie mit Arrays gearbeitet und hänge dem entschprechend jetzt dort.
Moderiert von
Narses: Überflüssige Leerzeilen entfernt
Narses - Do 12.06.08 00:44
Moin!
amazing hat folgendes geschrieben: |
Also, ich gebe eine bestimmbare Anzahl an zufälligen Zahlen in Memo2 aus.
[...]
Wie sähe das denn us, wenn die Zahlen in einem Array abgelegt sind, die müssen ja irgentwo her kommen, hast Du ein Beispiel? |
Genau hier ist schon der Trick (oder dein Missverständnis): du gibst die Zahlen nur ins Memo aus, aber eigentlich solltest du die Zahlen zuerst mal in einem globalen Array ablegen und dann von dort aus ins Memo schreiben: :idea:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| var Zahlen: array[0..5] of Integer; procedure TForm1.Ausgabe; var i: Integer; tmp: String; begin tmp := ''; for i := 0 to 5 do tmp := IntToStr(Zahl[i]) +' '; Memo2.Lines.Add(tmp); end;
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 5 do Zahl[i] := Random(50) +1; Ausgabe; end;
procedure TForm1.Button2Click(Sender: TObject); var i,j,tmp: Integer; begin for j := 4 downto 0 do begin for i := 0 to j do if (Zahl[i] > Zahl[i+1]) then begin tmp := Zahl[i]; Zahl[i] := Zahl[i+1]; Zahl[i+1] := tmp; end; Ausgabe; end; end; |
cu
Narses
oldmax - Do 12.06.08 06:43
Hi
Es ist doch völlig egal, wie und wo Zahlen gegeben sind. Zur Not muß man diese eben aus einem String herausfiltern. Du schreibst, es ist kein Problem, aus mehreren Zeilen die Zahlen im Memofeld zu lesen, dasselbe sollte nach meinem letzten Script auch von Zahlen in einer Zeile der Fall sein. Es ist halt nur das herauslösen aus einem String.
Wenn du nicht weißt, wieviele Zahlen du zu erwarten hast, halte ich die Lösung mit einem Array bei deinem Wissensstand ( sorry für diese Aussage ) falsch, es sei denn, du weißt , wie man dynamische Arrays aufbaut, oder zu Laufzeit den Bereich vergrößert. Dies bezweifle ich allerdings nach dem, was ich hier zu lesen bekomme.
Daher ist die Lösung mit der Listbox nach wie vor mein Favorit, nachdem ich ja weiß, das Typwandlung bekannt sein muß (StrToInt sowie IntToStr)
So wie du nach dem Typ Array fragst, scheint mir, das ihr darüber wohl noch nicht geredet habt. Versteh's nicht falsch, aber es muß dir klar sein. Du bekommst eine Aufgabe, die wir nicht ahnen können, und du mußt einen Weg finden, der dir mit deinen Mitteln zur Lösung hilft. Da kann ich dir nur sagen, laß mal einen "Gedankensturm" los und blätter mal alles durch, worüber ihr gesprochen habt. Irgendwas davon wird geeignet sein, irgendwelche Werte in der gewünschten Form zu bearbeiten. In diesem Fall wären die Werte "Zahlen" und die Aufgabe "sortieren".
Wenn du dann dein Aufgabenblatt vorgelegt bekommst, wird es dir nicht helfen, etwas über Arrays gehört , aber die Struktur nicht verstanden zu haben.
Natürlich weiß ich nicht, ob's klar ist, das man in einem String auch auf jedes einzelne Zeichen zugreifen kann, das man Strings addieren und somit neue Strings bilden kann. In welcher Reihenfolge nun eure Lehrinhalte vermittelt werden, weiß ich nicht. Daher solltest du es dir zur Regel machen, auch mal um die Ecke zu denken. Dein Werkzeug (was auch immer du gelernt hast ) mußt du einsetzen können.
Das soll jetzt nicht heißen, du sollst die Arrays ignorieren, allerdings bin ich mir nicht sicher, ob du sie brauchst.
Gruß oldmax
amazing - Do 12.06.08 12:32
Das blöde ist ja nur wenn der Lehrer es in der Klausur trotzdem verlangt, hab noch ein paar Fragen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| zahlen[0] := strtoint(memo1.lines[0]); zahlen[1] := strtoint(memo1.lines[1]); zahlen[2] := strtoint(memo1.lines[2]); zahlen[3] := strtoint(memo1.lines[3]); zahlen[4] := strtoint(memo1.lines[4]); zahlen[5] := strtoint(memo1.lines[5]); zahlen[6] := strtoint(memo1.lines[6]); |
zahlen ist array [0..6] of integer, dann hab ich ich i als Laufvariable.
Um das zu vereinfachen:
Delphi-Quelltext
1: 2:
| for i := 0 to 6 do zahlen[i] := strtoint(memo1.lines[i]); |
Ist das so korrekt?
Wenn das so stimmt sind die Zahlen jetzt eingelesen.
Und wenn ich nun nur einen Durchgang pro Klick durchführen möchte, muss ich doch eine Schleife benutzten, oder? Also:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for i := 0 to memo1.lines.count-1 do begin if zahlen[i] > zahlen[i+1] then hilfe := zahlen[i]; zahlen[i] := zahlen[i+1]; zahlen[i+1] := hilfe; |
Wie geb ich denn jetzt den einen Durchgang in Memo2 aus?
Narses - Do 12.06.08 12:34
amazing hat folgendes geschrieben: |
Wie geb ich denn jetzt den einen Durchgang in Memo2 aus? |
Narses hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| procedure TForm1.Ausgabe; | |
amazing - Do 12.06.08 12:51
Stimmt denn alles was ich gesagt habe?
Wenn ich Ausgabe; aufrufen wollte, kam ein Fehler der sagte 'Nicht genügend wirkliche Parameter'.
Kann es sein, dass diese Prozedur immer eine Zahl pro Zeile ausgibt?
Die sollen ja alle in einer Zeile ausgegeben werden.
oldmax - Do 12.06.08 13:01
Hi
Fast hab ich die Vermutung, du versuchst deinen Code auf Papier, d. H. du hast kein Delphi. Sonst würde dir dies nicht passieren....
Zitat:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to memo1.lines.count-1 do begin if zahlen[i] > zahlen[i+1] then hilfe := zahlen[i]; zahlen[i] := zahlen[i+1]; zahlen[i+1] := hilfe; |
So sollte zumindest der Werteaustausch richtig funktionieren
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to memo1.lines.count-2 do begin if zahlen[i] > zahlen[i+1] then begin hilfe := zahlen[i]; zahlen[i] := zahlen[i+1]; zahlen[i+1] := hilfe; end; End; |
Beachte bitte das Einrücken. Es zeigt dir ganz deutlich, welche Zeilen bearbeitet werden.
Gruß oldmax
---
Moderiert von
Narses: Beiträge zusammengefasst---
Nachtrag:
NArses hat es schon geschrieben : das Zauberword heißt Procedure
Du brauchst eine, um z. B. den Soriervorgang einmal ausführen zu lassen, eine zweite, um die Were aus dem Array in das Memofeld zu übertragen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Procedure TForm.Bubble_Step; Var i : Integer; Hilfe : Integer; Begin for i := 0 to memo1.lines.count-2 do begin if zahlen[i] > zahlen[i+1] then begin hilfe := zahlen[i]; zahlen[i] := zahlen[i+1]; zahlen[i+1] := hilfe; end; End; End; |
Und die Ansicht
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Procedure TForm.Show_Array; Var i : Integer; Begin Memo2.Lines.Clear; for i := 0 to memo1.lines.count-1 do Memo2.Lines.Add(IntToStr(Zahlen[i]); End; |
Abgesehen vom Schönheitsfehler, das du bei jeden Buttonclick alle Zahlen, also auch die bereits sortierten nochmal in der Sortierroutine durchläufst, sollte es so gehen.
Natürlich kannst du auch in der OnClick des Buttons beide Proceduren direkt programmieren, doch es ist sinnvoll, verschiedene Aufgaben von kleinen Programmteilen (Stichwort : Procedure, Function ) erledigen zu lassen. Vorteil: Wenn sie einmal funktionieren, werden sie es immer wieder tun, egal aus welchem Programmbereich sie aufgerufen werden. Außerdem erhöht es die Lesbarkeit eines Programmes gewaltig. Nicht grad bei deinem Dreizeiler, aber besser man gewöhnt sich gleich was richtiges an, als die langen Spaghetticodes, die man als Anfänger sehr gern produziert.
Nun sollte es aber gut sein
Gruß oldmax
Narses - Do 12.06.08 13:52
Moin!
oldmax hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Procedure TForm.Show_Array; Var i : Integer; Begin Memo2.Lines.Clear; for i := 0 to memo1.lines.count-1 do Memo2.Lines.Add(IntToStr(Zahlen[i]); End; | |
Aber das will er doch nicht, es sollen alle Zahlen in einer Zeile ausgegeben werden :nixweiss: und genau das macht mein Vorschlag oben. ;)
cu
Narses
Hidden - Do 12.06.08 13:53
Hi,
@
amazing: IMHO war das nur die Beispielaufgabe für die Schüler, dass die Schritte einzeln laufen; in der Klausur sollte ganz normales Bubblesort zum Einsatz kommen, dann. Z.B.: 'Schreiben Sie eine Prozedur, die ein beliebiges Array of Integer mittels Bubblesort sortiert zurückgibt.'
mfG,
amazing - Do 12.06.08 14:28
Würde ich jetzt auch vermuten, denn wie man das alles richtig macht haben wir gar nicht besprochen.
Also danke an alle, die mir geholfen haben :)
oldmax - Do 12.06.08 17:42
Sorry, kann ich mir leider nicht verkneifen....
Zitat: |
Würde ich jetzt auch vermuten, denn wie man das alles richtig macht haben wir gar nicht besprochen. |
?????
und das kann ich auch so nicht stehen lassen:
Zitat: |
'Schreiben Sie eine Prozedur, die ein beliebiges Array of Integer mittels Bubblesort sortiert zurückgibt.' |
Eine Procedur gibt nichts zurück, sie führt etwas aus ! Für eine Rückgabe ist eine Function ! Zumindest war das bis heut so ! Es sei denn, ich hab was verschlafen...
Aber das wär auch nicht das erste mal.
Oldmax
Hidden - Do 12.06.08 17:56
Hi,
oldmax hat folgendes geschrieben: |
Eine Procedur gibt nichts zurück, sie führt etwas aus ! Für eine Rückgabe ist eine Function |
Jop. Genaugenommen könnte ich hier auf Out-Parameter verweisen, aber ich meinte schon function.
Edit: Wobei eine function natürlich auch etwas ausführt (!)
mfG,
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!