Autor Beitrag
Motchi
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden volle Höhe 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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.
Motchi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 15.06.09 21:38 
Danke, danke, hab´s jetzt zum Laufen bekommen!

Mfg Motchi