[PIPython] Approssimazione
Luigi Pantano
luigi.pantano
Ven 4 Feb 2005 20:54:36 CET
Ho creato per un mio amico geometra questo semplice programmino che
effettua dei banali calcoli sui triangoli.
Gli unici problemi che ho riscontrato nella creazione del programma è
stata l'approssimazione ad una determinata cifra dopo la virgola e l'uso
da parte della funzione seno di angoli espressi in centesimi
(solitamente usata dai geometri) e non in radianti!
Per tale ragione ho implementato una rudimentale funzione "approssima"
che svolge egregiamente il suo compito e due funzioni di conversione
"Radianti_Gradi_Centesimi", "Centesimi_Gradi_Radianti".
Spero che tale codice possa essere di aiuto.
P.S.
ogni consiglio sarà ben accetto.
-------------- parte successiva --------------
# Teorema
from math import *
from string import *
from os import system
c_centesimi = 1.11111111111
ordine_di_grandezza = 0.00001
def licenza():
'''Mostra i termini della licenza'''
print '''Teorema v1.1.20050403
Copyright (C) 2004 Luigi Pantano
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\n'''
def approssima(num):
valore_intero = int(num)
valori_dopo_la_virgola = str(num).split(".")[1][0:6] #prende gli ultimi 6 valori della parte decimale
if int(valori_dopo_la_virgola[-1]) > 5:
valori_dopo_la_virgola = str(float('0.' + valori_dopo_la_virgola) + float(ordine_di_grandezza))[:-1]
return valore_intero + float(valori_dopo_la_virgola)
else:
return valore_intero + float('0.' + valori_dopo_la_virgola[:-1])
def Centesimi_Gradi_Radianti(valore) :
if valore == 0 or valore == 200 or valore == 400 or valore == 600 or valore == 800:
print "\t\t** Angolo immesso di dimensioni errate!\n\t\t** Dimensione consentita diversa da k200 centesimali\n\t\t** Ripetere l\'immissione del dato..."
return "errato"
else :
return radians(valore / c_centesimi)
def Radianti_Gradi_Centesimi(valore) :
valore = (degrees(valore) * c_centesimi)
if valore >= 200 :
print "\t\t** Hai ottenuto un angolo PIATTO!\n\t\t** In un triangolo qualsiasi un tale risultato non e\' corretto\n\t\t** Controlla i dati immessi siano corretti."
if valore == 0 :
print "\t\t** Hai ottenuto un angolo NULLO!\n\t\t** In un triangolo qualsiasi un tale risultato non e\' corretto\n\t\t** Controlla i dati immessi siano corretti."
return valore
class Teorema(object) :
def __init__(self):
self.menu=['Teorema di Carnot',
'Teorema dei Seni (lato incognito)',
'Teorema dei Seni (angolo incognito)',
'Esci'
]
self.implementors=[self.TeoremaDiCarnot,
self.TeoremaDeiSeni1,
self.TeoremaDeiSeni2,
self.stop
]
self.numbers={}
self.running=True
def run(self):
while self.running:
s=self.menuSelection('Scegli un numero compreso tra')-1
self.implementors[s]()
def stop(self):
print "\n*** PROGRAMMA TERMINATO ***\n*** Vi auguro una Buona Giornata ***"
self.running=False
def printMenu(self):
system("cls")
licenza()
for idx,value in enumerate (self.menu):
print idx+1,'-',value
def menuSelection(self,message='Select'):
self.printMenu()
m=len(self.menu)
selection=m+1
while selection >m:
selection=input (message+' (1-%i):' % m)
return selection
def TeoremaDiCarnot(self):
risposta = True
while (risposta == True) :
print "\nApplicazione del Teorema di Carnot\n".upper()
B = input("\tlato triangolo (B) : ")
C = input("\tlato triangolo (C) : ")
a = "errato"
while a == "errato":
a = Centesimi_Gradi_Radianti(input("\tangolo compreso (a) : "))
print "\n\tLa misura del lato incognito e\' %f" % sqrt(pow(B,2) + pow(C,2) -2*B*C*cos(a))
if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : ")) == 's' : risposta = True
else: risposta = False
def TeoremaDeiSeni1(self) :
risposta = True
while (risposta == True) :
print "\nApplicazione del Teorema di Seni\n".upper()
print "Calcolo del lato incognito\n".upper()
A = input("\tImmetti la misura del lato noto: ")
a = "errato"
while a == "errato":
a = Centesimi_Gradi_Radianti(input("\tImmetti la misura dell\'angolo opposto al lato noto: "))
b = "errato"
while b == "errato":
b = Centesimi_Gradi_Radianti(input("\tImmetti la misura dell\'angolo opposto al lato incognito: "))
B = A * sin(b) / sin(a)
print "\n\t\tLa misura del lato incognito e\' %f" % approssima(abs(B))
if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : ")) == 's' : risposta = True
else: risposta = False
def TeoremaDeiSeni2(self) :
risposta = True
while (risposta == True) :
print "\nApplicazione del Teorema di Seni\n".upper()
print "Calcolo dell\'angolo incognito\n".upper()
a = "errato"
while a == "errato":
a = Centesimi_Gradi_Radianti(input("\tImmettere angolo noto: "))
l1 = input("\tImmettere lunghezza del lato oppsosto all'angolo noto: ")
l2 = input("\tImmettere lunghezza del secondo lato: ")
try :
risultato = Radianti_Gradi_Centesimi(asin(sin(a) * l1/l2))
print "\n\tLa misura dell'angolo e\' di %f gradi centesimali" % approssima(risultato)
except :
print "\n\t\t** Non \'e stato possibile effettuare il calcolo!\n\t\t** I dati immessi non appartengono ad un triangolo!"
if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : ")) == 's' : risposta = True
else: risposta = False
if __name__ == '__main__':
a=Teorema()
a.run()
-------------- parte successiva --------------
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.8.5 - Release Date: 03/02/2005
More information about the Python
mailing list