Aritmetica 3


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="" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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"/>
&nbsp;&nbsp;&nbsp;
<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: