Seite 1 von 1

CalculateIt

Verfasst: Mittwoch 24. September 2008, 23:37
von Mugen
Hallo. :)

Bin derzeit Python-Anfänger, habe jedoch schon ein kleines Progrämmchen geschrieben (Projekt ruht schon etwas länger, vertiefe das Gelernte momentan eher).

Wie man der Readme entnehmen kann, ist das ganze natürlich noch nicht final, denn ich plane noch einige Funktionen sowie später eine GUI. (Ohne die sind Taschenrechner ja recht nutzlos. :P)

Kompiliert habe ich das Ganze diesmal allerdings nicht, da hier wohl jeder den Interpreter installiert hat.

Download

Verfasst: Donnerstag 25. September 2008, 00:59
von abgdf
Das Problem mit Taschenrechnern in Python ist, daß der interaktive Modus von Python selbst ein ganz guter Taschenrechner ist (wenn man immer nur float-Werte in den "print"-Anweisungen verwendet).

Gruß

Verfasst: Donnerstag 25. September 2008, 12:57
von BlackJack
@Mugen: Die gegenseitige Rekursion zwischen `weiter()` und `main()` ist unsauber. Der Aufrufstack wächst bei jeder durchgeführten Operation weiter an.

`schleife` in `weiter()` ist sinnlos.

Das alle Aktionen doppelt aufgeführt werden, um Gross- und Kleinschreibung bei den Kommandos zu erlauben ist unschön. Insbesondere bei 'info' fasst man sich an den Kopf. Man könnte ja stattdessen die `eingabe` auch in Kleinbuchstaben umwandeln und braucht dann immer nur noch auf *eine* Schreibweise prüfen. Ein Dictionary, dass das Kommando auf die jeweilige Funktion abbildet, bietet sich hier an.

Die Operationen enthalten zu viele Wiederholungen. Wenn alle Operationen die Eingabe von zwei Zahlen verlangen, sollte man das *einmal* programmieren und nicht in jeder Operation erneut.

Verfasst: Freitag 26. September 2008, 19:34
von roschi
ich hab sowas auch schonmal gemacht.
(allerdings mit gui und ein paar mehr funktionen):
http://python-tools.ath.cx/tools/
das ding heißt 'MultiCalc'.

ist allerdings schon laenger her ->
der code ist vielleicht an manchen stellen etwas seltsam :(

ihr braucht hier dazu auch kein feedback zu geben. (ist ja schließlich nicht mein thread) ich kann aber gern dazu spaeter noch einen neuen eroeffnen.

vielleicht hilft es dir ja, Mugen.

mfg
roschi

EDIT:
das benoetigte modul 'mixed' gibts hier:
http://pypi.python.org/pypi/mixed/0.2.1
/EDIT

Verfasst: Freitag 31. Juli 2009, 14:49
von Mugen
So, hab' das Ganze etwas entrümpelt und nach Python 3 portiert.

http://paste.pocoo.org/show/131896/ - Hauptprogramm

http://paste.pocoo.org/show/131897/ - Modul mit den Funktionen

Kritik und Verbesserungsvorschläge sind natürlich erwünscht.

Verfasst: Freitag 31. Juli 2009, 14:56
von EyDu
Du solltest zunächst BlackJacks Ratschläge von vor einem Jahr befolgen.

Verfasst: Freitag 31. Juli 2009, 15:04
von snafu
Zu dem Lizenzvermerk: Eigentlich kommt das in jede Datei und eigentlich packt man das auch als Kommentar rein und nicht als Docstring. Der Docstring beschreibt das Modul / die Funktion / die Klasse.

Verfasst: Freitag 31. Juli 2009, 15:09
von cofi
Fuer deine if-/elif-Kaskade willst du eigentlich ein Dictionary.
Das ``_input`` in Zeile 58 will eigentlich ``choice`` heissen.

Generell: Bau dir lieber einen Parser fuer beliebigen Input. Das ist ja mehr Verwaltung als Taschenrechner.

Verfasst: Freitag 31. Juli 2009, 15:33
von jerch
@Mugen:
Und wenn ich (3+5)*9/(4-3) rechnen muß/will?

Bitte verstehe die Kritik nicht falsch, aber alles was Dein Programm macht, ist die Grundrechenarten mit netten "Hallo ich bins, die Addierfunktion"-Strings und der Aufforderung zur Zahleneingabe zu dekorieren. Ist nicht bös gemeint, nur der Sinn dahinter verschließt sich mir eben.

Verfasst: Freitag 31. Juli 2009, 15:41
von Mugen
jerch hat geschrieben:@Mugen:
Und wenn ich (3+5)*9/(4-3) rechnen muß/will?

Bitte verstehe die Kritik nicht falsch, aber alles was Dein Programm macht, ist die Grundrechenarten mit netten "Hallo ich bins, die Addierfunktion"-Strings und der Aufforderung zur Zahleneingabe zu dekorieren. Ist nicht bös gemeint, nur der Sinn dahinter verschließt sich mir eben.
[Zitat meinerseits]
Bin derzeit Python-Anfänger, habe jedoch schon ein kleines Progrämmchen geschrieben (Projekt ruht schon etwas länger, vertiefe das Gelernte momentan eher).

Das Programm soll nur mein Einstieg in die Programmierung sein und kein funktionales.
Wo wir schon dabei sind, versuche ich gerade die Methode von cofi umzusetzen.

Code: Alles auswählen

def rechne_mal_fuer_mich():
    2 + 2
choices = {'Rechnen': rechne_mal_fuer_mich()}

choice = input('Gib Rechnen ein: ')
if choice in choices:
    pass # hier soll er nun die eingabe überprüfen und dann eben die funktion aufrufen
else:
    print('Die Eingabe ist falsch.')

Verfasst: Freitag 31. Juli 2009, 15:45
von HWK
Für Division mit Rest bietet sich die Built-in-Funktion divmod() an.
Die main-Funktion sollte man so aufrufen:

Code: Alles auswählen

if __name__ == '__main__':
    main()
MfG
HWK

Verfasst: Freitag 31. Juli 2009, 16:04
von derdon
mugen: Die Funktion hat keinen Rückgabewert (genau genommen hat es den Standard-Rückgabewert None). Du hast das return-Statement vergessen.

Verfasst: Freitag 31. Juli 2009, 16:44
von Mugen
Ja, trotzdem weiß ich nicht, wie ich den mit dem Schlüssel verbundenen Wert aufrufen kann (durch eine Eingabe des Benutzers - Bsp: addition (Schlüssel) ist im Dictionary mit der Funktion addition (Wert) verbunden, durch die Eingabe von addition soll diese Funktion dann aufgerufen werden usw.).

Verfasst: Freitag 31. Juli 2009, 16:55
von EyDu
So:

Code: Alles auswählen

def addition(a, b):
    return a+b

def subtraction(a, b):
    return a+b

operators = {"addition":addition, "subtratkion":subtraction}
choice = input('Gib Rechnen ein: ')
operator = operators[choice]
a = input(...)
b = input(...)

print operator(a, b)
Im Beispiel ist jetzt alles ohne Fehlerbehandlung, aber so in etwas sollte es aussehen. Wie du Funktionen mit mehr oder weniger als zwei Operanden umsetzt ist eine schöne neue Aufgabe.

Die Funktionen "addition" und "subtraction" kann man sich hier auch sparen, wenn man das "operator"-Modul verwendet.

Verfasst: Freitag 31. Juli 2009, 17:48
von Mugen
Danke erst einmal.
So sieht's derzeit aus.
http://paste.pocoo.org/show/131927/
http://paste.pocoo.org/show/131928/

Die Operationen funktionieren nun, allerdings nicht das Aufrufen von info().
Wenn ich info eintippe erhalte ich nur die übliche Aufforderung zur Eingabe der Zahlen.

Verfasst: Freitag 31. Juli 2009, 18:12
von cofi
So hast du das schliesslich auch geschrieben. Der Prompt kommt unabhaengig von der Wahl und info wird sowieso falsch aufgerufen - seltsam, dass du von dem ``TypeError`` nichts sagst ;)

http://paste.pocoo.org/compare/131930/131928/

Verfasst: Freitag 31. Juli 2009, 18:40
von Mugen
Okay, jetzt klappt's. Vielen Dank. :)
Ich versuch mich dann mal daran, auch mehrere Zahlen eingeben zu können. :P
Hier übrigens der überarbeitete Code: http://paste.pocoo.org/show/131946/
http://paste.pocoo.org/show/131947/ (übrigens mit divmod - kann man die Ausgabe ebenfalls formatieren, damit die Klammern wegfallen?)