![]() |
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:
Geht es noch besser? Ich glaube es ist eine umständliche Lösung.
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. [Edit: u. a. Titel geändert] |
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.
|
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 ;) |
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:
@jfheins
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. 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? |
Re: Isalpha, IsNum, IsNumeric als eine Function
Hi!
Zu 1) Er meinte das hier:
Delphi-Quellcode:
Das sollte man nicht tun, sondern besser
if ZiffernFlag=True then
Delphi-Quellcode:
if ZiffernFlag then
Ciao, Frederic |
Re: Isalpha, IsNum, IsNumeric als eine Function
@fkerber
Danke, war schon oft Thema in der DP. Ändere ich. Danke! |
Re: Isalpha, IsNum, IsNumeric als eine Function
Hi,
Zitat:
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! |
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:
(Es könnte sein, dass es nicht kompiliert - mangels Delphi im Editor geschrieben)
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. |
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 |
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:
korrekt: (hier kann man den Code wenigstens lesen)
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;
Delphi-Quellcode:
Viele Grüsse
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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