22 Esercizi con i while e do while
- esercizio 1 :
Stampa i numeri da 1 a 170 (colonna A) con a fianco la somma dei numeri che li hanno preceduti nella fila A (colonna B). Nel caso la somma arriva a 5000 deve interrompersi il ciclo.
let a=1, b=170, somma=0; cont=a; while (cont<=b && somma<5000) { document.write(cont + " " + somma +"<br>"); somma+=cont; cont++; }
Creiamo una funzione che era una linea separatrice che separa a livello grafico gli esercizi .
function separatore() { document.write(' _ '.repeat(60) + '<br />'); }
Così basta richiamarla tra un esercizio e l’altro per creare un separatore. Interessante il metodo per le stringhe repeat che ripete la stringa di quante volte lo specifico nel metodo.
- esercizio 2 :
stampiamo i numeri da 1 a 10, quindi lo zero no, ma il 10 si , vediamo cosa cambia a spostare il contatore all’inizio o infondo alle istruzioni 012345678910
Mentalmente è buona norma portarsi sempre col contatore all’inizio dell’istruzione e vedere cosa accade
let conta = 0; while (conta<10) { conta++; document.write(conta + "<br />"); }
e, sempre mentalmente, portarsi alla penultima iterazione e vedere cosa accade. Con conta++ in fondo, ma conta = 1 si parte da 1
let conta = 1; while (conta<10) { document.write(conta + "<br />"); conta++; }
Ma si arriva fino a 9, perché quando viene stampato il valore 9 il conta++ lo incrementa a 10 e il ciclo si blocca. Risolviamo cambiando la condizione <=10
let conta = 1; while (conta<=10) { document.write(conta + "<br />"); conta++; }
- esecizio 3 :
stampare i numeri di prima (da 1 a 10) ma solo quelli pari
Viene logico inizializzare il contatore a 2, stamparlo e fare l’incremento di unità
let contat = 2; while (contat<=10) { document.write(contat + '<br />'); contat+=2; }
Immaginiamo che però volessimo far passare tutti i numeri, magari i dispari ci potrebbero servire per qualcos’altro , l’esercizio ci serve per comprendere le strutture annidate, quindi nel corpo di un ciclo possiamo mettere qualunque altra iterazione o condizione
let contat = 1; while (contat<=10) { if (contat%2 == 0) { document.write(contat + '<br />'); } contat++; }
contatore%2 calcola il resto (%) diviso 2. Occhio perché a differenza di altri linguaggi, in js dividendo e divisore sono sempre considerati floating point e non interi, quindi attenzione alle approssimazioni.
- esercizio 4 :
Stampa della tabellina pitagorica
let riga=1, colonna=1; while (riga<=10) { colonna = 1; while (colonna<=10) { document.write(riga*colonna + " "); colonna++ } document.write("<br />"); riga++; }
Un classico esempio di cicli annidati
Tutti i cicli visto fino ad oggi sono detti enumerativi , in quanto sono basati sul fatto che sappiamo a priori quante volte il ciclo si ripete o comunque è facilmente individuabile.
Con l’ultimo esempio, oltre ad usare un do while per variare un po’ vedremo i cicli detti indefiniti, perché non sappiamo a priori quante volte sarà eseguito
- esercizio 5 :
un elenco di numeri generati casualmente da 0 a 100 fino a quando non sarà estratto il numero 7
iniziamo col creare una funzione che genera il numero casuale
function interoCasuale(max) { return Math.floor( Math.random() * max); }
Il metodo random della classe Math restituisce un numero casuale tra 0 e 1 (in realtà 1 non può mai uscire potrebbe uscire 0,99999999…..999 ma 1 mai). noi vogliamo tra 1 e 100, basta moltiplicare per il max . La funzione floor toglie i decimali arrotondando in basso (fosse 60,88 restituisce 60).
Ecco il codice completo:
do { let estratto = interoCasuale(100); document.write(estratto + "<br />") } while (estratto!=7); function interoCasuale(max) { return Math.floor( Math.random() * max); }