AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Löschen doppelter Zahlen

Ein Thema von n00b_on_knees · begonnen am 21. Aug 2003 · letzter Beitrag vom 27. Aug 2003
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#1

Löschen doppelter Zahlen

  Alt 21. Aug 2003, 11:03
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?

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.
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 11:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 11:49
Ich glaube i darf in deinem Fall nicht 0 sein. Du musst also

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

Gruß Matze
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#4

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 11:52
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;
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 11:55
So ist's wirklich einfacher.
Ich glaube der Code von n00b_on_knees funktioniert, bei mir zumindest, nicht.
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#6

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 12:24
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 . 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
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 12:48
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#8

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 12:58
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
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 13:18
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#10

Re: Löschen doppelter Zahlen

  Alt 21. Aug 2003, 16:10
naja, nur da müsste man ja praktisch nur dass machen, und das würde das mit den schleifen etc. irgendwie aussparen... ?
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr.
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