2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet

arhzz

Bekanntes Mitglied
Hallo!

Schreiben Sie einen Algorithmus checkPasswd(word), der zur Überprüfung des eingegebenen Passworts dient. Bei der Eingabe eines Passworts hat man drei Versuche, das richtige Passwort einzugeben. Das Passwort wird in einer globalen Variablen (passwd) gespeichert und mittels der Funktion setPasswd(word) jeweils gesetzt oder geändert. Der Algorithmus checkPasswd(word) liefert true, falls das Passwort richtig ist, ansonsten false. Nach der dritten inkorrekten Passworteingabe wird jeglicher weitere Versuch, checkPasswd aufzurufen, sofort mit false beendet. Ein korrekter Versuch setzt alle Zählvariablen wieder auf den Initialzustand zurück. Als Einschränkung soll ein Passwort aus genau 6 Zeichen bestehen.

Java:
import inout.*;
public class test {


    static String password;

    public static String setPassword(String password) {
        Out.println("Please input a password");
        password = In.readString();
        if(password.length() > 6) {
            Out.println("That password is too long");
        }
        return password;
    }
    public static boolean checkPassword(String word) {
        Out.println("Enter the password");
        word = In.readString();
        return word.equals(password);

    }
    public static void main(String[] args) {
        Out.println(setPassword(password));
        Out.println(checkPassword(password));

    }
}

So habe ich es probiert.Also ich versuche kurz meinen Problem zu erklaren.Also das mit setPassword funktioniert.Ich gebe das password ein falls es zu lang is(6+ zeichen) kommt dieses print statement out.Ich habe es deswegen in ein println statement in main geschrieben das ich sehen kann welcher wert wird zuruckgegeben mit dem return password in der setPassword methode. Aber wenn ich jetzt nun versuche in check password es zu vergleichen kommt immer false zuruck.Ich denk ich weiss wieso,weil die checkPassword methode nicht die "aktuelles" password niemt,dieses das die methode setPassword zuruckgibt,sondern die globale variable set password,und das sie leer ist,wird immer false zuruckgegeben.

Also jetzt konnte man einfach es so machen.halt in der equals to methode es so machen;

word.equals(setPassword(password));

Und das klappt so,aber dann sieht der code sehr hasslich aus,da dieses print statement in setPassword zweimal kommt,und das ist einfach kein gutes programieren.Ist es moglich irgendwie dieser checkPassword methode das richtige password zu ubergeben? Also wenn ich ja logik denken wurde,musste ich zuerst diese globale variable den neun passwort zuweisen aber ich weiss nicht wie.

Und noch falls man die Aufgabenstellung richtig gelesen hat sollte es die moglichkeit geben den password 3 mal einzugeben,bevor das programm sperrt quasi.Also da hatte ich ne ide das ich eine do while schleife mach die aufhort bei 3 oder wenn dieser vergleich true ist,aber mir ware es wichtiger derzeit das ich das mit dem vergleich hinbekomme.

Freue mich auf eure Ideen!
 
Da ist sicher eine Prüfung mit == notwendig.
Kann sein,aber ich verstehe nicht warum? Wenn ich ja ein string langer als 6 zeichen gebe klappt es auch so? Wie wurde mir das in sinne von der checkPassword methode helfen? Ich konnte den code anpassen, vielleich einfach check if == 6 und dann sofort zuruckgeben das pasword aber wird das mein Problem beheben?
 
Du nutzt zum speichern des Passworts die lokale Variable von deiner Methode setPassword.
Das Passwort soll genau 6 Zeichen lang sein, du überprüfst nur ob es größer ist.
So wie die Methoden aufgebaut sind brauchst du keine Parameter definieren.
 
Du nutzt zum speichern des Passworts die lokale Variable von deiner Methode setPassword.
Das Passwort soll genau 6 Zeichen lang sein, du überprüfst nur ob es größer ist.
So wie die Methoden aufgebaut sind brauchst du keine Parameter definieren.
Ah ja es steht es soll genau 6 Zeichen lang sein,my bad dachte es durfte einfach nicht grosser sein.

Ja genau also ich will das ich zum speichern des Passworts nicht die lokale variable nutzte sondern die Globale,wie schaff ich das?

Und denn letzten tipp verstehe ich leider nicht ganz,also du meinst ich konnte es ohne parameter machen? In der angabe steht dass ich doch parameter verwenden soll,also ich vermute ich verwende die falsche parameter? Ich sollte wahrscheinlich die Globale variable verwenden.
 
