Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "rai/Prove1"
Differenze tra le versioni 5 e 25 (in 20 versioni)
Versione 5 del 08/01/2023 22.00.32
Dimensione: 14447
Autore: rai
Commento:
Versione 25 del 02/02/2023 09.37.02
Dimensione: 10747
Autore: rai
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 10: Linea 10:
In questa pagina vengono mostrati alcuni programmi scritti in Python a difficoltà crescente. Non è una guida esauriente a tutte le funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione [[#risorse|Risorse]].

Alcune note:

 * su ogni riga, tutto ciò che viene preceduto dal carattere # è considerato dall'interprete come un commento.
## * q
uesti listati sono scritti per l'interprete Python 3.7 per la guida nella vecchia versione Python 2.7, vedi [[Programmazione/Python/Listati]] 
In questa pagina vengono mostrati alcuni programmi scritti in Python a difficoltà crescente. Non è per niente una guida alle funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione [[#Ulteriori_risorse|Ulteriori Risorse]].

Questi listati sono scritti per l'interprete Python 3.x; per la guida nella vecchia e deprecata versione Python 2.7 consultare la [[Programmazione/Python/Listati|relativa guida]].
Linea 17: Linea 15:
<<BR>>

<<Anchor(areatriangolo1)>>
{{{#!python
#!/usr/bin/python3
import sys
import string
import math
''' questa è un'area di commento che uso per indicare cosa fa il programma o sorgente o script.
    Il programma principale o il main, calcola l'area di un triangolo qualsiasi noti i suoi tre
    lati usando la formula di Erone.
    Formula sqrt p*(p-a)*(p-b)*(p-c) sqrt = radice quadrata, p = (a+b+c)/2 a,b,c lati
    Salvatelo sul disco con il nome che vi propongo AreaTriangolo.py o come più vi piace
'''
Esempio di script minimale: calcola l'area di un triangolo richiedendo all'utente di immettere la misura dei lati.
{{{#!python
#!/usr/bin/python3

""" Questa è un'area di commento usata per indicare cosa fa il programma e come.

    Calcola l'area di un triangolo qualsiasi, noti i suoi tre lati.
    Usa la formula di Erone: sqrt p*(p-a)*(p-b)*(p-c)
    dove: sqrt = radice quadrata; p = (a+b+c)/2; a,b,c lati
"""

# tutto ciò che viene preceduto dal carattere # è
# considerato dall'interprete come un commento
import math # importa il modulo math; anche questo è un commento
Linea 36: Linea 34:
print('terzo lato = ',c)
print("\n");
print('terzo lato = ', c)
print();
Linea 39: Linea 37:
print("\n")
p = ((a+b+c))/2
s = math.sqrt(p*(p-a)*(p-b)*(p-c))
print()
p = (a+b+c) / 2
s = math.sqrt(p * (p-a) * (p-b) * (p-c))
Linea 45: Linea 43:
<<BR>>
Linea 48: Linea 45:
<<BR>>

Il programma precedente termina se durante l'inserimento dei dati, per errore, viene digitato un carattere non numerico. È necessario quindi inserire un controllo sul dato immesso. A questo scopo è stato preparato questo altro programmino che salviamo col nome `AreaTriangolo2.py`:
<<Anchor(areatriangolo2)>>

{{{#!python
#!/usr/bin/python3
import sys
Il programma precedente si interrompe se durante l'inserimento dei dati, per errore, viene digitato un carattere non numerico. Per questo il seguente script, che salviamo col nome `AreaTriangolo2.py`, inserisce un controllo sul dato immesso.
{{{#!python
#!/usr/bin/python3
Linea 56: Linea 50:
import string
Linea 58: Linea 51:
l=[] l = []
print("\nInserire le misure dei lati:")
Linea 60: Linea 54:
        a = input('inserisci il '+str(i+1)+' lato ')
        for j in range(len(a)) :
                errato = 'F'
                if a[j] in string.digits:
                        errato = 'F'
                        continue #continua il ciclo for
                else:
                        errato = 'T'
                        print("hai digitato qualcosa che non è un numero. Riprova")
                        break # termina il ciclo for
        if errato =='T':
                continue #continua il ciclo while
                        
        i +=1
        l.append(float(a)) # completata la verifica che il dato inserito sia una cifra, viene trasformato
                           # in un numero a virgola mobile e inserito in un array
        if errato =='F'and i <3:
                # questo controllo ci serve per riprendere l'inserimento dei dati dopo aver completato il controllo
                # sul dato precedente
                continue # continua il ciclo while per passare al successivo input
        elif errato =='F' and i >=3:
                print("\n")
                print('primo lato = ',l[0])
                print("\n")
                print('secondo lato = ',l[1])
                print("\n")
                print('terzo lato = ',l[2])
                print("\n")
                p = (l[0]+l[1]+l[2])/2.0 # calcola il semi perimetro
                if p > l[0] and p>l[1] and p >l[2]:
                        print("ora calcolo l'area di questo triangolo")
                        break # esce dal ciclo while per fine input
                else:
                        print("questi dati non possono rappresentare i lati di un triangolo. Riprova")
                        i =0
                        l=[]
                        continue # continua nel ciclo while per ricominciare i nuovi input
        
        
                
        

print("\n")

s = math.sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]))

print("l'area del triangolo è " , s)
print("\n")
    a = input(f'\tMisura del {i+1}° lato: ')
    if not a.isdigit():
        print("non hai digitato un numero valido. Riprova")
        continue # ricomincia il ciclo while e ripete la richiesta dello stesso lato
    # una volta verificato che il dato immesso è una cifra, lo
    # converte in numero a virgola mobile e lo inserisce in un array
    l.append(float(a))
    i += 1
    if i < 3:
        continue # ricomincia il ciclo while per passare al successivo lato
    else:
        print()
        print('primo lato = ', l[0])
        print('secondo lato = ', l[1])
        print('terzo lato = ', l[2])
        p = (l[0]+l[1]+l[2]) / 2 # calcola il semiperimetro
        if p > l[0] and p > l[1] and p > l[2]:
            break # esce dal ciclo while per fine input
        else:
            print("questi dati non possono rappresentare i lati di un triangolo. Riprova:")
            i = 0
            l = []
            continue # ricomincia il ciclo while per acquisire di nuovo tutti i lati

s = math.sqrt(p * (p-l[0]) * (p-l[1]) * (p-l[2]))
print("l'area di questo triangolo è " , s)
print()
Linea 110: Linea 83:
<<BR>>

== Listato 2 con eccezioni ==
<<BR>>

Mostriamo anche un'alternativa che utilizza le classi e la gestione delle eccezioni modificando il programma precedente `AreaTriangolo2.py`:
{{{#!python
#!/usr/bin/python3

# Importiamo la funzione sqrt (radice quadrata) dal modulo math

= Listato 3 =

Questa è un'alternativa più efficiente della versione precedente `AreaTriangolo2.py`: utilizza le classi e la gestione delle eccezioni per eliminare ogni possibilità di errore di immissione senza costringere a immettere solo numeri interi.
{{{#!python
#!/usr/bin/python3

from math import sqrt# Importa la funzione sqrt (radice quadrata) dal modulo math


class TriangoloInesistente(Exception):
    """Classe per sollevare un'eccezione se vengono immesse misure incompatibili."""
    
    def __init__(self, message="\nUn triangolo con queste misure non esiste. Riprova."):
        self.message = message


class Triangolo:
    """Classe per costruire gli oggetti triangolo da calcolare
    
    Oltre al costruttore, la classe ha due metodi:
    un metodo che calcola il perimetro e uno che calcola l'area.
    Attributi della classe sono le misure dei tre lati a, b, c
    """

    def __init__(self, a, b, c):
        """Metodo costruttore. In Python i costruttori hanno il nome speciale __init__
        
        Controlla se i tre valori immessi sono accettabili,
        cioè se sono validi come misure dei lati di un triangolo.
        In caso contrario solleva una eccezione TriangoloInesistente.
        """
        
        if a + b > c and a + c > b and b + c > a:
            self.a = a
            self.b = b
            self.c = c
        else:
            # quando il tipo dei dati è corretto (numeri in virgola mobile)
            # ma i valori sono incompatibili.
            raise TriangoloInesistente
    def perimetro(self):
        "Metodo che calcola il perimetro"
        return self.a + self.b + self.c

    def area(self):
        "Metodo che calcola l'area (tramite formula di Erone)"
        p = self.perimetro() / 2.0
        return sqrt(p * (p - self.a) * (p - self.b) * (p - self.c))


while True:
    # Chiede all'utente di immettere le misure dei lati
    print("\nInserire le misure dei lati:")
    lati=[]
    for lato in 'abc':
        while True:
            l = input(f"\tMisura del lato {lato}: ")
            try :
                l = float(l)
            # se viene inserito un valore che non si può trasformare in un numero,
            # ad esempio una lettera, si solleva l'eccezione ValueError
            except ValueError:
                print("\nDevi inserire valori numerici. Riprova.\n")
            # se invece non è stata sollevata nessuna eccezione
            # possiamo salvare il valore del lato
            else:
                lati.append(l)
                break
    try:
        # Crea una nuova istanza della classe Triangolo.
        # In pratica facciamo una chiamata al suo metodo costruttore:
        # sarebbe stato lo stesso scrivere "triangolo = Triangolo.__init__(a,b,c)"
        triangolo = Triangolo(lati[0], lati[1], lati[2])
    # qua gestiamo l'eccezione che potrebbe sollevarsi nella classe Triangolo
    except TriangoloInesistente as err:
        #"err" è l'oggetto creato da Python durante il verificarsi dell'errore
        print(err.message)
        continue
    # Utilizza i metodi definiti nella classe per ottenere perimetro ed area
    # dell'oggetto triangolo e stampa a video i risultati.
    print()
    print("Perimetro = ", triangolo.perimetro())
    print("Area = ", triangolo.area())

    # Chiede all'utente se intende terminare il programma.
    exit = input("\nUscire [digitare 's' per confermare]? ")
    print("")
    if exit == "s": break
}}} ''Listato del programma !AreaTriangolo2ConEccezioni.py''


= Listato 4 =

Ora supponiamo di dover calcolare l'area di un appezzamento di terreno scomposto in un numero finito di triangoli.<<BR>>
Una volta nota l'area, supponiamo che debba essere divisa, per volontà testamentaria, in tre parti in funzione dell'età di tre fratelli.<<BR>>
Useremo come base lo script [[#areatriangolo2|AreaTriangolo2.py]], con qualche modifica o aggiunta; lo salveremo come `AreaTriangolo3.py`.
{{{#!python
#!/usr/bin/python3
Linea 122: Linea 185:
# Definiamo una classe Triangolo con tre metodi:
# un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
class Triangolo:

      # Attributi della classe (le misure dei tre lati)
      a, b, c = 0, 0, 0

      # Metodo costruttore
      def __init__(self,a,b,c):
         # Controlliamo se i tre valori dati possono effettivamente essere le misure dei lati di un triangolo.
         # Caso contrario solleviamo una bella eccezione!
         if ((a+b>c) and (a+c>b) and (b+c>a)):
            self.a=a
            self.b=b
            self.c=c
         else:
            # stabiliamo che l'errore e' di tipo ValueError, cioe' il tipo di dato e' corretto(numeri in
            # virgola mobile) ma i valori sono sballati.ValueError è un errore definito da Python, ma
            # volendo potremmo crearci un errore personalizzato, ad esempio TriangoloInesistente
            raise ValueError("\nUn triangolo con queste misure non esiste. Riprova.")

      # Metodo che calcola il perimetro
      def perimetro(self):
         return self.a + self.b + self.c

      # Metodo che calcola l'area (tramite formula di Erone)
      def area(self):
         p=self.perimetro()/2.0
         return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))


while True:
      # Chiediamo all'utente di immettere le misure dei lati
      print("\nInserire le misure dei lati:")
      lati=[]
      for lato in ['a','b','c']:
          while True:
               l = input("\tMisura del lato "+lato+": ")
               try :
                  l = float(l)
               # se l'utente inserisce un valore che non puo' essere trasformato in un numero,
               # ad esempio una lettera, python sollevera' l'eccezione ValueError, e noi
               # prontamente la gestiamo
               except ValueError:
                  print("\nDevi inserire valori numerici. Riprova.\n")
               #se invece non e' stata sollevata nessuna eccezione, possiamo salvare il
               #valore del lato
               else:
                  lati.append(l)
                  break

      try:
         # Creiamo una nuova istanza della classe Triangolo.
         # In pratica facciamo una chiamata al suo metodo costruttore.
         # Sarebbe stato lo stesso scrivere "triangolo=Triangolo.__init__(a,b,c)"
         triangolo=Triangolo(lati[0],lati[1], lati[2])
      #qua gestiamo l'eccezione che noi stessi potremmo aver sollevato nella classe Triangolo
      except ValueError(e):
         #"e" e' l'oggetto creato da python durante il verificarsi dell'errore
         print(e.message)
         continue
      # Utilizziamo i metodi definiti in precedenza per ottenere perimetro ed area dell'oggetto triangolo,
      # e stampiamo a video i risultati.
      print("")
      print("Perimetro = ", triangolo.perimetro())
      print("Area = ", triangolo.area())

      # Chiediamo all'utente se intende terminare il programma.
      exit = input("\nUscire [digitare 's' per confermare]? ")
      print("")
      if exit == "s": break
}}} ''Listato del programma Area``Triangolo2.py con eccezioni''
<<BR>>

= Listato 3 =
<<BR>>

Ora supponiamo di dover calcolare l'area di un appezzamento di terreno di svariati ettari scomposto in un numero finito di triangoli.<<BR>>
Una volta nota l'area, supponiamo che debba essere divisa, per volontà testamentaria, in tre parti in funzione dell'età di tre fratelli i cui nomi sono Angelo, Alberto, Amilcare o come volete voi.

Useremo lo stesso programma [[#areatriangolo2|AreaTriangolo2.py]], con qualche modifica o aggiunta, che chiameremo `AreaTriangolo3.py`:
{{{#!python
#!/usr/bin/python3
import sys
import math
import string
# fase di input
### fase di input
Linea 210: Linea 187:
eta = []
lati = []
fratelli =[]
lati= []
Linea 214: Linea 191:
        a = input('Inserici nome '+str(x)+' fratello ')
        #verifichiamo l'input immesso
        errore = 'F'
        for i in range(len(a)):
                if a[i] in string.ascii_letters:
                        continue # continua il ciclo for
                else:
                        if i <= len(a):
                                print("errore nell'immettere il nome. Riprova")
                                errore = 'T'
                                break # esce dal ciclo for
        if errore == "T":
                continue # continua il ciclo while costringendo a reinserire il dato immesso prima in maniera errata
        else:
                # lo rendiamo tutto maiuscolo indipendentemente se lo sia o meno
                nomi.append(str.upper(a))
                print(nomi)
                x +=1 # questo incremento ci serve per poter distinguere nella immissione a quale persona assegnare il nome
                
#ora prendiamo in input le loro eta
x = 0

while x < 3:
        
        a = input("inserisci l'eta di "+nomi[x]+' ')
        for j in range(len(a)) :
                errato = 'F'
                if a[j] in string.digits:
                        errato = 'F'
                        continue #continua il ciclo for
                else:
                        errato = 'T'
                        print("hai digitato qualcosa che non è un numero. Riprova")
                        break # termina il ciclo for
        if errato =='T':
                continue #continua il ciclo while
                        
        x +=1
        eta.append(int(a))
        if errato =='F'and x <3:
                
                continue # continua il ciclo while per passare al successivo input
        elif errato =='F' and x >=3:
                print(' Eta di' +nomi[0] +" "+ str( int(eta[0])))
                print()
                print(' Eta di' +nomi[1] +" "+ str( int(eta[1])))
                print()
                print(' Eta di' +nomi[2] +" "+ str( int(eta[2])))
                print()
                break
    a = input(f' Inserici il nome del {x}° fratello: ')
    if not a.isalpha():
        print(" Errore nell'immettere il nome. Riprova")
        continue # ricomincia il ciclo while per reinserire il nome che era errato
    nomi.append(a.title()) # salva nella lista nomi il nome (con iniziale maiuscola)
    x += 1

for nome in nomi:
    a = ""
    while not a.isdigit():
        a = input(f" Inserisci l'età di {nome}: ")
        if not a.isdigit():
            print(" Non hai digitato un numero valido. Riprova")

    fratelli.append((nome, int(a)))
for n, e in fratelli:
    print(f' Età di {n}: {e}', end=" ")
print('\n')
Linea 265: Linea 210:
                 i = 0
l=[]
Linea 269: Linea 211:
while True:
        a = input('inserisci il '+str(i+1)+' lato ')
        for j in range(len(a)) :
                errato = 'F'
                if a[j] in string.digits:
                        errato = 'F'
                        continue #continua il ciclo for
                else:
                        errato = 'T'
                        print("hai digitato qualcosa che non è un numero. Riprova")
                        break # termina il ciclo for
        if errato =='T':
                continue #continua il ciclo while
                        
        i +=1
        l.append(float(a))
        if errato =='F'and i <3:
                # questo controllo verifica se abbiamo terminato i dati in input relativi ad un triangolo
                continue # continua il ciclo while per passare al successivo input
        elif errato =='F' and i >=3:
                # qui avendo termianto l'input dei dati relativi ad un trinagolo li ripresenta a video per maggior chiarezza
                print(' primo lato = ',l[0])
                print()
                print(' secondo lato = ',l[1])
                print()
                print(' terzo lato = ',l[2])
                print()
                p = (l[0]+l[1]+l[2])/2.0
                if p > l[0] and p>l[1] and p >l[2]:
                        print(" l'area di questo triangolo e' calcolabile")
                        tria.append(l)
                        l=[]
                        si = input(" hai finito di immettere i lati dei triangoli ? conferma con S/s ")
                        if si == "S" or si =='s':
                                print("Inizia la fase di calcolo ")
                                break # esce dal ciclo while per fine input
                        else:
                                i =0
                                l=[]
                                continue # continua nel ciclo while per input dati nuovo triangolo
                else:
                        print("questi dati non rappresentano i lati di un triangolo. Riprova ")
                        i =0
                        l=[]
                        continue # continua nel ciclo while perche i dati in input del triangolo erano errati
        
        
#fase di calcolo area appezzamento
n = len(tria) # il calcolo dell'area verrà ripetuto n volte una per ogni triangolo

p = 0
n_tri = 0
si = ''
while si != "S":
    n_tri += 1
    lati = []
    p = 0
    for i in range(1, 4):
        while True:
            try:
                a = input(f' Inserisci il {i}° lato del {n_tri}° triangolo: ')
                lati.append(float(a))
            except ValueError:
                print(" Non hai digitato un numero valido. Riprova")
                continue #continua il ciclo while costringendo a reimmettere il dato
            break
    # terminato l'input dei dati del triangolo
    # li ripresenta a video per maggior chiarezza
    for i, lato in enumerate(lati):
        print(f' {i + 1}° lato = {lato}', end=" ")
        p += lato / 2
    if not p > lati[0] and p > lati[1] and p > lati[2]:
        print("\n Questi dati non rappresentano i lati di un triangolo. Riprova")
        continue # ricomincia il ciclo while perché i dati immessi erano errati
    tria.append(lati)
    print('\n')
    si = input(" hai finito di immettere i triangoli? conferma con S/s ").upper()

### fase di calcolo area appezzamento
# il calcolo dell'area verrà ripetuto una volta per triangolo
Linea 321: Linea 241:
for i,l in enumerate(tria):
        for j in range( len(l)):
                print(l[j])
                p = p+l[j]
        print("semiper. nel "+str(i+1)+ " triangolo = "+ str(p/2.0))
        print()
        p=p/2.0
        s = math.sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]))
        print("area "+str(i+1)+ " triangolo = "+ str(s))
        print()
        stot = stot +s
        p=0
print()
print("l'area totale dell'appezamento di terreno e di mq " + str(stot))
for i, lati in enumerate(tria):
    p = 0
    print(f"\n {i + 1}° triangolo\n Lati:", end=' ')
    for lato in lati:
        print(lato, end=' ')
        p += lato / 2.0
    print()
    s = sqrt(p * (p-lati[0]) * (p-lati[1]) * (p-lati[2]))
    print(f" Area = {s}")
    stot += s
print(f"\n L'area totale dell'appezzamento di terreno è di mq {stot:<15.2f}")
print(" quanto terreno spetta a ciascuno dei tre fratelli in base all'età:")

seta = sum([eta for n, eta in fratelli]) # somma delle età dei fratelli
areau = stot / seta # rapporto tra area totale e somma delle età

for fratello in fratelli:
    nome, eta = fratello
    area = areau * eta
    print(f"\n l'area spettante a {nome} somma {area:<10.2f}")
Linea 336: Linea 263:
print("ora calcoliamo quanto terreno spetta a ciascuno dei tre fratelli")

seta = 0
for i in eta:
        seta=seta+i
        
        
areau =(stot/seta)

for i in eta:
        a =areau*i
        nomi.append(a)
for i in range(0,3):
        print("l'area spettante a " +nomi[i] + " somma mq. "+ str(nomi[i+3]))
        print()
        
print(' Fine programma ')

}}} ''Listato del programma Area``Triangolo3.py''
print(' Fine programma ')

}}} ''Listato del programma !AreaTriangolo3.py''
Linea 357: Linea 268:
<<Anchor(risorse)>>
Linea 360: Linea 269:

 * È possibile anche utilizzare delle interfacce grafiche, per informazioni consultare la [[Programmazione/Python/InterfacceGrafichePython3|relativa guida]].
 * [[https://wiki.python.org/moin/BeginnersGuide|Guida ufficiale per principianti (Inglese)]]
 * [[https://www.python.it/doc/newbie/|Python per i principianti]]
 * [[https://www.html.it/guide/guida-python/|Una guida per Python]]



 * È possibile anche scrivere applicazioni dotate di interfaccia grafica, per informazioni consultare la [[Programmazione/Python/InterfacceGrafichePython3|relativa guida]].
Linea 365: Linea 279:
CategoryProgrammazione ##CategoryProgrammazione


Attenzione! Questa è una Pagina di prova. Le informazioni riportate potrebbero essere incomplete, errate e potenzialmente pericolose. Per contribuire alla realizzazione di questa pagina consultare la discussione di riferimento.

Guida verificata con Ubuntu: 20.04 22.04

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

In questa pagina vengono mostrati alcuni programmi scritti in Python a difficoltà crescente. Non è per niente una guida alle funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione Ulteriori Risorse.

Questi listati sono scritti per l'interprete Python 3.x; per la guida nella vecchia e deprecata versione Python 2.7 consultare la relativa guida.

Listato 1

Esempio di script minimale: calcola l'area di un triangolo richiedendo all'utente di immettere la misura dei lati.

Dis/Attivare numerazione delle righe
   1 #!/usr/bin/python3
   2 
   3 """ Questa è un'area di commento usata per indicare cosa fa il programma e come.
   4 
   5     Calcola l'area di un triangolo qualsiasi, noti i suoi tre lati.
   6     Usa la formula di Erone: sqrt p*(p-a)*(p-b)*(p-c)  
   7     dove:  sqrt = radice quadrata; p = (a+b+c)/2;  a,b,c lati
   8 """
   9 
  10 # tutto ciò che viene preceduto dal carattere  #  è
  11 # considerato dall'interprete come un commento
  12 import math  # importa il modulo math; anche questo è un commento 
  13 a = int(input('inserisci il primo lato  '))
  14 print('primo lato = ', a)
  15 b = int(input('inserisci il secondo lato  '))
  16 print('secondo lato = ', b)
  17 c = int(input('inserisci il terzo lato  '))
  18 print('terzo lato = ', c)
  19 print();
  20 print(" ora calcolo l'area di questo triangolo")
  21 print()
  22 p = (a+b+c) / 2
  23 s = math.sqrt(p * (p-a) * (p-b) * (p-c))
  24 
  25 print("l'area  del triangolo è " , s)

Listato del programma AreaTriangolo.py

Listato 2

Il programma precedente si interrompe se durante l'inserimento dei dati, per errore, viene digitato un carattere non numerico. Per questo il seguente script, che salviamo col nome AreaTriangolo2.py, inserisce un controllo sul dato immesso.

Dis/Attivare numerazione delle righe
   1 #!/usr/bin/python3
   2 
   3 import math
   4 i = 0
   5 l = []
   6 print("\nInserire le misure dei lati:")
   7 while True:
   8     a = input(f'\tMisura del {i+1}° lato:  ')
   9     if not a.isdigit():
  10         print("non hai digitato un numero valido. Riprova")
  11         continue  # ricomincia il ciclo while e ripete la richiesta dello stesso lato
  12     # una volta verificato che il dato immesso è una cifra, lo
  13     # converte in numero a virgola mobile e lo inserisce in un array 
  14     l.append(float(a))
  15     i += 1  
  16     if i < 3:
  17         continue # ricomincia il ciclo while per passare al successivo lato
  18     else:
  19         print()
  20         print('primo lato   = ', l[0])
  21         print('secondo lato = ', l[1])
  22         print('terzo lato   = ', l[2])
  23         p = (l[0]+l[1]+l[2]) / 2 # calcola il semiperimetro
  24         if  p > l[0]  and  p > l[1] and p > l[2]:
  25             break  # esce dal ciclo while per fine input
  26         else:
  27             print("questi dati non possono rappresentare i lati di un triangolo. Riprova:")
  28             i = 0
  29             l = []
  30             continue # ricomincia il ciclo while per acquisire di nuovo tutti i lati
  31 
  32 s = math.sqrt(p * (p-l[0]) * (p-l[1]) * (p-l[2]))
  33 print("l'area di questo triangolo è " , s)
  34 print()
  35 print("Fine programma ")

Listato del programma AreaTriangolo2.py

Listato 3

Questa è un'alternativa più efficiente della versione precedente AreaTriangolo2.py: utilizza le classi e la gestione delle eccezioni per eliminare ogni possibilità di errore di immissione senza costringere a immettere solo numeri interi.

Dis/Attivare numerazione delle righe
   1 #!/usr/bin/python3
   2 
   3 from math import sqrt# Importa la funzione sqrt (radice quadrata) dal modulo math
   4 
   5 
   6 class TriangoloInesistente(Exception):
   7     """Classe per sollevare un'eccezione se vengono immesse misure incompatibili."""
   8     
   9     def __init__(self, message="\nUn triangolo con queste misure non esiste. Riprova."):
  10         self.message = message
  11 
  12 
  13 class Triangolo:
  14     """Classe per costruire gli oggetti triangolo da calcolare
  15     
  16     Oltre al costruttore, la classe ha due metodi:
  17     un metodo che calcola il perimetro e uno che calcola l'area.
  18     Attributi della classe sono le misure dei tre lati a, b, c
  19     """
  20 
  21     def __init__(self, a, b, c):
  22         """Metodo costruttore. In Python i costruttori hanno il nome speciale __init__
  23         
  24         Controlla se i tre valori immessi sono accettabili,
  25         cioè se sono validi come misure dei lati di un triangolo.
  26         In caso contrario solleva una eccezione TriangoloInesistente.
  27         """
  28         
  29         if a + b > c and a + c > b and b + c > a:
  30             self.a = a
  31             self.b = b
  32             self.c = c
  33         else:
  34             # quando il tipo dei dati è corretto (numeri in virgola mobile) 
  35             # ma i valori sono incompatibili.
  36             raise TriangoloInesistente
  37     def perimetro(self):
  38         "Metodo che calcola il perimetro"
  39         return self.a + self.b + self.c
  40 
  41     def area(self):
  42         "Metodo che calcola l'area (tramite formula di Erone)"
  43         p = self.perimetro() / 2.0
  44         return sqrt(p * (p - self.a) * (p - self.b) * (p - self.c))
  45 
  46 
  47 while True:
  48     # Chiede all'utente di immettere le misure dei lati
  49     print("\nInserire le misure dei lati:")
  50     lati=[]
  51     for lato in 'abc':
  52         while True:
  53             l = input(f"\tMisura del lato {lato}: ")
  54             try :
  55                 l = float(l)
  56             # se viene inserito un valore che non si può trasformare in un numero,
  57             # ad esempio una lettera, si solleva l'eccezione ValueError 
  58             except ValueError:
  59                 print("\nDevi inserire valori numerici. Riprova.\n")
  60             # se invece non è stata sollevata nessuna eccezione
  61             # possiamo salvare il valore del lato
  62             else:
  63                 lati.append(l)
  64                 break
  65     try:
  66         # Crea una nuova istanza della classe Triangolo.
  67         # In pratica facciamo una chiamata al suo metodo costruttore:
  68         # sarebbe stato lo stesso scrivere "triangolo = Triangolo.__init__(a,b,c)"
  69         triangolo = Triangolo(lati[0], lati[1], lati[2])
  70     # qua gestiamo l'eccezione che potrebbe sollevarsi nella classe Triangolo
  71     except TriangoloInesistente as err:
  72         #"err" è l'oggetto creato da Python durante il verificarsi dell'errore 
  73         print(err.message)
  74         continue
  75     # Utilizza i metodi definiti nella classe per ottenere perimetro ed area
  76     # dell'oggetto triangolo e stampa a video i risultati.
  77     print()
  78     print("Perimetro = ", triangolo.perimetro())
  79     print("Area = ", triangolo.area())
  80 
  81     # Chiede all'utente se intende terminare il programma.
  82     exit = input("\nUscire [digitare 's' per confermare]? ")
  83     print("")
  84     if exit == "s": break

Listato del programma AreaTriangolo2ConEccezioni.py

Listato 4

Ora supponiamo di dover calcolare l'area di un appezzamento di terreno scomposto in un numero finito di triangoli.
Una volta nota l'area, supponiamo che debba essere divisa, per volontà testamentaria, in tre parti in funzione dell'età di tre fratelli.
Useremo come base lo script AreaTriangolo2.py, con qualche modifica o aggiunta; lo salveremo come AreaTriangolo3.py.

Dis/Attivare numerazione delle righe
   1 #!/usr/bin/python3
   2 
   3 from math import sqrt
   4 
   5 ### fase di input
   6 nomi = []
   7 fratelli =[]
   8 lati= []
   9 x = 1
  10 while x <= 3:
  11     a = input(f' Inserici il nome del {x}° fratello: ')
  12     if not a.isalpha():
  13         print(" Errore nell'immettere il nome. Riprova")
  14         continue  # ricomincia il ciclo while per reinserire il nome che era errato
  15     nomi.append(a.title()) #  salva nella lista nomi il nome (con iniziale maiuscola)
  16     x += 1
  17 
  18 for nome in nomi:
  19     a = ""
  20     while not a.isdigit():
  21         a = input(f" Inserisci l'età di {nome}: ")
  22         if not a.isdigit():
  23             print(" Non hai digitato un numero valido. Riprova")
  24 
  25     fratelli.append((nome, int(a)))
  26 for n, e in fratelli:
  27     print(f' Età di {n}: {e}', end="  ")
  28 print('\n')
  29 #input dei dati per il calcolo dell'area dell'appezzamento
  30 tria = []
  31 n_tri = 0
  32 si = ''
  33 while si != "S":
  34     n_tri += 1
  35     lati = []
  36     p = 0
  37     for i in range(1, 4):
  38         while True:
  39             try:
  40                 a = input(f' Inserisci il {i}° lato del {n_tri}° triangolo: ')
  41                 lati.append(float(a))
  42             except ValueError:
  43                 print(" Non hai digitato un numero valido. Riprova")
  44                 continue  #continua il ciclo while costringendo a reimmettere il dato 
  45             break
  46     # terminato l'input dei dati del triangolo 
  47     # li ripresenta a video per maggior chiarezza
  48     for i, lato in enumerate(lati):
  49         print(f' {i + 1}° lato = {lato}', end=" ")
  50         p += lato / 2
  51     if not p > lati[0] and p > lati[1] and p > lati[2]:
  52         print("\n Questi dati non rappresentano i lati di un triangolo. Riprova")
  53         continue # ricomincia il ciclo while perché i dati immessi erano errati
  54     tria.append(lati)
  55     print('\n')
  56     si = input(" hai finito di immettere i triangoli?  conferma con S/s  ").upper()
  57 
  58 ### fase di calcolo area appezzamento
  59 # il calcolo dell'area verrà ripetuto una volta per triangolo
  60 stot = 0
  61 for i, lati in enumerate(tria):
  62     p = 0
  63     print(f"\n {i + 1}° triangolo\n Lati:", end=' ')
  64     for lato in lati:
  65         print(lato, end='  ')
  66         p += lato / 2.0
  67     print()
  68     s = sqrt(p * (p-lati[0]) * (p-lati[1]) * (p-lati[2]))
  69     print(f" Area = {s}")
  70     stot += s
  71 print(f"\n L'area totale dell'appezzamento di terreno è di mq {stot:<15.2f}")
  72 print(" quanto terreno spetta a ciascuno dei tre fratelli in base all'età:")
  73 
  74 seta = sum([eta for n, eta in fratelli])  # somma delle età dei fratelli
  75 areau = stot / seta  # rapporto tra area totale e somma delle età
  76 
  77 for fratello in fratelli:
  78     nome, eta = fratello
  79     area = areau * eta
  80     print(f"\n l'area spettante a {nome} somma {area:<10.2f}")
  81 
  82 print()
  83 print(' Fine programma ') 

Listato del programma AreaTriangolo3.py

Ulteriori risorse


CategoryHomepage