AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Isalpha, IsNum, IsString als eine Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Isalpha, IsNum, IsString als eine Funktion

Ein Thema von Go2EITS · begonnen am 3. Apr 2009 · letzter Beitrag vom 11. Apr 2009
Antwort Antwort
Seite 3 von 5     123 45      
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#21

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 17:31
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;
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#22

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 17:58
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 ...)
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#23

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 4. Apr 2009, 05:58
@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?
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#24

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 4. Apr 2009, 13:34
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#25

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 4. Apr 2009, 15:15
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!!
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#26

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 4. Apr 2009, 15:52
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
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;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#27

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 4. Apr 2009, 16:14
So - jetzt dann jetzt meine vorläufige Endversion:

In meinem D2006 compiliert es

Arbeitet mit Sets

Kein goto

case-Statement statt "else if"

Einfach elegant

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.
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#28

Re: Isalpha, IsNum, IsString als eine Function

  Alt 8. Apr 2009, 17:58
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.
Formatierung meine Eigenheit... Sorry.
Angehängte Dateien
Dateityp: rar testwithinclude_168.rar (1,5 KB, 1x aufgerufen)
Dateityp: exe testwithinclude_173.exe (43,0 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#29

Re: Isalpha, IsNum, IsString als eine Funktion

  Alt 8. Apr 2009, 18:18
Zitat:
// Sets zuweisen - geht wohl nicht global.
probier es mal mit Konstanten

Delphi-Quellcode:
const
  CheckStr_ZiffernSet = ['0'..'9'];
  CheckStr_ZeichenSet = ['a'..'z', 'A'..'Z'];
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#30

Re: Isalpha, IsNum, IsString als eine Funktion

  Alt 8. Apr 2009, 18:23
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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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