Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi String buchstabenweise in array einlesen (https://www.delphipraxis.net/161016-string-buchstabenweise-array-einlesen.html)

himitsu 12. Jun 2011 21:55

AW: String buchstabenweise in array einlesen
 
Zeichen zählen:

Delphi-Quellcode:
var
  Anzahl: array[Char] of Integer;
  C: Char;
  i: Integer;

for C := Low(Char) to High(Char) do
  Antahl[C] := 0;

for i := 1 to Length(Wort) do
  Anzahl[Word[i]] := Anzahl[Word[i]] + 1;
Delphi-Quellcode:
var
  Anzahl: array[Char] of Integer;
  C: Char;

FillChar(Anzahl, SizeOf(Anzahl), 0);
for C in Wort do Inc(Anzahl[C]);
nun steht zu jedem Char die Anzahl im Array drin, z.B.
Delphi-Quellcode:
AnzahlVonGroßA := Anzahl['A'];

Luckie 12. Jun 2011 22:30

AW: String buchstabenweise in array einlesen
 
Ich glaube, von solchen extremen Optimierungen sollte man eher absehen, das es hier eher um das allgemeine Verständnis geht.

basti2011 12. Jun 2011 22:30

AW: String buchstabenweise in array einlesen
 
Vielen Dank ich werds trotz eher geringem Verständnis einfach durchprobieren :thumb:

DeddyH 12. Jun 2011 23:58

AW: String buchstabenweise in array einlesen
 
Ich hatte das bewusst möglichst einfach gehalten, aber manche Egos scheinen einfach stärker zu sein :evil:

Bjoerk 13. Jun 2011 00:02

AW: String buchstabenweise in array einlesen
 
Vermutlich meint dein Lehrer lediglich das:

Delphi-Quellcode:
type
  TCharArray = array of Char;


function LowerCaseChar (const C: char): char;
begin
  Result:= C;
  if (Result in ['A'..'Z', 'Ä', 'Ö', 'Ü']) then
    Inc(Byte(Result), 32);
end;


function FindChar (const S: TCharArray; const C: char): integer;
var
  I: integer;
begin
  Result:= 0;

  for I:= 0 to Length(S)-1 do
    if S[I] = C then Inc(Result);
end;


procedure TForm1.Edit2Change(Sender: TObject);
var
  I, L1, L2, N: integer;
  C: char;
  S: TCharArray;
begin
  Label1.Caption:= '';

  L1:= Length(Edit1.Text);
  L2:= Length(Edit2.Text);

  if ((L1 > 0) and (L2 > 0)) then
  begin
    SetLength(S, L1);

    for I:= 1 to L1 do
      S[I-1]:= LowerCaseChar(Edit1.Text[I]);

    C:= LowerCaseChar(Edit2.Text[1]);

    N:= FindChar(S, C);
    Label1.Caption:= 'Buchstabe ' + C + ' kommt ' + IntToStr(N)+' mal vor.';

    SetLength(S, 0);
  end;
end;

DeddyH 13. Jun 2011 00:07

AW: String buchstabenweise in array einlesen
 
Tragt nur ruhig ein wenig mehr zur Verwirrung bei, ich halte mich jetzt da raus.

himitsu 13. Jun 2011 00:22

AW: String buchstabenweise in array einlesen
 
FillChar ist doch keine extreme Optimierung?

Und den Rest kann man sich aus jedem guten Delphi-Lehrbuch rausholen. :angle:

Gut, das For-In ist vielleicht neu und es geht nicht in vielen älternen Delphiversionen, aber zu Extremoptimiert würde ich auch das nicht zählen.


Zitat:

Zitat von zeras (Beitrag 1105992)
Versuche es doch einmal so (nicht optimiert):
Delphi-Quellcode:
procedure TForm11.Button1Click(Sender: TObject);
var i,laenge :integer;
    wort :string;
    BS_array: array ['a'..'z'] of byte;
    c   : char;

begin
 wort := 'hallo';
 laenge := Length(wort);

 for c:=low(BS_array) to high(BS_array) do BS_array[c]:=0;

 For i := 1 to (laenge) do begin
   c := wort[i];
   BS_array[wort[i]] := BS_array[wort[i]] +1;
  end;
end;

Wozu das C in der letzen Schleife, wenn es dann nicht genutzt wird?
Ich vermute mal du wolltest
Delphi-Quellcode:
BS_array[c] := BS_array[c] +1;
schreiben.

PS: gegenüber einiger anderer Codes hier ist mein Cod sogar fehlerunanfälliger.

z.B. das
Delphi-Quellcode:
array ['a'..'z'] of byte;
im gerade gezeigten Code kann zu einem Pufferüberlauf führen,
wenn in
Delphi-Quellcode:
wort
nicht nur Kleinebuchstaben von A bis Z vorkommen.
Schließlich ist fast immer die Index- und Bereichsprüfung deaktiviert.

Das Array[Char] ist beim Unicode zwar ein 1/4 MB groß, aber dafür liegen garantiert alle Zeichen irgendwo in dessen Bereich.

Luckie 13. Jun 2011 00:37

AW: String buchstabenweise in array einlesen
 
Ich bezog mich auf die Version mit dem Move.

himitsu 13. Jun 2011 01:20

AW: String buchstabenweise in array einlesen
 
achso das. :lol:

Aber wenn das schon Hochoptimiert ist, dann kenn ich etwas Höchstoptimiertes (auch wenn mich die Grammatikfreunde dafür erschlagen werden).

Delphi-Quellcode:
function StrToArray(Value: String): TCharArray;
begin
  String(Pointer(Result)) := Value; // geht zwar, also wenn man das Char-Array nur auslesen will und nicht verändert
end;
ACHTUNG:
* ich weiß was ich mache (denn ich weiß wie beide Typen intern aufgebaut sind, wie sie verwaltet werden und daß ein String eigentlich "nur" ein aufbemotztes CharArray ist)
* und ich würde jeden standrechtlich erschießen, welcher sowas produktiv einsetzt
* also macht es besser nicht nach :warn:

Stevie 13. Jun 2011 01:27

AW: String buchstabenweise in array einlesen
 
Zitat:

Zitat von DeddyH (Beitrag 1106024)
Ich hatte das bewusst möglichst einfach gehalten, aber manche Egos scheinen einfach stärker zu sein :evil:

Hätte er Delphi 2010 oder höher könnte er auch das hier machen:
Delphi-Quellcode:
  ShowMessageFmt('"%s" kommt %d mal in "%s" vor', [Edit2.Text,
    TDelegateEnumerable<Char>.Create(
      procedure
      var
        c: Char;
      begin
        for c in Edit1.Text do Yield<Char>(c);
      end).Where(
    function(c: Char): Boolean
    begin
      Result := SameText(c, Edit2.Text);
    end).Count,
    Edit1.Text]);
Sorry, ich konnte nicht widerstehen. :oops: :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 2 von 3     12 3      

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