Earendil - So 10.11.02 16:09
Titel: Straightinsertion und Zeiger
Hallo, erstmal sei gesagt dass ich nicht viel Ahnung von Delphi also seid nicht böse wenn ich irgendwelchen Unsinn schreibe.
Ich soll mit straightinsertion ein programm schreiben dass ein element sofort wenn ich es hinzufüge in eine liste einordnet. irgendwie soll ich das ganze auch noch mit zeigern machen. also wie ich das mit den zeigern machen soll hab ich so oder so keinen plan von, ich weiß nicht mal wie ich ne zahl direkt einordnen soll. ich bin bisher soweit ein programm zu haben das 10 zahlen die ich per edits einlese per insertion sort sortiert (die schritte lass ich über ein stringgrid ausgeben).
nun: wie kann ich jetzt ein element in die liste einsortieren lassen OHNE diese komplett neu zu sortieren.
und hat jemand ne idee mit den zeigern?
Gruß
Earendil
Das hier hab ich bisher:
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| procedure TForm1.DoSort1Click(Sender: TObject); var i : integer; //Zähler max : integer; //Maximale Zahlenanzahl zs : real; //Zwischenspeicher für ne Zahl Feld : array [0..9] of real; j: integer; x, y : integer; //Zähler für GidAusgabe begin y := 0; max := 9; for i := 0 to max do sorted.Items.Delete(0); for i := 0 to change.RowCount do change.RowCount := change.RowCount - 1; for i := 0 to max do Feld[i] := StrToInt(unsorted.Items.Strings[i]);
for x := 0 to 9 do change.Cells[x,y] := FloatToStr(Feld[x]); change.RowCount := change.RowCount+1; inc(y);
for i := 1 to max do begin zs := Feld[i]; j := i-1; while (zs < Feld[j]) and (j >= 0) do begin Feld[j+1] := Feld[j]; dec(j);
for x := 0 to 9 do change.Cells[x,y] := FloatToStr(Feld[x]); change.RowCount := change.RowCount+1; inc (y);
end; Feld[j+1] := zs; end; for i := 0 to max do sorted.Items.Add(FloatToStr(Feld[i])); change.RowCount := change.RowCount - 1; counter.Text := inttostr(change.RowCount); end;
procedure TForm1.Hinzufuegen1Click(Sender: TObject); begin unsorted.items.add(edit1.text); unsorted.items.add(edit2.text); unsorted.items.add(edit3.text); unsorted.items.add(edit4.text); unsorted.items.add(edit5.text); unsorted.items.add(edit6.text); unsorted.items.add(edit7.text); unsorted.items.add(edit8.text); unsorted.items.add(edit9.text); unsorted.items.add(edit10.text); end; |
Irgendwelche Ideen, Kritik, Verbesserungsvorschläge, Lösungsvorschläge?
Wolff68 - Mi 13.11.02 18:08
Also um einen Wert gleich an die richtige Position im Feld zu speichern geht folgendes
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TForm1.SortInsert(Neu: Real): Integer; {Fügt neuen Wert sortiert in Array of Real ein} var i1, i2 : Integer; begin {Einfügeposition suchen} For i1 := Low(Feld) to High(Feld) do begin IF Neu < Feld[i1] then break; end; {Falls Neu größer ist als letzter Feldwert} IF i1 = High(Feld)+1 then DEC(i1); {Alle nachfolgenden 1 Platz nach hinten setzen (Platz schaffen)} For i2 := High(Feld)-1 downto i1 do begin Feld[i2+1] := Feld[i2]; end; {Neuen Wert speichern} Feld[i1] := Neu; SortInsert := i1; end; |
Diese Funktion gibt Dir auch gleich die Einfügeposition aus.
Das Feld muß vorher aber mit Maximalwerten initialisiert werden.
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin For i := Low(Feld) to High(Feld) do Feld[i] := 1.7E+308; end; |
Genau darin liegt aber ein kleines Problem: In zukünftigen Delphi-Versionen könnte sich dieser Maximalwert ändern! zB in Extended
Ein anderes Problem stellt sich, wenn der neue Wert größer als der letzte Wert in der Liste ist. Soll man nun einfügen, und den niedrigeren Wert raushauen, oder soll man sagen, daß der Wert eben oberhalb liegt....
Mit Zeigern kenn ich mich selber nicht besonders aus, und ich sehe auch grad keinen Sinn sie hier einzusetzen.
Ach ja: Die Feldgröße ist innerhalb des Integerbereiches frei.
Ist also egal ob Du ein 0..9 Feld hast oder ein 0..2147483647
(Und sag mir mal die Note, die Du (ich) dafür jetzt bekomme) :twisted: