![]() |
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. |
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:
Ich hoffe dies hilft Deinem vorhaben.
for i := 1 to Length(Input) do
Array[Chr(Input[i])] := Array[Chr(Input[i])] + 1; |
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; |
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. |
AW: Zerteilen eines String in einzelne Zeichen
Sollten wir vielleicht ein neues Hausaufgaben-Forum einrichten?
|
AW: Zerteilen eines String in einzelne Zeichen
Oder so... zählt die Zeichen und ermittelt auch die Anzahl Konsonanten und Vokale:
Delphi-Quellcode:
Main:
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;
Delphi-Quellcode:
Damit es auch für andere Sätze funktioniert, musst du das Hauptprogramm anpassen ;-). Geschätzter Aufwand: 3h googlen.
var hs : TStringList;
begin hs := TStringList.Create; absolute_haeufigkeit( 'Hallo, dies ist ein Test.', hs ); hs.Sort; writeln( hs.Text ); hs.Free; readln; end. |
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:
|
AW: Zerteilen eines String in einzelne Zeichen
Moin...:P
Zitat:
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: |
AW: Zerteilen eines String in einzelne Zeichen
Zitat:
![]() ![]() 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; |
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 09:27 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-2025 by Thomas Breitkreuz