Autor Beitrag
Earendil
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 10.11.02 16:09 
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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: So 10.11.02 17:45 
Hi!

google:
asg.region-kaisersla...aightinsertion-1.htm

Poste doch mal den Text der Hausaufgabe.

cu
waba
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mi 13.11.02 18:08 
Also um einen Wert gleich an die richtige Position im Feld zu speichern geht folgendes
ausblenden 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.
ausblenden 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:

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."