#
# 018 Python3 - Utilizzare notazione scientifica per esprimere numeri a virgola mobile
#
# Questo script acquisisce UN numero a virgola mobile e lo trasforma nel corrispondente numero espresso con la Notazione Esponenziale
# dove il numero significativo è un numero intero, e l'ordine di grandezza è calcolato di conseguenza.
#
# Per avviare questo script:
# 1) Salvarlo nella cartella di lavoro, con nome ed estensione che si preferisce (Estensioni comuni: .py .pyw .pyc .pyo .pyd )
# In questo caso specifico, io l'ho salvato come "018-NumeriVirgolaMobile.py"
# 2) Aprire un terminale nella cartella di lavoro
# 3) Impartire il comando: "python3 018-NumeriVirgolaMobile.py".
#
NUMERO = ["Numero reale ? ", 0, 0, 0] # Definisce variabile contenente: ["Descrizione", "Numero reale", Num.Significativo, OrdineDiGrandezza]
def ACQUISIZIONE(X): # Inizio definizione funzione ACQUISIZIONE()
try: # Inizio istruzioni soggette a gestione errore
X_ = input(X) # Acquisisce il numero e lo mette in una variabile stringa
XX = float(X_) # Mette il numero in una variabile a virgola mobile
if XX == int(XX): # Se le cifre dopo la virgola sono degli zeri, esegue la riga seguente
X_ = str(int(XX)) # Mette nella variabile stringa X_ il numero acquisito, privo di cifre dopo la virgola
except ValueError: # Inizio istruzioni da eseguire in caso di errore 'ValueError'
print("ERRORE!!! Occorre inserire esclusivamente numeri, e con la notazione anglosassone (la parte intera è separata dalla parte decimale mediante il punto '.').")
X_ = ACQUISIZIONE(X) # Chiama la funzione ACQUISIZIONE() previo trasferimento del contenuto della variabile X.
return(X_) # Restituisce il valore contenuto nella variabile stringa X_
def CONVERTE(NUM_STRINGA): # Inizio definizione funzione CONVERTE()
LUNG_NUM = len(NUM_STRINGA) # Trova la lunghezza del numero
PUNTO = NUM_STRINGA.count(".") # Mette nella variabile PUNTO il numero di caratteri "." contenuti nella variabile NUM_STRINGA
if PUNTO == 0: # Se il numero inserito è un numero intero, esegue le 2 righe seguenti
GRANDEZZA = 0 # Calcola "Ordine di GRANDEZZA" quando il numero SIGNIFICATIVO è un numero intero
SIGNIFICATIVO = NUM_STRINGA # Trova il corrispondente "Numero SIGNIFICATIVO" intero.
else: # Se il numero inserito NON è un numero intero, esegue le 3 righe seguenti
POS_PUNTO = NUM_STRINGA.index(".") # Trova la posizione del punto decimale
GRANDEZZA = LUNG_NUM - POS_PUNTO - 1 # Calcola "Ordine di GRANDEZZA" quando il numero SIGNIFICATIVO diventa un numero intero.
SIGNIFICATIVO = NUM_STRINGA.replace(".", "") # Trova il corrispondente "Numero SIGNIFICATIVO" intero.
return(SIGNIFICATIVO, GRANDEZZA) # Restituisce il numero SIGNIFICATIVO ed il numero di GRANDEZZA della variabile a virgola mobile iniziale
print("Inserimento numeri a virgola mobile con notazione anglosassone (la virgola è il punto) .")
NUMERO[1] = ACQUISIZIONE(NUMERO[0]) # Chiama la funzione ACQUISIZIONE() previo trasferimento del contenuto della variabile NUMERO[0].
NUMERO[2], NUMERO[3] = CONVERTE(NUMERO[1]) # Chiama la funzione CONVERTE() previo trasferimento del contenuto della variabile NUMERO[1].
RISULTATO = f"Il numero reale {NUMERO[1]} equivale a {NUMERO[2]}×10^({-NUMERO[3]})"
print(RISULTATO)
input("Per poter proseguire, premere il tasto [Invio]")
#