Programmazione Iterativa

Flusso naturale del programma:

  • viene eseguita un’istruzione dopo l’altra fino a che non si incontra l’istruzione di fine programma.

Programmazione iterativa:

  • un'istruzione (o una serie di istruzioni) vengo eseguite continuamente, fino a quando non sopraggiungono delle condizioni che fanno terminare il ciclo.

while

Il ciclo while ripete un blocco di codice fino a quando una condizione specificata è vera.

Sintassi

while (condizione) {
    //blocco di codice da eseguire
}

Esempio 1

//Questo ciclo continua fino a che  i è minore di 20
	function myFunction() {
		var i = 0;	
		while (i < 20) {
			var text =	"<br>Il numero è " + i;
			document.getElementById("demo").innerHTML += text;
			i++;
		}
		document.getElementById("demo").innerHTML += "<br>Il ciclo è finito!";
    }
/* ================================================================
   !!! ATTENZIONE !!!
   Se si dimentica di aumentare la variabile usata nella condizione, 
   il ciclo diventerà infinito . Questo manderà in crash il browser.
   ================================================================= */

for

Il for inizializza una variabile, pone una condizione e poi modifica (normalmente incrementa o decrementa) la variabile iniziale.

for (inzializzazione; condizione; modifica){
   // blocco istruzioni;
}

Il codice  <blocco istruzioni> viene eseguito fino a che l’espressione <condizione> risulta vera, poi si passa la all’istruzione successiva al for.

Esempio

// Questo ciclo for continua fino a che  < i > è minore di 20
function test () {
	for (var i = 0; i < 20; i++) {
		console.info('I adesso vale ' + i); 
	}
	console.info("Adesso i vale " + i + 
		". Il ciclo è terminato.");
}
test();

Esercizio: Media tra numeri

/medianumeri.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Media tra numeri</title>
    <link rel="stylesheet" href="/css/stile.css">
</head>

<body>
    <div class="copertina">
        <div class="contenitore">
            <h1>Media tra più numeri</h1>
        </div>
    </div>

    <div class="contenitore">
        <div class="riga align-items-center mt-2">
            <div class="col">
                <input id="input-utente" type="text" placeholder="Inserisci i numeri separati da punto e virgola" value="" class="aba-input">
            </div>
            <div class="col-auto">
                <button id="btn-calcola" type="button" class="bottone bottone-rosso btn-rounded">Calcola</button>
            </div>
        </div>

        <h5 class="my-2">Risultato</h5>
        <p id="risultato"></p>
    </div>

    <script>
        // Calcola la media dei numeri organizzati in un 
        // Array di numeri
        function calcolaMedia(numArray) {
            var i = 0; // Indice dell'array di numeri
            var somma = 0; // Somma dei valori presenti nell'array

            while (i < numArray.length) {
                somma = somma + numArray[i];
                i++;
            }

            if (numArray.length > 0) {
                return somma / numArray.length;
            }
            return 0;
        }


        // Trasforma una stringa di numeri separati da punti e virgola 
        // in un array di numeri controllando che i valori siano 
        // realmete numeri e restituisce NaN se la conversione non va a buon fine
        function traduciInput(numeriStringa) {
            var arrayStr = numeriStringa.split(';');
            var numArray = [];
            for (i = 0; i < arrayStr.length; i++) {
                arrayStr[i] = arrayStr[i].replace(',','.');
                var num = parseFloat(arrayStr[i]);
                if (isNaN(num))
                    return NaN;
                numArray.push(num);
            }
            return numArray;
        }

        // Prende la stringa inserita dall'utente nel campo di immissione 
        // prova a trasformarla in un array di numeri utilizzando la funzione traduciInput 
        // se la trasformazione riesce utilizza la funzione calcolaMedia per calcolare al media dei numeri
        // altrimenti restituisce un messaggio di errore
        function outpuSuPagina () {
            var testoUtente = document.getElementById('input-utente');
            var outputUtente = document.getElementById('risultato');
            var testoInserito = testoUtente.value;
            var numArray = traduciInput(testoInserito);
            if (numArray == NaN) {
                outputUtente.innerHTML = "Inserisci solo numeri separati da punto e virgola!";
            } else {
                var r = calcolaMedia(numArray);
                outputUtente.innerHTML = "La media è: " + r;
            }
        }

        var bottone = document.getElementById('btn-calcola');

        bottone.addEventListener('click', outpuSuPagina);


    </script>

</body>

</html>

/css/stile.css

/*==============
    GENERALE
================*/

* {
    box-sizing: border-box;
    margin:0;
}

html {
    font-size: 20px;
}

/*==============
    TIPOGRAFIA
================*/
body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
    font-size: 1rem;
    color: #222222; 
    line-height: 1.4;
}

h1,h2,h3 {
    font-weight: 300;
}

h4,h5,h6 {
    font-weight: 600;
    font-variant: small-caps;
}

