Entwickler-Ecke

Sonstiges (Delphi) - Straightinsertion und Zeiger


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?


aogwaba - So 10.11.02 17:45

Hi!

google:
http://asg.region-kaiserslautern.de/_infoSCHUL/_5_informatik_sort_web/Straightinsertion/Straightinsertion-1.htm

Poste doch mal den Text der Hausaufgabe.

cu
waba


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: