Convertire un numero in parole

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