Vogliamo inserire da tastiera un numero intero di al massimo 3 cifre e convertirlo in parole. Es 321 => trecentoventuno Utilizzare in modo ottimale funzioni per scomporre il problema.
La soluzione
Per prima cosa ci occorre leggere un numero da tastiera. La funzione è piuttosto semplice e l’abbiamo sicuramente vista in molti esercizi. Possiamo aggiungere i controlli di validità che desideriamo. qui cil imitiamo a validare che il numero non sia nullo, negativo o a quattro cifre.
def leggiNumero():
numero = -1
while numero <= 0 or numero > 999:
numero = int(input("Inserisci un numero: "))
return numero
Inserito il numero dobbiamo scomporlo per avere ognuna delle sue cifre e il loro relativo peso unità/decine/centinai. La soluzione più semplice è di usare un vettore dove inserire le cifre che reperiamo dividendo progressivamente il numero per 10, prendendo il resto e troncando la parte decimale in modo da ottenere la cifra desiderata. La possiamo quindi appendere/aggiungere ad una lista.
def scomposizione(numero):
lista = []
while numero > 0:
resto = numero % 10
numero = math.trunc(numero / 10)
lista.append(resto)
Siamo già a buon punto. La funzione di scomposizione è quella che forse logicamente potrebbe mettere in difficoltà lo studente meno esperto. Ora si tratta di rileggere le nostre cifre nella lista e assegnargli una parola. Usiamo il costrutto match presenta solo dalla versione 3.10 di python rilasciata nel 2021. La versione è piuttosto recente quindi in alcune macchine non aggiornate potrebbe essere necessario utilizzare una soluzione alternativa con la costruzione di if/else annidati o usare strutture dati interessanti come i dizionari.
La funzione tiene conto della lunghezza della lista in modo da stampare le opportune scritte per centinaia o decine. Attenzione a combinare le parole con un operatore +=
def converti(lista):
parola = ""
if len(lista) <= 0:
return
if len(lista) == 3:
match lista[2]:
case 9:
parola = "novecento"
case 8:
parola = "ottocento"
#ecc...
if len(lista) >= 2:
match lista[1]:
case 9:
parola += "novanta"
#ecc...
Il main è piuttosto semplice, si limita a combinare e chiamare i risultati delle funzioni appena commentate.
Listato completo
import math
def leggiNumero():
numero = -1
while numero < 0 or numero > 999:
numero = int(input("Inserisci un numero: "))
return numero
def scomposizione(numero):
lista = []
while numero > 0:
resto = numero % 10
numero = math.trunc(numero / 10)
lista.append(resto)
return lista
def converti(lista):
parola = ""
#attendo che il numero 321 in lista sia:
# lista[0] = 1
# lista[1] = 2
# lista[2] = 3
if len(lista) <= 0:
return
if len(lista) == 3:
match lista[2]:
case 9:
parola = "novecento"
case 8:
parola = "ottocento"
case 7:
parola = "settecento"
case 6:
parola = "seicento"
case 5:
parola = "cinquecento"
case 4:
parola = "quattrocento"
case 3:
parola = "trecento"
case 2:
parola = "ducento"
case 1:
parola = "cento"
#case 0 non serve aggiungere nulla
if len(lista) >= 2:
match lista[1]:
case 9:
parola += "novanta"
case 8:
parola += "ottanta"
case 7:
parola += "settanta"
case 6:
parola += "sessanta"
case 5:
parola += "cinquanta"
case 4:
parola += "quaranta"
case 3:
parola += "trenta"
case 2:
parola += "venti"
case 1:
parola += "dieci"
#case 0 non serve
match lista[0]:
case 9:
parola += "nove"
case 8:
parola += "otto"
case 7:
parola += "sette"
case 6:
parola += "sei"
case 5:
parola += "cinque"
case 4:
parola += "quattro"
case 3:
parola += "tre"
case 2:
parola += "due"
case 1:
parola += "uno"
return parola
if __name__ == "__main__":
numero = leggiNumero()
lista = scomposizione(numero)
parola = converti(lista)
print(parola)
Ultima modifica 8 Gennaio 2024