Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zerteilen eines String in einzelne Zeichen

  Alt 25. Jun 2021, 01:22
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (25. Jun 2021 um 03:49 Uhr) Grund: überarbeitet.
  Mit Zitat antworten Zitat