Tecnologie lato Client: Javascript Stefano Clemente [email protected] © 2005 Stefano Clemente I lucidi sono in parte realizzati con materiale tratto dal libro di testo adottato tradotto in italiano: © 2002 Prentice Hall H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) Riferimenti bibliografici • H. M. Deitel, P. J. Deitel, T. R. Nieto Internet & World Wide Web – How To Program (Second Edition) ed. Prentice Hall 2002 Capitoli 7, 8, 9, 10, 11, 12 11 Ottobre 2005 Stefano Clemente 2 Introduzione • JavaScript − Linguaggio di scripting per un approccio disciplinato alla realizzazione di programmi utili per migliorare le funzionalità e la visualizzazione delle pagine Web − È il linguaggio client-side “de facto” per le applicazioni basate sul Web − L’uso di JavaScript non è destinato solo allo scripting lato client, ma è utilizzato anche dal lato server per la creazione di script più complessi 11 Ottobre 2005 Stefano Clemente 3 Esempio 1 11 Ottobre 2005 Stefano Clemente 4 Esempio 2 11 Ottobre 2005 Stefano Clemente 5 Esempio 3 11 Ottobre 2005 Stefano Clemente 6 Esempio 4 N.B. - JavaScript è case-sensitive 11 Ottobre 2005 Stefano Clemente 7 Esempio 4 11 Ottobre 2005 Stefano Clemente 8 Struttura di un programma JavaScript • Un programma JavaScript deve essere definito nella parte di intestazione <head></head> (X)HTML • Deve essere racchiuso tra i tag <script></script> • All’interno di questi tag, si può ancora racchiudere in una sezione di commento HTML per evitare che un browser che non è in grado di eseguirlo lo visualizzi nella pagina • In sostanza la struttura è <script language="Javascript“ type="text/javascript"> <!-{dichiarazioni e statement JavaScript} //--> </script> 11 Ottobre 2005 Stefano Clemente 9 Variabili • Locazioni di memoria in cui memorizzare dati • Devono essere dichiarate con uno statement var var <nome_variabile>; var <nome_variabile_1> , … , <nome_variabile_n>; • Una variabile può essere inizializzata nello stesso statement di definizione var <nome_variabile> = <valore>; var <nome_variabile_1> = <valore1> , … , <nome_variabile_n> = <valoren>; 11 Ottobre 2005 Stefano Clemente 10 Variabili • Il tipo di dato della variabile è definito dal valore che le viene assegnato • I valori possono essere di tipo − − − − − caratteri o stringhe interi virgola mobile date booleani • false = false, 0, null, NaN, “” • true = qualsiasi altro valore • Il nome di una variabile può essere una qualsiasi sequenza di caratteri alfa-numerici, caratteri di sottolineatura (_) e dollaro ($), purché non cominci per un numero e non contenga spazi 11 Ottobre 2005 Stefano Clemente 11 Operazioni sulle variabili • È possibile − interrogare le variabili per conoscerne il valore − eseguire l’operazione di assegnamento <variabile> = <espressione>; • l’espressione alla destra dello statement viene valutata • il valore risultante diventa il nuovo valore assegnato alla variabile − ESEMPI • a = 12 + 3; • a = a + 3; ≡ a += 3; • a = a + 1; ≡ a += 1; ≡ a++; ≡ ++a; attenzione: in alcuni casi a++; ≠ ++a; 11 Ottobre 2005 Stefano Clemente 12 Esempio 5 11 Ottobre 2005 Stefano Clemente 13 Operatori () Operatore [] . ++ -- * / + - < <= == Tipo parentesi/array/punto incremento/decremento/ NOT ! moltiplicazione/divisione/ modulo % addizione/sottrazione > relazionali >= uguaglianza != && AND || OR ?: condizionale = += %= 11 Ottobre 2005 Priorità -= *= /= assegnamento Stefano Clemente 14 Oggetti • JavaScript è un linguaggio di programmazione Objectbased • Il nostro mondo è fatto di oggetti • Gli oggetti hanno − attributi – es. colore, peso, forma − comportamenti – es. una palla rotola, rimbalza, si gonfia, ecc. • Nel caso dei linguaggi di programmazione − gli oggetti sono parti di codice standardizzate e intercambiabili che consentono il riutilizzo del codice − proprietà – corrispondono agli attributi dell’oggetto e sono le variabili e le costanti dell’oggetto − metodi – corrispondono ai comportamenti e sono le parti di codice richiamabili dall’esterno vale a dire le funzioni dell’oggetto 11 Ottobre 2005 Stefano Clemente 15 L’oggetto Math: i metodi Metodo abs( x ) Descrizione Valore assoluto di x ceil( x ) Arrotonda cos( x ) exp( x ) Coseno di floor( x ) Arrotonda log( x ) Logaritmo naturale di max( x, y ) Massimo tra min( x, y ) Minimo tra pow( x, y ) X alla y (xy) round( x ) Arrotondamento di sin( x ) sqrt( x ) seno di tan( x ) Tangente di 11 Ottobre 2005 x per eccesso x (x in radianti) Metodo esponenziale ex x per difetto x x y e e x (base e) y Esempio abs( 7.2 ) = 7.2 abs( 0.0 ) = 0.0 abs( -5.6 ) = 5.6 ceil( 9.2 ) = 10.0 ceil( -9.8 ) = -9.0 cos( 0.0 ) = 1.0 exp( 1.0 ) = 2.71828 exp( 2.0 ) = 7.38906 floor( 9.2 ) = 9.0 floor( -9.8 ) = -10.0 log( 2.718282 ) = 1.0 log( 7.389056 ) = 2.0 max( 2.3, 12.7 ) = 12.7 max( -2.3, -12.7 ) = -2.3 2.3, 12.7 ) = 2.3 min( -2.3, -12.7 ) = -12.7 pow( 2.0, 7.0 ) = 128.0 pow( 9.0, .5 ) = 3.0 round( 9.75 ) = 10 round( 9.25 ) = 9 sin( 0.0 ) = 0.0 sqrt( 900.0 ) = 30.0 sqrt( 9.0 ) = 3.0 tan( 0.0 ) = 0.0 min( x x (x in radianti) Radice quadrata di x x (x in radianti) Stefano Clemente 16 L’oggetto Math: le proprietà Costante Math.E Descrizione Valore Costante di Eulero (e) Circa 2.718 Math.LN2 Math.LN10 Math.LOG2E Logaritmo naturale di 2 (in base e) Circa 0.693 Logaritmo naturale di 10 (in base e) Circa 2.302 Logaritmo in base 2 della costante di Eulero Circa 1.442 Math.LOG10E Math.PI Logaritmo in base 10 della costante di Eulero Circa 0.434 Circa 3.141592653589793 Math.SQRT1_2 Math.SQRT2 Radice quadrata di 0.5. Circa 0.707 Radice quadrata di 2.0. Circa 1.414 11 Ottobre 2005 Stefano Clemente 17 L’oggetto String: i metodi Metodo charAt( indice ) charCodeAt( indice ) concat( string ) Descrizione e esempi Restituisce una stringa contenente il carattere alla posizione specificata da indice var s = “Tecnologie di Internet”; s.charAt ( 0 ) = “T” s.charAt ( 7 ) = “g” s.charAt ( 100 ) = “” Restituisce il carattere Unicode alla posizione specificata da indice s.charCodeAt ( 0 ) = 84 s.charCodeAt ( 7 ) = 103 s.charCodeAt ( 100 ) = NaN Concatena stringhe s.concat ( “ – CLEI” ); = “Tecnologie di Inernet – CLEI” s1.concat ( s2 ) = s1 + s2 indexOf( substring, indice ) Cerca la prima occorrenza di lastIndexOf( substring, indice ) Cerca l’ultima occorrenza di slice( start, end ) Restitusce la stringa compresa tra start e end. Se end non è specificato, il metodo restituisce la stringa da start alla fine della stringa. Un end negativo specifica un indice a partire dalla fine della stringa (–1 è l’indice dell’ultimo carattere della stringa) s.slice( 1, 14 ) = “ecnologie di ” s.slice( 12 ) = “i Internet” s.slice( 12, -5 ) = “i Int” Separa la stringa proprietaria del metodo in più stringhe nella posizioni specificate da substring s.split( "e" ) = “T” “cnologi” “ di Int” “rn” “t” s.split( "u" ) = “Tecnologie di Internet” Stefano Clemente 18 split( string ) 11 Ottobre 2005 substring a indice in avanti partire dalla posizione specificata da s.indexOf( "di", 4 ) = 11 s.indexOf( "di", 14 ) = -1 substring a partire indice all’indietro dalla posizione specificata da s.lastIndexOf( "di", 4 ) = -1 s.lastIndexOf( "di", 14 ) = 11 L’oggetto String: i metodi Metodo substr( start, n ) Restituisce una da start. Se n Descrizione stringa contenente n caratteri a partire non viene fornito, restituisce una stringa fino alla fine sempre a partire da s.substr( 4 , 3 ) = “olo” s.substr( 4 ) = “ologie di Internet” start. substring( start, end ) toLowerCase() Restituisce la sottostringa da s.substring( 0 , 2 ) = “Te” toUpperCase() Converte i caratteri della stringa in caratteri maiuscoli s.toUpperCase( ) = “TECNOLOGIE DI INTERNET” toString() valueOf() Metodi che generano tag XHTML anchor( name ) Restituisce la stessa stringa end escluso Restituisce la stessa stringa Descrizione Trasforma la stringa in un elemento anchor (<a></a>) con name Trasforma la stringa in un elemento Trasforma la stringa in un elemento Trasforma la stringa in un elemento url strike() sub() sup() 11 Ottobre 2005 a Converte i caratteri della stringa in caratteri minuscoli s.toLowerCase( ) = “tecnologie di internet” nome blink() fixed() link( url ) start <blink></blink> <tt></tt> anchor (<a></a>) con come link Trasforma la stringa in un elemento<strike></strike> Trasforma la stringa in un elemento pedice TrasformaStefano la stringa Clemente in un elemento apice <sub></sub> <sup></sup>19 L’oggetto Date: i metodi var data = new Date; Inizializza la variabile alla data e ora corrente Metodo Descrizione getDate() getUTCDate() getDay() getUTCDay() getFullYear() getUTCFullYear() getHours() getUTCHours() getMilliseconds() getUTCMilliSeconds() getMinutes() getUTCMinutes() getMonth() getUTCMonth() getSeconds() getUTCSeconds() getTime() getTimezoneOffset() setDate( val ) setUTCDate( val ) Restitusce un numero da 1 a 31 che rappresenta il giorno del mese espresso nell’ora locale o UTC (detta anche GMT) 11 Ottobre 2005 Restituisce il giorno della settimana da 0 (Dom) a 6 (Sab) locale o UTC Anno di quattro cifre locale o UTC Ora (0-23) locale o UTC Millisecondi (0-999) ora locale o UTC Minuti (0-59) ora locale o UTC Mese da 0 (Gen) a 11 (Dic) locale o UTC Secondi (0-59) ora locale o UTC Millisecondi trascorsi dal 1.1.1970 all’ora contenuta nell’oggetto Date Differenza tra l’ora locale e l’ora UTC Settano il giorno del mese dell’oggetto Date (valori da 1 a 31) nell’ora locale o UTC Stefano Clemente 20 L’oggetto Date: i metodi Metodo setFullYear( y, m, d ) setUTCFullYear( y, m, d ) setHours( h, m, s, ms ) setUTCHours( h, m, s, ms ) setMilliSeconds( ms ) setUTCMilliseconds( ms ) setMinutes( m, s, ms ) setUTCMinutes( m, s, ms ) Descrizione Settano l’anno (locale o UTC). Il secondo e terzo argomento settano mese e giorno, sono opzionali e se non forniti vengono presi i valori attuali dell’oggetto Date Settano l’ora (locale o UTC). Il secondo, il terzo e il quarto argomento settano minuti, secondi e millisecondi, sono opzionali e se non forniti vengono presi i valori attuali dell’oggetto Date Settano i millisecondi nell’ora locale o UTC setMonth( m, d ) setUTCMonth( m, d ) Settano i minuti (locale o UTC). Il secondo e il terzo e argomento settano secondi e millisecondi, sono opzionali e se non forniti vengono presi i valori attuali dell’oggetto Date Settano il mese (locale o UTC). Il secondo argomento setta il giorno, è opzionale e se non fornito viene preso il valore attuale dell’oggetto Date setSeconds( s, ms ) setUTCSeconds( s, ms ) Settano i secondi (locale o UTC). Il secondo argomento setta i millisecondi, è opzionale e se non fornito viene preso il valore attuale dell’oggetto Date 11 Ottobre 2005 Stefano Clemente 21 L’oggetto Boolean: i metodi var b = new Boolean ( <valore_booleano> ); Metodo Descrizione Restituisce “true” (stringa) se il valore toString() dell’oggetto Boolean corrisponde a vero altrimenti restituisce “false” (stringa) valueOf() Restituisce il valore true se l’oggetto Boolean corrisponde a true altrimenti restituisce 11 Ottobre 2005 Stefano Clemente false 22 L’oggetto Number: i metodi var n = new Number ( <valore_numerico> ); Metodi Descrizione Ritorna la stringa della rappresentazione del numero toString( radix ) in base radix (argomento opzionale numerico da 2 a 36. 2 = binario 8 = ottale 10 = decimale 16 = esadecimale valueOf() Restituisce il valore numerico dell’oggetto Number.MAX_VALUE This property represents the largest value that can be stored in a JavaScript program—approximately 1.79E+308 This property represents the smallest value that can be Stefano storedClemente in a JavaScript program—approximately Number.MIN_VALUE 11 Ottobre 2005 Number 23 L’oggetto Number: le proprietà Proprietà Number.MAX_VALUE Descrizione Il più grande valore che può essere trattato da un programma JavaScript — circa 1.79E+308 Number.MIN_VALUE Il più piccolo valore che può essere trattato da un programma JavaScript — circa 2.22E–308 Number.NaN not a number - valore restituito dalle espressioni aritmetiche che non producono un numero come risultato (es., l’espressione parseInt("hello") non può convertire la stringa "hello" Number.NEGATIVE_INFINITY Number.NaN). Per stabilire se un valore corrisponde a NaN, utilizzare la funzione isNaN che restituisce true se il valore è NaN o false altrimenti “-” qualsiasi valore minore di -Number.MAX_VALUE Number.POSITIVE_INFINITY “+” qualsiasi valore maggiore di Number.MAX_VALUE. 11 Ottobre 2005 in un numero e restituisce Stefano Clemente 24 Array • Un array è un gruppo di locazioni di memoria tutte corrispondenti allo stesso nome e con valori solitamente dello stesso tipo (quest’ultima proprietà non è obbligatoria) 11 Ottobre 2005 nome dell’array c Il primo elemento ha indice 0 indice dell’elemento dell’array c Stefano Clemente c[ 0 ] -45 c[ 1 ] 6 c[ 2 ] 0 c[ 3 ] 72 c[ 4 ] 1543 c[ 5 ] -89 c[ 6 ] 0 c[ 7 ] 62 c[ 8 ] -3 c[ 9 ] 1 c[ 10 ] 6453 c[ 11 ] 78 25 Array • Un elemento dell’array può essere acceduto fornendo il nome dell’array e l’indice dell’elemento es: c [ 2 ] • L’indice può essere il risultato della valutazione di un’espressione es: c [ a + b ] • Un elemento di un array può essere trattato come una variabile es: c [ 1 ] += 12; • Un array in JavaScript è un oggetto 11 Ottobre 2005 Stefano Clemente 26 Array • La dichiarazione di un array var c = new Array ( 12 ); in cui l’operatore new crea un array di 12 elementi • La dichiarazione sopra può essere scritta anche nel modo che segue var c; // dichiara l’array c = new Array ( 12 ); // alloca l’array • È possibile dichiarare più array nello stesso statement var c = new Array ( 12 ), b = new Array ( 104 ); • È possibile dichiarare array vuoti var c = new Array ( ); e in questo caso gli elementi saranno aggiunti ogni volta con un assegnamento all’elemento c [ 0 ] = 12; 11 Ottobre 2005 Stefano Clemente 27 Array • Al momento della dichiarazione si può anche inizializzare l’array var c = new Array ( 10, 20, 30, 40, 50 ); crea un array di 5 elementi con i valori 10 per il primo (0), 20 per il secondo (1), …, 50 per il quinto (4) • Un altro modo di dichiarare un array e di inizializzarlo è il seguente: var c = [ 10, 20, 30, 40, 50 ] • Non è necessario inizializzare tutti gli elementi var c = [ 10, 20, , 40, 50 ] • Una proprietà dell’oggetto array è length, che conta il numero degli elementi dell’array c.length • Un metodo dell’oggetto array è sort(<funzione_confronto>), che ordina gli elementi dell’array; la funzione argomento è opzionale e nel caso in cui non venga fornita sort opera attraverso il confronto delle stringhe c.sort () 11 Ottobre 2005 Stefano Clemente 28 Esempio 6 11 Ottobre 2005 Stefano Clemente 29 Array multi-dimensionali • Sono anche detti “array di array” • Un elemento può contenere a sua volta un array Co lum n 0 Ro w 0 Ro w 1 Ro w 2 Co lum n 1 Co lum n 2 Co lum n 3 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ] a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ] Column sub sc rip t (o r index) Ro w subsc rip t (or inde x) Arra y na me 11 Ottobre 2005 Stefano Clemente 30 Array multi-dimensionali • Esempi di dichiarazioni var b = [ [ 1, 2 ], [ 3, 4 ] ]; var b = [ [ 1, 2 ], [ 3, 4, 5 ] ]; var b = b [ b [ 11 Ottobre 2005 b; new Array ( 2 ); 1 ] = new Array ( 5 ); 2 ] = new Array ( 10 ); Stefano Clemente 31 Funzioni • Un programmatore può scrivere delle funzioni per codificare delle azioni che possono essere eseguite in più punti dello script • Una funzione è invocata da una chiamata, uno statement del tipo <nome_funzione> ( <lista_argomenti> ); • La funzione esegue le azioni codificate e alla fine restituisce il risultato delle sue elaborazioni • La sintassi della definizione delle funzioni è function <nome_funzione> ( <lista_parametri> ) { dichiarazioni e statement } in cui <nome_funzione> è un identificatore valido, <lista_parametri> è un elenco di nomi di parametri ricevuti con la chiamata; il corpo della funzione è la sequenza di dichiarazioni e statement tra parentesi graffe 11 Ottobre 2005 Stefano Clemente 32 Funzioni • Il corpo della funzione è anche un blocco: un blocco è in generale in JavaScript una sequenza di dichiarazioni e statement • Le funzioni terminano − quando l’esecuzione raggiunge la parentesi graffa finale • in questo caso la funzione non restituisce alcun risultato − quando l’esecuzione incontra all’interno del corpo uno statement return; • anche in questo caso la funzione non restituisce alcun risultato − quando l’esecuzione incontra all’interno del corpo uno statement return ( <espressione> ); • la funzione restituisce il valore di <espressione> 11 Ottobre 2005 Stefano Clemente 33 Esempio 7 11 Ottobre 2005 Stefano Clemente 34 Passaggio argomenti • Gli argomenti possono essere passati alle funzioni in due modi − call-by-value • si passa alla funzione una copia del valore dell’argomento − call-by-reference • la funzione accede direttamente ai dati (variabili) di chi la invoca • In JavaScript tutti gli oggetti sono passati alle funzioni nella modalità callby-reference 11 Ottobre 2005 Stefano Clemente 35 Esempio 8 11 Ottobre 2005 Stefano Clemente 36 Durata e portata degli identificatori • Durata = ciclo di vita dell’identificatore − periodo per il quale l’identificatore è mantenuto in memoria − variabili dichiarate nelle funzioni e i parametri delle funzioni hanno durata automatica e sono chiamati identificatori locali • creati quando il controllo passa alla funzione in cui sono dichiarati • distrutti quando la funzione termina la sua esecuzione − gli identificatori definiti nella parte <head> dell’XHTML hanno durata statica e sono chiamati identificatori globali 11 Ottobre 2005 Stefano Clemente 37 Durata e portata degli identificatori • Portata = è la porzione del programma in cui l’identificatore può essere riferito − portata globale − portata locale – sono le variabili locali alle funzioni la cui portata è limitata ai delimitatori “{” e “}” del corpo della funzione • gli identificatori locali alle funzioni hanno portata limitata alla funzione alla quale appartengono e se hanno lo stesso nome di una variabile globale, nascondono per la loro durata la visibilità della variabile globale 11 Ottobre 2005 Stefano Clemente 38 Esempio 9 11 Ottobre 2005 Stefano Clemente 39 Funzioni Globali di JavaScript Funzioni globali escape eval isFinite Descrizione Accetta come argomento una stringa e restituisce una stringa nella quale tutti gli spazi, la punteggiatura, i caratteri accentati e tutti gli altri caratteri non ASCII sono codificati in esadecimale Accetta come argomento una stringa che rappresenta del codice JavaScript da eseguire e invoca l’interprete che si fa carico di eseguire il codice Accetta come argomento un numero e restituisce true se il valore non è NaN, Number.POSITIVE_INFINITY o Number.NEGATIVE_INFINITY altrimenti restituisce false isNaN parseFloat parseInt unescape 11 Ottobre 2005 Accetta come argomento un numero e restituisce true se il valore non è un numero altrimenti restituisce false. Accetta come argomento una stringa e cerca di convertire la parte iniziale della stessa in un numero in virgola mobile. Se la conversione fallisce, la funzione restituisce NaN altrimenti restituisce il valore convertito Accetta come argomento una stringa e cerca di convertire la parte iniziale della stessa in un numero intero. Se la conversione fallisce, la funzione restituisce NaN altrimenti restituisce il valore convertito. Accetta anche un argomento opzionale da 2 a 36 che specifica la radice o base del numero fornito come argomento (2 = binario, 8 = ottale, 10 = decimale, 16 = esadecimale) Accetta come argomento una stringa e restituisce una stringa nella quale tutti i caratteri codificati con la funzione escape sono decodificati Stefano Clemente 40 Strutture di controllo • Normalmente l’esecuzione di un programma procede uno statement dopo l’altro seguendo l’ordine in cui questi sono scritti • A volte è necessario alterare questa sequenza imponendo che il comando successivo da eseguire non sia quello staticamente successivo (trasferimento del controllo) • Le strutture di controllo sono − strutture sequenze • prevedono l’esecuzione dei comandi secondo la sequenza in cui sono stati scritti − strutture di selezione • prevedono la possibilità si scegliere se eseguire o meno alcune righe di programma − strutture di ripetizione • prevedono la possibilità di ripetere più volte uno o più righe di programma 11 Ottobre 2005 Stefano Clemente 41 Le strutture di selezione: if • È la struttura più semplice e permette di scegliere se eseguire o meno uno o più comandi in base al verificarsi di una condizione condizione true comando false • Esempio if ( a >= 0 ) document.writeln ( “a è positiva” ); 11 Ottobre 2005 Stefano Clemente 42 Le strutture di selezione: if/else • A differenza della if permette di codificare un’azione da eseguire se la condizione non si verifica comando2 false condizione true comando1 • Esempio if ( a >= 0 ) document.writeln ( “a è positiva” ); else document.writeln ( “a è negativa” ); 11 Ottobre 2005 Stefano Clemente 43 Le strutture di selezione: if/else • JavaScript dispone di un operatore ternario “?:” equivalente al costrutto if/else • L’esempio precedente potrebbe essere riscritto nel modo seguente document.writeln ( a >= 0 ? “a è positiva” : “a è negativa” ); 11 Ottobre 2005 Stefano Clemente 44 Le strutture di selezione: if/else • Si possono annidare diversi if/else per testare condizioni multiple • Esempio if ( a >= 1 && a <= 10 ) document.writeln ( “1 ≤ a ≤ 10” ); else if ( a >= 11 && a <= 20 ) document.writeln ( “11 ≤ a ≤ 20” ); else if ( a >= 21 && a <= 30 ) document.writeln ( “21 ≤ a ≤ 30” ); else if ( a >= 31 && a <= 40 ) document.writeln ( “31 ≤ a ≤ 40” ); 11 Ottobre 2005 Stefano Clemente 45 Le strutture di selezione: if/else • L’else è associato sempre all’ultimo if, per esempio if ( a >= 1 ) if ( b >= 1 ) document.writeln ( “a e b sono ≥ 1” ); else document.writeln ( “a < 1” ); produrrà il risultato “a < 1” quando a >= 1 e b < 1 • Per evitare questo tipo di errori bisogna ricorrere all’uso delle parentesi graffe if ( a >= 1 ) { if ( b >= 1 ) document.writeln ( “a e b sono ≥ 1” ); } else document.writeln ( “a < 1” ); 11 Ottobre 2005 Stefano Clemente 46 Le strutture di selezione: if/else • L’uso delle parentesi graffe è utile anche quando si vuole associare l’esecuzione di più comandi a un ramo if o else if ( a >= 1 && a <= document.writeln document.writeln } else { document.writeln document.writeln } 10 ) { ( “a ≥ 1” ); ( “a ≤ 10” ); ( “a < 1 oppure ” ); ( “a > 10” ); • Un insieme di statement racchiuso tra parentesi graffe è detto blocco 11 Ottobre 2005 Stefano Clemente 47 Le strutture di selezione: switch • Permette la selezione multipla • Sintassi switch ( <variabile> ) { case <valore_1>: <lista_statement_1> break; … case <valore_n>: <lista_statement_n> break; default: <lista_statement_default> } 11 Ottobre 2005 Stefano Clemente 48 Esempio 11 11 Ottobre 2005 Stefano Clemente 49 Le strutture di ripetizione: while • Permette di ripetere un comando o una sequenza di comandi fino a quando un data condizione è vera • La condizione è valutata all’ingresso nella struttura e il comando eseguito solo se la condizione è true comando condizione true • Sintassi false while ( <condizione> ) <lista_statement>; • Esempio var prodotto = 2; while ( prodotto <= 1000 ) prodotto *= 2; 11 Ottobre 2005 Stefano Clemente 50 Esempio 12 11 Ottobre 2005 Stefano Clemente 51 Le strutture di ripetizione: do/while • Come il comando while, ma la condizione è valutata dopo l’esecuzione del corpo − il corpo è eseguito almeno una volta • All’ingresso nella struttura si esegue il corpo dopo si comando valuta la condizione: se la condizione è true si esegue nuovamente il corpo, se è false si esce dal ciclo • Sintassi do { condizione true <lista_statement> } while ( <condizione> ); false • Esempio var prodotto = 2; do { prodotto *= 2; } while ( prodotto <= 1000 ); NB – le parentesi graffe in caso di un unico statement sono opzionali e vengono solitamente messe al solo fine di migliorare la leggibilità del programma 11 Ottobre 2005 Stefano Clemente 52 Le strutture di ripetizione: for • È una ripetizione controllata da un contatore • Sintassi for ( <inizializzazione>; <test>; <incremento> ) <lista_statement> • È equivalente a <inizializzazione> while ( <test> ){ <lista_statement> <incremento> } • Esempio for ( var i = 1; i <= 10; i++ ) document.writeln ( i ); 11 Ottobre 2005 Stefano Clemente 53 Esempio 13 11 Ottobre 2005 Stefano Clemente 54 Le strutture di ripetizione: for/in • È una ripetizione eseguita su tutti gli elementi di un insieme • Sintassi for ( <variabile_elemento> in <insieme> ) <lista_statement> • Viene solitamente usata con gli array 11 Ottobre 2005 Stefano Clemente 55 Esempio 14 11 Ottobre 2005 Stefano Clemente 56 Le strutture di ripetizione: break e continue • break e continue, usati nelle strutture di ripetizione, servono per alterare l’esecuzione dei cicli • break − provoca l’uscita immediata dalla struttura di ripetizione − all’interno della struttura i comandi successivi al break non saranno eseguiti − nessun ciclo verrà più eseguito − si esegue il primo comando successivo alla struttura di ripetizione • continue − forza una nuova iterazione − all’interno della struttura i comandi successivi al continue non saranno eseguiti − nei while e do/while la continue forza il test della condizione − nei for e for/in forza l’incremento dell’elemento di conteggio e solo dopo il test della condizione 11 Ottobre 2005 Stefano Clemente 57 Esempio 15 11 Ottobre 2005 Stefano Clemente 58 Esempio 16 11 Ottobre 2005 Stefano Clemente 59 Le strutture di ripetizione: break e continue con uso di etichette • break e continue, interrompono l’esecuzione del ciclo al quale appartengono • Nel caso di strutture di ripetizione annidate, l’uscita da una non provoca l’uscita dalle altre • Si può controllare il salto attraverso l’uso di etichette • Un’etichetta non è altro che un identificatore di uno statement o di un blocco di statement <etichetta>: <statement> 11 Ottobre 2005 Stefano Clemente 60 Esempio 17 11 Ottobre 2005 Stefano Clemente 61 Esempio 18 11 Ottobre 2005 Stefano Clemente 62 Esempio 19 11 Ottobre 2005 Stefano Clemente 63 Esempio 20 11 Ottobre 2005 Stefano Clemente 64 Funzioni ricorsive • Una funzione ricorsiva è una funzione che richiama se stessa − direttamente − indirettamente attraverso un’altra funzione • L’uso delle funzioni ricorsive è utile in quei casi in cui − si conosce il caso base − gli altri casi sono riconducibili attraverso casi più semplici al caso base (chiamata ricorsiva) • Esempio: fattoriale di un numero – n! − Caso base: 1! = 1 − Caso generico: n! = n * (n – 1)! 11 Ottobre 2005 Stefano Clemente 65 Esempio 21 11 Ottobre 2005 Stefano Clemente 66 Esempio 22 11 Ottobre 2005 Stefano Clemente 67