Abfrage [ERLEDIGT]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Abfrage [ERLEDIGT]

Beitrag von Rolf Ramacher »

Hallo zusammen,

ich möchte aus einem eingegebenen Passwort feststellen, ob mindestens eine Zahl, ein Grossbuchstabe, ein Kleinbuchstabe ein Sonderzeichen eingetragen ist - dies kann egal an welcher Stelle sein.

funtk. aber irgendwie nicht.

Code: Alles auswählen

	For i = 048 to 057
		AAdd(aZahl,Chr(i))
	Next i

	For i = 033 to 047
		AAdd(aSond,Chr(i))
	Next i

	For i = 058 to 064
		AAdd(aSond,Chr(i))
	Next i

	For i = 091 to 096
		AAdd(aSond,Chr(i))
	Next i

	For i = 123 to 128
		AAdd(aSond,Chr(i))
	Next i

	For i = 65 to 090
		AAdd(aGross,Chr(i))
	Next i

	For i = 097 to 122
		AAdd(aKlein,Chr(i))
	Next i

	For j = 1 to Len(aZahl)
		nPos:=At(aZahl[j],alltrim(aFelder[2])) 
		AAdd(aOk,nPos)
	Next j 
	If AScan(aOK,1) < 1
		msgbox("Kein numerischer Wert im Passwort eingegeben","Fehlerhafte Eingabe")
		Return {aFelder,.f.}
	Endif
	aOK:={}

	For j = 1 to Len(aKlein)
		nPos:=At(aKlein[j],alltrim(aFelder[2]))
		AAdd(aOk,nPos)
	Next j 
	If AScan(aOK,1) <1
		msgbox("Kein Kleinbuchstabe im Passwort eingegeben","Fehlerhafte Eingabe")
		Return {aFelder,.f.}
	Endif
	aOK:={}

	For j = 1 to Len(aSond)
		nPos:=At(aSond[j],alltrim(aFelder[2])) 
		AAdd(aOk,nPos)
	Next j 
	If AScan(aOK,1) <1
		msgbox("Kein Sonderbuchstabe im Passwort eingegeben","Fehlerhafte Eingabe")
		Return {aFelder,.f.}
	Endif
	aOK:={}

	For j = 1 to Len(aGross)
		nPos:=At(aGross[j],alltrim(aFelder[2])) 
		AAdd(aOk,nPos)
	Next j 
	If AScan(aOK,1) <1
		msgbox("Kein Grossbuchtabe im Passwort eingegeben","Fehlerhafte Eingabe")
		Return {aFelder,.f.}
	Endif
	aOK:={}

zunächst lasse ich alle entsprechenden Zeichen in Array eintragen. stimmt auch alles - Zahl funktiniert nur wenn Zahlen am Anfang stehen. alles andere überhaupt nicht. Ich habe es bei den kleinbuchstaben auch mit lower getestet - nix.


Hat jemand eine Idee?

so es ist doch schon erledigt
Zuletzt geändert von Rolf Ramacher am Di, 20. Jan 2015 23:03, insgesamt 1-mal geändert.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von Jan »

Rolf, was machst Du das kompliziert? Ich würde einfach kurze Schleifen machen

Code: Alles auswählen

LOCAL lKleinerBuchstabe := .F.
FOR i := 1 To Len(cPasswort)
    If Asc(cPasswert[i]) >= 48 .AND. Asc(cPasswert[i]) <= 57
       lKleinerBuchstabe := .T.
       Exit
    EndIf
NEXT

// Nächste Schleife auf die nächste Zeichengruppe
Und dann die l-Variablen auswerten, ob da noch eine auf .F. steht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von brandelh »

In Jans Beispiel steht am Ende ...

Code: Alles auswählen

// Nächste Schleife auf die nächste Zeichengruppe
natürlich arbeitet man die Schleife nur einmal durch und kombiniert die Abfragen in der Schleife ... aber mit den richtigen Werten ;-)
asc(48) => 0 ... also Ziffern ... und weil ich es hasse mit Ziffern zu arbeiten und nicht dauernd asc() aufrufen will, nehme ich Strings ;-)

Code: Alles auswählen

LOCAL lKleinerBuchstabe := .F.
LOCAL lGroßerBuchstabe := .F.
LOCAL lZiffer := .F.
...
FOR i := 1 To Len(cPasswort)
    If cPasswert[i] $ "abcdefghijklmnopqrstuvwxyz" // äöü ?
       lKleinerBuchstabe := .T.
    EndIf
    If cPasswert[i] $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // ÄÖÜß ?
       lGroßerBuchstabe := .T.
    EndIf
    If cPasswert[i] $ "0123456789"
       lZiffer := .T.
    EndIf
    if lKleinerBuchstabe .and. lGroßerBuchstabe .and. lZiffer
       exit
    endif
NEXT

if ! ( lKleinerBuchstabe .and. lGroßerBuchstabe .and. lZiffer )
   Fehlermeldungen ...
else
   Arbeiten
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von Jan »

... oder so ... :-D

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von Rolf Ramacher »

Jan
danke für den Tipp funkt.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Abfrage

Beitrag von Werner_Bayern »

