2017-06-30 1 views
1

Ich habe den folgenden Code und in der Login-Funktion ist die Ausgabe fehlerhaft (ein logischer Fehler). Es druckt im Grunde "ungültiger Benutzername und Passwort", bis es zur rechten kommt, und druckt dann "korrekte Anmeldung".Spezifischer Einrückungsfehler in der verschachtelten if-Anweisung in der for-Schleife

fehlerhafte Ausgabe:

Zum Beispiel mit den Testdatum: user3 und Pass3, der Ausgang ist:

*****LOGIN SCREEN****** 
Username: user3 
Password: pass3 
invalid username or password 
invalid username or password 
correct login 
>>> 

Hier ist der Code in Frage, mit Bezug auf den LOGIN Funktion:

usernames=["user1","user2","user3"] 
passwords=["pass1","pass2","pass3"] 

def main(): 
    mainmenu() 


def mainmenu(): 
    print("****MAIN MENU****") 
    print("=======Press L to login :") 
    print("=======Press R to register :") 
    choice1=input() 
    if choice1=="L" or choice1=="l": 
     login() 
    elif choice1=="R" or choice1=="r": 
     register() 
    else: 
     print("please make a valid selection") 

usernames=["user1","user2","user3"] 
passwords=["pass1","pass2","pass3"] 

def login(): 
    print("*****LOGIN SCREEN******") 
    username=input("Username: ") 
    password=input("Password: ") 
    for index_of_current_user, current_user in enumerate(usernames): #enumerate allows to you to go throw the list and gives to you the current element, and the index of the current element 
    if username == current_user and passwords[index_of_current_user] == password: #since the two list are linked, you can use the index of the user to get the password in the passwords list 
     print("correct login") 
    else: 
     print("invalid username or password") 

def register(): 
    print("*****REGISTRATION****") 
    username=input("Enter a username:") 
    password=input("Enter a password:") 
    users_pass[username] = password 
    answer=input("Do you want to make another registration?") 
    if answer=="y": 
    register() 
    else: 
    registration_details() 

def registration_details(): 
    print(usernames) 
    print(passwords) 

main() 

ich suche ein) Eine Lösung und, um das Problem zu beheben, so dass es druckt nur „richtige Login“, sobald das richtige Paar von Benutzernamen und Passwörtern statt Schleifen und Drucken jeder auf der Suche nach

b) eine Erklärung, warum die Einrückung oder was auch immer hier falsch ist, funktioniert nicht - da die Logik (in einer Sprache wie VB.Net) gut ist.

Ich würde es vorziehen, wenn das Problem ohne zusätzlichen Code (und eine sehr einfache Lösung) behoben werden könnte, aber vielleicht ist die eleganteste Lösung eine Flagge. Das heißt, wenn das Problem nicht nur bei Einrückung oder ähnlichem liegt, habe ich es verpasst.

+1

Sie führen 'else: print ("ungültig ..") 'für jeden fehlgeschlagenen Test, also ja, du bekommst diese Ausgabe. –

+0

können Sie eine Lösung vorschlagen? Bitte beachten Sie, dass, obwohl jemand mich sehr freundlicherweise abgelehnt hat, dies eine gültige Frage ist, dass ich es aus einem VB.Net-Hintergrund komme, in dem diese Logik/Code-Struktur klingen würde – MissComputing

+0

Nur ein Vorschlag, anstatt zwei Listen zu verwenden Speichern Sie Benutzernamen und Passwörter, verwenden Sie stattdessen ein Wörterbuch. –

Antwort

1

In Ihrem Login() Funktion, drucken Sie für jedes Element der Liste, so können Sie nach der Schleife drucken tun:

def login(): 
    print("*****LOGIN SCREEN******") 
    username=input("Username: ") 
    password=input("Password: ") 
    correct_login = False 
    for index_of_current_user, current_user in enumerate(usernames): #enumerate allows to you to go throw the list and gives to you the current element, and the index of the current element 
    if username == current_user and passwords[index_of_current_user] == password: #since the two list are linked, you can use the index of the user to get the password in the passwords list 
     correct_login = True 
     break 
    if(correct_login): 
    print("correct login") 
    else: 
    print("invalid user name or password") 
2

Sie sehen dies aufgrund der else-Anweisung in Ihrer Login-Funktion. Was Ihr Code in dieser Funktion gerade macht, ist das Durchschleifen, die Überprüfung, ob der Benutzername und das Passwort dem aktuellen Wert entsprechen (d. H., Vergleichen Sie user1 == user2), wenn sie nicht gleich sind, dann drucken Sie automatisch den ungültigen Benutzernamen.

Stattdessen sollten Sie warten, bis Sie alle Werte vergleichen, um die ungültige Benutzername oder Kennwortnachricht auszudrucken. Außerdem können Sie - anstatt Ihre Werte weiter zu durchlaufen - eine Pause hinzufügen, um die for-Schleife zu stoppen, sobald der gültige Wert gefunden wurde. Ihre Login-Funktion würde wie folgt aussehen:

def login(): 
    print("*****LOGIN SCREEN******") 
    username=input("Username: ") 
    password=input("Password: ") 
    found = False 
    for index_of_current_user, current_user in enumerate(usernames): #enumerate allows to you to go throw the list and gives to you the current element, and the index of the current element 
    if username == current_user and passwords[index_of_current_user] == password: #since the two list are linked, you can use the index of the user to get the password in the passwords list 
     print("correct login") 
     found = True 
     break 
    if found == False: 
    print("invalid username or password") 

Das gibt Ihnen nur 1 Instanz entweder richtig oder Login Benutzername oder Passwort ungültig.

+0

Das ist das Problem zu lösen, ich werde upvote, aber ich sage nur, dass es keine Notwendigkeit zu tun gefunden == False in einem wenn, False ist bereits ein boolean, und ist anders von True, also fragst du einfach ob (gefunden) oder, wenn (nicht gefunden), sogar besser aussehen :), wenn du willst, sehe meine Antwort oben und du wirst sehen –

3

Sie können Ausnahmen verwenden, um die Anmeldung auf diese Weise zu schreiben.

def login(): 
    print("*****LOGIN SCREEN******") 
    username=input("Username: ") 
    password=input("Password: ") 
    try: 
    index = usernames.index(username) 
    if password == passwords[index]: 
     print("correct login") 
    else: 
     print("invalid username or password") 
    except: 
    print("invalid username or password") 
+0

das ist eine interessante Alternative! Ich habe nie darüber nachgedacht –

Verwandte Themen