dal 2015 - visita n. 745
Strutture di controllo
Strutture di controllo

 

Strutture di controllo

Le strutture di controllo e le strutture condizionali sono alla base di tutti i linguaggi di programmazione. Esse permettono di svolgere determinate azioni ripetitive e di deviare il flusso progressivo delle azioni in funzione degli accadimenti nel corso dell'elaborazione del programma. E' compito del programmatore prevedere tutti i casi che possono ragionevolmente presentarsi, pena l'incorrere in spiacevoli errori di gestione qualora se ne omettesse qualcuno. Questo procedimento viene detto controllo di flusso di un programma. Passiamo adesso in rassegna i costrutti sintattici di JavaScript che servono sia per operare delle scelte sia per controllare ripetizioni di blocchi di codice.


if ... else if ... else

Questa struttura di controllo, molto usata nella programmazione in tutti linguaggi, in JavaScript permette di eseguire dei blocchi di codice in funzione di un controllo su un oggetto. Ecco la sua sintassi:

if ([condizione]) 
   { [Blocco di istruzioni A] }

oppure:

if ([condizione]) 
   { [Blocco di istruzioni A] }
else
   { [Blocco di istruzioni B] }

Nel primo caso il [Blocco di istruzioni A] viene eseguito solo se la [condizione] risulta soddisfatta.
Nel secondo caso viene prevista l'alternativa [Blocco di istruzioni B] se la [condizione] NON risulta soddisfatta.
È anche possibile fare più controlli in sequenza grazie alla coppia di parole chiave else if che permette di utilizzare più di una alternativa, se la [condizione] non viene soddisfatta. Ecco un esempio:

var n = 10;
.....
if (n == 0) { document.write("Il numero n è zero."); }
else if (n <= 5) { document.write("Il numero n non è superiore a 5."); } 
else if (n <= 10) { document.write("Il numero n non è superiore a 10."); } 
else { document.write("Il numero n è maggiore di 10."); }

Quando il [Blocco di istruzioni] si riduce ad una sola istruzione la coppia di parentesi graffe può essere omessa:

.....	
if (n == 0) document.write("Il numero n è zero.");
else if (n <= 5) document.write("Il numero n non è superiore a 5."); 
.....

Prova


if annidate

Per annidamento si intende la possibilità di includere, all'interno dei blocchi di codice, altre istruzioni di controllo dello stesso tipo di quelle che controllano il blocco. In poche parole, nel caso del costrutto if, è possibile racchiudere altre istruzioni if all'interno di una prima if. Per chiarire meglio questo concetto è opportuno osservare il seguente esempio:

  var x=1, y=0;
     if (x==1) {
        alert('x è uguale a 1');
        if (y==0) alert('y è uguale a 0');
     }
     else alert('x è diverso da 1');

In questo caso la prima istruzione if, oltre a racchiudere nel blocco di codice da essa dipendente un'istruzione alert, include anche un altro costrutto condizionale, che però verrà esaminato solamente se la condizione della prima if, si rivelerà vera. Se tale condizione dovesse rivelarsi falsa, la condizione dipendente dalla seconda if non verrebbe mai presa in considerazione e l'esecuzione dello script passerebbe direttamente al di fuori delle parentesi graffe del blocco. E' chiaro che se la seconda if avesse bisogno di eseguire più di una istruzione sarebbe possibile aprire un secondo blocco, ad essa dedicato, con l'uso delle parentesi graffe.
Per verificare quanto appena detto ecco un esempio interattivo dove è possibile cambiare il valore della variabile x ed osservare che quando questa vale 1 vengono eseguite le due istruzioni alert del blocco if, mentre se è diversa da 1 viene eseguita solo l'istruzione alert di else.

x =    


if sintetiche

Quando l'istruzione da eseguire all'interno di un costrutto if è una sola è possibile omettere le parentesi graffe che delimitano il blocco di codice. In tal caso è anche possibile scrivere tutto il codice su una sola riga:

 if (condizione) istruzione;

