Simpler Taschenrechner.

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
BattleCookie
User
Beiträge: 5
Registriert: Samstag 24. November 2018, 16:57

Hallo zusammen,
ich lerne erst seit kurzem Python und habe mich mit einem simplen Taschenrechner versucht:

https://www.file-upload.net/download-13 ... er.py.html

Es ist selbst programmiert und über verbesserungsvorschläge oder Ideen wie ich noch andere Funktionen hinzufügen könnte würde ich mich sehr freuen.

~BattleCookie
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Am besten postest Du die zwanzig Zeilen Code hier direkt. Dann kann sie auch gleich jeder lesen:

Code: Alles auswählen

import math

eingabe0 = input("Was möchtest du Rechnen? Standart oder Wurzel?: ")

if (eingabe0 == "standart"):

    eingabe = int(input("Jetzt Zahl eingeben: "))

    eingabe2 = int(input("Jetzt zweite Zahl eingeben: "))

    eingabe3 = input("Jetzt Rechnenzeichen eingeben: ")

    if (eingabe3 == "+"):
               summe = eingabe+eingabe2

    if (eingabe3 == "-"):
               summe = eingabe-eingabe2

    if (eingabe3 == "/"):
               summe = eingabe/eingabe2

    if (eingabe3 == "*"):
               summe = eingabe*eingabe2

if (eingabe0 == "wurzel"):

  eingabe = int(input("Jetzt Zahl eingeben: "))
  
  summe = math.sqrt(eingabe)
    
                 
print(summe)               
Variablennamen sollte aussagekräftig sein, eingabe123 sind das nicht. Um was für eine Eingabe handelt es sich? Eine Zahl? Eine mathematische Operation? Falsche Namen sind verwirrend. Nur eine der Operationen ist eine Summe.

Die Klammern um die if-Bedingungen sind allesamt überflüssig. Wenn je nur eine Bedingung einer if-Kaskade wahr sein kann, nimmt man ›elif‹. Leerzeilen sollen dem Lesefluß helfen, wenn aber jede zweite Zeile eine Leerzeile ist, dann bewirkt das das Gegenteil.

Was Du noch erweitern könntest: mit Fließkommazahlen rechnen (machst Du bei Wurzel und / sowieso schon). Erst die Operation abfragen, dann kannst Du anhand dessen entscheiden, ob Du zwei oder nur eine Zahl brauchst. Damit wird die erste Unterscheidung nach Standard und Wurzel überflüssig.
BattleCookie
User
Beiträge: 5
Registriert: Samstag 24. November 2018, 16:57

Ok. Danke für die Tips. Nur das mit elif hat beim ersten mal nicht funktioniert ich probiers noch mal aus. Danke auf jeden Fall. ;)
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

BattleCookie hat geschrieben: Samstag 24. November 2018, 17:03 Hallo zusammen,
ich lerne erst seit kurzem Python und habe mich mit einem simplen Taschenrechner versucht:
[...]
Es ist selbst programmiert und über verbesserungsvorschläge oder Ideen wie ich noch andere Funktionen hinzufügen könnte würde ich mich sehr freuen.
[...]
Das Programm tut bei korrekter Eingabe das gewünschte. Das ist gut. Die print-Funktion wird für beide Varianten verwendet un steht deshalb
in einem Programmteil, der von beiden Varianten verwendet wird, anstatt das sie im if-block jeder Variante naufgerufen wird. Das ist gut so.
Hier noch einige Verbesserungsvorschläge:

1. Ausdrucksvollere Variablennamen wären vermutlich 'Zahl1', 'Zahl2', 'Operator',
das wurde schon in einem anderen Post angemerkt.
Aber selbst wenn du deine Namen beibehalten willst, solltest du 'Eingabe1' anstatt der Variablen 'Eingabe' verwenden.
Noch sinnvoller wäre es, die erste Eingabe mit 'Eingabe1' zu bezeichnen, die zweite mit 'Eingabe2', ...
Vermutlich hast du das auch so begonnen, aber da noch keine Auswahl zwischen 'standart' und 'wurzel' gehabt.
Das hast du erst später eingeführt und damit wurde die erste Eingabe zur 'Eingabe0'.

2. Eine Leerzeile nach jeder Zeile Code solltest du unterlassen. Das bringt nichts, außer dass man nur halb soviel
Codezeilen auf den Bildschirm bringt, was das Lesen erschweren kann.

3.. Wenn man nach Start des Programmes liest "Was möchtest du Rechnen? Standart oder Wurzel?: ",
woher soll man nun wissen, was man jetzt eintippen muss? Insbesondere ist unklar, das man die Wörter,
die man jetzt eintippen muss, mit kleinen Anfangsbuchstaben eintippen muss. Das müsste eigentlich schon
im Text zur Eingabeaufforderung klar gestellt werden. Außerdem solltest du die Eingabe für einen Benutzer
einfach machen. Warum muss er ganze Wörter eintippen? Also besser "Was möchtest du Rechnen? [s]tandard oder [w]urzel?: "
oder auch "Was möchtest du Rechnen? Standard(1) oder Wurzel(2)?: Die korrekte Rechtschreibung ist 'Standard', also mit weichem d am Schluss

