[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