@GhastCraftHD: Bei Anmeldedaten sollte man den Benutzer immer erst beide Angaben, Name *und* Passwort, machen lassen, bevor man die prüft. Wenn man nämlich beim Namen den Benutzer schon wissen lässt ob man ihn kennt oder nicht, dann kann ein Angreifer den Namen und das Passwort getrennt raten. Wenn man beides zugleich prüft, sind auch die Namen schon besser gegen raten geschützt.
Wie man etwas wiederholt hat Jankie ja bereits gezeigt: Eine Schleife. Wenn man beim Schleifeneintritt nicht weiss wie oft die Schleife wiederholt werden wird und auch noch keinen Abbruchbedingung an der Stelle formulieren kann, dann nimmt man eine ”Endlosschleife” (``while True:``). Die kann man dann im Schleifenkörper mit der ``break``-Anweisung verlassen. Das machst Du im Grunde ja bereits für das Rechnen selbst. Dann musst es halt auch für die Aktivitäten machen.
Mit ”WebTigerJython” programmierst Du kein Python sondern eine Sprache die Python sehr ähnlich ist. Und die Turtle-Befehle dort sind auch nicht die gleichen wie die vom `turtle`-Modul aus der Python-Standardbibliothek. Warum TigerJython an der Stelle abweicht ist mir ein Rätsel. Die haben da dann auch Java-Namenskonventionen. Bäh.
Was soll die 4 bei `password4`? Man nummeriert in aller Regel keine Namen. Dann will man entweder bessere Namen oder gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste.
Der Code der ausgeführt werden soll wenn der Benutzer die richtigen Zugangsdaten eingegeben hat, muss entweder dort stehen wo auch das ``print("Zugriff gewährt!")`` steht, oder man verschiebt den Code in eine Funktion und bricht die ab, falls falsche Zugangsdaten eingegeben wurden.
Man hat sowieso in der Regel immer eine Funktion, denn auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst und deren Ausführung durch ein ``if __name__ == "__main__":`` bedingt wird. Auch wenn das im Webeditor von TigerJython nicht so viel Sinn macht, funktioniert es dort, und man sollte sich das IMHO gleich angewöhnen.
Statt `activity` mit drei Werten zu vergleichen und das mit ``or`` zu Verknüpfen würde man eher den ``in``-Operator mit einer Sequenz mit den Werten für den Test verwenden.
Bei solchen Benutzereingaben bietet es sich an die in Kleinbuchstaben zu wandeln und mit Worten in Kleinbuchstaben zu vergleichen, damit der Benutzer es einfacher hat und nicht auf Gross-/Kleinschreibung achten muss.
Namen sollte man nicht kryptisch abkürzen. Wenn man `number` oder `operator` meint, sollte man das auch schreiben.
In den ``if``/``elif``-Zweigen steht fast überall das gleiche, es unterscheided sich nur der Operator und die Zeichenkette mit dem Operator bei der ersten Ausgabe. Die Zeichenkette kann man sich sparen weil `oper` ja bereits diesen Wert hat, womit das erste `print()` in jedem Fall gleich ist. Wenn man in den Zweigen nur das Ergebnis berechnet, dann kann man beide `print()`-Aufrufe *einmal* *hinter* das ganze ``if``-Konstrukt schreiben.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
def main():
username = input("Bitte geben sie ihren Benutzernamen ein: ")
password = input("Bitte gib dein Passwort ein, {}: ".format(username))
if not (username == "Benutzer 1" and password == "passwort"):
print("Falsche Zugangsdaten!")
return
print("Zugriff gewährt!")
while True:
activity = input("Was möchtest du jetzt machen? ").lower()
if activity in ["tr", "rechnen", "taschenrechner"]:
print("Okay, jetzt wird gerechnet!")
while True:
number_a = int(input("Gib die erste Zahl ein: "))
operator = input(
"Welche Rechenoperation soll durchgeführt werden?"
" (+,-,/,*): "
)
number_b = int(input("Gib die zweite Zahl ein: "))
#
# TODO ``if``-Konstrukt durch Wörterbuch ersetzen, welches
# Operator auf passende Funktion aus dem `operator`-Modul
# abbildet.
#
if operator == "+":
result = number_a + number_b
elif operator == "-":
result = number_a - number_b
elif operator == "/":
result = number_a / number_b
elif operator == "*":
result = number_a * number_b
else:
result = None
if result is None:
print("Deine Eingaben sind nicht gültig!")
else:
print(
"Deine Rechnung: {} {} {}.".format(
number_a, operator, number_b
)
)
print("Ergebnis: {}.".format(result))
jein = input(
"Willst du weiter rechnen, oder etwas anderes machen?"
).lower()
if jein in ["nein", "stopp"]:
break
if __name__ == "__main__":
main()
Die `main()`-Funktion macht hier aber viel zu viel, das sollte man dringend sinnvoll auf Funktionen aufteilen.
Und es fehlt Fehlerbehandlung. Wenn der Benutzer beispielsweise keine Zahlen eingibt, oder wenn er Division auswählt und als zweiten Operanden eine 0 eingibt.
PS:Oi, Du hast mein Avatar-Bild geklaut!