4. Was passiert eigentlich, wenn der Benutzer eine nicht vorgesehene Eingabe macht. zum Beispiel 'Wurzel' statt 'wurzel'?
Da sollte der Benutzer eine sinnvolle Fehlermeldung bekommen und nicht einen Programmabsturz.

5. Wenn zwischen mehreren Varianten ausgewählt werden kann, sollte, wie ebenfalls in einem anderen Post bemerkt wurde, 'if ... elif ...'
verwendet werden. Das macht es für den Leser wesentlich klarer.
Außerdem kann im else-Zweig dann nicht der Fall einer ungültigen Eingabe behandelt werden.
BattleCookie
User
Beiträge: 5
Registriert: Samstag 24. November 2018, 16:57

Hallo zusammen.
Ich habe mir die Verbesserungsvorschläge zu Herzen genommen und das ist dabei raus gekommen:

Code: Alles auswählen

import math
Rechnenart = input("Was möchtest du Rechnen? Standard[1] oder Wurzel[2]?: ")
if (Rechnenart == "1"):
    Zahl1 = int(input("Jetzt Zahl eingeben: "))
    Zahl2 = int(input("Jetzt zweite Zahl eingeben: "))
    Rechnenzeichen = input("Jetzt Rechnenzeichen eingeben: ")
    if (Rechnenzeichen == "+"):
               summe = Zahl1+Zahl2
    if (Rechnenzeichen == "-"):
               summe = Zahl1-Zahl2
    if (Rechnenzeichen == "/"):
               summe = Zahl1/Zahl2
    if (Rechnenzeichen == "*"):
           summe = Zahl1*Zahl2
    print(summe)               
    input("Zum Beenden Enter-Taste drücken")       
if (Rechnenart == "2"):
  Zahl= int(input("Jetzt Zahl eingeben: ")) 
  summe = math.sqrt(eingabe)                
  print(summe)               
  input("Zum Beenden belibige Taste drücken")
else:
    print("Ungültige Rechnenform oder Zeichen bitte versuche es erneut")
Auch hier würde ich mich über positive Kritik freuen.
Dazu habe ich das Problem, dass sich das Fenster nach dem Wurzel anzeigen direkt schließt. Hat jemand eine Idee wie ich das verhindern kann?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@BattleCookie:

Variablen, Funktionen und Methoden schreibt man in Python klein_mit_unterstrich, hier also bspw. rechenart statt Rechenart, oder zahl1, zahl2, usw.

Die Bedingungen solltest du mit if, elif, else auswerten, da es unnötig ist wenn der Benutzer z.B. "+" als Rechenart eingibt, auch noch die anderen Bedingungen zu prüfen, und genau das tut Python wenn du überall if verwendest, statt in allen folgenden Bedingunen elif und zu letzt else verwendest.

Die Klammern () bei den Bedingungen sind in Python unüblich, statt if (rechenart == "1") einfach if rechenart == "1".

Weiterhin ungünstig ist, dass du das Programm jedes Mal erneut starten musst. Schöner wäre hier eine zusätzliche while-Schleife, damit bei ungültiger Eingabe der Benutzer die Möglichkeit hat eine erneute Eingabe zu tätigen ohne das Programm erneut starten zu müssen, oder falls er einfach weitere Rechnungen durchführen möchte.

Zu deinem Fehler: du hinterlegst den Wert der Benutzereingabe beim Wurzelrechnen in "Zahl", wertest dann in der Wurzelberechnung "eingabe" aus, eingabe wurde aber nie deklariert und ist Python unbekannt. Somit kommt es zum Fehler.
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@BattleCookie: Du startest Dein Konsolenprogramm mit Doppelklick, was falsch ist, für ein Konsolenprogramm, denn dafür braucht man eine Konsole (Eingabeaufforderung, cmd.exe).
Einrückungen sind in Python wichtig, weshalb man hier auch sorgfältig sein muß. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4, mal 2, mal viel zu viele.

Was hast Du bei elif ausprobiert, was nicht funktioniert hat?
BattleCookie
User
Beiträge: 5
Registriert: Samstag 24. November 2018, 16:57

Sirius3 hat geschrieben: Sonntag 25. November 2018, 12:17 @BattleCookie: Du startest Dein Konsolenprogramm mit Doppelklick, was falsch ist, für ein Konsolenprogramm, denn dafür braucht man eine Konsole (Eingabeaufforderung, cmd.exe).
Einrückungen sind in Python wichtig, weshalb man hier auch sorgfältig sein muß. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4, mal 2, mal viel zu viele.

Was hast Du bei elif ausprobiert, was nicht funktioniert hat?

Code: Alles auswählen

import math
while True:
    rechnenart = input("Was möchtest du Rechnen? Standard[1] oder Wurzel[2]?: ")
    if rechnenart == "1":
        zahl1 = int(input("Jetzt Zahl eingeben: "))
        zahl2 = int(input("Jetzt zweite Zahl eingeben: "))
        rechnenzeichen = input("Jetzt Rechnenzeichen eingeben: ")
        if rechnenzeichen == "+":
               summe = zahl1+zahl2
               print(summe)
        if rechnenzeichen == "-":
               summe = zahl1-zahl2
               print(summe)
        if rechnenzeichen == "/":
               summe = zahl1/zahl2
               print(summe)
        if rechnenzeichen == "*":
           summe = zahl1*zahl2
           print(summe)
        else:
           print("Falsche Eingaben bitte versuche es erneut.")
    if rechnenart == "2":
        zahl= int(input("Jetzt Zahl eingeben: ")) 
        summe = math.sqrt(zahl)                
        print(summe)               
    else:
        print("Ungültige Rechnenform bitte versuche es erneut")
    verlassen = input("Zum verlassen tippe leave ein: ")
    if verlassen == "leave":
        exit(0)
    if verlassen != "leave":
        print("Zum neustart Enter drücken.")
    
Ich weiß nicht mehr genau was ich mit elif machen wollte aber ich glaube das brauche ich so auch nicht.
Ich habe jetzt noch ein paar Funktionen dazu gemacht, wie z.B. die Fehler Meldungen und das das Programm mit "leave" verlassen werden kann.
~BattleCookie
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@BattleCookie: jetzt hast Du einige Fehler eingebaut. weil Du elif genau so brauchst.
`exit` hat in einem normalen Programm nichts zu suchen. Hier verläßt Du die Schleife einfach per `break`.
BattleCookie
User
Beiträge: 5
Registriert: Samstag 24. November 2018, 16:57

Sirius3 hat geschrieben: Sonntag 25. November 2018, 13:13 @BattleCookie: jetzt hast Du einige Fehler eingebaut. weil Du elif genau so brauchst.
`exit` hat in einem normalen Programm nichts zu suchen. Hier verläßt Du die Schleife einfach per `break`.
@Sirius3: Was wäre denn wenn ich das ganze so mache:

Code: Alles auswählen

import math

def standard():
    zahl1 = int(input("Jetzt Zahl eingeben: "))
    zahl2 = int(input("Jetzt zweite Zahl eigeben: "))
    operator = input("Jetzt Rechnenzeichen eingeben: ")
    if operator == "+":
        summe = zahl1+zahl2
        print(summe)
    elif operator == "-":
        summe = zahl1-zahl2
        print(summe)
    elif operator == "/":
        summe = zahl1/zahl2
        print(summe)
    elif operator == "*":
       summe = zahl1*zahl2
       print(summe)
    else:
       print("Falsche Eingaben bitte versuche es erneut.")

def wurzel():
    zahl = int(input("Jetzt Zahl eingeben: "))
    summe = math.sqrt(zahl)
    print(summe)

while True:
    rechnenart = input("Was möchtest du Rechnen? Standard[1] oder Wurzel[2]?: ")
    if rechnenart == "1":
        standard()
    elif rechnenart == "2":
        wurzel()
    else:
        print("Ungültige Rechnenform bitte versuche es erneut.")
    verlassen = input("Zum verlassen tippe leave ein.")
    if verlassen == "leave":
        break
    if verlassen != "leave":
        print("Neustart")
    
    
Wiedermal würde ich mich über Verbesserungsvorschläge freuen.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich würde statt "rechenart" einfach "benutzer_wahl" o.ä. verwenden, worin es zusätzlich möglich ist das Programm zu verlassen. Dann spart man sich die Deklaration weiterer Variablen. (Hier "verlassen"). Es muss außerdem nicht geprüft werden, ob verlassen != "leave" ist, da das sowieso immer eintritt wenn "verlassen" False ergibt.
When we say computer, we mean the electronic computer.
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BattleCookie: Du könntest Dich für die Weiterentwicklung auch mal mit Wörterbüchern (`dict`) beschäftigen, und das Funktionen auch Werte sind, und das es im `operator`-Modul in der Standardbibliothek für alle Operatoren in Python auch eine Funktion gibt. Damit kannst Du die ``if``/``elif``-Zweige in `standard()` ersetzen, in dem Du Zeichenketten mit den Rechenoperationssymbolen über ein Wörterbuch auf die entsprechenden Funktionen abbildest.

Fehlerbehandlung wäre auch nicht schlecht, wenn der Benutzer etwas anderes eingibt, als Du erwartest. Die machen das ziemlich oft die doofen Benutzer. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten