Fondamenti Teorici e Programmazione Modulo A

Transcript

Fondamenti Teorici e Programmazione Modulo A
Le funzioni in JavaScript
Funzioni
Funzioni predefinite della libreria matematica
Funzioni disponibili:
Math.sqrt(x)
radice quadrata
Math.log(x)
logaritmo naturale in base e di x
Math.abs(x)
valore assoluto di x
Math.ceil(x)
arrotonda all’intero più piccolo ≥ x
Math.floor(x)
arrotonda all’intero più grande ≤ x
Math.round(x)
arrotonda all’intero più vicino ad x
Math.pow(x,y)
xy
Math.random()
restituisce un numero casuale n tale che 0 < n < 1
Esempio:
print((Math.floor(1345/10)%10);
print (Math.floor(1345/100)%10);
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 1
Le funzioni in JavaScript
Funzioni
Visibilità delle variabili: globali e locali
Riconsideriamo la funzione succ definita precedentemente
var y=10, z;
function succ (x) {x=x+1; return x;}
z = succ(y);
print(z);
I
Le variabili definite nel programma principale e sono visibili nella
funzione e si dicono globali.
I
Le variabili definite nella funzione si dicono locali.
I
Le variabili locali della funzione non sono visibili nel programma
principale.
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 2
Le funzioni in JavaScript
Funzioni
Visibilità delle variabili - continua
I
essendo y e z visibili nella funzione, potremmo anche scrivere:
var y=10, z;
function foo (x) {x=y+1; return x;}
z = foo(y);
print(z);
I
utilizzando il valore di y per assegnare un nuovo valore a x.
ma le variabili globali possono anche essere modificate. In questo
caso y è modificata, e x diventa superflua.
var y=10, z;
function foo (x) {y=y+1; return y;}
z = succ(y);
print(z);
Questo uso delle variabili globali è sconsigliato perchè foriero di errori.
Deve essere utilizzato solo quando è strettamente necessario, in un
particolare tipo di funzioni (che chiamiamo procedure) che vedremo più
avanti.
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 3
Le funzioni in JavaScript
Funzioni
I blocchi in JavaScript
I blocchi in JavaScript sono diversi dai blocchi in altri linguaggi di
programmazione (Java, C ecc.). In realtà sono solo delle parentesi.
var z, y=4;
if (y>0) {var x=24; print(x+y);}
else {var w=2; z=y;}
print(z);
print(x);
print(w);
Ad esempio cosa stampa il programma precedente?
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 4
Le funzioni in JavaScript
Funzioni
I blocchi in JavaScript - segue
Il programma precedente è equivalente al seguente programma:
var z,x,w,y=4;
if (y>0) { x=24; print(x+y);}
else { w=2; z=y;}
print(z);
print(x);
print(w);
La situazione è ancora più complessa se non si dichiarano le variabili.
Per questo motivo si richiede di definire tutte le variabili globali nella
porzione iniziale del programma principale, evitando di definire
variabili nei blocchi, interni.
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 5
Le funzioni in JavaScript
Funzioni
Visibilità delle variabili - segue
Dalle considerazioni precedenti sulla visibilità delle variabili nei blocchi
deriva che tutte le variabili definite nel programma principale sono
visibili nella funzione, anche quelle definite dopo la definizione della
funzione, come y, nel seguente esempio:
var z;
function foo (x) {y=x+1; return x;}
var y=10;
z = foo(y);
print(z);
Si sconsiglia fortemente l’uso di queste funzionalità del linguaggio e si
richiede:
I
I
E. Occhiuto
di definire tutte le variabili globali nella porzione iniziale del programma
principale e
tutte le variabili locali di una funzione nella porzione iniziale del corpo
della funzione
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 6
Le funzioni in JavaScript
Istruzioni iterative
Iterazione determinata e indeterminata
I
Le istruzioni iterative permettono di ripetere determinate azioni più
volte:
I
I
E. Occhiuto
un numero di volte fissato =⇒ iterazione determinata
Esempio:
fai un giro del parco di corsa per 10 volte
finchè una condizione rimane vera =⇒ iterazione indeterminata
Esempio:
finche’ non sei sazio
prendi una ciliegia dal piatto e mangiala
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 7
Le funzioni in JavaScript
Istruzioni iterative
Istruzione while
Permette di realizzare l’iterazione in JavaScript.
Sintassi:
while
(espressione)
istruzione
I
espressione è la guardia del ciclo
I
istruzione è il corpo del ciclo (può essere un blocco)
Semantica:
1. viene valutata l’espressione
2. se è vera si esegue istruzione e si torna ad eseguire l’intero while
3. se è falsa si termina l’esecuzione del while
I
Nota: se espressione è falsa all’inizio, il corpo non viene mai
eseguito.
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 8
Le funzioni in JavaScript
Istruzioni iterative
Iterazione determinata
Esempio: Leggere 10 interi, calcolarne la somma e stamparla.
I
Si utilizza un contatore per contare il numero di interi letti.
var conta=0, dato, somma=0;
while (conta < 10) {
dato=asknum();
somma = somma + dato;
conta = conta + 1;
}
print("La somma e’ "+ somma);
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 9
Le funzioni in JavaScript
Istruzioni iterative
Esempio: Leggere un intero N seguito da N interi e calcolare la
somma di questi ultimi.
I
Simile al precedente: il numero di ripetizioni necessarie non è noto al
momento della scrittura del programma ma lo è al momento
dell’esecuzione del ciclo.
var lung=asknum(), conta=0, dato, somma=0;
while (conta < lung) {
dato=asknum();
somma = somma + dato;
conta = conta + 1;
}
print("La somma e’ "+ somma);
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 10
Le funzioni in JavaScript
Istruzioni iterative
Esempio: Leggere 10 interi positivi e stamparne il massimo.
I
Si utilizza un massimo corrente con il quale si confronta ciascun
numero letto.
var conta, dato, massimo;
massimo = 0;
conta = 0;
while (conta < 10) {
dato=asknum();
if (dato > massimo)
massimo = dato;
conta = conta + 1;
}
print("Il massimo e’ "+massimo);
Esercizio
Leggere 10 interi arbitrari e stamparne il massimo.
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 11
Le funzioni in JavaScript
Istruzioni iterative
Istruzione for
I
I cicli visti fino ad ora hanno queste caratteristiche comuni:
I
I
I
I
utilizzano una variabile di controllo
la guardia verifica se la variabile di controllo ha raggiunto un limite
prefissato
ad ogni iterazione si esegue un’azione
al termine di ogni iterazione viene incrementato (decrementato) il
valore della variabile di controllo
Esempio: Stampare i numeri pari da 0 a N.
i = 0; /* Inizializzazione della var. di controllo */
while (i <= N) { /* guardia */
print(i); /* Azione da ripetere */
i=i+2; /* Incremento var. di controllo */
}
I
L’istruzione for permette di gestire direttamente questi aspetti:
for (i = 0; i <= N; i=i+2)
print(i);
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 12
Le funzioni in JavaScript
Istruzioni iterative
Sintassi:
for (istr-1; espr-2; istr-3)
istruzione
I
istr-1 serve a inizializzare la variabile di controllo
I
espr-2 è la verifica di fine ciclo
I
istr-3 serve a incrementare la variabile di controllo alla fine del
corpo del ciclo
I
istruzione è il corpo del ciclo
Semantica: l’istruzione for precedente è equivalente a
istr-1;
while (espr-2) {
istruzione
istr-3
}
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 13
Le funzioni in JavaScript
I
I
Esempio:
for (i = 1; i <= 10; i=i+1)
=⇒ i: 1, 2, 3, . . . , 10
for (i = 10; i >= 1; i=i-1)
=⇒ i: 10, 9, 8, . . . , 2, 1
for (i = -4; i <= 4; i = i+2)
=⇒ i: -4, -2, 0, 2, 4
for (i = 0; i >= -10; i = i-3) =⇒ i: 0, -3, -6, -9
In realtà, la sintassi del for è
for (espr-1; espr-2; espr-3)
istruzione
dove espr-1, espr-2 e espr-3 sono delle espressioni qualsiasi (in
JavaScript anche l’assegnamento è un’espressione . . . ).
È buona prassi:
I
I
I
usare ciascuna espr-i in base al significato descritto prima
non modificare la variabile di controllo nel corpo del ciclo
Ciascuna delle tre espr-i può anche mancare:
I
I
I
Istruzioni iterative
i “;” vanno messi lo stesso
se manca espr-2 viene assunto il valore vero
Se manca una delle tre espr-i è meglio usare un’istruzione while
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 14
Le funzioni in JavaScript
Istruzioni iterative
L’esempio del massimo di 10 interi positivi si puo‘ riscrivere anche cosi‘
Esempio: Leggere 10 interi positivi e stamparne il massimo.
var conta, dato, massimo=0;
for (conta=0; conta<10; conta=conta+1)
{
dato=asknum();
if (dato > massimo)
massimo = dato;
}
print("Il massimo e‘ "+massimo);
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 15
Le funzioni in JavaScript
Istruzioni iterative
Precisazione a proposito delle funzioni e degli esercizi
proposti
Esempio: Si scriva una funzione in JavaScript che dato un parametro k
legge in input kvalori interi e calcola la media dei valori letti. Si scriva un
programma che verifica il corretto funzionamento della funzione. Il
programma deve leggere in input un valore k, invocare la funzione e
stampare il risultato.
var x=asknum();
function max(k) {
var conta, dato, massimo=asknum();
for (conta=1; conta< k; conta++)
{ dato=asknum();
if (dato > massimo) massimo = dato; }
return massimo;} //fine function max
print("Il massimo e‘ "+max(x));
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 16
Le funzioni in JavaScript
Istruzioni iterative
Iterazione indeterminata
I
In alcuni casi il numero di iterazioni da effettuare non è noto prima di
iniziare il ciclo, perché dipende dal verificarsi di una condizione.
Esempio: Leggere una sequenza di interi che termina con 0 e
calcolarne la somma.
Input: n1 , . . . , nk , 0
(con ni 6= 0)
k
P
ni
Output:
i=1
var dato, somma = 0;
dato=asknum();
while (dato != 0) {
somma = somma + dato;
dato=asknum(); }
print(somma);
Questo tipo di iterazioni e‘ meglio espressa usando il while piuttosto
che il for, anche se i due costrutti sono equivalenti
E. Occhiuto
–
Fondamenti Teorici e Programmazione- 437AA –
pag. 17