La scrittura su una sola riga rende piú leggibile il codice. L'uso di questa forma unilineare di if non è però riservato solo al caso che si debba scrivere una sola istruzione dopo la condizione, anche in caso di più istruzioni è possibile scrivere tutto su una sola riga con la differenza che ridiventa obbligatorio racchiudere le istruzioni tra parentesi graffe:

 if (condizione) {istruzione1; istruzione2; ...; istruzioneN}

Queste scelte sono a totale discrezione del programmatore, ognuno ha il suo stile di programmazione, ma è importante cercare sempre di rendere il codice chiaro e leggibile a sé stessi e agli altri.
A questo proposito si sarà notato come nei listati d'esempio le istruzioni che seguono il costrutto if, nel caso siano scritte su una riga diversa, siano tutte spostate di un paio di spazi rispetto alla if da cui dipendono. Questo è un uso comune nello scrivere codice e viene chiamato indentazione. Anche questo è un espediente per rendere piú chiaro ciò che si scrive. Le regole non scritte dell'indentazione prevedono che si debbano scalare solamente quelle istruzioni che sono subordinate a un'istruzione di controllo come la if, ma conviene farlo anche per quanto riguarda i cicli o altri costrutti simili. Questo favorisce l'immediata comprensione di quali istruzioni saranno eseguite qualora una determinata condizione si verifichi.

 L'indentazione è una pratica altamente raccomandata  sebbene essa non abbia alcuna influenza su come il codice verrà interpretato o compilato (nel caso di altri linguaggi), ma nel corso della revisione di un listato a distanza di tempo è più importante la leggibilità del codice piuttosto che la sua compattezza.


switch

Quando si ripetono molte alternative else if il codice può risultare complicato nell'aspetto e difficile da leggere. Allora il costrutto switch consente di effettuare la scelta delle alternative con maggiore pulizia del codice e conseguente maggiore leggibilità. Ecco la sintassi:

switch ([condizione]) {
case punto1:
	[Blocco di istruzioni]
	break;
case punto2:
	[Blocco di istruzioni]
	break;
default:
	[Blocco di istruzioni]
}

Al verificarsi della [condizione], verrà eseguito il [Blocco di istruzioni] che ha come etichetta il risultato dell'espressione definita nella condizione.
L'istruzione di default è l'alternativa estrema e viene eseguita quando il risultato della [condizione] non ha alcun riscontro con le etichette precedenti.
L'istruzione break, invece, serve per limitare l'esecuzione del Blocco di codice; se omesso, verrebbe eseguito anche il blocco di codice successivo.

var d=new Date();
var n=d.getDay();
switch (n) {
  case 1: st="lunedì!;    break;
  case 2: st="martedì";   break;
  case 3: st="mercoledì"; break;
  case 4: st="giovedì";   break;
  case 5: st="venerdì";   break;
  case 6: st="sabato";    break;
  default: st="domenica";
} 
document.write("oggi è " + st + "!");

Prova


Operatore Ternario

Poichè la struttura if è molto frequente esiste un modo alternativo, più compatto, per realizzarla, si tratta dell'operatore ? che è detto ternario perchè ha la seguente sintassi:

Espressione1 ? Espressione2 : Espressione3

dove Espressione1 è un'espressione booleana che viene valutata. Se Espressione1 è vera, viene valutata Espressione2 ed il suo risultato è il risultato dell'operatore ?, altrimenti viene valutata Espressione3 ed il suo risultato sarà il risultato dell'operatore ?. Quindi il carattere due punti separa la condizione vera dalla condizione falsa. Ecco un esempio:

 y = (x>0) ? 5 : 10;

dove la variabile y assume il valore 5 se x è un numero positivo, assume il valore 10 se x è negativo o zero.
In maniera classica avremmo potuto scrivere:

 if (x>0) y=5 else y=10;