statt if / endif wäre hier do case schneller, weil dann die unnötigen if / endifs wegfallen.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von brandelh »

Werner_Bayern hat geschrieben:statt if / endif wäre hier do case schneller, weil dann die unnötigen if / endifs wegfallen.
stimmt, solange sie unnötig sind, ich ändere mal meinen Quellcode entsprechend:

Code: Alles auswählen

LOCAL lKleinerBuchstabe := .F.
LOCAL lGroßerBuchstabe := .F.
LOCAL lZiffer := .F.
...
FOR i := 1 To Len(cPasswort)
   do case
      case cPasswert[i] $ "abcdefghijklmnopqrstuvwxyz" // äöü ?
         lKleinerBuchstabe := .T.
      case cPasswert[i] $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // ÄÖÜß ?
         lGroßerBuchstabe := .T.
      case cPasswert[i] $ "0123456789"
         lZiffer := .T.
    End
    // Alle Bedingungen erfüllt, Prüfschleife beenden
    if lKleinerBuchstabe .and. lGroßerBuchstabe .and. lZiffer
       exit
    endif
NEXT

if ! ( lKleinerBuchstabe .and. lGroßerBuchstabe .and. lZiffer )
   Fehlermeldungen ...
else
   Arbeiten
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von Jan »

Da bin ich mir jetzt aber nicht so sicher. Gibt es da wirklich Performance-Unterschiede? Ich dachte immer, die werden im PP alle in den gleichen Topf geworfen.

Abgesehen davon dürfte das bei dieser kurzen Schleife nicht messbar sein.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von brandelh »

Jan hat geschrieben:Ich dachte immer, die werden im PP alle in den gleichen Topf geworfen.
Die IF werden alle durchlaufen, auch wenn eine davon .t. gibt, bei do case wird nur die mit .t. durchlaufen.
Nur in Fällen bei denen es nur ein richtiges Ergebnis geben kann und nicht 2 möglich sind, ist do case anwendbar.
Falls eine .t. Abfrage eine weitere Prüfung nicht verhindern darf, muss IF eingesetzt werden.

Daraus folgt, da beide sich nicht gleich verhalten darf weder der Präprozessor noch der Compiler oder Linger den Code gleich machen.
Jan hat geschrieben:Da bin ich mir jetzt aber nicht so sicher. Gibt es da wirklich Performance-Unterschiede? ...
Abgesehen davon dürfte das bei dieser kurzen Schleife nicht messbar sein.
Hier hast du auf jeden Fall Recht, auf einem Rechner mit 3 Ghz spielen 2 zusätzliche IF keine messbare Rolle.
Aber der Quellcode ist klarer und kürzer, das weiß ich zu schätzen.
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von Herbert »

Macht aber schon Sinn, Jan.
Hier, Hubert, ist nur eine Bedingung erfüllbar, also klar ein DO CASE sinnvoll.
Falls einmal eine Bedingung erfüllt ist, muss doch nicht nochmals getestet werden. Das spar 100%-ig Zeit.
Dazu könnten im OTHERWISE-Fall die Sonderzeichen ÄÖÜ usw. separat noch abgearbeitet werden.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Abfrage

Beitrag von brandelh »

Herbert hat geschrieben:Macht aber schon Sinn, Jan.
Hier, Hubert, ist nur eine Bedingung erfüllbar, also klar ein DO CASE sinnvoll.
genau, deshalb habe ich die oberen 3 IF zusammengefasst.
Herbert hat geschrieben:Falls einmal eine Bedingung erfüllt ist, muss doch nicht nochmals getestet werden. Das spar 100%-ig Zeit.
da hast du völlig Recht, die Frage ist nur wie lange 2 IF Abfragen dauern, wenn 3 Millionen Taktzyklen je Sekunde verarbeitet werden :!:
Nichts, was man mit Sekunden bzw. 1/100 Sekunden messen könnte ;-)
Daher gab ich hier JAN Recht, dass es wegen der Geschwindigkeit nicht geändert werden muss (bei so kurzem Code).
Herbert hat geschrieben:Macht aber schon Sinn, Jan.
JA, wegen der eindeutig besseren Lesbarkeit und schneller getippt ist es auch
Herbert hat geschrieben:Dazu könnten im OTHERWISE-Fall die Sonderzeichen ÄÖÜ usw. separat noch abgearbeitet werden.
Da muss ich jetzt aber widersprechen, das wäre ja mega umständlich. Wenn Sonderzeichen erwünscht sind, dann einfach oben in den String rein :D
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Abfrage

Beitrag von Werner_Bayern »

Jan hat geschrieben:Abgesehen davon dürfte das bei dieser kurzen Schleife nicht messbar sein.Jan
Im ungünstigsten Fall sind das len(cPasswort) * 2 unnötige Abfragen.
Kommt also auch auf die Länge des PW an. Schon aus Prinzip mache ich mir da schon immer vorab oder spätestens beim Codieren die Gedanken über unnötige Schleifen, Funktionsaufrufe (hier wäre noch len(cPasswort) überflüssig, da sich die Länge während der Bearbeitung nicht ändert) etc.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten