Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm, das Zeichen in einem Wort zählt - BinarySearchTree (https://www.delphipraxis.net/171570-programm-das-zeichen-einem-wort-zaehlt-binarysearchtree.html)

Kudle 13. Nov 2012 08:46

Delphi-Version: 7

Programm, das Zeichen in einem Wort zählt - BinarySearchTree
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi-Experten,

ich sitze momentan an einem Projekt, das allgemein Zeichen in einem Wort zählen soll. Man gibt ein beliebiges Wort in ein Memo ein und erhält in dem zweiten Memo nach klicken auf den Button "btZeichenanzahl" einen Buchstaben plus die Anzahl (z.B. A 3, B 4, C 2).

Für das Programm werden die Units mZeichenanzahl (Hauptformular), mZeichenzaehler, mZeichenzahl, mBinarySearchTree, mItem, mBinaryTree und mListenstruktur verwendet.

Im Anhang befindet sich mein Ansatz, jedoch komme ich momentan nicht mehr weiter...

Ich wäre euch sehr dankbar, wenn mir jemand bei diesem Problem behilflich ist :-)

Mfg,

Kudle

Sharky 13. Nov 2012 09:12

AW: Programm, das Zeichen in einem Wort zählt - BinarySearchTree
 
Hai Kudle,

ich habe hier kein Delphi und kann dein Projekt nicht öffnen.

Aber mal ein "grober" ansatz. Jedes Zeichen (nicht unicode) hat einen ASCII Wert von 0 bis 255.
Also erzeuge Dir doch ein Array dieser größe, gehe jedes Zeichen des Strings durch und Incrementiere immer die Position im Array die dem ASCII Wert des Zeichens entspricht.

Delphi-Referenz durchsuchenOrd

Aurelius 13. Nov 2012 10:03

AW: Programm, das Zeichen in einem Wort zählt - BinarySearchTree
 
Den Ansatz mit dem Array find ich zwar klasse, aber ich vermute stark, dass Kudle das mit einem Binärbaum lösen soll. Da ich selbst kein Delphi zur Hand habe habe ich den Code nur mal kurz überflogen, prinzipiell hast du aber in den Units alle notwendigen Klassen zur Hand.

Prinzipielles:
  • TItem ist doppelt deklariert, einmal in mBinarySearchTree.pas, einmal in mItem.pas
  • benötigt man die Klassen aus mListenstruktur? Kann man glaube ich weglassen.
  • grundsätzliches zu einem Binärbaum findest du bspw. hier: https://de.wikipedia.org/wiki/Bin%C3%A4rbaum
  • in den vorhanden Klassen der Binärbaum so implementiert ist, dass die Items, welche angefügt werden, von TItem abgeleitet sein müssen. Dabei müssen die Funktionen isEqual, isGreater, isLess überschrieben werden
    --> dadurch kann der B-Baum die komplette Einsortierung, Suche etc. durchführen, ohne dass du dich noch großartig drum kümmern musst

Grobimplementierung:
  • in deinem Formular benötigst du eine Instanz von mBinarySearchTree
  • in einer Routine jedes Zeichen aus der Eingabe durchgehen und in eine Instanz von TZeichenZahl schreiben
  • diese Instanz an TBinarySearchTree.insert übergeben
  • das Item suchen
  • den Wert um 1 erhöhen
  • wenn du damit fertig bist ist dein Baum gefüllt, nun kann die Ausgabe erfolgen
  • mit getItem, getLeftTree, getRightTree den baum durchgehen und die Werte ausgeben

Ich hoffe mal das passt so, ich konnte es wie gesagt selbst nicht testen und hab mir das alles on-the-fly überlegt :)

Popov 13. Nov 2012 15:10

AW: Programm, das Zeichen in einem Wort zählt - BinarySearchTree
 
Ich weiß nicht ob du was spezielles suchst, aber auf die Schnelle Just4Fun:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  x = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüÄÖÜß0123456789';
var
  s: String;
  i, k: Integer;
begin
  s := Memo1.Lines.Text;
  Memo2.Clear;

  for i := 1 to Length(x) do
  begin
    k := 0;
    while Pos(x[i], s) > 0 do
    begin
      s[Pos(x[i], s)] := '~';
      Inc(k);
    end;
    if k > 0 then //wenn auch fehlende Zeichen angezeigt werden sollen, dann die Zeile weg
      Memo2.Lines.Add(x[i] + ' = ' + IntToStr(k));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 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