« Ritorna al blog

Ritorna alla lista completa degli articoli

Mettiti alla prova: utilizzo del namespace

PHP - SFIDE - gennaio 28, 2022

Grazie al namespace in PHP possiamo organizzare meglio il nostro codice e renderlo mantenibile nel tempo. Altra caratteristica straordinaria è che non dobbiamo preoccuparci dell'omonimia tra classi o funzioni. Ad esempio se utilizziamo una funzione che ha lo stesso nome della funzione contenuta nel namespace il codice funzionerà regolarmente. Per questo esercizio immaginiamo di voler costruire delle funzioni matematiche che ci saranno utili anche per altri progetti.

start.php

<?php include_once('namespace/namespace.math.start.php'); ?>
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>namespace math</title>
</head>

<body>


	<?php

	function stampa_divisori($numero)
	{
		$res = math\divisori($numero);
		for ($c = 1; $c <= $numero; $c++) {
			printf("%s : %s = %s - Resto: %s <br>", $numero, $c, $numero / $c, $numero % $c);
		}
		printf("Divisori di %s: [%s]", $numero, implode(" , ", $res));
	}

	function stampa_mcm($n1, $n2)
	{
		$res = math\mcm($n1, $n2);
		printf("m.c.m di %s è %s: %s", $n1, $n2, $res);
	}

	function stampa_mcd($n1, $n2)
	{
		$res = math\mcd($n1, $n2);
		printf("M.C.D di %s è %s: %s", $n1, $n2, $res);
	}

	function stampa_decimale($n)
	{
		$res = math\separa_decimali($n);
		printf("Il decimale di %s è %s", $n, $res);
	}

	function stampa_somma($arr)
	{
		$res = math\somma($arr);
		printf("La somma dei numeri [%s] è uguale a %s", implode(" + ", $arr), $res);
	}

	function stampa_moltiplicazione($arr)
	{
		$res = math\prodotto($arr);
		printf("Il prodotto dei numeri [%s] è uguale a %s", implode(" x ", $arr), $res);
	}

	function stampa_media($arr)
	{
		$res = math\media($arr);
		printf("La media dei numeri (%s) / %s è uguale a %s", implode(" + ", $arr), count($arr), $res);
	}


	$numeri = [10, 5, 4, 7, 1];

	stampa_divisori(12);

	echo "<br><br>";
	stampa_divisori(12.25);

	echo "<br><br>";
	stampa_mcm(50, 20);

	echo "<br><br>";
	stampa_mcd(50, 20);

	echo "<br><br>";
	stampa_decimale(589.45);

	echo "<br><br>";
	stampa_somma($numeri);

	echo "<br><br>";
	stampa_moltiplicazione($numeri);

	echo "<br><br>";
	stampa_media($numeri);

	?>

</body>

</html>

Il file da completare sarà solo namespace.math.start.php in quanto il file start.php si occupa di formattare i dati e di includere il namespace. Il file start.php visualizza il risultato di diverse operazioni matematiche richiamando le funzioni specificate nel namespace il cui nome è math:

namespace.math.start.php

<?php

namespace math;

function divisori($numero)
{
    // da completare
    return array();
}

function mcm($n1, $n2)
{
    // da completare
    return 0;
}

function mcd($n1, $n2)
{
    // da completare
    return 0;
}

function separa_decimali($num)
{
    // da completare
    return 0.00;
}

function somma($numeri)
{
    // da completare
    return 0;
}

function prodotto($numeri)
{
    // da completare
    return 0;
}

function media($numeri)
{
    // da completare
    return 0;
}

Ogni funzione dovrà essere completata scrivendo il codice necessario.

Note:

  • funzione divisori(): nella funzione può essere passato sia un numero intero che decimale. A seconda della natura del parametro la funzione dovrà calcolare tutti i possibili divisori di quel numero. Sarà forse necessario ad esempio utilizzare le funzioni incorporate di php come is_numeric(), floor()  e l'operatore modulo (%) che calcola il resto di una divisione. Tali funzioni, se combinate, possono anche aiutare ad individuare se un numero è decimale o meno.
    Ricordo che i divisori di un numero sono tutti quei numeri che dividono esattamente quel numero generando un resto pari a zero. I due divisori più ovvi sono 1 e il numero stesso poiché ogni numero può essere diviso per 1 e per sé stesso.
    In questo esercizio viene usato il numero 12 e il numero12.25.
    Pertanto avremo che i divisori di 12 saranno [1 , 2 , 3 , 4 , 6 , 12], mentre i divisori di 12.25 saranno [1 , 1.0208333333333 , 2 , 2.0416666666667 , 3 , 3.0625 , 4 , 4.0833333333333 , 6 , 6.125 , 12 , 12.25];
  • funzione mcm(): in questa funzione bisognerà calcolare il minimo comune multiplo di due numeri, ossia il numero più piccolo divisibile per entrambi i numeri. In questo esempio vengono usati i numeri 50 e 20. Usando il metodo della scomposizione in fattori primi avremo:
    50 = 2 x 52
    20 = 22 x 5
    mcm = 100
  • funzione mcd(): in questa funzione bisognerà calcolare il MCD, ossia il più grande divisore dei due numeri considerati. In questo esempio vengono usati i numeri 50 e 20. Usando il metodo della scomposizione in fattori primi avremo:
    50 = 2 x 52
    20 = 22 x 5
    mcd = 10
  • funzione separa_decimali(): in questa funzione dovremo separare la parte intera da quella decimale di un numero. In questo caso la parte decimale di 589.45 sarà 0.45. Se posso darvi un suggerimento arrotondate il numero per difetto con la funzione floor() di php e poi sottraete per ricavare la parte decimale
  • funzione somma(): in questa funzione dovrete sommare i valori di un array. Utilizzate il metodo che più preferite ma ricordatevi anche della funzione di php array_sum()
  • funzione prodotto(): in questa funzione dovrete moltiplicare i valori di un array. Utilizzate il metodo che più preferite ma ricordatevi anche della funzione di php array_product()
  • funzione media(): in questa funzione dovrete calcolare la media aritmetica di una serie di numeri

 

Dovrete concentrarvi solo nel file namespace.math.start.php. Una volta completato avrete un output simile al seguente:

Mettiti alla prova: utilizzo del namespace in PHP

Provate a farlo da soli senza vedere la soluzione. Buon lavoro e soprattutto divertitevi :)

namespace.math.finish.php

<?php

namespace math;

function divisori($numero)
{
    // da completare
    $arr_int = array();
    $arr_dec = array();
    $arr_global = array();
    $decimal = false;

    // Verifico se è un numero decimale o meno
    $decimal = is_numeric($numero) && floor($numero) != $numero ? true : false;

    for ($c = 1; $c <= $numero; $c++) {
        if (0 == ($numero % $c)) {
            array_push($arr_int, $c);
            if ($decimal == true) {
                array_push($arr_dec, $numero / $c);
            }
        }
    }

    // Creo un unico array
    for ($c = 0; $c < count($arr_int); $c++) {
        array_push($arr_global, $arr_int[$c]);
        if (!empty($arr_dec)) {
            array_push($arr_global, $arr_dec[$c]);
        }
    }

    // Ordino l'array
    asort($arr_global);
    
    return $arr_global;
}

function mcm($n1, $n2)
{
    // da completare
    $mcd = mcd($n1, $n2);
    $mcm = ($n1 * $n2) / $mcd;
    return $mcm;
}

function mcd($n1, $n2)
{
    // da completare
    while ($n1 != $n2) {
        if ($n1 > $n2) {
            $n1 = $n1 - $n2;
        } else {
            $n2 = $n2 - $n1;
        }
    }
    return $n1;
}

function separa_decimali($num)
{
    // da completare
    $intpart = floor($num); 
    $decimal = $num - $intpart; 
    return $decimal;
}

function somma($numeri)
{
    // da completare
    return array_sum($numeri);
}

function prodotto($numeri)
{
    // da completare
    return array_product($numeri);
}

function media($numeri)
{
    // da completare
    return array_sum($numeri) / sizeof($numeri);
}
Mettiti alla prova: utilizzo del namespace