Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Abbruchbedingungen einer Suche(In Listbox)


Motchi - So 14.06.09 14:04
Titel: Abbruchbedingungen einer Suche(In Listbox)
Hallo liebe Leute!

Ich soll als kleinen Vortag für meinen Informatik Kurs in der Schule anhand des folgenden Programms erklären, mit welcher Aufforderung(if) ich dem Programm sage, das es aufhören soll nach einem nicht gefundenen Eintrag suchen(Bis jetzt hängt es sich natürlich in der repeat Schleife auf). Bitte erklärt mir dann auch gleich das Prinzip dahinter. Hier mal mein Qellcode:

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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
unit Sort;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tmain = class(TForm)
    LBoxDemo: TListBox;
    BtFuellen: TButton;
    EdAnz: TEdit;
    BtBubble: TButton;
    BtInsert: TButton;
    BtShell: TButton;
    EdStart: TEdit;
    EdEnde: TEdit;
    BtSuchen: TButton;
    EdSuchwort: TEdit;
    procedure BtFuellenClick(Sender: TObject);
    procedure BtBubbleClick(Sender: TObject);
    procedure BtInsertClick(Sender: TObject);
    procedure BtShellClick(Sender: TObject);
    procedure BtSuchenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  main: Tmain;

implementation

{$R *.dfm}

procedure Tmain.BtFuellenClick(Sender: TObject);
var i, anz : integer;
begin
    randomize;
    i := 0;
    anz := StrToInt(EdAnz.Text);
    LBoxDemo.clear;
    repeat
        LBoxDemo.Items.add(IntToSTr(random(10000)));
        i := i + 1;
    until i = anz;


end;

procedure Tmain.BtBubbleClick(Sender: TObject);
var i, j : integer;
    str : string;
    getauscht : boolean;
begin
    EdStart.Text := TimeToStr(time);        // Startzeit anzeigen

    j := LBoxDemo.Items.count - 1;          // Bubblesort
    repeat
        i := 0;
        getauscht := false;
        repeat
            if LBoxDemo.Items[i] > LBoxDemo.Items[i+1then
            begin
                getauscht := true;
                str := LBoxDemo.Items[i];
                LBoxDemo.Items[i] := LBoxDemo.Items[i+1];
                LBoxDemo.items[i+1] := str;

            end;
            i := i + 1;
        until i >= j;
        j := j - 1;
    until (j = 0or not getauscht;

    EdEnde.Text := TimeToStr(time);         // Sortierende-Zeitpunkt anzeigen
end;

procedure Tmain.BtInsertClick(Sender: TObject);
var i, j : integer;
    str : string;
begin
    EdStart.Text := TimeToStr(time);

    i := 1;
    repeat                                  // Insertionsort
        str := LBoxDemo.Items[i];
        j := i;
        while (j > 0and (LBoxDemo.Items[j-1] > str) do
        begin
            LBoxDemo.Items[j] := LBoxDemo.Items[j-1];
            j := j - 1;
        end;
        LBoxDemo.Items[j] := str;
        i := i + 1;
    until i >= LBoxDemo.Items.Count;

    EdEnde.Text := TimeToStr(time);

end;

procedure Tmain.BtShellClick(Sender: TObject);
var i, j, h : integer;
    str : string;
begin
    EdStart.Text := TimeToStr(time);

    h := 1;                                 // Shell-Sort
    repeat
        h := 3 * h + 1;
    until h > LBoxDemo.Items.Count - 1;

    repeat
        h := h div 3;
        for i := h to (LBoxDemo.Items.Count - 1do
        begin
            str := LBoxDemo.Items[i];
            j := i;
            while ((j >= h) and (LBoxDemo.Items[j-h] > str)) do
            begin
                LBoxDemo.Items[j] := LBoxDemo.Items[j-h];
                j := j - h;
            end;
            LBoxDemo.Items[j] := str;
        end;
    until h <= 1;

    EdEnde.Text := TimeToStr(time);
end;

procedure Tmain.BtSuchenClick(Sender: TObject);
var  m,a,e:integer;
     gefunden: boolean;
begin
  a:=0;
  e:=LBoxDemo.Items.Count -1;
  gefunden:=false;
  repeat
  m:=(a+e) div 2;

  if EdSuchwort.Text < LBoxDemo.Items[m] then e:=m
  else if EdSuchwort.Text > LBoxDemo.Items[m] then a:=m
  else if EdSuchwort.Text = LBoxDemo.Items[m] then gefunden:=true;
  until gefunden;
  LBoxDemo.itemindex:=m;

 

  

end;

end.


PS: Bin Neu hier, also sorry wenn ich ins falsche U_Forum gepostet habe :)

Moderiert von user profile iconGausi: Highlight- durch Delphi-Tags ersetzt
Moderiert von user profile iconGausi: B- durch Highlight-Tags ersetzt
Moderiert von user profile iconGausi: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am So 14.06.2009 um 14:27


Delete - So 14.06.09 14:14

Steppe doch einmal in der Schleife durch und beobachte, wie sich a(Anfang) und e(Ende) verändern. Daraus kannst Du dann folgern, wie Du die Schleifenendebedingung erweitern musst, damit die Schleife verlassen wird, wenn der zu suchende Text nicht gefunden wurde.


Marc. - So 14.06.09 14:14

Wenn du genau hinschaust, wirst du erkennen, dass du den Index m nie(!) veränderst. Damit vergleichst du permanent die selben Einträge miteinander.
Edit: Wer lesen kann, ist klar im Vorteil. :oops:

Grüße


Gausi - So 14.06.09 14:30

Hallo und :welcome: in der Entwickler-Ecke,

Das sieht doch ganz nach einer Binärsuche aus. Die muss man spätestens dann abbrechen, wenn a=e ist, oder besser a>=e.

Nebenbei: es ist empfehlenswert, den Suchbereich etwas stärker einzuschränken.

Delphi-Quelltext
1:
2:
3:
if EdSuchwort.Text < LBoxDemo.Items[m] then e := m-1
  else if EdSuchwort.Text > LBoxDemo.Items[m] then a := m+1
  else if EdSuchwort.Text = LBoxDemo.Items[m] then gefunden:=true;


Motchi - So 14.06.09 21:47

Danke für die schnellen Antworten! :)
Ich probiers gleich morgen mal aus wenn ich wieder in der Schule sitze(hab Zuhaus kein Delphi)!


Regan - So 14.06.09 22:34

user profile iconMotchi hat folgendes geschrieben Zum zitierten Posting springen:
(hab Zuhaus kein Delphi)

Dann wird es aber Zeit ;) : Turbo Delphi 2006 herunterladen und installieren. [http://www.delphi-library.de/topic_Turbo+Delphi+herunterladen+und+installieren_88835.html]


Motchi - Mo 15.06.09 21:38

Danke, danke, hab´s jetzt zum Laufen bekommen!

Mfg Motchi