Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Löschen doppelter Zahlen (https://www.delphipraxis.net/7775-loeschen-doppelter-zahlen.html)

n00b_on_knees 21. Aug 2003 10:03


Löschen doppelter Zahlen
 
Hi Leute!

Ich habe gestern ein Programm geschrieben, das aus einem Memofeld doppelte Zahlen herauslöschen soll, die restlichen sollen aufgerückt werden. Hierbei habe ich ein Problem nachdem ich auf den Start Button drücke, dann kommt eine Benachrichtigung über Debugger Exception, so eine Art Zugriffsverletzung aus irgendeinem Grund, nur ich weiß nicht aus welchem ;). Kommt sowohl beim Start über F9, als auch der exe. Datei. Ich geb euch hierzu mal den Quellcode, vielleicht stimmt daran etwas nicht, wobei es schonmal so ähnlich funktioniert hat? :freak:

Delphi-Quellcode:
unit fDoppelLoesch;

interface

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

type
  TForm1 = class(TForm)
    mmEin: TMemo;
    mmAus: TMemo;
    btStart: TButton;
    procedure btStartClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btStartClick(Sender: TObject);
//Konstantendeklaration
const
  nMax = 30;

//Variablendeklaration
var
  i, j, k, N: integer;
  A: array [1..nMax] of integer;

begin
   //Einlesen von N
   N:= mmEin.Lines.Count;
   //Einlesen der Zahlen
   for i:= 0 to N-1 do
     //Speichern der Zahlen im Feld
     A[i]:= StrToInt(mmEin.Lines[i]);
   //i auf 0 zuweisen
   i:= 0;
   //Wiederhole bis
   repeat
     //j ist zugewiesen i+1
     j:=i+1;
       //Wiederhole bis
       repeat
         //Wenn A[i] und A[i+1] oder j>=N, dann
         if ((A[i]=A[j]) or (j>= N)) then
           begin
             //Von i+1 zu N+1
             for k:= j to N+1 do
               begin
               //Speichere bei i+1, den Wert von i+1+1
               A[j]:= A[j+1];
               //Vermindere N um 1
               dec(N);
               end;
           end
         //sonst
         else
           //Erhöhe j um 1
           inc(j);
       //j größer N-1
       until j > N-1;
     //Erhöhe i um 1
     inc(i);
   //i größer N-1
   until i > N-1;
   //Ausgeben der restlichen Zahlen
   for i:= 0 to N-1 do
     mmAus.Lines.Add(IntToStr(A[i]));
end;
end.

Matze 21. Aug 2003 10:44

Re: Löschen doppelter Zahlen
 
Der Fehler kiegt hier:

Code:
for i:= 0 to N-1 do
  //Speichern der Zahlen im Feld
  A[i]:= StrToInt(mmEin.Lines[i]);
Gruß Matze

Matze 21. Aug 2003 10:49

Re: Löschen doppelter Zahlen
 
Ich glaube i darf in deinem Fall nicht 0 sein. Du musst also

Code:
for i:=1 to...
schreiben

Gruß Matze

Tpercon 21. Aug 2003 10:52

Re: Löschen doppelter Zahlen
 
Ich finde deine Methode etwas sehr umständlich, probier mal das:
Delphi-Quellcode:
  private
    numbers: array of integer;
    { Private-Deklarationen }
...

procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;

 function inarray(number: integer): boolean;
 var i : integer;
 begin
   result := false;
   for i := 0 to High(numbers) do begin
     if numbers[i] = number then begin
       result := true;
       Break;
     end;
   end;
 end;

begin
   SetLength(numbers, 0);
   for i := 0 to Memo1.Lines.Count - 1 do begin
     if inarray(StrtoInt(Memo1.Lines.Strings[i])) = false then begin
       j := High(numbers) + 1;
       SetLength(numbers, j + 1);
       numbers[j] := StrtoInt(Memo1.Lines.Strings[i]);
     end;
  end;
  Memo1.Clear;
  for i := 0 to High(numbers) do begin
    Memo1.Lines.Add(InttoStr(numbers[i]));
  end;
end;

Matze 21. Aug 2003 10:55

Re: Löschen doppelter Zahlen
 
So ist's wirklich einfacher.
Ich glaube der Code von n00b_on_knees funktioniert, bei mir zumindest, nicht. :mrgreen:

n00b_on_knees 21. Aug 2003 11:24

Re: Löschen doppelter Zahlen
 
Sorry, den Code kann ich leider nicht verwenden, da das eine Angabe ist, und ich das von meinem Prof. aus mit For und ineinander verschachtelten Repeat Until Schleifen machen soll :(

Wenn ich 0 statt eins schreibe, und die Werte
2
2
3
eingebe, kommt die Zahl 12402348 raus, was irgendwie sehr falsch ist :shock:. Wie ich oben schonmal geschrieben hab, hatte ich so einen ähnlichen Code, bzw. fast den gleichen:

Delphi-Quellcode:
unit kill;

interface

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

type
  TForm1 = class(TForm)
    mmEin: TMemo;
    mmAus: TMemo;
    btStart: TButton;
    procedure btStartClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btStartClick(Sender: TObject);
const
  nmax= 30;
var
  n, i, j, k: integer;
  feld: array [0..nmax] of integer;
begin
  n:= mmEin.Lines.Count;
  for i:=0 to n-1 do
    feld[i]:=StrToInt(mmEin.Lines[i]);
  i:=0;
  repeat
    j:= i+1;
    repeat
      if ((feld[i] = feld[j]) or (j>=n)) then
        begin
          for k:= j to n+1 do
            feld[j]:= feld[j+1];
            dec(n);
        end
      else
        j:= j+1;
   until j>n-1;
   i:= i+1;
 until i>n-1;
 for i:=0 to n do
   mmAus.Lines.Add(IntToStr(feld[i]));
end;
end.
wäre dieser, funktioniert bei ca. 4 Zahlen, wenns mehr sind macht er nicht mehr weiter :?

hitzi 21. Aug 2003 11:48

Re: Löschen doppelter Zahlen
 
Hallo,

wie wäre es, wenn du eine zusätzliche TStringList verwendest.

Pseudocode:

Schleife durch alle Linien des Memos
in Zahl umwandeln
prüfen, ob Zahl schon in der extra Stringlist ist
NEIN -> Zahl der Stringlist hinzufügen
JA -> Zahl ignorieren
Schleifenende
Memo.Linien := Stringlist


Sollte eigentlich funktionieren.

MfG Hitzi

n00b_on_knees 21. Aug 2003 11:58

Re: Löschen doppelter Zahlen
 
Gute Idee, und auch eher simpel, werd das gleich mal probieren, nachdem ich mit meinem nächsten Prog fertig bin, wo ich auch schon wieder n kleines Prob hab... lol.

Nur ich glaube nicht das das der Sinn des Progs sein wird, einfach so ne Liste zu machen, sollte schon eher nur gelöscht werden :?

--------

danke trotzdem schonmal an alle die sich mit dem Tread beschäftigt haben

hitzi 21. Aug 2003 12:18

Re: Löschen doppelter Zahlen
 
Du machst es doch auch so, nur dass du ein Array Feld verwendest. Was spricht dagegen hier:

Delphi-Quellcode:
n:= mmEin.Lines.Count;
  for i:=0 to n-1 do
    feld[i]:=StrToInt(mmEin.Lines[i]);
schon abzuprüfen, ob die Zahl schon im Array vorhanden ist - falls nicht, dann Zahl dem Array hinzufügen.


MfG Hitzi

n00b_on_knees 21. Aug 2003 15:10

Re: Löschen doppelter Zahlen
 
naja, nur da müsste man ja praktisch nur dass machen, und das würde das mit den schleifen etc. irgendwie aussparen... ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz