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 public 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); j := LBoxDemo.Items.count - 1; repeat i := 0; getauscht := false; repeat if LBoxDemo.Items[i] > LBoxDemo.Items[i+1] then 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 = 0) or not getauscht;
EdEnde.Text := TimeToStr(time); end;
procedure Tmain.BtInsertClick(Sender: TObject); var i, j : integer; str : string; begin EdStart.Text := TimeToStr(time);
i := 1; repeat str := LBoxDemo.Items[i]; j := i; while (j > 0) and (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; repeat h := 3 * h + 1; until h > LBoxDemo.Items.Count - 1;
repeat h := h div 3; for i := h to (LBoxDemo.Items.Count - 1) do 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
Gausi: Highlight- durch Delphi-Tags ersetzt
Moderiert von
Gausi: B- durch Highlight-Tags ersetztModeriert von
Gausi: 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)!
Motchi - Mo 15.06.09 21:38
Danke, danke, hab´s jetzt zum Laufen bekommen!
Mfg Motchi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!