Autor |
Beitrag |
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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...
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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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?  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  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.  Das macht sehr viel mehr Sinn, als die Eingabe einer Zahlenfolge per Memo.
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...
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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:
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 12.06.08 12:34
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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  und genau das macht mein Vorschlag oben.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|