Dimensione: 13524
Commento:
|
Dimensione: 10522
Commento:
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 89: | Linea 89: |
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: {{{#!python #!/usr/bin/python3 # Importa la funzione sqrt (radice quadrata) dal modulo math from math import sqrt |
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 numeri interi: {{{#!python #!/usr/bin/python3 from math import sqrt# Importa la funzione sqrt (radice quadrata) dal modulo math |
Linea 111: | Linea 110: |
a, b, c = 0, 0, 0 |
|
Linea 183: | Linea 180: |
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. |
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. |
Linea 189: | Linea 186: |
import sys import math import string # fase di input |
from math import sqrt ### fase di input |
Linea 194: | Linea 191: |
eta = [] lati = [] |
fratelli =[] lati= [] |
Linea 198: | Linea 195: |
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 249: | Linea 214: |
i = 0 l=[] |
|
Linea 253: | Linea 215: |
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 305: | Linea 245: |
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 320: | Linea 267: |
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 ') |
print(' Fine programma ') |
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 è una guida esauriente a tutte le funzionalità del linguaggio. Se si desidera approfondire le proprie conoscenze, consultare la sezione Risorse.
Alcune note:
- su ogni riga, tutto ciò che viene preceduto dal carattere # è considerato dall'interprete come un commento.
Listato 1
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 Salvatelo sul disco come AreaTriangolo.py o con il nome preferito
9 """
10 import math
11 a = int(input('inserisci il primo lato '))
12 print('primo lato = ', a)
13 b = int(input('inserisci il secondo lato '))
14 print('secondo lato = ', b)
15 c = int(input('inserisci il terzo lato '))
16 print('terzo lato = ', c)
17 print();
18 print(" ora calcolo l'area di questo triangolo")
19 print()
20 p = (a+b+c) / 2
21 s = math.sqrt(p * (p-a) * (p-b) * (p-c))
22
23 print("l'area del triangolo è " , s)
Listato del programma AreaTriangolo.py
Listato 2
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:
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 2 con eccezioni
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 numeri interi:
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 AreaTriangolo2.py con eccezioni
Listato 3
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 lo stesso programma AreaTriangolo2.py, con qualche modifica o aggiunta, che chiameremo AreaTriangolo3.py:
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
È possibile anche utilizzare delle interfacce grafiche, per informazioni consultare la relativa guida.