ganz simpler Kopfrechner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Hallo,

ich bin ein Anfänger und wollte versuchen, einen ganz einfachen Kopfrechner zu programmieren.
Leider zeigt er immer an, dass meine Eingabe falsch ist. Woran liegt das?

Code: Alles auswählen

import random

zahl1 = random.randint(1,101)
zahl2 = random.randint(1,101)

ergebnis = zahl1 + zahl2

print(str(zahl1) + " + "  + str(zahl2) + " = ")
eingabe = input()
print("ERGEBNIS: " + str(ergebnis))
print("EINGABE: " + str(eingabe))
if eingabe == ergebnis:
    print("IHRE EINGABE WAR RICHTIG!")
else:
    print("IHRE EINGABE WAR FALSCH!")
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Deine Eingabe ist ein String. Und du vergleichst den mit einer Zahl. Dabei kommt nichts sinnvolles rum. Wandel die Eingabe in eine Zahl.
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Alles klar, Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sam123: Bist Du sicher mit der 101 als Obergrenze? Die ist *inklusive*. Also anders als bei `random.randrange()` oder `range()`.

Zeichenketten und Werte mit `str()` und ``+`` zusammenstückeln ist eher BASIC denn Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode oder f-Zeichenkettenliterale. Oder Du nutzt das `print()` mehrere Argumente entgegen nimmt und die selbst in Zeichenketten umwandelt und mit Leerzeichen getrennt ausgibt:

Code: Alles auswählen

    print(str(zahl_1) + " + " + str(zahl_2) + " = ")
    # <->
    print(zahl_1, "+", zahl_2, "=")
Wobei Du hier vielleicht gar kein `print()` verwenden willst, sondern das lieber als Prompt bei `input()` verwendest. Da braucht man das dann als *ein* Argument.

Warum schreist Du den Benutzer an? Das ist unhöflich. 🙂

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    zahl_1 = random.randint(1, 100)
    zahl_2 = random.randint(1, 100)
    ergebnis = zahl_1 + zahl_2
    #
    # TODO Fehleingaben ordentlich behandeln.
    #
    eingabe = int(input(f"{zahl_1} + {zahl_2} = "))
    print("Ergebnis:", ergebnis)
    print("Eingabe:", eingabe)
    print(
        "Ihre Eingabe war {}!".format(
            "richtig" if eingabe == ergebnis else "falsch"
        )
    )


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sam123
User
Beiträge: 35
Registriert: Freitag 20. November 2020, 12:25

Ist die erste Zeile einfach eine Kurzform der zweiten?

Code: Alles auswählen

eingabe = int(input(f"{zahl_1} + {zahl_2} = "))

eingabe = int(input("{0} + {1} = ".format(zahl_1, zahl_2)))
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

In einfachen Fällen wie diesem hier ja, aber nicht generell. Ein wichtiger Unterschied: für den f-String ("formatted string literal" in der Dokumentation) müssen die Werte der Variablen bekannt sein, wenn der String konstruiert wird. Du kannst nicht am Anfang Deines Programms schreiben

Code: Alles auswählen

GLEICHUNGSFORM = f"{zahl_1} + {zahl_2} = "
später die Werte vom Benutzer abholen und dann mit

Code: Alles auswählen

print(GLEICHUNGSFORM)
ausgeben.

Du kannst Entsprechendes mit der format-Methode sehr wohl machen:

Code: Alles auswählen

GLEICHUNGSFORM ="{0} + {1} = "
und dann später (vielleicht an verschiedenen Stellen im Programm, mit wechselnden Werten von zahl_1 und zahl_2):

Code: Alles auswählen

print(GLEICHUNGSFORM.format(zahl_1, zahl_2)
Wenn Du verschiedene Teile einer Datenstruktur ausgeben willst (mehrere Attribute ein und derselben Klassen-Instanz, mehrere Werte aus einem Dictionary oder aus einer Liste o.ä.), dann lässt sich das mit format auch kürzer formulieren. Fälle, in denen f-Strings etwas können, was mit format nicht geht, sind mir andererseits noch nicht begegnet.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

Code: Alles auswählen

>>> foo = 42
>>> f"{foo = }"
'foo = 42'
>>> "{foo = }".format(foo=foo)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'foo = '
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@narpfel: Also bei mir funktioniert auch schon das erste nicht:

Code: Alles auswählen

In [119]: foo = 42                                                              

In [120]: f"{foo = }"                                                           
  File "<fstring>", line 1
    (foo = )
         ^
SyntaxError: invalid syntax
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@__blackjack__: Das ist neu in Python 3.8.
Antworten