Autor Beitrag
depigoid
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Fr 20.04.07 16:24 
Ich soll ein Feld voll Zufallszahlen ausgeben. Dann soll ich per zweitem Button ein Element suchen und dieses löschen. Wurde es gefunden, soll die Zahl immer mit dem Nachfolger überschrieben werden.
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:
 
var
  Form1: TForm1;
  a:array[0..20]of integer;
implementation

{$R *.dfm}

procedure TForm1.BerechneClick(Sender: TObject);
var i,k,j,help,pos:integer;
begin
 for i:=0 to 20 do a[i]:=random(333);   //Feld festlegen 

 for i:=0 to 19 do                      //Feld sortieren 
  begin
   pos:=i;
   k:=a[pos];
    for j:=i+1 to 20 do
     if (a[j]<k) then
      begin
       k:=a[j];
       pos:=j;
      end;
     if not (k=a[i]) then
      begin
       help:=a[i];
       a[i]:=k;
       a[pos]:=help;
      end;
   end;

  for i:=0 to 20 do listbox1.items.add(inttostr(a[i])); //Ausgeben


Das müsste ja Button eins sein.

Die suche würde ich so schreiben
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 
 n:=strtoint(zahlEdit.text); //zu suchende Zahl
 pos:=0;
 for i:=0 to 100 do
   if (a[i]=n) then
    begin
     listbox2.items.add(inttostr(i));
     pos:=pos+1;
    end;
 if pos=0 then Showmessage('Das Element ist nicht enthalten!');


Ist das richtig? Wie kann ich das "Löschen" schreiben?
Mit freundlichen Grüßen
depigoid
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Fr 20.04.07 17:05 
Der Sortiervorgang scheint mir falsch zu sein, bei nur 20 Einträgen kannst du einfach auf BubbleSort zurückgreifen

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:
type
  TIntArr = Array of Integer;

//sortieren

procedure BubbleSort(var A : TIntArr ; const Up : Boolean = True);
var
  i, n : integer;
  done : Boolean;
begin
  n := 0;
  repeat
    done := true;
    for i := n to Length(A) - 2 do
      if (A[i] < A[i + 1]) = Up then
      begin
        Temp := A[i];
        A[i] := A[i + 1];
        A[i + 1] := Temp;
        Done := False;
      end;
    Inc(n);
  until done;
end;

//löschen

procedure Delete(var A : TIntArr; const Index : integer);
var
  i : integer;
begin
  for i := index to Length(A) - 2 do
    A[i] := A[i + 1];
  SetLength(A, Length(A) - 1);
end;

//suchen

function IndexOf(const A : TIntArr; const Value : integer);
var
  i : integer;
begin
  Result := -1;
  for i := 0 to Length(A) - 1 do
    if A[i] = Value then
    begin
      Result := i;
      Break;
    end;
end;


Alles ungetestet hier reingetipselt, aber der Ansatz sollte klar sein ;)

gruss, Rob

_________________
erare humanum est
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: Sa 21.04.07 11:08 
Vielen Dank, aber Sortierung funktioniert (select_sort). Wie kann ich einen Wert durch überschreiben mit dem nächsten löschen?

MfG depigoid
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 21.04.07 17:07 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for X := 10 to High(MyArray) - 1 do
  MyArray[X] := MyArray[X + 1];

MyArray[High(MyArray)] := 0


"Löscht" den 11. Wert;

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
depigoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP

BeitragVerfasst: So 22.04.07 11:33 
Vielen Dank, hilft mir aber leider nicht so dolle. Ich soll ja Werte bis zu der Zahl übernehmen und aller weitern Werte (X) überschreiben, sozusagen x:=x+1;
Ich habe das mal wie folgt versucht:
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:
 
procedure THauptfenster.BelegenClick(Sender: TObject);
var i,pos,k,j,help:integer;
begin
 for i:=0 to 100 do a[i]:=random(831); //Feld festlegen

 for i:=0 to 99 do                      //Sortierung
  begin
   pos:=i;
   k:=a[pos];
    for j:=i+1 to 100 do
     if (a[j]<k) then
      begin
       k:=a[j];
       pos:=j;
      end;
     if not (k=a[i]) then
      begin
       help:=a[i];
       a[i]:=k;
       a[pos]:=help;
      end;
   end;
  for i:=0 to 100 do listbox1.Items.add(inttostr(a[i])); //Ausgabe des Feldes zur
end;                                                     //Kontrolle

procedure THauptfenster.LoeschenClick(Sender: TObject);  //Button zwei zum Löschen
var loes,i:integer;
begin
 loes:=strtoint(loschEdit.text);            //zu löschende Zahl
 if loes>=831 then Showmessage('Bitte einen Wert unter 831 eingeben!');

 for i:=0 to 100 do
  begin
   while a[i]<loes do listbox2.items.add(inttostr(a[i]));
   if a[i]=loes then
    begin
     while a[i]>loes do
      begin
       a[i]:=a[i+1];
       listbox2.items.Add(inttostr(a[i]));
      end;
    end;
  end;
end;


Wieso geht das nicht? Was ist daran falsch?

MfG depigoid
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 22.04.07 11:42 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  for i := 0 to 100 do  
  begin  
    while a[i] < loes do
      listbox2.items.add(inttostr(a[i]));  
   
    if a[i] = loes then  
    begin  
      while a[i] > loes do  
      begin  
        a[i]:=a[i+1];  
        listbox2.items.Add(inttostr(a[i]));  
      end;  
    end;  
  end;


Alles markierte gibt ne Endlosschleife. Richtig:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for I := 0 to High(A) do
begin
  if A[I] < Loes do
    ListBox2.Items.Add(IntToStr(A[I]));

  if A[I] = Loes then
  begin
    for X := I to High(A) - 1 do
      A[X] := A[X + 1];

    ListBox2.Items.Add(IntToStr(A[I]));
  end;
end;

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)