Autor |
Beitrag |
Motchi
Hält's aus hier
Beiträge: 3
|
Verfasst: So 14.06.09 14:04
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: 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
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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.
Grüße
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 14.06.09 14:30
Hallo und  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; |
_________________ We are, we were and will not be.
|
|
Motchi 
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: So 14.06.09 22:34
Motchi hat folgendes geschrieben : | (hab Zuhaus kein Delphi) |
Dann wird es aber Zeit  : Turbo Delphi 2006 herunterladen und installieren.
|
|
Motchi 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 15.06.09 21:38
Danke, danke, hab´s jetzt zum Laufen bekommen!
Mfg Motchi
|
|
|