Programm das auf Ziffern testet (Java)?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

string.toCharArray() macht dir ja ein Array - Und mit .length kriegt man die Länge eines jedes Arrays.

Um die Anzahl an Zeichen zu ermitteln kannst du also einfach

char[] passwordArray = password.toCharArray()
int arrayLength = passwordArray.length;

benutzen.

Um die Anzahl an Großbuchstaben zu zählen kannst du mit einer for-schleife das Char-Array durchgehen ( for(int i = 0; i < arrayLength; i++) ), und für jeden Char prüfen ob er groß ist, und wenn ja dann einen Zähler erhöhen.

if(Character.isUpperCase(passwordArray[i]) { bigLetterCounter++;} )

Selbiges natürlich auch mit isLowerCase().

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
80anonymous08 
Fragesteller
 02.06.2020, 15:29

okay, habe noch kurz 3 Fragen dazu:

1) Und dann kann man zur Länge einfach if lenght >= 10 System.out.println(„xy“); ?

2) Und für die Groß- und Kleinbuchstaben ja eigentlich genau so: if i <= 2 System.out.println („xyz“); ?

3) Und den String kann man einfach mit toCharArray() zu einem Array machen, oder?

Nur kurz zu meiner Bestätigung, bevor ich da jetzt einen dummen Denkfehler mache und mich am Ende frage, wieso es nicht funktioniert😅

0
MrAmazing2  02.06.2020, 16:50
@80anonymous08

1) Genau! Wollte dass du da selber draufkommst, und du bist draufgekommen, super :D

2) da musst du schauen ob der Zähler kleiner 2 ist. Den Zähler „i“ zu nennen ist nicht sehr empehlenswert. Nenn die Zähler bigLetterCounter und smallLetterCounter oder so :D

if(bigLetterCounter < 2) { ... } //Wenn es weniger als 2 große Buchstaben gibt -> Fehler ausgeben

3) Jap!

1
80anonymous08 
Fragesteller
 02.06.2020, 18:39
@MrAmazing2

Kann man da jetzt auch noch irgendetwas mit Sonderzeichen machen? :)
Werden ja auch bei vielen Passwörtern gefordert.

0
MrAmazing2  02.06.2020, 18:56
@80anonymous08

Schwer, sowas wie eine Character.isSonderzeichen() Methode gibt es nicht.

Normal macht man das mit Regex, aber das ist ja in deiner Aufgabenstellung verboten, du darfst ja nur die drei String-Methoden da hernehmen.

Du kannst natürlich einfach alles als Sonderzeichen zählen, das weder Buchstabe noch Zahl ist.

