Sviluppando i concetti e le tecniche viste nel capitolo precedente, si propone un altro classico problema aritmetico, cioè il calcolo del massimo comun divisore e del minimo comune multiplo tra due interi.
Questo è il sorgente HTML.
<!DOCTYPE html> <html lang="it"> <head> <title>Esempio 6</title> <script src="mcdmcm.js"></script> </head> <body style="background-color:cyan; font-family:arial,verdana"> <form id="frm" name="frm" style="position:relative; width:80%; left:10%; top:40px; background-color:azure; color:blue; border-style:solid; border-color:blue; text-align:center"> <h3 style="text-align:center">massimo comun divisore e minimo comune multiplo</h3> <p> <label for="campo_uno">1° numero </label> <input type="text" id="campo_uno" name="campo_uno" size="10" value="" /> <label for="campo_due">2° numero </label> <input type="text" id="campo_due" name="campo_due" size="10" value="" /> </p> <p> <input type="button" value=" calcolo" onclick="campo_mcd.value=mcd(campo_uno.value, campo_due.value); campo_mcm.value=mcm(); campo_ms.value=messaggio()" /> </p> <p> <label for="campo_mcd">MCD </label> <input type="text" id="campo_mcd" name ="campo_mcd" size="10" value="" readonly="readonly"/> <label for="campo_mcm">mcm </label> <input type="text" id="campo_mcm" name="campo_mcm" size="20" value="" readonly="readonly"/> </p> <p> <label for="campo_ms">esito </label> <input type="text" id="campo_ms" name="campo_ms" size="15" value="" readonly="readonly" /> </p> <p> <input type="reset" value=" reset" /> </p> </form> </body> </html>
Come nel precedente esempio 5 si fa riferimento al codice Javascript con il tag
<script src="mcdmcm.js"></script>
Nella form sono collocati
I campi di output presentano i risultati calcolati dalle funzioni Javascript. In particolare il campo campo_ms mostra un messaggio di riuscita oppure di errore.
Questo è il sorgente Javascript.
//variabili globali maggiore = 0; minore = 0; resto = 0; MCD = 0; /*controllo della validità dell'input: se è accettabile produce il suo valore assoluto altrimenti produce il valore null*/ function controlloInput(n) { if (isNaN(n)) return null; if (parseInt(n) != n) return null; if (n==0) return null; return Math.abs(n); } //Calcolo del MCD function mcd(n1,n2) { MCD = null; //se gli input non sono validi non si fa nulla n1 = controlloInput(n1); if (n1==null) return null; n2 = controlloInput(n2); if (n2==null) return null; //se il primo numero è minore del secondo, si scambiano if (n1<n2) { var temp = n1; n1 = n2; n2 = temp; } //si fissano i valori delle variabili globali, usati dalla funzione seguente maggiore = n1; minore = n2; //si applica l'algoritmo di Euclide while (n2 != 0) { resto = n1 % n2; n1 = n2; n2 = resto; } //si fissa il valore di MCD, usato dalle funzioni seguenti MCD = n1; return MCD; } function mcm() { //se non è stato possibile calcolare MCD, non si fa niente if (MCD==null) return null; //altrimenti si calcola il mcm return maggiore*minore/MCD; } function messaggio() { //se non è stato possibile calcolare MCD, messaggio di errore if (MCD==null) return "Input improprio."; else return "OK"; }
Il sorgente dichiara quattro variabili globali, inizialmente nulle, il cui valore definitivo viene fissato dalla funzione mcd() e viene utilizzato dalle funzioni mcm() e messaggio().
La funzione controlloInput() verifica se il suo argomento può rappresentare un numero intero. In caso affermativo restituisce il valore assoluto del numero intero; in caso contrario il valore null.
La funzione mcd(), dopo aver verificato tramite la funzione controlloInput() l'adeguatezza degli input ricevuti (altrimenti termina con valore null), se i numeri non sono in ordine decrescente li scambia tra loro e ne assegna i valori alle variabili globali maggiore e minore utili alle altre funzioni del sorgente.
Infine determina il MCD applicando il metodo delle divisioni successive noto come algoritmo di Euclide: si divide il maggiore per il minore, quindi il minore per il resto e così via, fino a che non si ottiene resto zero. Quando il resto è zero, il MCD è l'ultimo divisore usato.
Si potrebbe sostituire il ciclo while usato in mcd(n1,n2) con l'istruzione MCD=euclide(n1,n2) aggiungendo al sorgente Javascript la seguente funzione
function euclide(a,b) { if (b!=0) return euclide(b,a%b); return a; }
Questa funzione mostra un esempio di ricorsione: per calcolare il proprio risultato la funzione invoca sè stessa. Il procedimento logico è questo: