Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String und Char (https://www.delphipraxis.net/49077-string-und-char.html)

Kompon Ente 5. Jul 2005 09:38


String und Char
 
Hi,

ich will abfragen, ob die 5 Vokale in einer TStringList vorhanden sind.

Wie mache ich das?

Hier mein Anfang:

Delphi-Quellcode:
  if CheckListe.Strings[i] in ['A','E','I','O','U'] then
  begin
    // ...
  end;
Kommt aber die Fehlermeldung, dass es inkompatible Typen sind!

JasonDX 5. Jul 2005 09:41

Re: String und Char
 
Der in-Operator funktioniert nur mit Ordinalen Typen. Ein String ist das nicht.
Wenn du es nur mit chars machen willst, kannst du das Erste Element des Strings nehmen. Dafür muss aber gewährleistet sein, dass überhaupt ein Element enthalten ist
Delphi-Quellcode:
if CheckListe.Strings[i][1] in ['A','E','I','O','U'] then
klappt, aber wie gesagt, unter der Bedingung, dass der String nicht Leer ist.

Kompon Ente 5. Jul 2005 09:43

Hallo,

ich möchte aber testen, ob schon alle Vokale erraten wurden und nicht nur einer davon.

Wenn alle Vokale erraten wurden, soll was passieren.

Verstehst?

Thanatos81 5. Jul 2005 09:46

Re: String und Char
 
Habs jetzt mal Testweise mit nem einfachen String gemacht und nicht mit ner TStringList, aber das hier müsste auch für ne TStringList passen:
Delphi-Quellcode:
procedure test;
var i,v : Integer;
    c : Char;
    s : string;
    erraten : array[0..4] of Boolean;
begin
  s := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  v := 0; //Anzahl Vokale
  for i := 1 to length(s) do
    begin
      c := s[i];
      if c in ['A','E','I','O','U']
        then inc(v);    
      if v = 5 then
        begin
          showMessage('Das waren alle Vokale!');
          abort;
        end;
    end;
end;
Vorteil: Aufgrund er Überprüfung mit length(s) passiert nichts, wenn der String leer ist. for i := 1, weil im String das erste Element 1 ist, anders als bei anderen Typen.

Edit:
Deinen letzten Post nicht gesehen. Daraufhin Code angepasst

LoL 5. Jul 2005 09:48

Re: String und Char
 
hi

Das ist doch aber nicht das was Kompon Ente haben will oder?
So wie ich das sehe wird dir nix anderes übrig bleiben als es mit 6 if Abfragen zu machen, mit Pos zb.

Kompon Ente 5. Jul 2005 09:50

Danke für Eure Ideen! :)

Hab's anders gelöst:

Hab 'ne globale Variable deklariert und bei jedem Kauf + 1 gezählt und wenn er bei 5 ist, sind alle Vokale gekauft. ;)

Trotzdem danke! :)

Thanatos81 5. Jul 2005 09:56

Re: String und Char
 
Zitat:

Zitat von LoL
hi

Das ist doch aber nicht das was Kompon Ente haben will oder?
So wie ich das sehe wird dir nix anderes übrig bleiben als es mit 6 if Abfragen zu machen, mit Pos zb.

Jupp, hatte seinen Post bezüglich des Problem übersehen :oops: Deswegen mal ein edit.

Catbytes 5. Jul 2005 10:22

Re: String und Char
 
Zitat:

Zitat von Thanatos81
Habs jetzt mal Testweise mit nem einfachen String gemacht und nicht mit ner TStringList, aber das hier müsste auch für ne TStringList passen:
Delphi-Quellcode:
procedure test;
var i,v : Integer;
    c : Char;
    s : string;
    erraten : array[0..4] of Boolean;
begin
    s := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    v := 0; //Anzahl Vokale
  for i := 1 to length(s) do
    begin
      c := s[i];
      if c in ['A','E','I','O','U']
        then inc(v);    
      if v = 5 then
        begin
          showMessage('Das waren alle Vokale!');
          abort;
        end;
    end;
end;
Vorteil: Aufgrund er Überprüfung mit length(s) passiert nichts, wenn der String leer ist. for i := 1, weil im String das erste Element 1 ist, anders als bei anderen Typen.

Das Problem ist zwar schon gelöst, aber Dein Code wird auch sagen "Das waren alle Vokale!", wenn ich

Delphi-Quellcode:
s := 'AAAAAAAAAAAAAAAAAA';
tippe :drunken:

BlackJack 5. Jul 2005 10:50

Re: String und Char
 
Zitat:

Zitat von Catbytes
Das Problem ist zwar schon gelöst, aber Dein Code wird auch sagen "Das waren alle Vokale!", wenn ich

Delphi-Quellcode:
s := 'AAAAAAAAAAAAAAAAAA';
tippe :drunken:

um das zu umgehen, musst du nur die if-bedingung anpassen:

Delphi-Quellcode:
      if c in ['A','E','I','O','U'] then
        begin
        inc(v);    
        Remove(c, v); // <==
        end;
      if v = 5 then
        begin
          showMessage('Das waren alle Vokale!');
          abort;
        end;
edit: vergesst was ich da gerade geschrieben habe, man müsste natürlich eine variable des types set of char deklarieren, die zuerst alle vokale enthält und woraus dann die vokale entfehrnt werden... :wall:

Thanatos81 5. Jul 2005 11:04

Re: String und Char
 
Zitat:

Zitat von Catbytes
Das Problem ist zwar schon gelöst, aber Dein Code wird auch sagen "Das waren alle Vokale!", wenn ich

Delphi-Quellcode:
s := 'AAAAAAAAAAAAAAAAAA';
tippe :drunken:

Autsch! Nimmt mal jemand das Brett von meinem Kopf, bitte?
Hatte es erst so:
Delphi-Quellcode:
procedure test;
var i : Integer;
    c : Char;
    s : string;
    erraten : array[0..4] of Boolean;
begin
  s := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  for i := 0 to 4
    do erraten[i] := false;
  for i := 1 to length(s) do
    begin
      c := uppercase(s)[i];
      case c of
        'A' : erraten[0] := true;
        'E' : erraten[1] := true;
        'I' : erraten[2] := true;
        'O' : erraten[3] := true;
        'U' : erraten[4] := true;
      end;
      if erraten[0] and erraten[1] and erraten[2] and erraten[3] and erraten[4] then
        begin
          showMessage('Das waren alle Vokale!');
          abort;
        end;
    end;
end;
Aber so hab ich wieder was dazu gelernt: remove ;-)
Außerdem hab ich mal ein uppercase um den string gemacht, da Groß-/Kleinschreibung ja wahrscheinlich irrelevant sein soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 Uhr.

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