![]() |
Re: Isalpha, IsNum, IsNumeric als eine Function
Hallo ...,
ich habe zwar noch nie ne Konsolenanwendung geschrieben, aber würde sich hier nicht eine Case Abfrage anbieten?
Delphi-Quellcode:
Function CheckStr(Str:string):TStringTyp;
var i:Integer; begin Result:= []; Str:= UpperCase(Str); if Str <> '' then For i:= 1 to Length(Str) do Begin Case Str[i] of '0'..'9' : Include(Result, Ziffer); {'a'..'z',} 'A'..'Z' : Include(Result, Zeichen); else Include(Result, Andere); end; If Result = [Ziffer, Zeichen, Andere] Then Break; end; End; |
Re: Isalpha, IsNum, IsNumeric als eine Function
Zitat:
Hatte ich auch dran gedacht aber dann wieder verworfen ... Dann bin ich für die Version mit der case-Abfrage (das spart dann auch den if-else-else if-Syntax Streit aus ...) |
Re: Isalpha, IsNum, IsNumeric als eine Function
@hobbyprogrammierer
Consolenprogramm verwende ich nur zum Testen von Routinen und sind kurz und schnell erstellt. Dein Code sieht auf dem ersten Blick schön aus, ich bekomme ihn wegen vieler Fehler nicht zu laufen. Wie geht es richtig? |
Re: Isalpha, IsNum, IsNumeric als eine Function
Hallo,
Tyrael Y. hat mit seinen Ausführungen Recht. Wenn man die entsprechende Delphi Version hätte mit dem man Audits vom Quellcode erstellen könnte, so würde eine Warnung ausgegeben „Anweisungen in Block setzen“. Es lohnt sich in diesem Zusammenhang mal das Video von Daniel: BDS2006: Refactoring / Together-Integration anzusehen: ![]() Bis bald Chemiker |
Re: Isalpha, IsNum, IsNumeric als eine Function
Zitat:
bist Du sicher das Du deinen Code gscheit lesen kannst und logische Fehler sofort erkennst? Ich bezweifel das doch sehr! Hast Du den Code selbst auf Fehlerfreiheit geprüft? Teste selbst in dem Du einfach mehrmals 'Enter' drückst. Das Ergebnis ist mehr als fehlerhaft!! |
Re: Isalpha, IsNum, IsNumeric als eine Function
Zitat:
Wieso hast du ['a'..'z'] auskommentiert, und stattdessen UpperCase aufgerufen? Ich wette, dass es so schneller ist:
Delphi-Quellcode:
function CheckStr(Str: string): TStringTyp;
var i: Integer; begin Result := []; for i := 1 to Length(Str) do begin Case Str[i] of '0'..'9' : Include(Result, Ziffer); 'a'..'z', 'A'..'Z' : Include(Result, Zeichen); else Include(Result, Andere); end; if Result = [Ziffer, Zeichen, Andere] then break; end; end; |
Re: Isalpha, IsNum, IsNumeric als eine Function
So - jetzt dann jetzt meine vorläufige Endversion:
:arrow: In meinem D2006 compiliert es :) :arrow: Arbeitet mit Sets :arrow: Kein goto :stupid: :arrow: case-Statement statt "else if" :mrgreen: :arrow: Einfach elegant :drunken:
Delphi-Quellcode:
program test;
{$APPTYPE CONSOLE} // Dies ist unser ErgebnisTyp: type TCharTyp = (Ziffer, Zeichen, Andere); type TStringTyp = set of TCharTyp; function CheckStr(Str:string):TStringTyp; var i: Integer; begin Result := []; for i:= 1 to Length(Str) do begin case Str[i] of '0'..'9': Include(Result, Ziffer); 'a'..'z', 'A'..'Z': Include(Result, Zeichen); else Include(Result, Andere); end; 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; // Es sollte überall 1 rauskommen ;-) //Zum Testen: Writeln(Ord(Zeichen in checkstr('190'))); readln; writeln(Ord(Ziffer in checkstr('az'))); readln; Writeln(Ord([Zeichen, Andere] = checkstr('az10'))); readln; Writeln(Ord([Zeichen, Ziffer] >= checkstr('az10 !?.,;:-_<>'))); readln; // Es sollte überall 0 rauskommen ;-) end. |
Re: Isalpha, IsNum, IsString als eine Function
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, hier meine Version mit Includes und einem "Profiling".
Natürlich kann man andere Zeichen mit einfügen, oder die Funktion um ein IsFloat, IsInKlammern etc. ergänzen. Inwieweit dies sinnvoll ist, kommt auf den Einsatzzweck an. Hier der "Profiler", simpel gestrickt, als Include: "Profiler.inc":
Delphi-Quellcode:
Unsere Funktion CheckStr als Include: "CheckStr.inc"
// Date: 08.04.2009
// File: Profiler.inc //Variablen var Profiler_StartWert, Profiler_StopWert, Profiler_Freq: int64; /// Profiler Routinen Start... procedure Start; begin QueryPerformanceFrequency(Profiler_Freq); QueryPerformanceCounter(Profiler_StartWert); end; procedure Stopp; begin QueryPerformanceCounter(Profiler_StopWert); //Label1.Caption:='Profiler: '+floattostr(((Profiler_StopWert-Profiler_StartWert)/Freq)*1000)+' ms'; Writeln('Profiler: '+floattostr(((Profiler_StopWert-Profiler_StartWert)/Profiler_Freq)*1000)+' ms'); end; /// ...Profiler Routinen Ende
Delphi-Quellcode:
Warum so lange Namen wie CheckStr_i für eine einfache Schleifenvariable? Diese sind aus Geschwindigkeitsgründen global deklariert.
// Date: 08.04.2009
// File: CheckStr.inc // Dies ist unser ErgebnisTyp: type r=(Leer,Ziffer,Zeichen,AlphaNum); type typ=set of Char; //Variablen absichtlich global deklariert. var CheckStr_i:Integer; CheckStr_ZiffernSet:typ; CheckStr_ZeichenSet:typ; CheckStr_ZiffernFlag:Boolean; CheckStr_ZeichenFlag:Boolean; function CheckStr(Str:string):r; begin // Sets zuweisen - geht wohl nicht global. CheckStr_ZiffernSet:=['0'..'9']; CheckStr_ZeichenSet:=['a'..'z','A'..'Z']; // "Fehlerbehandlung" If Str=''then begin Result:=Leer;Exit;end;//<- Ergebnis: LEER // Flags initialisieren CheckStr_ZiffernFlag:=False; CheckStr_ZeichenFlag:=False; //// Hauptteil for CheckStr_i:=1 to Length(Str) do begin if str[CheckStr_i] in CheckStr_ZiffernSet then CheckStr_ZiffernFlag:=True; //.. nur Ziffern... if str[CheckStr_i] in CheckStr_ZeichenSet then CheckStr_ZeichenFlag:=True; // .. nur Zeichen... // i läuft nicht bis zum Ende,wenn AlphaNum erkannt wurde! if CheckStr_Zeichenflag and CheckStr_ZiffernFlag then begin result:=AlphaNum; Exit;end;// <- Ergebnis: AlphaNum end; // ...die restlichen Results if CheckStr_ZiffernFlag then Result:=Ziffer; // <- Ergebnis: Ziffer if CheckStr_ZeichenFlag then Result:=Zeichen; // <- Ergebnis: Zeichen end; Das Testprogramm mit Profiling:
Delphi-Quellcode:
Falls jemand die Routine beschleunigen kann. Nur her damit. :zwinker:
program TestWithInclude;
{$APPTYPE CONSOLE} uses Sysutils, // Für FloatToString in Profiler.inc notwendig; Windows; // Für Profiler.inc notwendig // Die Variablen für unser Testprogramm var xx,ii:Integer; // Include mit dem "Profiler und der Funktion CheckStr" {$I Profiler.inc} {$I CheckStr.inc} begin Writeln('### Mini-Demo fuer die Funktion Checkstr ###'); Writeln; //Profiling: for xx:=1 to 10 do begin Start; for ii:= 1 to 1000000 do begin CheckStr('1234567890'); CheckStr('abcdefghijklmnopqrstuvwxyz'); CheckStr('1234567890abcdefghijklmnopqrstuvwxyz') end; Stopp; end; Writeln('Profiling beendet. Weiter: [ENTER]');readln; // Als Ergebnis wird jeweils 0, 1, 2, und 3 angezeigt. // Entspricht dem Code: type r=(Leer,Ziffer,Zeichen,AlphaNum); Writeln(Ord(CheckStr(''))); Writeln(Ord(CheckStr('1234567890'))); Writeln(Ord(CheckStr('abcdefghijklmnopqrstuvwxyz'))); Writeln(Ord(CheckStr('abcdefghijklmnopqrstuvwxyz1234567890'))); Writeln('Test beendet. Programmende mit [ENTER]');readln; end. Formatierung meine Eigenheit... Sorry. |
Re: Isalpha, IsNum, IsString als eine Funktion
Zitat:
Delphi-Quellcode:
const
CheckStr_ZiffernSet = ['0'..'9']; CheckStr_ZeichenSet = ['a'..'z', 'A'..'Z']; |
Re: Isalpha, IsNum, IsString als eine Funktion
Hallo, himitsu. Danke. Dürfte ein paar Millisekunden sparen.
[Nachtrag] Opps, ein paar Millisekunden? Das Programm benötigt fast nur noch die Hälfte der Zeit! Super Tipp! :cheer: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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