Autor Beitrag
amazing
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Di 03.06.08 19:53 
Was mit welchem Array hast du nicht verstanden?
amazing Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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?

ausblenden 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..9of 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+1then
begin
hilf:=zahlfeld[i];
zahlfeld[i]:=zahlfeld[i+1];
zahlfeld[i+1]:=hilf;
end

end;

end.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mo 09.06.08 21:37 
Finde den Fehler leider nicht, wie gesagt ich bin nicht grade vertraut mit dieser Art
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
For i:=1 to Menge-1// -1 wegen dem letzten Vergleich
For j:=i+1 to Menge; // Die innere Schleife wird immer kürzer, da die unteren ja sortiert sind

Nun zum Vergleich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If Wert_in_Array[i]>Wert_In_Array[j] then 
begin
  Merke:=Wert_In_Array[i]; // größeren Wert zwischenspeichern
  Wert_In_Array[i]:=Wert_in_Array[j]; // kleineren Wert nach unten
  Wert_in_Array[j]:=Merke; // größeren Wert nach oben
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Di 10.06.08 10:35 
user profile iconXentar 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 user defined image oder user defined image 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.06.08 00:22 
Moin!

user profile iconamazing 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
amazing Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mi 11.06.08 00:37 
ausblenden 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..9of 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.06.08 00:44 
Moin!

Hier mal dein Code in einer etwas mehr als "Standard" zu bezeichnenden Formatierung:
ausblenden 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..9of 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: ;)

user profile iconamazing 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mi 11.06.08 09:08 
Soweit komme ich ja nicht, ich bleibe beim einlesen der Zahlen hängen