h1,h2,h3,h4,h5,h6 {
    line-height: 1.1;
}

h1 {
    font-size: 4.5rem;
}

h2 {
    font-size: 3.5rem;
}

h3 {
    font-size: 2.5rem;
}

h4 {
    font-size: 1.8rem;
}

h5 {
    font-size:1.4rem;
}

h6 {
    font-size: 1.1rem;
}

a {
    color: #660000;
    font-weight: 600;
    text-decoration: none;
}

a:hover {
    color: #dd0000;
    text-decoration: underline;
}

p {
    margin-bottom: 1.6rem;
}

section {
    padding-top: 60px;
}

/*==============
    CONTAINER
================*/

.contenitore {
    width: 90%;
    margin-left: auto;
    margin-right: auto;
}

@media (max-width: 1200px) {
    .contenitore {
        width: 100%;
        padding-right: 15px;
        padding-left: 15px;
    }
}

.d-flex {
    display: flex;
}

.align-items-center {
    align-items: center;
}

.justify-content-between {
    justify-content: space-between;
}

.rotondo {
    border-radius: 50%;;
}

.full-screen {
    min-height: 100vh;
}

.text-center {
    text-align: center;
}

.text-orologio {
    font-family: 'Courier New', Courier, monospace;
    font-size: 18vw;
}

@media (max-width:996px) {
    .text-tablet-center {
        text-align: center;
    }
}

/*========================
    BARRA DI NAVIGAZIONE
==========================*/

nav {
    background-color: black;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    z-index: 1000;
}

nav ul {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-flow: row wrap;
    justify-content: center;
}

nav ul > li > a {
    display: block;
    padding: 0.8rem 2rem;
    color: #eeeeee;
    text-transform: uppercase;
}

nav ul > li > a:hover {
    color: #222222;
    background-color: #cccccc;
    text-decoration: none;
}

.nav-brand {
    height: 40px;
}

/*========================
       COPERTINA
==========================*/
.copertina {
    background-color: #333;
    color: white;
    padding-top: 4rem;
    padding-bottom: 4rem;
}

.copertina-orologio {
    background-color: #333333;
    color: white;
}

/*========================
       GRIGLIA
==========================*/

.img-fluid {
    max-width: 100%;
    height: auto;
}

.riga {
    display: flex;
    flex-flow: row wrap;
    margin-left: -15px;
    margin-right: -15px;
}

.col-33, .col-66, .col, .col-auto {
    padding-left: 15px;
    padding-right: 15px;
}

.col-33 {
    flex: 1 1 33.33%;
    max-width: 33.33%;
}

.col-66 {
    flex: 1 1 66.66%;
    max-width: 66.66%;
}
.col-auto {
    flex: 0 0 auto;
    max-width: 100%;
}

.col {
    flex: 1 1 1px;
}

@media (max-width:996px) {
    .col-66.col-tablet-100, .col-33.col-tablet-100, .col.col-tablet-100 {
        flex: 1 1 100%;
        min-width: 100%;
    }

    .riga-tablet-2 .col {
        flex: 1 1 50%;
        max-width: 50%;
    }
}

/*=======================
        MARGINI
========================*/
.m-0 {
    margin: 0;
}

.m-auto {
    margin: auto;
}
.mt-2, .my-2 {
    margin-top:2rem;
}

.mb-2, .my-2 {
    margin-bottom: 2rem;
}

.ml-2, .mx-2 {
    margin-left: 2rem;
}

.mr-2, .mx-2 {
    margin-right: 2rem;
}
/*========================
         BOTTONI
==========================*/

.bottone {
    border:2px solid transparent;
    border-radius:0;
    display: inline-block;
    cursor: pointer;
    font-weight: 700;
    padding: 0.75rem 1.5rem;
}
.bottone:hover {
    text-decoration: none;
}

.bottone-rosso {
    background-color: #660000;
    border-color: #660000;
    color: white;
}

.bottone-rosso:hover {
    background-color: white;
    color: #660000;
}

.btn-rounded {
    border-radius: 2rem;
}

.btn-rounded:focus {
    outline: none;
}
/*========================
         COLORI
==========================*/
.bg-grigio-chiaro {
    background-color: #cccccc;
}

/*========================
        GALLERY
==========================*/

.img-cont-1by1 {
    padding-bottom: 100%;
}

.img-cont-4by3 {
    padding-bottom: 75%;
}

.img-cont {
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    transition: all 0.5s;
}

.galleria a {
    display: block;
    overflow: hidden;
}
.galleria a:hover .img-cont {
    opacity: 0.7;
    transform: scale(1.1);
}

/*========================
        INPUT
==========================*/

.aba-input {
    width: 100%;
    padding: 0.5rem 0.75rem;
    border-radius: 0;
    border: #cccccc 1px solid;
}

.aba-input:focus {
    outline: #660000 solid 3px;;
}