Seite 1 von 1

ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 12:33
von Sam123
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!")

Re: ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 12:44
von __deets__
Deine Eingabe ist ein String. Und du vergleichst den mit einer Zahl. Dabei kommt nichts sinnvolles rum. Wandel die Eingabe in eine Zahl.

Re: ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 14:17
von Sam123
Alles klar, Danke!

Re: ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 15:34
von __blackjack__
@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()

Re: ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 19:47
von Sam123
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)))

Re: ganz simpler Kopfrechner

Verfasst: Freitag 20. November 2020, 21:41
von bb1898
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.

Re: ganz simpler Kopfrechner

Verfasst: Dienstag 24. November 2020, 11:12
von narpfel

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 = '

Re: ganz simpler Kopfrechner

Verfasst: Dienstag 24. November 2020, 11:38
von __blackjack__
@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

Re: ganz simpler Kopfrechner

Verfasst: Dienstag 24. November 2020, 11:49
von narpfel
@__blackjack__: Das ist neu in Python 3.8.