AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zerteilen eines String in einzelne Zeichen

Ein Thema von Mo53 · begonnen am 24. Jun 2021 · letzter Beitrag vom 26. Jun 2021
Antwort Antwort
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#1

Zerteilen eines String in einzelne Zeichen

  Alt 24. Jun 2021, 21:56
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zerteilen eines String in einzelne Zeichen

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

Geändert von KodeZwerg (25. Jun 2021 um 01:04 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Zerteilen eines String in einzelne Zeichen

  Alt 25. Jun 2021, 01:23
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Zerteilen eines String in einzelne Zeichen

  Alt 25. Jun 2021, 02: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 04:49 Uhr) Grund: überarbeitet.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zerteilen eines String in einzelne Zeichen

  Alt 25. Jun 2021, 06:56
Sollten wir vielleicht ein neues Hausaufgaben-Forum einrichten?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Zerteilen eines String in einzelne Zeichen

  Alt 25. Jun 2021, 10:48
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.
Michael Gasser

Geändert von Michael II (25. Jun 2021 um 10:58 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

AW: Zerteilen eines String in einzelne Zeichen

  Alt 26. Jun 2021, 10:24
Sollten wir vielleicht ein neues Hausaufgaben-Forum einrichten?
Ich sage dazu nur: Histogramm bei Google eingeben und selber zur Lösung kommen.

Zitat:
Und wann werdet ihr Delphi lernen?
Du glaubst doch nicht im ernst, dass die dort jemals Delphi vernünftig beigebracht bekommen.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Zerteilen eines String in einzelne Zeichen

  Alt 26. Jun 2021, 11:41
Sollten wir vielleicht ein neues Hausaufgaben-Forum einrichten?
Auf Discord gibt es eines: https://discord.gg/eb5cmcGMtW
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.
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 by Thomas Breitkreuz