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 user profile iconNarses: 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..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 - 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// -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:

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


amazing - 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 - 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 user defined image oder user defined image 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!

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


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..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 - 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..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


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; // Laufvariable
Begin
  For i:=0 to Memo1.Lines.Count-1 do
  Begin
    Listbox1.Items.Add(Memo1.Lines[i]); // Die Lines werden mit i indiziert !
  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]))); // mit integerwandlung
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]))); // mit integerwandlung
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; // Laufvariable  
    TestStr   : String;
    ZahlStr   : String;
Begin  
  TestStr:=Memo1.Lines[0]; // wenn du nur die erste Zeile willst
{ alternativ :  TestStr:=Memo1.Text; }
  ZahlStr:=''// einen völlig leeren String erzeugen
  For i:=1 to Length(TestStr) do  
  Begin 
    if TestStr[i]=' ' then 
    begin // leerzeichen bildet die Trennung der Zahlen
      if ZahlStr<>'' then 
      begin  // nur wenn wirklich was in ZahlStr drin steht
        Listbox1.Items.Add(ZahlStr); // hier schreibst du die Zahlen in die Listbox  
        ZahlStr:='';
      end;
    end else ZahlStr:=ZahlStr+TestStr[i]; // zusammenhängende Zahlen bilden

  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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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!

user profile iconamazing 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... :?)

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

user profile iconamazing 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. ;)

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

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

user profile iconamazing 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..5of 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 user profile iconNarses: Überflüssige Leerzeilen entfernt


Narses - Do 12.06.08 00:44

Moin!

user profile iconamazing 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..5of Integer; // globales Zahlenfeld, 6 Elemente

procedure TForm1.Ausgabe; // Zahlen ausgeben
  var
    i: Integer;
    tmp: String;
begin
  tmp := ''// temp. Sammelvariable
  for i := 0 to 5 do // alle 6 Zahlen
    tmp := IntToStr(Zahl[i]) +' '// in den temp. String
  Memo2.Lines.Add(tmp); // und diesen dann ins Memo
end;

procedure TForm1.Button1Click(Sender: TObject); // Zahlen erzeugen
  var
    i: Integer;
begin
  for i := 0 to 5 do // alle 6 Zahlen
    Zahl[i] := Random(50) +1// mit Zufallszahl 1..50 belegen
  Ausgabe; // und ausgeben
end;

procedure TForm1.Button2Click(Sender: TObject); // Zahlen sortieren
  var
    i,j,tmp: Integer;
begin
  for j := 4 downto 0 do begin // äußere Schleife 4..0
    for i := 0 to j do // innere Schleife 0..j
      if (Zahl[i] > Zahl[i+1]) then begin // Zahlen verkehrtrum?
        tmp := Zahl[i]; // dann tauschen
        Zahl[i] := Zahl[i+1];
        Zahl[i+1] := tmp;
      end;
    Ausgabe; // nach einem Durchlauf Zwischenergebnis ausgeben
  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+1then 
 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

user profile iconamazing hat folgendes geschrieben:
Wie geb ich denn jetzt den einen Durchgang in Memo2 aus?
user profile iconNarses hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
procedure TForm1.Ausgabe; // Zahlen ausgeben
// s.o.


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+1then   
   hilfe := zahlen[i];  // diesen und die folgenden Befehle in Begin und End 
   zahlen[i] := zahlen[i+1]; // sonst werden diese Befehle immer !! ausgeführt 
   zahlen[i+1] := hilfe;     // nur Hilfe wird in Abhängigkeit vom Vergleich gesetzt
   // außerdem ist dein max. Indexwert Memo.Lines.Count-1 und damit 
   // greifst du beim letzten Durchlauf beim Array über den Arraybereich hinaus
// es fehlt das End für die Schleife

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+1then   
   begin
     hilfe := zahlen[i];  // jetzt werden alle Variablen nacheinander getauscht
     zahlen[i] := zahlen[i+1]; 
     zahlen[i+1] := hilfe;     
   end; // end if
 End; // end For

Beachte bitte das Einrücken. Es zeigt dir ganz deutlich, welche Zeilen bearbeitet werden.
Gruß oldmax

---Moderiert von user profile iconNarses: 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+1then     
    begin  
      hilfe := zahlen[i];  // jetzt werden alle Variablen nacheinander getauscht  
      zahlen[i] := zahlen[i+1];   
      zahlen[i+1] := hilfe;       
    end// end if  
  End// end For 
End// end Proc

Und die Ansicht

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Procedure TForm.Show_Array;
Var i      : Integer;
Begin
  Memo2.Lines.Clear; // Memoinhalt löschen
  for i := 0 to memo1.lines.count-1 do Memo2.Lines.Add(IntToStr(Zahlen[i]);    
  
End// end Proc

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!

user profile iconoldmax hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Procedure TForm.Show_Array;
Var i      : Integer;
Begin
  Memo2.Lines.Clear; // Memoinhalt löschen
  for i := 0 to memo1.lines.count-1 do
    Memo2.Lines.Add(IntToStr(Zahlen[i]);    
End// end Proc
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,

@user profile iconamazing: 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,

user profile iconoldmax 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,