Le due soluzioni sono perfettamente equivalenti, ma la seconda è più facilmente leggibile; però alcuni programmatori ritengono molto elegante utilizzare la sintassi dell'operatore ternario e quindi è bene riconoscerla e saperla interpretare nel caso in cui si consultino script realizzati da altri. Nei propri script l'uso dell'uno o dell'altro costrutto è solo una questione di abitudine. Per finire un altro esempio, leggermente più articolato:

 var x = 11;
 var inLettere = (x == 5) ? 'cinque' :
                 (x == 7) ? 'sette' :
                 (x == 11) ? 'undici' :
                 (x == 15) ? 'quindici' :
                 'altro numero';
 document.write(inLettere);                      // Il risultato sarà undici, nel nostro caso.

In questo caso, che sarebbe realizzabile altrimenti o con una serie di if o con un costrutto switch, si ha sia una maggiore compattezza del codice sia un'ottima leggibilità.


while

Il ciclo while è uno dei costrutti che permettono di ripetere un certo numero di volte un determinato blocco di codice. La sua sintassi è piuttosto semplice:

while ([condizione]) {
	[Blocco di istruzioni]
}

Questo ciclo esegue il [Blocco di istruzioni] contenuto tra le parentesi graffe finché la [condizione] permane vera.
Se la [condizione] risulta falsa fin dall'inizio, il [Blocco di istruzioni] non verrà eseguito neanche una volta.
Nota: ricordarsi di aggiornare sempre la variabile di controllo usata nella [condizione] per evitare un loop infinito che potrebbe causare il blocco del browser.

Prova


do ... while

Il ciclo do ... while si comporta esattamente come il costrutto salvo per il fatto che il [Blocco di istruzioni] racchiuso tra parentesi graffe viene eseguito almeno una volta, dato che il controllo sulla [condizione] avviene alla fine del costrutto. La sintassi è la seguente:

do {
	[Blocco di istruzioni]
} while ([condizione]);

Prova


for

Il ciclo for è probabilmente quello più conosciuto e usato per le iterazioni. Chi ha familiarità con la programmazione, conoscerà certamente questo costrutto essendo comune alla maggior parte dei linguaggi. Chi è al primo approccio troverà molto più leggibile il ciclo for rispetto al ciclo while ed al ciclo do ... while. Il suo funzionamento si basa su tre elementi:

Vediamo subito il suo schema di funzionamento per capire com'è composto e come va usato.

for ([contatore]; [condizione]; [incremento]) {
	[Blocco di istruzioni]
}

Il ciclo, partendo dal valore iniziale del [contatore], esegue il [Blocco di istruzioni] e quindi esegue un [incremento] del contatore. Questa sequenza si ripeterà fino a quando la [condizione] non è verificata.
Esiste anche la possibilità di creare cicli controllati, che possono essere terminati dall'interno del [Blocco di istruzioni] tramite la parola chiave break. Ma occorre prestare molta attenzione perchè una dichiarazione imprecisa o errata nel ciclo può portare al verificarsi del cosiddetto loop infinito con conseguente blocco del programma.

Prova


for ... in

Il ciclo for ... in è una variante molto utile del ciclo for che serve per creare un ciclo di iterazioni su tutti gli elementi di un oggetto. La sua sintassi è:

for ([elemento] in [oggettoIterabile]) {
	[Blocco di istruzioni]
}

Il suo funzionamento è immediato: partendo dal primo [elemento] dell'[oggettoIterabile] viene eseguito il [Blocco di istruzioni] su ciascuno di tutti gli altri elementi.

Prova


break

Questa istruzione è già stata incontrata a proposito di switch e for. Il suo scopo è quello di bloccare l'iterazione per uscire dal ciclo, passando alle istruzioni successive.


continue

Anche questa istruzione è strettamente legata alle iterazioni. Una volta chiamata, interrompe il ciclo corrente e continua con il valore successivo dell'iterazione senza uscire dal ciclo.
















Introduzione
Variabili ed Operatori
Parole riservate
Codici Carattere
HTML e JavaScript
Funzioni
Strutture di controllo
Eventi
Oggetti
Oggetti predefiniti
Espressioni Regolari



Chi s'innamora di se stesso non avrà rivali.
Benjamin Franklin

Valid CSS!
pagina generata in 0.001 secondi