CalculateIt

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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
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ß
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.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du solltest zunächst BlackJacks Ratschläge von vor einem Jahr befolgen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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.')
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

mugen: Die Funktion hat keinen Rückgabewert (genau genommen hat es den Standard-Rückgabewert None). Du hast das return-Statement vergessen.
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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.).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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/
Benutzeravatar
Mugen
User
Beiträge: 17
Registriert: Mittwoch 24. September 2008, 23:28

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?)
Antworten