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 1 von 5  1 23     Letzte »    
Go2EITS

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

Isalpha, IsNum, IsString als eine Funktion

  Alt 3. Apr 2009, 08:33
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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 08:43
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 08:56
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

  Mit Zitat antworten Zitat
Go2EITS

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

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 09:41
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?
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#5

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 09:52
Hi!

Zu 1)
Er meinte das hier:

if ZiffernFlag=True then Das sollte man nicht tun, sondern besser
if ZiffernFlag then
Ciao, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Go2EITS

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

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 09:57
@fkerber
Danke, war schon oft Thema in der DP. Ändere ich. Danke!
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:09
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!
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:13
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)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:15
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

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Isalpha, IsNum, IsNumeric als eine Function

  Alt 3. Apr 2009, 10:18
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 16:23 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