if(!Character.isDigit(passwordArray[i]) && !Character.isLetter(passwordArray[i]) {
sonderzeichenCounter++;
}

Auf deutsch:

Wenn ( das Zeichen an Stelle i keine Zahl ist UND das Zeichen an Stelle i kein Buchstabe ist) dann Erhöhe den Counter der die Sonderzeichen zählt.

0
80anonymous08 
Fragesteller
 02.06.2020, 19:03
@MrAmazing2

kann man dann eigentlich auch bestimmte stellen verbieten? zum beispiel, dass das passwort nicht mit einem sonderzeichen beginnen darf?

0
MrAmazing2  02.06.2020, 19:04
@80anonymous08
if(!Character.isDigit(passwordArray[0]) && !Character.isLetter(passwordArray[0]) 
{
System.out.println("Passwort darf nicht mit Sonderzeichen beginnen");
return;
}

Einfach überprüfen ob die erste Stelle (also [0]) ein Sonderzeichen ist. (Sowas macht man ausserhalb der for-Schleife)

0
80anonymous08 
Fragesteller
 02.06.2020, 19:06
@MrAmazing2

und kann man das dann auch zum beispiel für die 3. letzte stelle machen?

denn die variiert ja immer.

also habe ich nicht vor (zumindest nicht ursprünglich), aber daraus lernt man ja immer :D

0
MrAmazing2  02.06.2020, 19:06
@80anonymous08

passwordArray.length - 3

if(!Character.isDigit(passwordArray[passwordArray.length - 3]) && !Character.isLetter(passwordArray[passwordArray.length - 3]) 
{
System.out.println("Passwort darf nicht an dritt-letzter Stelle ein Sonderzeichen haben");
return;
}
0
80anonymous08 
Fragesteller
 02.06.2020, 19:11
@MrAmazing2

und macht man das dann einfach nach der for schleife? du meintest ja außerhalb

0
MrAmazing2  02.06.2020, 19:11
@80anonymous08

Davor würd ichs machen.

Weil warum noch lange die Schleife durchlaufen und überprüfen ob Großbuchstaben etc. im Passwort sind, wenn das Passwort so schon nicht erlaubt ist.

Die kürzeren Überprüfungen macht normal man immer zuerst. Ist aber optional. Sorgt halt dafür dass das Programm schneller läuft. :D

0

Iteriere über jedes Zeichen vom String und leg dir 3 Variablen für Zahl, Groß / Kleinbuchstaben an

Dann testest du jedes Zeichen:

if(Character.isDigit(char))
  zahl++;
else if(Character.isUpperCase(char))
  groß++;
else if(Character.isLowerCase(char))
  klein++;

Dann am Ende schaust du, ob zahl > 10 ist, usw

80anonymous08 
Fragesteller
 02.06.2020, 15:22

wie genau „iteriert“ man denn ein Passwort? Und geht das nur, wenn man das Passwort vorher schon kennt, oder bei jedem beliebigem Passwort, das man eingibt?

0
80anonymous08 
Fragesteller
 02.06.2020, 15:39
@codinghelp

Eine Frage hätte ich noch: Wie schaffe ich es, dass sich das Programm dabei auf den Scanner bezieht, den ich deklariert habe?

0
80anonymous08 
Fragesteller
 02.06.2020, 15:44
@codinghelp

also erstelle ich erst den Scanner, dann kann man etwas eingeben und das mache ich dann durch meinString = scannername.nextLine(); zu einem String den ich dann mit.toCharArray() zu einem Array machen und untersuchen kann, habe ich das richtig verstanden? :)

1
80anonymous08 
Fragesteller
 02.06.2020, 16:00
@codinghelp

Sorry dass ich dich doch noch einmal störe😅

Hatte das jetzt gerade so weit ausprobiert, wenn ich aber nun die for-Schleife

for(var char : dasPasswort [mein String].toCharArray() )

eingebe, bekomme ich ein paar Fehlermeldungen:

-einmal sei das kein Statement

-nach dem var würde ein Semikolon erwartet

-zwischen char und : würde ein .class erwartet

-nach toCharArray würde ein weiteres Semikolon erwartet

Weißt Du vielleicht, woran das liegen könnte und wie ich das beheben kann?

0
codinghelp  02.06.2020, 16:09
@80anonymous08
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String passwort = scanner.nextLine();
    int zahl = 0, groß = 0, klein = 0;

    for (var c : passwort.toCharArray()) {
        if (Character.isDigit(c))
            zahl++;
        else if (Character.isUpperCase(c))
            groß++;
        else if (Character.isLowerCase(c))
            klein++;
    }
    System.out.println(zahl < 10 || groß < 2 || klein < 2 ? "Ungültiges Passowort" : "Okay!");
}
0
MrAmazing2  02.06.2020, 16:55
@codinghelp

mach doch bitte

for (char c : passwort.toCharArray()) und nicht for (var c : ..)

  1. Benutzt nicht schon jeder Java 10
  2. Ist das für Anfänger verwirrend
0
MrAmazing2  02.06.2020, 16:58
@80anonymous08

So heisst die Variable dann.

Was seine for-Schleife macht:

Das selbe wie

for(int i = 0; i< passwort.toCharArray.length; i++) {
var c = passwort.toCharArray()[i];
...
}

Sie geht jeden buchstaben aus dem passwort-charArray durch und speichert ihn für den jeweiligen Durchgang in einer Variable c.

Benutz als Anfänger lieber eine for(int i = 0; i< array.length; i++) Schleife, wenn die mit dem Doppelpunkt noch nicht kennst.

1
80anonymous08 
Fragesteller
 02.06.2020, 17:06
@MrAmazing2

Irgendwas muss ich falsch gemacht haben, denn es wird immer „Das Passwort ist zu schwach“ ausgegeben :/ :

private void passwortTest()
     {
        int ziffer = 0;
        int groß = 0;
        int klein = 0;
        Scanner scanny = new Scanner(System.in);
        String passwort = scanny.nextLine();
        for (char c : passwort.toCharArray() )
        {
          if (Character.isDigit(c))
          {
            ziffer++;
          }
          else if (Character.isUpperCase(c))
          {
            groß++;
          }
          else if (Character.isLowerCase(c))
          {
            klein++;
          }
        }
        if (ziffer >= 10)
        {
            if (groß >= 2)
            {
                if (klein >= 2)
                {
                    System.out.println("Das Passwort ist gut genug!");
                }
            }
        }
        else
        {
            System.out.println("Das Passwort ist zu schwach!");
        }
     }
    }
