Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Isalpha, IsNum, IsString als eine Funktion (https://www.delphipraxis.net/131956-isalpha-isnum-isstring-als-eine-funktion.html)

Go2EITS 3. Apr 2009 08:33


Isalpha, IsNum, IsString als eine Funktion
 
Hallo,
ich habe mal Isalpha, IsNum, IsString als eine Funktion ausgeführt, die bei einem Aufruf mit einem String mit Ziffern eine 1, bei Zeichen eine 2 und bei Ziffern und Zeichen eine 3 liefert.
Code als Consolenprogramm:
Delphi-Quellcode:
program TestCheckStr;
{$APPTYPE CONSOLE}
uses SysUtils;

function CheckStr(Str:string):Byte;
var i:Integer;
type typ=set of Char;

var Ziffern:typ;
var Zeichen:typ;

var ZiffernFlag:     Boolean;
var ZeichenFlag:     Boolean;
var AlphaNumFlag:    Boolean;
label ende;
begin
// "Fehlerbehandlung"
If Str=''then begin Result:=0;goto ende;end;

// Hauptteil
Ziffern:=['0'..'9'];
Zeichen:=['a'..'z','A'..'Z'];

ZiffernFlag:=False;
ZeichenFlag:=False;
AlphaNumFlag:=False;

for i:=1 to Length(Str) do
   begin
   if str[i] in Ziffern then ZiffernFlag :=True;
   if str[i] in Zeichen then ZeichenFlag:=True;
   end;
if Zeichenflag =True and ZiffernFlag=True then
   begin
   result:=3; //AlphaNum
   goto ende;
   end;
if ZiffernFlag=True then Result:=1; //Ziffern
if ZeichenFlag=True then Result:=2; //Zeichen
ende:
end;
begin
//Zum Testen:
Writeln('Leerer String ',checkstr(''));readln;    //Ergebnis ist 0
Writeln('Ziffer  - 1: ',checkstr('190'));readln; //Ergebnis ist 1
Writeln('Zeichen - 2: ',checkstr('az'));readln;  //Ergebnis ist 2
Writeln('AlphaNum - 3: ',checkstr('az10'));readln; //Ergebnis ist 3
end.
Geht es noch besser? Ich glaube es ist eine umständliche Lösung.
[Edit: u. a. Titel geändert]

Luckie 3. Apr 2009 08:43

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Ich würde einen Typ zurückgeben. Das ist aussagekräftiger als einen Zahlenwert. da brauchst du dann auch nicht erklären, was -1, -2 oder -3 bedeutet, weil sich das aus der Bezeichnung des Typen ergibt. Damit wird die Funktion dann auch besser les- und anwendbar.

jfheins 3. Apr 2009 08:56

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Nichts für ungut, aber ich hätte da noch ein paar Verbesserungsvorschläge:

1. Nicht =True überprüfen

2. Was passiert wenn man ein Leerzeichen übergibt? " "

3. Schlecht eingerückt (ok - darüber kann an streiten)

4. Evtl. vorzeitug abbrechen wenn das Ergebnis schon feststeht (wenn beide Arten vorkommen => break;)

5. goto vermeiden.

6. Enum (oder evtl. Set dessen) deklarieren für den Rückgabewert

;)

Go2EITS 3. Apr 2009 09:41

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Danke Luckie für die schnelle Antwort!
Ich ist für mich ein wenig schwer, dies umzusetzen, aber ich glaube zu verstehen was Du meinst:

Delphi-Quellcode:
program test;
{$APPTYPE CONSOLE}
uses SysUtils;

// Dies ist unser ErgebnisTyp:
type r=(Leer,Ziffer,Zeichen,AlphaNum);

function CheckStr(Str:string):r;
type typ=set of Char;
var
i:Integer;
ZiffernSet:typ;
ZeichenSet:typ;
ZiffernFlag:Boolean;
ZeichenFlag:Boolean;
AlphaNumFlag:Boolean;
label Ende;
begin
// "Fehlerbehandlung"
If Str=''then begin Result:=Leer;goto ende;end;

//// Hauptteil

// Flags
ZiffernSet:=['0'..'9'];
ZeichenSet:=['a'..'z','A'..'Z'];

// Sets
ZiffernFlag:=False;
ZeichenFlag:=False;
AlphaNumFlag:=False;

for i:=1 to Length(Str) do
begin
   if str[i] in ZiffernSet then ZiffernFlag :=True;
   if str[i] in ZeichenSet then ZeichenFlag:=True;
    //Wenn ZiffernFlag und Zeichenflag =True sind Result setzen und Goto ProgrammEnde;
   if Zeichenflag =True and ZiffernFlag=True then
   begin
   result:=AlphaNum;
   goto ende;
   end;
end;
// Bei einem Break würde es hier weitergehen!
if ZiffernFlag=True then Result:=Ziffer;
if ZeichenFlag=True then Result:=Zeichen;
// ProgrammEnde
Ende:
end;

begin
//Zum Testen:
Writeln(Ord(checkstr('')));readln;
Writeln(Ord(checkstr('190')));readln;
writeln(Ord(checkstr('az')));readln;
Writeln(Ord(checkstr('az10')));readln;
// Als Ergebnisse werden 0, 1, 2, und 3 angezeigt.
// Entspricht dem Code: type r=(Leer,Ziffer,Zeichen,AlphaNum);

end.
@jfheins
Zu 1: Verstehe nicht was Du meinst.
Zu 2: Zum Leerstring: Wird unter "//Fehlerbehandlung" doch beachtet.
Zu 3: Einrückungen und Formatierungen sind meine Eigenheiten.
Zu 4: Gute Idee: Code geändert!
Zu 5: "Break" verlässt eine for-, while- oder repeat-Schleife. Dies würde hier nicht passen.
zu 6: Typrückgabe nun im Code.

Noch Verbesserungen?

fkerber 3. Apr 2009 09:52

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Hi!

Zu 1)
Er meinte das hier:

Delphi-Quellcode:
if ZiffernFlag=True then
Das sollte man nicht tun, sondern besser
Delphi-Quellcode:
if ZiffernFlag then

Ciao, Frederic

Go2EITS 3. Apr 2009 09:57

Re: Isalpha, IsNum, IsNumeric als eine Function
 
@fkerber
Danke, war schon oft Thema in der DP. Ändere ich. Danke!

R2009 3. Apr 2009 10:09

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Hi,

Zitat:

Zu 3: Einrückungen und Formatierungen sind meine Eigenheiten.
In dem relativ kurzen Stück Code mag das ja noch gehen aber sonst....
Du solltest mal den Delphi Styleguide durchlesen.
Deutsch schreibt man ja auch mit Gross und Kleinschreibung. An irgendwelche Konventionen sollte man sich schon halten.

Viele Grüsse!

jfheins 3. Apr 2009 10:13

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Sooo, ich hab den Code mal etwas verändert.

Sets eingebaut und das goto entfernt :)

Was haltet ihr davon?

Delphi-Quellcode:
program test;
{$APPTYPE CONSOLE} 
uses SysUtils;

// Dies ist unser ErgebnisTyp:
type TCharTyp = (Ziffer, Zeichen, Andere);
type TStringTyp = set of TCharTyp;


function CheckStr(Str:string):TStringTyp;
var
   i:Integer;
begin
   // "Fehlerbehandlung"
   if Str = '' then
   begin
      Result := [];
      exit;
   end;
    
   for i:=1 to Length(Str) do
   begin
      if str[i] in ['0'..'9'] then
         Include(Result, Ziffer);
      else if str[i] in ['a'..'z','A'..'Z'] then
         Include(Result, Zeichen);
      else
         Include(Result, Andere);
         
      if Result = [Ziffer, Zeichen, Andere] then
         break;
   end;
end;

begin
//Zum Testen:
Writeln(Ord(checkstr('') = []));readln;
Writeln(Ord(Ziffer in checkstr('190')));readln;
writeln(Ord(Zeichen in checkstr('az')));readln;
Writeln(Ord([Zeichen, Ziffer] = checkstr('az10')));readln;
Writeln(Ord([Zeichen, Ziffer] <= checkstr('az10 !?.,;:-_<>')));readln;

end.
(Es könnte sein, dass es nicht kompiliert - mangels Delphi im Editor geschrieben)

Neutral General 3. Apr 2009 10:15

Re: Isalpha, IsNum, IsNumeric als eine Function
 
Hi,

Hi,

Das mit dem Goto kann man IMMER vermeiden. z.B. so:

Delphi-Quellcode:
for i:=1 to Length(Str) do
begin
   if str[i] in ZiffernSet then ZiffernFlag :=True;
   if str[i] in ZeichenSet then ZeichenFlag:=True;
    //Wenn ZiffernFlag und Zeichenflag =True sind Result setzen und Goto ProgrammEnde;
   if Zeichenflag and ZiffernFlag then
   begin
     result:=AlphaNum;
     exit;
   end;
end;
// Bei einem Break würde es hier weitergehen!
if ZiffernFlag then Result:=Ziffer;
if ZeichenFlagthen Result:=Zeichen;

end;


Edit: Wie ich sehe hast du das goto schon rausgenommen ;)

Zum anderen ist die Codeformatierung natürlich deine Sache. Aber es ist nicht nur der "Schönheit" wegen, dass dir das gesagt wurde. Früher war mein Code auch ziemlich chaotisch.. Wenn jemand meine meine Formatierung kritisiert hab, hab ich gesagt, dass es doch egal ist und es schon passt. Aber in einem ordentlichen Code findet man viel besser Fehler und irgendwie sieht es eben auch besser aus. Es gibt nichts schöneres als gut formatierten, funktionierenden Code ;) Das weckt Glücksgefühle :mrgreen:

Gruß
Neutral General

R2009 3. Apr 2009 10:18

Re: Isalpha, IsNum, IsNumeric als eine Function
 
hi,

selbst auf die Gefahr hin zum Dauermeckerer zuwerden, ich kann hier keinerlei Zuordnung der elses zu irgenwelchen if's erkennen.
Das ist der Sinn des Delphi Styleguides. Code soll so leserlich wie möglich gehalten werden.
Das ist bei dir nicht der Fall.

Delphi-Quellcode:
   for i:=1 to Length(Str) do
   begin
      if str[i] in ['0'..'9'] then
         Include(Result, Ziffer);
      else if str[i] in ['a'..'z','A'..'Z'] then
         Include(Result, Zeichen);
      else
         Include(Result, Andere);
         
      if Result = [Ziffer, Zeichen, Andere] then
         break;
   end;
korrekt: (hier kann man den Code wenigstens lesen)
Delphi-Quellcode:
   for i:=1 to Length(Str) do
   begin
      if str[i] in ['0'..'9'] then Include(Result, Ziffer);
      else if str[i] in ['a'..'z','A'..'Z'] then Include(Result, Zeichen);
           else Include(Result, Andere);
      if Result = [Ziffer, Zeichen, Andere] then
         break;
   end;
Viele Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr.
Seite 1 von 5  1 23     Letzte »    

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