Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sortieralgorithmen (https://www.delphipraxis.net/162274-sortieralgorithmen.html)

biby90 18. Aug 2011 10:08

AW: funktion erstellen... weiß nicht weiter
 
was ich gerade nicht verstehe ist, dass mein ShellSort nicht funktioniert obwohl ich es genau nach beispiel erstellt habe....
Delphi-Quellcode:
procedure TForm1.ShellSort(var A: array of String);
var
  i, j, k, B: Integer;
  lBuffer: String;
begin
  B := high(A);
  i := Length(A) div 2;
  While i > 0 do
  begin
    for k := 0 to B -i do
    begin
      j := k;
      while (j >= 0) and (A[j] > A[j +i]) do
      begin
        lBuffer := A[j];
        A[j] := A[j +i];
        A[j +i] := lBuffer;
      end;
      begin
        if j > i then
        begin
          Dec(j, i)
        end else
          j := 0;
        end;
        end;
        begin
          i := i div 2;
          Break;
        end;
    end;
end;
also er öfnnet es zwar, ich kann auch was in das memo reinschreiben aber er sortiert einfach nicht.
und er muss sich ja das zu sortierende noch aus dem Memo holen.... aber ich weiß nicht wie ichs einbauen soll

biby90 18. Aug 2011 11:17

AW: funktion erstellen... weiß nicht weiter
 
will mir hier keiner helfen?:(

DeddyH 18. Aug 2011 12:06

AW: funktion erstellen... weiß nicht weiter
 
Wieso Array of string? Nimm TStrings stattdessen, dann kannst Du Memo1.Lines direkt übergeben.

biby90 18. Aug 2011 12:11

AW: funktion erstellen... weiß nicht weiter
 
Zitat:

Wieso Array of string?
weil ich es eigentlich so machen soll

DeddyH 18. Aug 2011 12:15

AW: funktion erstellen... weiß nicht weiter
 
Dann musst Du eben ein Array of string deklarieren, die Zeilen des Memos da reinkopieren, sortieren und anschließend zurückkopieren.

biby90 18. Aug 2011 12:18

AW: funktion erstellen... weiß nicht weiter
 
:shock: oha.. na dann.... mach ich mich mal an die abeit wenn ich das hinbekomme

DeddyH 18. Aug 2011 12:19

AW: funktion erstellen... weiß nicht weiter
 
Vielleicht solltest Du lieber vorher noch einmal nachfragen ;)

Bjoerk 18. Aug 2011 15:05

AW: funktion erstellen... weiß nicht weiter
 
Immer noch am sortieren, Kumpel?

Vielleicht bringt es dich weiter, wenn du siehst, was du programmiert hast:

Delphi-Quellcode:
var
  i, j, k, B: Integer;
  lBuffer: String;
begin
  B := high(A);
  i := Length(A) div 2;

  While i > 0 do // Begin i
  begin

    for k := 0 to B -i do // Begin K
    begin
      j := k;

      while (j >= 0) and (A[j] > A[j +i]) do // Begin J
      begin
        lBuffer := A[j];
        A[j] := A[j +i];
        A[j +i] := lBuffer;
      end; // Ende J

      begin // Begin von Nix
        if j > i then
        begin
          Dec(j, i)
        end
        else
          j := 0;
      end; // Ende von Nix

    end; // Ende von K

    begin // Begin von Nix
      i := i div 2;
      Break; // Abbruch von I
    end; // Ende von Nix

  end; // Ende i
end;

bernerbaer 18. Aug 2011 15:18

AW: funktion erstellen... weiß nicht weiter
 
Titel des Threads:
Zitat:

Funktion erstellen ...
und wo ist die Funktion, ich sehe nur eine Prozedur

DeddyH 18. Aug 2011 15:20

AW: funktion erstellen... weiß nicht weiter
 
So langsam sollte man eh entweder den Thread-Titel ändern (es geht ja um Sortier-Algorithmen) oder einen neuen aufmachen.

biby90 18. Aug 2011 15:51

AW: funktion erstellen... weiß nicht weiter
 
ihr habt recht he he... immerhin ist das thema funktionen vorbei.....
Zitat:

Immer noch am sortieren, Kumpel?

ja ganz genau... nur noch feinarbeiten..... kannst mich gerne als kumpeline bezeichnen:wink:


wie änder ich hier denn den namen? oder geht das gar nicht

DeddyH 18. Aug 2011 15:58

AW: funktion erstellen... weiß nicht weiter
 
Das geht nur innerhalb von 24 Stunden. Aber wenn Du einen Mod lieb darum bittest ("Report"-Button), übernimmt er das bestimmt gerne für Dich ;)

