Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Doppelte Buchstaben aus String auslesen (https://www.delphipraxis.net/200710-doppelte-buchstaben-aus-string-auslesen.html)

SirMaurice 17. Mai 2019 16:18

Doppelte Buchstaben aus String auslesen
 
Hallöchen,

ich hätte da mal ne Frage.

Fällt euch eine Idee ein, wie man doppelte Buchstaben aus einem String löschen könnte?

Also z.B. Erwinistdoof, da soll das zweite i und das zweite o gelöscht werden.
Ich hatte die Idee, dass es vielleicht möglich wäre, den gerade gelesenen Buchstaben mit den vorher gelesenen Buchstaben zu vergleichen
und diese bei der erneuten Zusammensetzung des Strings nicht zu berücksichtigen.
Ich habe leider absolut keine Idee wie man dies bewerkstelligen könnte.

Danke und LG
SirMaurice

Rollo62 17. Mai 2019 16:53

AW: Doppelte Buchstaben aus String auslesen
 
Lustiges Spiel, könnte man z.B. so machen mit einem TDictionary als Speicher für die Zeichen und deren Anzahl.
Das gibt dann auch gleich noch die Anzahl der beteiligten Zeichen aus.

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.Generics.Collections
  , Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
   TCharsCount = TDictionary<Char,Integer>;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FChars : TCharsCount;

    function Convert(const AInput: String): String;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
    FChars := TCharsCount.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    FChars.Free;
end;

function TForm1.Convert(const AInput : String) : String;
var
  I: Integer;
  LChar : Char;
  LCount: Integer;
  LSB: TStringBuilder;
begin

    LSB := TStringBuilder.Create;

    try
        for I := Low(AInput) to High(AInput) do
        begin
            LChar := AInput[I];

            if FChars.TryGetValue( LChar, LCount) then
            begin
                Inc( LCount );
                FChars.Items[LChar] := LCount;
            end
            else
            begin // take only 1. time
                LCount := 1;
                if FChars.TryAdd(LChar, LCount) then
                    LSB.Append( LChar );
            end;

        end;

    finally
        Result := LSB.ToString;

        LSB.Free;
    end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
    LKey: Char;
begin
    FChars.Clear;
    Memo1. Clear;

    Memo1.Lines.Append( Convert( Edit1.Text ) );

    for LKey in FChars.Keys do
        Memo1.Lines.Append( LKey + ' - ' + FChars.Items[LKey].ToString + ' Zeichen' );
end;


end.

Amateurprofi 17. Mai 2019 17:11

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

Zitat von SirMaurice (Beitrag 1432436)
Hallöchen,

ich hätte da mal ne Frage.

Fällt euch eine Idee ein, wie man doppelte Buchstaben aus einem String löschen könnte?

Also z.B. Erwinistdoof, da soll das zweite i und das zweite o gelöscht werden.
Ich hatte die Idee, dass es vielleicht möglich wäre, den gerade gelesenen Buchstaben mit den vorher gelesenen Buchstaben zu vergleichen
und diese bei der erneuten Zusammensetzung des Strings nicht zu berücksichtigen.
Ich habe leider absolut keine Idee wie man dies bewerkstelligen könnte.

Danke und LG
SirMaurice


Delphi-Quellcode:
FUNCTION RemoveRepeatetChars(const S:String):String;
var I,J:Integer; C:Char; UsedChars:Array of Boolean;
begin
   SetLength(UsedChars,Ord(High(Char))+1);
   Result:=S;
   J:=0;
   for I:=1 to Length(Result) do begin
      C:=Result[I];
      if not UsedChars[Ord(C)] then begin
         Inc(J);
         Result[J]:=C;
         UsedChars[Ord(C)]:=True;
      end;
   end;
   SetLength(Result,J);
end;

Rollo62 17. Mai 2019 17:56

AW: Doppelte Buchstaben aus String auslesen
 
Kann man machen, aber mit

Delphi-Quellcode:
    SetLength(UsedChars,Ord(High(Char))+1);
   
    // Ord(High(Char)) --> wird 65535 Zeichen groß
wird das Array riesig groß.

Deshalb war mein Vorschlag mit TDictionary (oder irgendein anderer dynamischer Container),
der würde nur soweit wachsen je nachdem wieviel Elemente es gibt
(naja, bei 4GB RAM spielt das vielleicht auch keine grosse Rolle) :stupid:

Das interessante ist ja, das irgendwann keine neuen Buchstaben mehr hinzukommen. wenn einmal alle 26 drin sind.

DieDolly 17. Mai 2019 18:13

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

wenn einmal alle 26 drin sind.
Wer sagt denn, dass der TE nur A bis Z speichern möchte? :thumb:

Amateurprofi 17. Mai 2019 19:15

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

Zitat von Rollo62 (Beitrag 1432449)
Kann man machen, aber mit

Delphi-Quellcode:
    SetLength(UsedChars,Ord(High(Char))+1);
   
    // Ord(High(Char)) --> wird 65535 Zeichen groß
wird das Array riesig groß.

Wie bitte, 65535 (korrekt 65536) Bytes ist riesig ?

SirMaurice 17. Mai 2019 20:02

AW: Doppelte Buchstaben aus String auslesen
 
Ich bräuchte tatsächlich nur 26 Buchstaben.

Ich sollte vielleicht ein wenig mehr zum Projekt schreiben.
Es geht darum, dass ein Programm entwickelt werden soll, welches einen eingegebenen Text verschlüsselt.

Ein "Passwort" wird eingegeben, z.B. CBA, und es wird ein Schlüssel bestimmt, z.B. K, dann wird aus dem normalen Alphabet

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z eben
Q R S T U V W X Y Z C B A D E F G H I J K L M N O P oder bei ERWIN dann halt

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z A B C D F G H J K E R W I N M O P Q S T U V W X Y
(Ist jetzt nen bisschen verschoben, dass C bzw. E sollte unter dem K sein)

Deswegen darf auch kein Buchstabe doppelt vorkommen.
Weiß halt leider nicht wie genau ich diese Buchstaben aus dem "Passwort" aussortieren soll, wie z.B. bei CCBA.

Erstmal will ich nur Buchstaben verschlüsseln, später möchte ich ergänzen, dass die Formatierung und Sonderzeichen, also auch Leerzeichen, erhalten bleiben.

DieDolly 17. Mai 2019 20:06

AW: Doppelte Buchstaben aus String auslesen
 
Das sieht fast aus wie ROT13. Verschlüsselung würde ich sowas nicht nennen. Das knackt dir ein Kind einer Mittelschule der 7. Klasse im spielerischen Matheunterricht.

SirMaurice 17. Mai 2019 20:19

AW: Doppelte Buchstaben aus String auslesen
 
Sowas ist es auch.
Ist auch mehr als Sichtschutz gedacht bzw. auch mehr oder weniger eine Aufgabe.
Weiß nur nicht so recht wie ich mit dem String umgehen soll.

Andreas13 17. Mai 2019 20:29

AW: Doppelte Buchstaben aus String auslesen
 
Hallo SirMaurice,

zum Thema Passwortverschlüsselung kannst Du mal nachschauen unter:

https://www.delphipraxis.net/200188-...ml#post1428892

Vielleicht hilft es Dir weiter.

Gruß
Andreas

Uwe Raabe 17. Mai 2019 21:40

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

Zitat von SirMaurice (Beitrag 1432459)
Ich bräuchte tatsächlich nur 26 Buchstaben.

Na dann...
Delphi-Quellcode:
function StripDoubleChars(const Source: string): string;
var
  C: AnsiChar;
  cSet: set of 'A'..'Z';
  I: Integer;
begin
  cSet := [];
  Result := '';
  for I := 1 to Length(Source) do begin
    C := AnsiChar(UpCase(Source[I]));
    if not (C in ['A'..'Z']) then Continue;
    if not (C in cSet) then begin
      Include(cSet, C);
      Result := Result + Source[I];
    end;
  end;
end;

SirMaurice 22. Mai 2019 16:40

AW: Doppelte Buchstaben aus String auslesen
 
Passwort ist unglücklich gewählt.

Ich muss es nicht verschlüsseln, geht mir nur darum aus einem String die doppelt vorkommenden Zeichen zu entfernen.

hoika 22. Mai 2019 16:50

AW: Doppelte Buchstaben aus String auslesen
 
Hallo,
ich würde einfach eine TStringList SL nehmen.

Der String wird durchlaufen, jedes Zeichen wird geprüft, ob es bereits in SL ist (IndexOf),
wenn ja, verwerfen, wenn nein rein in die SL.

SirMaurice 22. Mai 2019 17:48

AW: Doppelte Buchstaben aus String auslesen
 
An sich ne gute Idee, ich darf nur den String nicht sortieren, sonst ist ja mein String nachher ein anderer.

Weiterhin habe ich nicht wirklich eine Ahnung von Properties und wie man diese festlegt.

hoika 22. Mai 2019 18:27

AW: Doppelte Buchstaben aus String auslesen
 
Hallo,
ich habe nichts von Sortierung gesagt.
Und was ist mit Properties?

Pseudo-Code:

Delphi-Quellcode:
S2:= '';
for i=1 to Length(AString) do
begin
  AChar=Copy(AString,i,1);
  if SL.IndexOf(AChar)=-1 then
  begin
    // noch nicht vorhanden
    S2:= S2+AChar;
  end;
  SL.Add(AChar);
end;

SirMaurice 22. Mai 2019 18:31

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

Code:
function StripDoubleChars(const Source: string): string;
var
  C: AnsiChar;
  cSet: set of 'A'..'Z';
  I: Integer;
begin
  cSet := [];
  Result := '';
  for I := 1 to Length(Source) do begin
    C := AnsiChar(UpCase(Source[I]));
    if not (C in ['A'..'Z']) then Continue;
    if not (C in cSet) then begin
      Include(cSet, C);
      Result := Result + Source[I];
    end;
  end;
end;


Ich schaffs nicht das ganze zu implementieren. Brauche theoretisch das ganze als Prozedur.

Habe zwei Untis, eine für die oberfläche, die andere für die Umwandlung.

Ich weiß nicht so ganz ob mein Aufruf hier richtig ist.

Code:
procedure TCaesar.SetPassword(ps2: string);
 var
  i: integer;
begin
  ps:='';
  ps2:=UpperCase(ps2);
  for i:=1 to length(ps2) do begin
    case ps2[i] of
      'A'..'Z': ps:=ps + ps2[i];
      'Ä': ps:=ps + 'A';
      'Ö': ps:=ps + 'O';
      'Ü': ps:=ps + 'U';
      'ß': ps:=ps + 'S';
    end;
  end;
  [B][U]ps:= stripdoublechars(ps) ;[/U][/B]
end;

Durchläuft er dann den obengenannten Prozess und dann die Function StripDoubleCharacters?

SirMaurice 22. Mai 2019 18:39

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

function StripDoubleChars(const Source: string): string;
var
C: AnsiChar;
cSet: set of 'A'..'Z';
I: Integer;
begin
cSet := [];
Result := '';
for I := 1 to Length(Source) do begin
C := AnsiChar(UpCase(Source[I]));
if not (C in ['A'..'Z']) then Continue;
if not (C in cSet) then begin
Include(cSet, C);
Result := Result + Source[I];
end;
end;
end;

Brauche das ganze als Prozedur oder jemand müsste mir sagen, ob der Aufruf unten korrekt ist:

Code:
procedure TCaesar.SetPassword(ps2: string);
 var
  i: integer;
begin
  ps:=ps2;
  ps2:=UpperCase(ps2);
  for i:=1 to length(ps2) do begin
    case ps2[i] of
      'A'..'Z': ps:=ps + ps2[i];
      'Ä': ps:=ps + 'A';
      'Ö': ps:=ps + 'O';
      'Ü': ps:=ps + 'U';
      'ß': ps:=ps + 'S';
    end;
  end;
  ps:= stripdoublechars(ps) ;
end;

Klaus01 22. Mai 2019 19:00

AW: Doppelte Buchstaben aus String auslesen
 
.. wenn Du es schon TCaeser nennst.
Bei der Caeser Verschlüsslung gibt es keine Passwort.
Da wird das Alphabet nur um eine gewissen Anzahl an Buchstaben verschoben.

A würde z.B. zu E
B würde z.B. zu F
etc

Der zu verschlüsselnde Text kann sehrwohl doppelte Buchstaben enthalten.
Sie werden dann immer mit dem gleichen Buchstaben ersetzt.

Grüße
Klaus

SirMaurice 23. Mai 2019 06:47

AW: Doppelte Buchstaben aus String auslesen
 
Oben steht doch was ich mit dem Programm vorhabe. Das Programm war ursprünglich auch mal die ganz normale Caeser Verschlüsselung, jedoch habe ich mich dazu entschlossen das Programm weiter zu entwickeln. Wie gesagt, Passwort ist eher schlecht gewählt worden.

Delphi.Narium 23. Mai 2019 07:59

AW: Doppelte Buchstaben aus String auslesen
 
Sowas (in PascalScript hingedaddelt)?
Delphi-Quellcode:
program Script;

function EindeutigeBuchstaben(ABuchstaben : String) : String;
var
        i : Integer;
begin
  Result := '';
  for i := 1 to Length(ABuchstaben) do begin
    if Pos(ABuchstaben[i],Result) = 0 then Result := Result + ABuchstaben[i];
  end;
end;

begin
  ShowMessage(EindeutigeBuchstaben('Erwinistdoof')); // ergibt Erwinstdof
end.

Truther 4. Jun 2019 06:27

AW: Doppelte Buchstaben aus String auslesen
 
Ist eine Klasse denn zwingend notwendig? Man muss nicht alles mit Klassen (TCaesar) lösen, nur weil es OOP gibt. Ist dein Problem mitlerweile gelöst? Für eine Rückmeldung wäre ich dankbar.


Was ich nicht in Ordnung finde, ist, dass einfach mit Kanonen auf Spatzen geschossen wird. (siehe bspw. erste Antwort)
Generics für ein so einfaches Problem? Ernsthaft? Da will wohl jemand sein Können zeigen und zur Schau stellen, wie toll er/sie programmiere kann. Leider völlig fehl am Platz. :x

Was ich auch nicht in Ordnung finde, ist die Tatsache, dass, anstelle einer Problemlösung im Sinne von "auf die Richtige spur führen", indem man eventuell String-Operationen und/oder Methoden nennt, einfach eine mögliche Lösung, in Form von Code, geschrieben wird. Was ist nur mit der Idee, dem Fragesteller das Problem selber lösen zu lassen, geworden? Muss man sich denn gleich mit geschriebenen Code profilieren? Einfach nur widerlich.
Ich finde es einfach schade, dass hier keine Chance gegeben wurde, dem Themenersteller selber auf die Idee kommen zu lassen. :cry:

Außerdem ist der Titel dem Themenerstellers nicht widerspigelnd des Themans gesetzt. Es müsste "Doppelte Buchstaben aus String entfernen" heißen.
Zudem wäre es in Zukunft angebracht, das Problem genauer zu beschreiben und/oder eine Suchmaschine des Vertrauens zuerst zu nutzen, bevor man in einem Forum solch ein Thema erstellt. Manchmal hilft auch Stift und Papier, um bestimmte Probleme zu lösen.

@Uwe: Der Funktionsname StripDoubleChars ist ungünstig gewählt, da deine Funktion nur Buchstaben berücksichtigt, nicht jedoch Zahlen oder Sonderzeichen, was dein Name nicht deutlich macht. Ein besserer Name wäre StripDoubleAlphabeticChars.

Noch eine Verständnisfrage: Wenn der Text "verschlüsselt" werden soll, wäre er denn 100%-ig wiederherstellbar? Was ist, wenn Sonderzeichen oder Zahlen im Text enthalten sind?

(jemand, der sehr genervt ist und wohl diese Antwort als Ventil genutzt hat und sich darüber bewusst ist)

p80286 4. Jun 2019 09:33

AW: Doppelte Buchstaben aus String auslesen
 
Zitat:

Zitat von Truther (Beitrag 1433796)
Was ich auch nicht in Ordnung finde, ist die Tatsache, dass, anstelle einer Problemlösung im Sinne von "auf die Richtige spur führen", indem man eventuell String-Operationen und/oder Methoden nennt, einfach eine mögliche Lösung, in Form von Code, geschrieben wird. Was ist nur mit der Idee, dem Fragesteller das Problem selber lösen zu lassen, geworden? Muss man sich denn gleich mit geschriebenen Code profilieren? Einfach nur widerlich.
Ich finde es einfach schade, dass hier keine Chance gegeben wurde, dem Themenersteller selber auf die Idee kommen zu lassen. :cry:

Zunächst habe ich für mich garnichts gegen Source-Code einzuwenden. Meiner Meinung nach lernt man am besten am konkreten Beispiel.
Was das Profilieren angeht...bei der gegebenen Problemstellung ist das Profil ja nich sehr ausgeprägt.
Welche Chance wurde hier vergeben? Dem Fragesteller blieb/bleibt es unbenommen, die Beiträge nur als Anregung zur eigenen Problemlösungsfindung zu nutzen.

Ich teile Deine Aversion gegen Klassen, nur ist es mit Blick auf zukünftige Entwicklungen vernünftig, sich frühzeitig mit Klassen auseinander zu setzen. In der Vergangenheit haben meine Programme manchen Umweg genommen, der "Klassifiziert" nicht vorgekommen wäre.

bleib gelassen
K-H


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