0
80anonymous08 
Fragesteller
 02.06.2020, 17:08
@80anonymous08

das mit dem if am ende hatte ich auch schon mit

if (ziffer >= 10 && groß >= 2 && klein >= 2)

versucht, aber da war das gleiche ergebnis

0
MrAmazing2  02.06.2020, 17:13
@80anonymous08

Weil Ziffer die Ziffern zählt.

„Ziffer“ bedeutet „Zahl“.

Laut deiner Frage willst du garnicht zählen wieviele Zahlen im Wort sind. Keine Ahnung wie der Antwortgeber da drauf kommt. Aber das mit dem Ziffer-Zähler kannste weglassen.

Was du wissen willst ist:

Hat das Passwort mehr als 10 Zeichen? Also:

“Ist das CharArray Länger als 10?“

if(passwort.toCharArray().length > 10) ...

1
MrAmazing2  02.06.2020, 17:16
@80anonymous08

Super, nimm das her. Ist viel schöner als 3 ifs ineinander. Nur du musst halt „ziffer“ mit „arraylänge“ austauschen. :D

1
MrAmazing2  02.06.2020, 17:18
@MrAmazing2

Ziffern sind

0,1,2,3,4,5,6,7,8,9

Momentan prüfst du, ob von denen mehr als 10 in deinem Wort sind.

Das ist der Fehler.

Gib AAbb1234567890 ein, und das Passwort wird angenommen werden.

Aber ja, dass du die Ziffern (zumindest laut deiner Fragestellung) nicht zählen musst hab ich dir ja schon gesagt. :D

1
80anonymous08 
Fragesteller
 02.06.2020, 17:41
@MrAmazing2

Wenn ich das so versuche, sagt er mir „cannot find symbol - variable toCharArray“ :/

for (int i = 0; i < passwort.toCharArray.lenght; i++)

an der Stelle halt

0
MrAmazing2  02.06.2020, 17:43
@80anonymous08

toCharArray()

hab die Klammern vergessen, sorry. toCharArray eine Methode, also müssen so Klammern dahinter.

1
80anonymous08 
Fragesteller
 02.06.2020, 17:44
@80anonymous08

vergiss das dann, gutefrage hat irgendwie rumgespinnt bei mir und mir eine falsche sache angezeigt, jetzt wo es funktioniert und ich deine antwort gesehen habe ergibt alles sinn :D Danke!!

1
80anonymous08 
Fragesteller
 02.06.2020, 17:51
@MrAmazing2

obwohl, funktioniert gerade doch nicht🙈

if (passwort.toCharArray().lenght >= 10 && groß >= 2 && klein >= 2)
{
Sytem.out.println(„Das Passwort ist gut“)
}
else
...

Irgendwie sagt er mir wieder „cannot find symbol - variable lenght“

0
codinghelp  02.06.2020, 18:27
@MrAmazing2

Ja, ich hab statt Zeichen Zahlen gelesen oder gedacht :) Naja, diese kleine Änderung hätte man ja auch selbst erkennen können

1