biby90 18. Aug 2011 16:04

AW: funktion erstellen... weiß nicht weiter
 
ich tu mein bestes^^

bernerbaer 18. Aug 2011 16:35

AW: Sortieralgorithmen
 
Auch wenn es hier nun keine direkte Hilfe ist. Ich finde die Aufgabenstellung bzw die Anforderungen sind didaktisch mindestens fragwürdig.

Als Programmierer geht man (ich) in der Regel vereinfacht so vor:

1. Problemerfassung (Was wird verlangt?)
2. Welche Eingaben benötige ich/sind vorgegeben (Hier TStrings bzw Memo.lines)
3. Wie soll das Resultat präsentiert werden? (Hier TStrings, bzw Memo.lines)
4. Wie gelange ich von der Eingabe zum Resultat (Algo -> Hier Shellsort)

Nun wenn ich hier diese obigen Schritte durchgehe, wird ein (durchschnittlicher) Programmierer wohl den kürzesten und effizientesten Weg wählen. Input und Output sind vom Typ TStrings, weshalb sollte ich da einen Umweg über Array of String nehmen? Für das Erreichen des Zieles (Schreiben eines Sortieralgorithmus) ist das absolut unerheblich und lenkt nur von der eigentlichen Aufgabe ab.

biby90 19. Aug 2011 08:20

AW: Sortieralgorithmen
 
Zitat:

Als Programmierer geht man
ich bin doch noch ein anfänger.... das muss ich halt alles noch lernen.
ich bin ja erst seit zwei wochen in der ausbildung und muss mich erst einmal an das ganze gewöhnen...
außerdem sind das alles vorgaben von meinem ausbilder um mir das ganze etwas einfacher zu machen... sprich unnötige funktionen erstellen und so weiter für den reinen lerneffekt

bernerbaer 19. Aug 2011 08:44

AW: Sortieralgorithmen
 
Mein Beitrag war auch keineswegs als Vorwurf an Dich gemeint, sondern richtete sich nur an Deinen Ausbildner.

Medium 19. Aug 2011 08:58

AW: Sortieralgorithmen
 
Didaktik scheint aber den meisten (nicht-akademischen) IT-Wissensvermittlern abzugehen. Im Hochschulumfeld fehlt dann aber wiederum gerne mal die Praxisrelevanz :mrgreen:

biby90 19. Aug 2011 09:02

AW: Sortieralgorithmen
 
@bernerbear
hab ich auch nicht als eine aufgefasst....

naja selber ausprobieren find ich persönlich besser. man sieht seine fehler und lernt daraus.

biby90 19. Aug 2011 10:51

AW: Sortieralgorithmen
 
habe jetzt in meinem button eingefügt, dass wenn ein leerstring vorhanden ist, die zeile gelöscht wird. aber irgendwie funktioniert das nicht ganz.... wenn er es sortiert hat fehlt ein wort und die obere zeile ist leer....
ich habe mir jetzt gedacht, dass ich die zeile um einen verschiebe, wenn eine zeile gelöscht wurde.
also entweder lasse ich ihn das ganze noch einmal prüfen ab der gelöschten zeile oder mache es so wie ich es probiert habe....
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lArray: array of String;
  i, j : Integer;
  A, B : String;
begin
  SetLength(lArray, Memo1.Lines.Count);

  for i := 0 to Memo1.Lines.Count -1 do
  begin
    //sicherstellen, dass der String min. ein Zeichen hat.
    if Memo1.Lines.Strings[i] = '' then
    begin
      Memo1.Lines.Delete(i);
      dec(j); //klappt trotzdem nicht
    end else
    begin
      lArray[i] := Memo1.Lines.Strings[i][1];
    end;
  end;

    //Array sortieren.
    ShellSort(lArray);

    //TODO: Array zurück ins Memo kopieren.
    Memo1.Lines.Clear;
    Memo1.Lines.Add('');
    for i := 0 to Length(lArray) - 1 do
    begin
      Memo1.Lines.Add(lArray[i]);
    end;
end;
naja es klappt aber irgendwie nicht.

Bjoerk 19. Aug 2011 11:32

AW: Sortieralgorithmen
 
Das mußt du mit einer while Schleife machen, da sich Memo1.Lines.Count ändert, wenn eine Zeile gelöscht wurde.

biby90 19. Aug 2011 11:37

AW: Sortieralgorithmen
 
ganz genau das hab ich gesucht... danke schöööön :thumb: ich probiere es gleich ma aus....
ist nur noch die frage wie und wo ich sie einsetze aber das versuch ich alleine herauszufinden.... das kann ja nicht all zu schwer sein

biby90 19. Aug 2011 12:54

AW: Sortieralgorithmen
 
werde nicht ganz schlau daraus.... vielleicht ein kleiner hinweis wo ich den ungefähr hinsetzen muss?

Bjoerk 19. Aug 2011 13:06

AW: Sortieralgorithmen
 
Pseudocode

Delphi-Quellcode:
  I:= 0;
  while I <= Count-1 do
  begin
    if Soll Zeile I Löschen then
    begin
      Lösche Zeile I
      Dec(I);
    end;
    Inc(I);
  end;

  array [0..count-1] = Memo.Lines[0..count-1]
  sort array

  Memo.Lines.BeginUpdate
  Memo.Lines[0..count-1] = array [0..count-1]
  Memo.Lines.EndUpdate

DeddyH 19. Aug 2011 13:28

AW: Sortieralgorithmen
 
Mit einer absteigenden For-Schleife löscht man etwas einfacher.
Delphi-Quellcode:
for i := Memo1.Lines.Count - 1 downto 0 do
  if Memo1.Lines[i] = '' then
    Memo1.Lines.Delete(i);

biby90 19. Aug 2011 13:33

AW: Sortieralgorithmen
 
Deddyh.... das war schon das richtige nur jetzt lässt er in den ersten beiden zeilen einen leerstring... die sollen ja auch noch weg. zu mindest bleiben jetzt alle werte da

Bjoerk 19. Aug 2011 13:49

AW: Sortieralgorithmen
 
Länge des Array aktualisiern nicht vergessen.
SetLength (Array, Memo.Lines.count);

biby90 19. Aug 2011 13:53

AW: Sortieralgorithmen
 
wenn ich das mache sind alle werte weg

biby90 19. Aug 2011 14:06

AW: Sortieralgorithmen
 
wenn ich SetLength(lArray, Memo1.Lines.Count) mit eingebe dann löscht er werte und behält die leerzeile.... er soll das doch umgekehrt machen!
och manno.... alles doof heute:roll:

himitsu 19. Aug 2011 14:10

AW: Sortieralgorithmen
 
Zitat:

Delphi-Quellcode:
  for i := 0 to Memo1.Lines.Count -1 do
  begin
    //sicherstellen, dass der String min. ein Zeichen hat.
    if Memo1.Lines.Strings[i] = '' then
    begin
      Memo1.Lines.Delete(i);
      dec(j); //klappt trotzdem nicht

Wegen dieser Konstruktion.

- "klappt trotzdem nicht" ist keine Fehlerbeschreibung!
- und wegen der Schleife, rate ich dir dringend mal die Indexprüfung zu aktivieren, in deinen Projektoptionen.

Bjoerk 19. Aug 2011 14:30

AW: Sortieralgorithmen
 
