![]() |
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. |
Re: Löschen doppelter Zahlen
Der Fehler kiegt hier:
Code:
Gruß Matze
for i:= 0 to N-1 do
//Speichern der Zahlen im Feld A[i]:= StrToInt(mmEin.Lines[i]); |
Re: Löschen doppelter Zahlen
Ich glaube i darf in deinem Fall nicht 0 sein. Du musst also
Code:
schreiben
for i:=1 to...
Gruß Matze |
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; |
Re: Löschen doppelter Zahlen
So ist's wirklich einfacher.
Ich glaube der Code von n00b_on_knees funktioniert, bei mir zumindest, nicht. :mrgreen: |
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:
wäre dieser, funktioniert bei ca. 4 Zahlen, wenns mehr sind macht er nicht mehr weiter :?
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. |
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 |
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 |
Re: Löschen doppelter Zahlen
Du machst es doch auch so, nur dass du ein Array Feld verwendest. Was spricht dagegen hier:
Delphi-Quellcode:
schon abzuprüfen, ob die Zahl schon im Array vorhanden ist - falls nicht, dann Zahl dem Array hinzufügen.
n:= mmEin.Lines.Count;
for i:=0 to n-1 do feld[i]:=StrToInt(mmEin.Lines[i]); MfG Hitzi |
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 00:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz