Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zerteilen eines String in einzelne Zeichen (https://www.delphipraxis.net/208206-zerteilen-eines-string-einzelne-zeichen.html)

Mo53 24. Jun 2021 21:56

Zerteilen eines String in einzelne Zeichen
 
Hallo, Ich frage mich wie eine Liste erstellen, und dann im Hauptprogramm den Benutzer auffordern kann einen String einzugeben, den ich dann in einzelne Buchstaben zerteile und jeden Buchstaben in der Liste speicher mit der Anzahl der Häufigket.

Habe damit begonnen komme jedoch nicht ganz weiter, bin schon sehr lange im Internet am recherchieren :roteyes:

Delphi-Quellcode:
{$APPTYPE CONSOLE}

{$R+,Q+,X-}

uses
  System.SysUtils;

type
   Talle = string;
   Tvokale = (a,e,i,o,u);
   Tkonsonanten = (b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z);
   TRec = record
     buchstabe : char;
     haufigkeit : byte;
   end;

     PRec = ^TRec;

var
   Zeichenkette : string;

   function CutString(var Zeichenkette: String);
     begin
      for Zeichenkette := 1 to length do


     end;




begin
repeat
writeln('Bitte Zeichenkette eingeben oder leer lassen zum beenden.');
readln(Zeichenkette);
until (Zeichenkette = '');



end.

KodeZwerg 25. Jun 2021 00:57

AW: Zerteilen eines String in einzelne Zeichen
 
Ich würde mir ein logisches Array (Ascii Code für klein und Gro0buchstaben verwenden) anlegen und dann so hier hochzählen lassen:

Pseudocode:
Delphi-Quellcode:
for i := 1 to Length(Input) do
  Array[Chr(Input[i])] := Array[Chr(Input[i])] + 1;
Ich hoffe dies hilft Deinem vorhaben.

Amateurprofi 25. Jun 2021 01:23

AW: Zerteilen eines String in einzelne Zeichen
 
So zum Beispiel
Delphi-Quellcode:
type
  TCount=packed record
     Character:Char;
     Count:Integer;
   end;
  TCounts=Array of TCount;
Delphi-Quellcode:
PROCEDURE CountChars(const S:String; var Counts:TCounts);
var I,N:Integer; C:Char; CharCounts:Array[Char] of Integer;
begin
   Counts:=Nil;
   if S<>'' then begin
      FillChar(CharCounts,SizeOf(CharCounts),0);
      // Anzahl je Zeichen ermitteln
      for I:=1 to Length(S) do Inc(CharCounts[S[I]]);
      // Anzahl verschiedener Zeichen ermitteln
      N:=0;
      for C:=Low(C) to High(C) do
         if CharCounts[C]>0 then Inc(N);
      // Zeichen und Anzahl je Zeichen in Counts stellen
      SetLength(Counts,N);
      I:=0;
      for C:=Low(C) to High(C) do
         if CharCounts[C]>0 then begin
            Counts[I].Character:=C;
            Counts[I].Count:=CharCounts[C];
            Inc(I);
         end;
   end;
end;
Delphi-Quellcode:
PROCEDURE TMain.Test;
const TestString='Delphi-Praxis';
var I:Integer; Counts:TCounts; S:String;
begin
   CountChars(TestString,Counts);
   for I:=0 to High(Counts) do
     S:=S+Counts[I].Character+' = '+IntToStr(Counts[I].Count)+#13;
   ShowMessage(S);
end;

KodeZwerg 25. Jun 2021 02:22

AW: Zerteilen eines String in einzelne Zeichen
 
Meine Variante von Pseudo in Echtcode:
Delphi-Quellcode:
program StringVorkommen;

{$APPTYPE CONSOLE}

{.$R *.res}

uses
  Winapi.Windows,
  System.SysUtils, System.Character;

type
  // proto-array für gültige ascii codes
  TAsciiArray = Array[32..127] of Integer;

// methode die wiedergibt ob die eingabe ein vokal ist
function IsVokal(const AChar: Char): Boolean; inline;
var
  LChar: Char;
begin
  LChar := ToLower(AChar);
  Result := (LChar = 'a') or (LChar = 'e') or (LChar = 'i') or (LChar = 'o') or (LChar = 'u');
end;

// methode die wiedergibt ob die eingabe eine konstante ist
function IsKonstante(const AChar: Char): Boolean; inline;
var
  LChar: Char;
begin
  LChar := ToLower(AChar);
  Result := (LChar = 'b') or (LChar = 'c') or (LChar = 'd') or (LChar = 'f') or (LChar = 'g') or (LChar = 'h') or (LChar = 'j') or (LChar = 'k') or (LChar = 'l') or (LChar = 'm') or (LChar = 'n') or (LChar = 'p') or (LChar = 'q') or (LChar = 'r') or (LChar = 's') or (LChar = 't') or (LChar = 'v') or (LChar = 'w') or (LChar = 'x') or (LChar = 'y') or (LChar = 'z');
end;

// methode die wiedergibt ob die eingabe ein umlaut ist
// momentan kann diese nicht über das array arbeiten
// da umlaute außerhalb der ascii zeichen 32-127 sind
function IsUmlaut(const AChar: Char): Boolean; inline;
var
  LChar: Char;
begin
  LChar := ToLower(AChar);
  Result := (LChar = 'ä') or (LChar = 'ö') or (LChar = 'ü');
end;

// methode zum füllen des arrays
function FillArray(const AString: string): TAsciiArray; inline;
var
  i: Integer;
  Index: Integer;
begin
  FillChar(Result, SizeOf(Result), $0);
  for i := 1 to Length(AString) do
    begin
      Index := Ord(AString[i]);
      if ((Index >= Low(Result)) and (Index <= High(Result))) then
        Result[Index] := Result[Index] + 1;
    end;
end;

// methode für die ausgabe des arrays
procedure PrintArray(const AAsciiArray: TAsciiArray);
var
  i: Integer;
  LChar: Char;
begin
  for i := Low(AAsciiArray) to High(AAsciiArray) do
    if AAsciiArray[i] > 0 then
      begin
        LChar := Char(i);
        Writeln(Format('Das Zeichen "%s" kam %d mal vor.', [LChar, AAsciiArray[i]]));
        if IsVokal(LChar) then
          Writeln('Das Zeichen ist ein Vokal.');
        if IsKonstante(LChar) then
          Writeln('Das Zeichen ist eine Konstante.');
      end;
end;

// methode um die console zu leeren
procedure ClrScr;
var
  tc: TCoord;
  nw: DWORD;
  cbi: TConsoleScreenBufferInfo;
  HConsoleOutput: THandle;
  TextAttr: Word;
begin
  HConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(HConsoleOutput, cbi);
  TextAttr := cbi.wAttributes;
  tc.X := 0;
  tc.Y := 0;
  FillConsoleOutputAttribute(HConsoleOutput, TextAttr, (cbi.dwSize.X * cbi.dwSize.Y), tc, nw);
  FillConsoleOutputCharacter(HConsoleOutput, Char(' '), (cbi.dwSize.X * cbi.dwSize.Y), tc, nw);
  SetConsoleCursorPosition(HConsoleOutput, tc);
end;


// hier beginnt der ausführungscode
var
  Input: string;
  AsciiArray: TAsciiArray;
  checker: Boolean;
begin
  try
    checker := True;
    while checker do
      begin
        ClrScr;
        Write('Gebe was ein: ');
        Readln(Input);
        if Length(Input) > 0 then
          begin
            AsciiArray := FillArray(Input);
            PrintArray(AsciiArray);
            Write('Zum fortfahren bitte Eingabetaste bestätigen.');
            Readln;
          end
          else
            begin
              Writeln('Programm beendet.');
              checker := False;
            end;
      end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

DeddyH 25. Jun 2021 06:56

AW: Zerteilen eines String in einzelne Zeichen
 
Sollten wir vielleicht ein neues Hausaufgaben-Forum einrichten?

Michael II 25. Jun 2021 10:48

AW: Zerteilen eines String in einzelne Zeichen
 
Oder so... zählt die Zeichen und ermittelt auch die Anzahl Konsonanten und Vokale:

Delphi-Quellcode:
procedure absolute_haeufigkeit( satz : string; hs : TStringList );
var zeichen : char;

    procedure zaehler( was : string );
    var anzahl : integer;
    begin
        anzahl := strtointdef(hs.Values[was],0);
        if (anzahl = 0) then hs.Add( was + '=1' ) else hs.Values[was] := inttostr(anzahl+1);
    end;
begin
  satz := Uppercase( satz );
  for zeichen in satz do
    if CharInSet( zeichen, ['A'..'Z'] ) then
    begin
      zaehler( zeichen );
      if CharInSet( zeichen, ['A','E','I','O','U'] ) then zaehler( '*Vokale' ) else zaehler( '*Konsonanten' );
    end;
end;
Main:

Delphi-Quellcode:
var hs : TStringList;

begin
  hs := TStringList.Create;
  absolute_haeufigkeit( 'Hallo, dies ist ein Test.', hs );
  hs.Sort;
  writeln( hs.Text );
  hs.Free;
  readln;
end.
Damit es auch für andere Sätze funktioniert, musst du das Hauptprogramm anpassen ;-). Geschätzter Aufwand: 3h googlen.

Mo53 25. Jun 2021 15:25

AW: Zerteilen eines String in einzelne Zeichen
 
Vielen Dank für eure Mühe, leider muss ich mit dem Compilerschalter {$R+,Q+,X-} arbeiten, da funktionieren diese Varianten leider nicht, mann könnte das aber sicher umschreiben :gruebel:

haentschman 25. Jun 2021 16:58

AW: Zerteilen eines String in einzelne Zeichen
 
Moin...:P
Zitat:

da funktionieren diese Varianten leider nicht,
...Gott sei Dank. :thumb:

Mache mal einen Ablaufplan, von mir aus auf Papier, was du in welcher Reihenfolge machen mußt. Welche Werte du bei jedem Step prüfen und ggf. speichern mußt. :wink:

Michael II 25. Jun 2021 16:58

AW: Zerteilen eines String in einzelne Zeichen
 
Zitat:

Zitat von Mo53 (Beitrag 1491513)
Vielen Dank für eure Mühe, leider muss ich mit dem Compilerschalter {$R+,Q+,X-} arbeiten, da funktionieren diese Varianten leider nicht, mann könnte das aber sicher umschreiben :gruebel:

Und wann werdet ihr Delphi lernen? {$X-} soll man in Delphi Programmen nicht verwenden. Noch einmal der Link.

TStringList.Add() ist eine Funktion. Mit {$X-} musst du den Funktionswert zwingend abfragen.
hs.add(was) gibt den Index:Integer in der Liste hs zurück, wo was eingefügt worden ist. Du musst (wegen {X-}) diesen Rückgabewert abfragen. Also so: dummy := hs.add(was).
Wenn du {$X-} kompilierst hast du in Funktionen auch keinen Zugriff auf Result (siehe frühere Hausaufgaben).

Delphi-Quellcode:
procedure absolute_haeufigkeit( satz : string; hs : TStringList );
var zeichen : char;

    procedure zaehler( was : string );
    var dummy, anzahl : integer;
    begin
        anzahl := strtointdef(hs.Values[was],0);
        if (anzahl = 0) then dummy := hs.Add( was + '=1' ) else hs.Values[was] := inttostr(anzahl+1);
    end;
begin
  satz := Uppercase( satz );
  for zeichen in satz do
    if CharInSet( zeichen, ['A'..'Z'] ) then
    begin
      zaehler( zeichen );
      if CharInSet( zeichen, ['A','E','I','O','U'] ) then zaehler( '*Vokale' ) else zaehler( '*Konsonanten' );
    end;
end;

Mo53 25. Jun 2021 22:43

AW: Zerteilen eines String in einzelne Zeichen
 
Mit Add und was habe ich ganz ehrlich noch nie hantiert und anscheinend funktionieren die auch nicht mit dem Angegebenen Compilerschalter.
Wir sollen alle Pascal Programme mit diesen Compilerschaltern erstellen, dann fangen wir nächstes Semester mit Java an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf