Delphi-PRAXiS
Seite 3 von 5     123 45      

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)

Hobby-Programmierer 3. Apr 2009 17:31

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;

jfheins 3. Apr 2009 17:58

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

Zitat von Hobby-Programmierer
Hallo ...,
ich habe zwar noch nie ne Konsolenanwendung geschrieben, aber würde sich hier nicht eine Case Abfrage anbieten?[

Oh ... äh ... ja :)

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 ...)

Go2EITS 4. Apr 2009 05:58

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?

Chemiker 4. Apr 2009 13:34

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: Videos

Bis bald Chemiker

Hobby-Programmierer 4. Apr 2009 15:15

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

Zitat von Go2EITS
Vorläufige Endversion, Dank Eurer Hilfe, meiner Funktion:
...

Zum Thema Formatierung:
Ich schließe mich himitsu an: So wie den 6. Zeiler kann ich meinen Code auch nach Jahren noch lesen.
und... "if..then..begin und end" schreibe ich wie oben in eine Zeile, wenn die Zeile kurz ist.

Vielen Dank für Eure Beiträge, sie waren, wie man am Ergebnis sieht, sehr hilfreich.

Hallo ...,
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!!

Namenloser 4. Apr 2009 15:52

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

Zitat von Hobby-Programmierer
Hallo ...,
ich habe zwar noch nie ne Konsolenanwendung geschrieben, aber würde sich hier nicht eine Case Abfrage anbieten?

Das Case wollte ich auch vorschlagen... aber hast du ja leider schon :mrgreen:
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;

jfheins 4. Apr 2009 16:14

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.

Go2EITS 8. Apr 2009 17:58

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:
// 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
Unsere Funktion CheckStr als Include: "CheckStr.inc"
Delphi-Quellcode:
// 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;
Warum so lange Namen wie CheckStr_i für eine einfache Schleifenvariable? Diese sind aus Geschwindigkeitsgründen global deklariert.

Das Testprogramm mit Profiling:
Delphi-Quellcode:
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.
Falls jemand die Routine beschleunigen kann. Nur her damit. :zwinker:
Formatierung meine Eigenheit... Sorry.

himitsu 8. Apr 2009 18:18

Re: Isalpha, IsNum, IsString als eine Funktion
 
Zitat:

// Sets zuweisen - geht wohl nicht global.
probier es mal mit Konstanten :zwinker:

Delphi-Quellcode:
const
  CheckStr_ZiffernSet = ['0'..'9'];
  CheckStr_ZeichenSet = ['a'..'z', 'A'..'Z'];

Go2EITS 8. Apr 2009 18:23

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 09:00 Uhr.
Seite 3 von 5     123 45      

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