Autor |
Beitrag |
amazing
      
Beiträge: 32
|
Verfasst: Mo 02.06.08 22:42
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
Zuletzt bearbeitet von amazing am Di 10.06.08 14:39, insgesamt 1-mal bearbeitet
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ 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)
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Di 03.06.08 19:53
Was mit welchem Array hast du nicht verstanden?
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
      
Beiträge: 32
|
Verfasst: Mo 09.06.08 21:37
Finde den Fehler leider nicht, wie gesagt ich bin nicht grade vertraut mit dieser Art
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
amazing 
      
Beiträge: 32
|
Verfasst: 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
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: 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 
      
Beiträge: 32
|
Verfasst: 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
      

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

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
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 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
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?  Das wäre nämlich erheblich viel einfacher (für den Anfang, wie man so schön sagt)...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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...
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
amazing 
      
Beiträge: 32
|
Verfasst: Mi 11.06.08 09:08
Soweit komme ich ja nicht, ich bleibe beim einlesen der Zahlen hängen
|
|