Dann tust du es an der falschen stelle..
Delphi-Quellcode:
  I:= 0;
  while I <= Count-1 do
  begin
    if Soll Zeile I Löschen then
    begin
      Lösche Zeile I
      Dec(I);
    end;
    Inc(I);
  end;

  -> SetLength (Array, Memo.Lines.count);
  array [0..count-1] = Memo.Lines[0..count-1]
  sort array

  Memo.Lines.BeginUpdate
  Memo.Lines[0..count-1] = array [0..count-1]
  Memo.Lines.EndUpdate

shmia 19. Aug 2011 14:48

AW: Sortieralgorithmen
 
Ja, ja das kommt davon, wenn man keine sauberen Funktionen schreibt!
Hier kommt mal eine ausgereifte Funktion:
Delphi-Quellcode:
{**************************************************************************
 * NAME:   RemoveEmptyStrings
 * DESC:   lösche leere Zeilen aus TStrings Objekt
 * PARAMS: [-]
 * RESULT: Anzahl der Löschungen
 *************************************************************************}
function RemoveEmptyStrings(list : TStrings):Integer;
var
   i : Integer;
begin
   Assert(Assigned(list));
   Result := 0;
   for i := list.Count-1 downto 0 do
   begin
      if list[i] = '' then
      begin
         list.Delete(i);
         Inc(Result);
      end;
   end;
end;
Und der Aufruf wäre dann
Delphi-Quellcode:
RemoveEmptyStrings(Memo1.Lines);

biby90 19. Aug 2011 14:56

AW: Sortieralgorithmen
 
unsauber mag vielleicht ja sein.... entschuldigung dass ich nicht als programmiererin geboren bin sondern jetzt meine zweite woche in der ausbildung verbringe




soo und jetzt an die lieben hier^^ bin jetzt so weit gekommen.... es funktioniert so weit auch gut nur muss ich das array rückwärts befüllen damit auch die letzte leerzeile die entsteht verschwindet.... hat dazu jemand einen kleinen tipp?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lArray: array of String;
  i : Integer;
  A : String;
begin
  SetLength(lArray, Memo1.Lines.Count);

  for i := Memo1.Lines.Count -1 downto 0 do
  begin
    //sicherstellen, dass der String min. ein Zeichen hat.
    if Memo1.Lines.Strings[i] = '' then
    begin
      Memo1.Lines.Delete(i);
      SetLength(lArray, Length(lArray) -1);
    end else
    begin
      lArray[i] := Memo1.Lines.Strings[i][1]; //Array rückwärts befüllen
    end;
  end;

    //Array sortieren.
    ShellSort(lArray);

    //TODO: Array zurück ins Memo kopieren.
    Memo1.Lines.Clear;
    for i := 0 to Length(lArray) - 1 do
    begin
      Memo1.Lines.Add(lArray[i]);
    end;
end;

DeddyH 19. Aug 2011 17:00

AW: Sortieralgorithmen
 
Meinst Du nicht, dass es sinnvoller wäre, zuerst die Leerzeilen aus dem Memo zu löschen und dann erst das Array entsprechend zu dimensionieren?

shmia 19. Aug 2011 17:22

AW: Sortieralgorithmen
 
Zitat:

Zitat von biby90 (Beitrag 1118078)
unsauber mag vielleicht ja sein.... entschuldigung dass ich nicht als programmiererin geboren bin

Das war mehr an meine Kollegen die beruflich programmieren gerichtet, nicht an dich.:wink:
Trotzdem kann du die Funktion so nehmen wie sie ist (natürlich nicht wenn deine Programmierleistung von einem Lehrer benotet wird).

biby90 22. Aug 2011 09:42

AW: Sortieralgorithmen
 
Zitat:

Das war mehr an meine Kollegen die beruflich programmieren gerichtet, nicht an dich
ok denn hab ichs faösch verstanden. habe es jetzt hinbekommen und habe eine neue aufgabe weil mein ausbilder 2 wochen auf lehrgang ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Seite 2 von 2     12   

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