Und denn letzten tipp verstehe ich leider nicht ganz,also du meinst ich konnte es ohne parameter machen? In der angabe steht dass ich doch parameter verwenden soll,also ich vermute ich verwende die falsche parameter? Ich sollte wahrscheinlich die Globale variable verwenden.
Dann solltest du die Nutzereingabe in der main durchführen, die Eingabe an deine Methode übergeben und in der Methode der globalen Variable zuweisen.
 
So ist es, entweder in der setPassword Methode selbst das Passwort einlesen lassen (In.readString() und so) und keine Parameter übergeben.
oder das Passwort an die Methode als parameter übergeben und in der Methode slebst nichts mehr einlesen.
Beides gleichzeitig macht keinen Sinn.

Übrigens, und das ist jetzt mehr eine Shcönheitssache:
Sagen wir, Jemand gibt ein unpassendes Passwort ein.
Jemand könnte bspw. ein 10 Zeichen langes passwort ein.
Dann solltest du ZUERST prüfen ob es ein zulässiges Passwort ist. Und erst danachdas Passwort, falls passend, ändern.

So wie du es aktuell hast, wird erst das neue Passowrt gesetzt . und hinterher sagst du dann "Öh, passwort hat unpassende Länge"
Aber geändert ist es trotzdem.

Insofern würde ich dir raten:
Mach einfach eine fallunterscheidung.
Falls passwortlänge==6, dann ändere das Passwort.
Ansonsten (else) gib deine "Fehlermeldung" aus.

Dadurch wird das Passwort wirklich nur geändert wenn es auch die richtige Länge hat.

In der checkpassword methode das gleiche Spiel, entweder in der methode password einlesen und keine parameter. oder in der methode wird ncihts eingelesen und das passwort wird als parameter an die methode übergeben.
 
Okay ich habe es jetzt so probiert;
Java:
import inout.*;
public class test {


    static String password;

    public static String setPassword(String password) {
        return password;

    }
    public static boolean checkPassword(String password) {
        return password.equals(password);
    }

    public static void main(String[] args){
        Out.println("Please set a password");
        password = In.readString();
        if(password.length() == 6) {
            Out.println(setPassword(password));
        } else {
            Out.println("Password is not valid");
        }
            Out.println("Please enter the password");
            password = In.readString();
            Out.println(checkPassword(password));

    }
}

Habe das problem jetzt,es wird immer true zuruckgeliefert,egal ob die Passworte ander sind.Das kann halt nur bedeuten das in der checkpassword methode password mit sich selbs vergliechen wird.Ich habe es auch mit password.equals(setPassword(password)) probiert,immer noch das selbe Problem
 
public static boolean checkPassword(String password) {
return password.equals(password);
}
wenn du auf das PW in der klassen variablen zugreifen willst musst du this benuten.


ich würde einen andern Bezeichner benutzen um diesen Fehler aus dem weg zugehen.


public static boolean checkPassword(String logginPw) {
return logginPw.equals(password);
}


Thema Sichtbarkeit von Variablen würde ich sagen. Lokale und Klassen Variablen bitte auseinander halten.
in diesem fall ist "password" lokal, und "this.password" das globale (Klasse)
 
Zuletzt bearbeitet:
was soll eigentlich das?

public static String setPassword(String password) {
return password; }

du gibst genau das zurück was du übergibst
 
Also nur einmal paar Verständnis-Dinge:

Java:
    static String password;

    public static String setPassword(String password) {
        return password;
    }

Du hast eine Klassenvariable password.
Dann kommt eine Klassenmethode setPassword. In einer Klassenmethode könntest Du auf eine statische Variable zugreifen, aber jetzt passiert folgendes:
Der Parameter heißt genau so, wie die Klassenvariable. Damit versteckt dieser Parameter die Klassenvariable.
Dein return gibt nun den parameter zurück und verändert hast Du eh nichts ...

Da wäre so etwas zu erwarten:
Java:
    static String password;

    public static void setPassword(String password) {
        test.password = password;
    }

test ist der Name der Klasse - entgegen allen Naming Standards! Aber auf die versteckte Klassenvariable kannst Du per Klassenname.Klassenvariable zugreifen. Und ein Setter gibt nichts zurück, daher void als Rückgabe.

Java:
    public static boolean checkPassword(String password) {
        return password.equals(password);
    }

Hier hast Du das gleiche: Du vergleichst den Parameter password mit dem Parameter password ... ja, wenn man etwas mit sich selbst vergleicht, dann sollte es wohl gleich sein....

Edit: Hatte versehentlich abgeschickt ehe ich fertig war ... daher noch zu Ende geschrieben ...
 

Zurück
Oben