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: