PDA

View Full Version : [Python] Calcolatrice


NickerX
06-10-2008, 19:29
Ciao a tutti! :D
Ho iniziato tempo fa a studiare il C, ma sono passato poco fa al Python e ora, per divertimento, sto creando una piccola calcolatrice. :fagiano: :fagiano:

Vorrei chidervi cosa ne pensate e se posso migliorarla.

Per ora ho integrato le semplici operazioni, la radice ( sqrt(x) ) e il valore assoluto ( fabs(x) ); gli altri tipi di calcolo li aggiungerò poi!! :D

Ecco il codice:
#!/usr/bin/env python

# PyCalc
# by NiCkErX
# 06/10/'08

from math import *

# Funzione visualizzazione menù
def visMenu():
print
print "Elenco operazioni possibili:"
print "0) Semplici Operazioni 1) Sqrt(x) 2) Fabs(x)"
print

# Funzione controllo scelta
def controlloScelta( s ):
if s == '0':
operazioni()
elif s == '1':
calcSqrt()
elif s == '2':
calcFabs()
else:
print "Scelta sbagliata. Inserirne un'altra."

# Funzione per semplici operazioni:
def operazioni():
print "Inserisci di seguito tutte le operazioni da svolgere. -1 per terminare:"
espr = float( input() )

while espr != -1:
print espr

scelta = raw_input( "Continuare? " )

if scelta == 'y' or 'Y':
operazioni()
elif scelta == 'n' or 'N':
espr = -1
else:
print "Scelta errata. Riprovare."

# Funzione per il calcolo della radice quadrata
def calcSqrt():
x = input( "Inserisci un numero di cui calcolare la radice quadrata: " )
print "La radice di", x, "è", sqrt( x )

# Funzione per il calcole del valore assoluto
def calcFabs():
x = input( "Inserisci un numero di cui calcolare il valore assoluto: " )
print "Il valore assoluto di", x, "è", fabs( x )

# Corpo Programma

print "\t\t\t\tPyCalc by NiCkErX"

visMenu()
scelta = raw_input( "Scegli una tra le operazioni disponibili, a per terminare l'esecuzione: " )

while scelta != 'a':
controlloScelta( scelta )

visMenu()
scelta = raw_input( "Scegli una tra le operazioni disponibili, a per terminare l'esecuzione: " )

print
print "Fine Esecuzione."
raw_input( "Premere un tasto per terminare..." )

cdimauro
06-10-2008, 20:45
Potresti provare a utilizzare i dizionari per implementare le scelte multiple, anziché le catene di if / elif / else. ;)

NickerX
06-10-2008, 22:40
Ho modificato la funzione "controllaScelta()" aggiungendo un dizoinario in questa maniera:

# Funzione controllo scelta
def controlloScelta( s ):
sceltaOperazioni = { '0' : operazioni(), '1' : calcSqrt(), '2' : calcFabs() }

sceltaOperazioni[ s ]

Devo anche correggere la funzione "operazione()" perché ha grandi problemi!! :eek:

cdimauro
07-10-2008, 08:40
Ho modificato la funzione "controllaScelta()" aggiungendo un dizoinario in questa maniera:

# Funzione controllo scelta
def controlloScelta( s ):
sceltaOperazioni = { '0' : operazioni(), '1' : calcSqrt(), '2' : calcFabs() }

sceltaOperazioni[ s ]

Devo anche correggere la funzione "operazione()" perché ha grandi problemi!! :eek:
Dovresti correggere anche controlloScelta:
# Funzione controllo scelta
def controlloScelta(s):
sceltaOperazioni = {'0' : operazioni, '1' : calcSqrt, '2' : calcFabs}

sceltaOperazioni[s]()
Nel dizionario bisogna mettere il nome della funzione, non la sua invocazione (con le parentesi tonde), che deve avvenire dopo. ;)

NickerX
07-10-2008, 20:23
Grazie mille, non avevo mai visto prima questa tecnica!! :D :D

Comunque dovrei aver eliminato ogni bug e ho anche migliorato un po' l'iterfaccia utente.

Codice aggiornato:
#!/usr/bin/env python

# PyCalc
# by NiCkErX
# 07/10/'08

from math import *

# Funzione visualizzazione menù
def visMenu():
print
print "Elenco operazioni possibili:"
print "0) Semplici Operazioni 1) Sqrt(x) 2) Fabs(x)"
print

# Funzione controllo scelta
def controlloScelta( s ):

sceltaOperazioni = { '0' : operazioni, '1' : calcSqrt, '2' : calcFabs }

sceltaOperazioni[ s ]()

# Funzione per semplici operazioni:
def operazioni():

print "Inserisci di seguito tutte le operazioni da svolgere:\n"
espr = input()

print
print "Il risultato è :", espr
print

s = raw_input( "Continuare? (Sì : y, No: n): " )

print

if s == 'y':
operazioni()
elif s == 'n':
return
else:
print "Scelta errata. Ritentare."

return

# Funzione per il calcolo della radice quadrata
def calcSqrt():

x = input( "Inserisci un numero di cui calcolare la radice quadrata: " )
print "\nLa radice di", x, "è", sqrt( x )

s = raw_input( "\nContinuare? (Sì : y, No: n): " )

while s != 'n':

x = input( "Inserisci un altro numero di cui calcolare la radice quadrata: " )
print "\nLa radice di", x, "è", sqrt( x )

s = raw_input( "\nContinuare? (Sì : y, No: n): " )

# Funzione per il calcole del valore assoluto
def calcFabs():

x = input( "Inserisci un numero di cui calcolare il valore assoluto: " )
print "\nIl valore assoluto di", x, "è", fabs( x )

s = raw_input( "\nContinuare? (Sì : y, No: n): " )

while s != 'n':

x = input( "Inserisci un altro numero di cui calcolare il valore assoluto: " )
print "\nIl valore assoluto di", x, "è", fabs( x )

s = raw_input( "\nContinuare? (Sì : y, No: n): " )

# Corpo Programma

print "\t\t\t\tPyCalc by NiCkErX"

visMenu()
scelta = raw_input( "Scegli una tra le operazioni disponibili, a per terminare l'esecuzione: " )

while scelta != 'a':
controlloScelta( scelta )

visMenu()
scelta = raw_input( "Scegli una tra le operazioni disponibili, a per terminare l'esecuzione: " )

print
print "Ciao!!"


Ho un solo problema, nella versione precendente, il corpo della funzione operazioni era, quasi completamente, un ciclo while, ma poiché uso input() per ricevere i dati dall'utente non riesco a gestire un valore sentinella. :muro:
Per ora ho optato per l'eliminazione del ciclo e dell'opzione di non fare calcoli nonostante sia stata scelta una data operazione. :mc:

Ci penserò un po' sopra!! :cool:

cdimauro
07-10-2008, 21:29
Puoi prender spunto da qui (http://www.hwupgrade.it/forum/showpost.php?p=24466527&postcount=64), se t'interessa.