Sei sulla pagina 1di 92

Corso di Informatica Multimediale

Linguaggi di programmazione: Espressioni

Marco Comini

2021-09-30
Espressioni e comandi

Definizione
Espressione = entità sintattica la cui valutazione produce un valore oppure non
termina.

Esempio x+3 , f(3)+4

Definizione
Istruzione/Comando = entità sintattica di un linguaggio di programmazione
imperativo che esprime alcune azioni da eseguire.

Un programma scritto in tale linguaggio è formato da una sequenza di una o


più istruzioni.
Le espressioni sono componenti interne dei comandi

Marco Comini Informatica Multimediale 2021-09-30 1 / 26


Espressioni: effetti laterali

La valutazione di una funzione può dipendere da variabili non-locali che ad


invocazioni diverse assumono valori diversi,
quindi f(x) + 2*f(x) non è necessariamente uguale a 3*f(x)

Marco Comini Informatica Multimediale 2021-09-30 2 / 26


Espressioni: aritmetica finita
Alcuni linguaggi usano il cosidetto complemento a 2 per gestire i numeri
interi
Usando il complemento a 2 con 8 bit si possono rappresentare i numeri da
−128 a +127.
Le operazioni aritmetiche primitive dei processori (in complemento a 2) hanno
un comportamento “ad anello”. Ad esempio (con 8 bit) 127 + 1 = −128,
127 + 2 = −127 e −128 − 1 = 127
Alcuni linguaggi decidono di non passare dal numero più grande al più piccolo
ne viceversa ma di “saturare”, per cui 127 + 2 = 127
Non possiamo dare per scontato che valgano le normali proprietà algebriche
della matematica, come a+b-c = a-c+b o (a*b)/c = a*(b/c) .
In complemento a 2 “puro” l’uguaglianza a+b-c = a-c+b vale. Per esempio
per a = 127, b = 3, c = 5,
▶ a+b-c = (127 + 3) − 5 = −126 − 5 = 125
▶ a-c+b = (127 − 5) + 3 = 122 + 3 = 125
Nell’altro formato invece
▶ a+b-c = (127 + 3) − 5 = 127 − 5 = 122
▶ a-c+b = (127 − 5) + 3 = 122 + 3 = 125

In Javascript 5*(1e308/10) = 5e+307 ma (5*1e308)/10 = Infinity


Marco Comini Informatica Multimediale 2021-09-30 3 / 26
Espressioni: operandi non definiti

Sapendo che la valutazione dell’espressione f(x) non termina, sapete dirmi


se la valutazione dell’espressione 0 * f(x) non termina o vale 0?
Ask students!

Marco Comini Informatica Multimediale 2021-09-30 4 / 26


Espressioni: operandi non definiti

Sapendo che la valutazione dell’espressione f(x) non termina, sapete dirmi


se la valutazione dell’espressione 0 * f(x) non termina o vale 0?
Dipende dal linguaggio!
Ci sono i linguaggi eager che prima valutano tutti gli argomenti delle
operazioni/chiamate di funzione
▶ che quindi in questo caso non terminano la valutazione
Ci sono i linguaggi lazy che valutano gli argomenti delle operazioni/chiamate
di funzione solo se servono
▶ che quindi in questo caso non hanno bisogno di valutare f(x) perché il primo
argomento della moltiplicazione è 0

Marco Comini Informatica Multimediale 2021-09-30 4 / 26


Espressioni: valutazione di espressioni booleane con
“corto-circuito”

La valutazione di espressioni booleane con “corto-circuito” è un caso


particolare di lazyness per le sole espressioni a valori booleani
Si parla di “corto-circuito” perché si arriva al valore finale dell’espressione
booleana prima di conoscere il valore di tutti gli operandi (anzi, senza neanche
necessariamente conoscerlo)
In questo caso abbiamo che tipicamente
per ogni espressione e , false and e = false , indipendentemente da
possibili errori o non-terminazione nella valutazione di e dato che e non
viene valutata
▶ ad esempio false and 1/0>1 = false , senza che si valuti la divisione per
zero
dualmente true or e = true , per ogni espressione e
Ci sono linguaggi (ad esempio Javascript ma anche molti altri) che son “quasi
sempre” eager ma valutano le espressioni a valori booleani in modo lazy
Ovviamente se un linguaggio è lazy necessariamente valuta le espressioni
booleane con “corto-circuito”.

Marco Comini Informatica Multimediale 2021-09-30 5 / 26


Corso di Informatica Multimediale
Linguaggi di programmazione: Istruzioni/Comandi

Marco Comini

2021-09-30
Comandi di assegnamento/1
Assegnamento semplice

Della forma l-expr = r-expr (left/right expression)


Ogni l-expr è anche una r-expr, mentre viceversa no.
Il valore di una l-expr /r-expr si chiama anche r-value
Si chiama l-value l’indirizzo della cella di memoria (anche detta locazione)
che viene identificato da una l-expr
Un nome di variabile è una l-expr e il suo l-value è l’indirizzo della cella di
memoria legata al nome nell’ambiente corrente.
Un accesso ad un elemento di un array a[k] è una l-expr e il suo l-value è
l’indirizzo della k-esima cella di memoria dell’array legato al nome a
nell’ambiente corrente.
Semantica di el = er assegna l’r-value di er nella cella identificata dall’l-value di
el .

Marco Comini Informatica Multimediale 2021-09-30 6 / 26


Comandi di assegnamento/2
Assegnamento con operazione

Della forma l-expr op= r-expr con op una operazione del linguaggio (come + ,
- , * , / , ...)
Semantica di el op= er detto vr l’r-value di er , vl l’r-value di el , assegna nella
cella identificata dall’l-value di el il valore di vl op vr .
L’r-value e l’l-value di el vengono determinati atomicamente.
Attenzione che non sempre el op= er è equivalente a el = el op er . È diverso
se due valutazioni successive di el producono un diverso r-value (a causa di
side-effects).
Ad esempio a[f()] += 3 se f() restituisce 0 incrementa di 3 il valore della
cella 0 dell’array a , mentre a[f()] = a[f()] + 3 se f() restituisce 2 la
seconda volta, diventa equivalente a a[0] = a[2] + 3

Marco Comini Informatica Multimediale 2021-09-30 7 / 26


Comandi di assegnamento/3
Ordine di valutazione/1

In presenza di side-effects l’ordine con cui si valutano gli assegnamenti e le


operazioni porta a risultati diversi!
Consideriamo ad esempio a[f()] = a[f()] / a[f()] assumendo che le
tre valutazioni di f() producano 1, 2 e 3. Abbiamo 4 possibilità:
si valuta prima l-expr + da sinistra a destra a[1] = a[2] / a[3]
si valuta prima l-expr + da destra a sinistra a[1] = a[3] / a[2]
si valuta dopo l-expr + da sinistra a destra a[3] = a[1] / a[2]
si valuta dopo l-expr + da destra a sinistra a[3] = a[2] / a[1]
L’esempio di poco fa a[f()] = a[f()] + 3 se f() restituisce prima 0 e
poi 2, diventa equivalente a
a[0] = a[2] + 3 se si valuta prima l-expr oppure
a[2] = a[0] + 3 se si valuta dopo l-expr.
L’ordine di valutazione di + è ininfluente in questo caso.

Marco Comini Informatica Multimediale 2021-09-30 8 / 26


Comandi di assegnamento/4
Ordine di valutazione/2

Nel caso di assegnamenti con operazione el op= er abbiamo 2 casi:


si valuta prima l-expr :
▶ prima si valuta l-value e r-value di el ;
▶ poi si valuta r-value di er ;
▶ quindi si esegue l’operazione op fra gli r-values e
▶ infine si assegna il risultato.
si valuta dopo l-expr :
▶ prima si valuta r-value di er ;
▶ poi si valuta l-value e r-value di el ;
▶ quindi si esegue l’operazione op fra gli r-values e
▶ infine si assegna il risultato.
Attenzione che l’ordine di valutazioni delle operazioni op nelle espressioni qui
non c’entra nulla! Nell’assegnamento op= l’operazione op non è un
operazione di una espressione.
In particolare a[f()] += 3 ha sempre gli stessi risultati indipendentemente
dall’ordine di valutazione degli assegnamenti e dall’ordine di valutazione delle
espressioni.

Marco Comini Informatica Multimediale 2021-09-30 9 / 26


Sequenza di comandi

È il contenuto di un blocco
Come dice il nome ho una serie di comandi che vengono eseguiti in sequenza

Marco Comini Informatica Multimediale 2021-09-30 10 / 26


Comandi condizionali/1
Condizionali semplici
if r-expr then statement 1
if r-expr then statement 1 else statement 2
1 r-expr deve essere un’espressione booleana
2 se il suo r-value è vero allora si esegue statement 1
3 altrimenti
a se c’è il ramo else si esegue statement 2
b oppure non si fa niente (si continua con quanto segue)
Ci sono problemi di ambiguità: il comando
if cond1 then if cond2 then stmt1 else stmt2
potrebbe essere interpretato come
if cond1 then (if cond2 then stmt1 else stmt2)
oppure come
if cond1 then (if cond2 then stmt1) else stmt2
Ad esempio, in uno stato dove x = 1 e y = 3 il comando
if x==0 then if y>2 then z=2 else z=5
1 se l’ else è associato al secondo if non fa nulla
2 se l’ else è associato al primo if esegue z = 5

Marco Comini Informatica Multimediale 2021-09-30 11 / 26


Comandi condizionali/2

Condizionale case : la variante “base” ha una forma tipo


1 case expr of
2 v1 : stmt 1
3 ...
4 vn : stmt n
5 default : stmt n+1
L’alternativa default è opzionale.
Semantica si valuta l’r-value di expr e se coincide con un qualche vi allora
si esegue stmt i . Altrimenti, se il caso default è presente, si esegue
stmt n+1 oppure non si fa nulla.
Ci sono varianti più espressive che permettono di utilizzare etichette di
selezione più articolate, come intervalli di valori (es. 4-10 ), unioni (es.
2-5,8-9 ), complementi (es. not(4-10) ), . . .

Marco Comini Informatica Multimediale 2021-09-30 12 / 26


Comandi condizionali/3

Attenzione! Se la valutazione di expr ha side-effects questo costrutto non è


equivalente a
1 if expr == v1 then stmt 1
2 else if expr == ...
3 else if expr == vn then stmt n
4 else stmt n+1

Marco Comini Informatica Multimediale 2021-09-30 13 / 26


Comandi iterativi

I comandi iterativi si dividono in


indeterminati
determinati

Marco Comini Informatica Multimediale 2021-09-30 14 / 26


Comandi iterativi indeterminati/1

Comandi iterativi indeterminati: si continua a ripetere un comando, detto


corpo del ciclo (tipicamente è un blocco ma non è sempre necessario) a
seconda del valore di un’espressione booleana, detta guardia.
Due le forme principali
prima la guardia e poi il corpo
1 while expr do stmt
prima il corpo e poi la guardia
due varianti a seconda dell’uso della guardia
▶ finché la guardia è vera continua il ciclo
1 do stmt while expr
▶ finché la guardia è falsa continua il ciclo
1 repeat stmt until expr

Marco Comini Informatica Multimediale 2021-09-30 15 / 26


Comandi iterativi indeterminati/2

while expr do stmt do stmt while expr repeat stmt until expr

expr
stmt stmt
vero
vero falso
stmt falso expr expr
falso vero

Marco Comini Informatica Multimediale 2021-09-30 16 / 26


Comandi iterativi indeterminati/3

Il comando repeat body until guard è equivalente a


do body while not guard .
Il comando do body while guard è equivalente a
body ; while guard do body .
Il comando while guard do body è equivalente a
if guard then do body while guard .

Marco Comini Informatica Multimediale 2021-09-30 17 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total
count

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 −→int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 0
count

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 −→int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 0
count 1

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 −→while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 0
count 1

eval 1<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 −→ total += count ;
6 count += 1;
7 }
8 print ( total );
total 01
count 1

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 −→ count += 1;
7 }
8 print ( total );
total 1
count 12

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 −→while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 1
count 2

eval 2<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 −→ total += count ;
6 count += 1;
7 }
8 print ( total );
total 13
count 2

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 −→ count += 1;
7 }
8 print ( total );
total 3
count 23

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 −→while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 3
count 3

eval 3<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 −→ total += count ;
6 count += 1;
7 }
8 print ( total );
total 36
count 3

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 −→ count += 1;
7 }
8 print ( total );
total 6
count 34

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 −→while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 print ( total );
total 6
count 4

eval 4<=3 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: while

1 int total = 0;
2 int count = 1;
3 while count <= 3 do
4 {
5 total += count ;
6 count += 1;
7 }
8 −→print ( total );
total 6
count 4

output 6

Marco Comini Informatica Multimediale 2021-09-30 18 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total
count

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 −→int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total 0
count

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 −→int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total 0
count 1

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 −→ total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total 01
count 1

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 −→ count += 1;
6 } while count <= 3;
7 print ( total );
total 1
count 12

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 −→} while count <= 3;
7 print ( total );
total 1
count 2

eval 2<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 −→ total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total 13
count 2

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 −→ count += 1;
6 } while count <= 3;
7 print ( total );
total 3
count 23

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 −→} while count <= 3;
7 print ( total );
total 3
count 3

eval 3<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 −→ total += count ;
5 count += 1;
6 } while count <= 3;
7 print ( total );
total 36
count 3

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 −→ count += 1;
6 } while count <= 3;
7 print ( total );
total 6
count 34

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 −→} while count <= 3;
7 print ( total );
total 6
count 4

eval 4<=3 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: do-while

1 int total = 0;
2 int count = 1;
3 do {
4 total += count ;
5 count += 1;
6 } while count <= 3;
7 −→print ( total );
total 6
count 4

output 6

Marco Comini Informatica Multimediale 2021-09-30 19 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


int count = 1; 2 int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 while count <= 0;
print ( total ); 8 print ( total );
total total
count count

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

−→int total = 0; 1 −→int total = 0;


int count = 1; 2 int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 while count <= 0;
print ( total ); 8 print ( total );
total 0 total 0
count count

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


−→int count = 1; 2 −→int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 while count <= 0;
print ( total ); 8 print ( total );
total 0 total 0
count 1 count 1

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


int count = 1; 2 int count = 1;
−→while count <= 0 do 3 do {
{ 4 −→ total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 while count <= 0;
print ( total ); 8 print ( total );
total 0 total 01
count 1 count 1

eval 1<=0 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


int count = 1; 2 int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 −→ count += 1;
count += 1; 6 }
} 7 while count <= 0;
−→print ( total ); 8 print ( total );
total 0 total 1
count 1 count 12
output 0

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


int count = 1; 2 int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 −→while count <= 0;
print ( total ); 8 print ( total );
total 0 total 1
count 1 count 2

output 0 eval 2<=0 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: confronto while / do-while

int total = 0; 1 int total = 0;


int count = 1; 2 int count = 1;
while count <= 0 do 3 do {
{ 4 total += count ;
total += count ; 5 count += 1;
count += 1; 6 }
} 7 while count <= 0;
print ( total ); 8 −→print ( total );
total 0 total 1
count 1 count 2

output 0 output 1

Marco Comini Informatica Multimediale 2021-09-30 20 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact
i

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 −→int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 −→int i =1;
3 while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 1

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 −→while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 1

eval 1<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 −→ fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3

fact 11
i 1

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 −→ i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 12

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 −→while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 2

eval 2<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 −→ fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3

fact 12
i 2

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 −→ i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 2
i 23

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 −→while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 2
i 3

eval 3<=3 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 −→ fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3

fact 26
i 3

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 −→ i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 34

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 −→while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 4

eval 4<=3 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/1

Ricordiamo che n! = 1 · . . . · n. Possiamo calcolarlo così


1 int fact =1;
2 int i =1;
3 while i <= n do {
4 fact *= i ;
5 i += 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 4

finished

Marco Comini Informatica Multimediale 2021-09-30 21 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact
i

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 −→int fact =1;
2 int i = n ;
3 while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 −→int i = n ;
3 while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 3

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 −→while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 1
i 3

eval 3>1 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 −→ fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3

fact 13
i 3

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 fact *= i ;
5 −→ i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 3
i 32

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 −→while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 3
i 2

eval 2>1 =⇒ true

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 −→ fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3

fact 36
i 2

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 fact *= i ;
5 −→ i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 21

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 −→while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 1

eval 1>1 =⇒ false

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Esempio: calcoliamo il fattoriale/2

Possiamo calcolare il fattoriale anche così


1 int fact =1;
2 int i = n ;
3 while i >1 do {
4 fact *= i ;
5 i -= 1;
6 }
Simuliamo l’esecuzione con n = 3
fact 6
i 1

finished

Marco Comini Informatica Multimediale 2021-09-30 22 / 26


Comandi iterativi determinati/1

Comandi iterativi determinati: si ripete il corpo un determinato numero n di


volte. n potrebbe non essere una costante, ma è comunque un parametro
stabilito prima dell’esecuzione delle iterate e non cambia durante l’esecuzione
delle iterate.
Un ciclo indeterminato potrebbe non terminare, un determinato termina
sempre!
Due le forme principali
“for numerico”
1 for id = expr1 to expr2 do stmt
“foreach”
1 for id in l-expr do stmt

Marco Comini Informatica Multimediale 2021-09-30 23 / 26


Comandi iterativi determinati/2

“for numerico”
1 for id = expr1 to expr2 do stmt

Vincolo il corpo stmt non può alterare il valore di id .


Semantica si valutano gli r-values v1 e v2 di expr 1 e expr 2 e dopo si
assegnano ad id tutti i valori da v1 a v2 (incluso) eseguendo il corpo stmt.
Se v1 ≤ v2 si eseguono v2 − v1 + 1 iterate, altrimenti 0.
“foreach”
1 for id in l-expr do stmt

Vincolo l-expr deve essere una l-expression e il suo tipo essere quello di un
dato aggregato, cioè identificare un dato composto da più dati che possano
essere enumerati (array, liste, oggetti, . . . ).
Semantica si lega in sequenza id a tutti i valori di l-expr eseguendo il corpo
stmt.
La variabile id , al contrario delle variabili viste fino ad ora, non ha lo stesso
l-value fra due iterate successive.
Si eseguono un numero iterate pari alla dimensione di l-expr .

Marco Comini Informatica Multimediale 2021-09-30 24 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3
i
fact

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 −→int fact =1;
3 for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3
i
fact 1

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 −→for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3
i 1
fact 1

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 for i = 1 to n do
4 −→ fact *= i ;
Simuliamo l’esecuzione con n = 3
i 1
fact 11

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 −→for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3

i 12
fact 1

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 for i = 1 to n do
4 −→ fact *= i ;
Simuliamo l’esecuzione con n = 3
i 2
fact 12

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 −→for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3

i 23
fact 2

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 for i = 1 to n do
4 −→ fact *= i ;
Simuliamo l’esecuzione con n = 3
i 3
fact 26

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 −→for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3

i 34
fact 6

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Esempio: calcoliamo il fattoriale/3

Possiamo calcolare il fattoriale così


1 int i ;
2 int fact =1;
3 for i = 1 to n do
4 fact *= i ;
Simuliamo l’esecuzione con n = 3
i 4
fact 6

finished

Marco Comini Informatica Multimediale 2021-09-30 25 / 26


Comandi iterativi determinati/3
Attenzione ai “falsi cicli determinati”, costrutti con una sintassi simile a quella
dei cicli determinati ma che non sono cicli determinati. Per esempio in C e
JavaScript si può scrivere
1 for ( stmt1 ; expr ; stmt2 ) stmt3 ;
che è equivalente a
1 stmt1 ;
2 while ( expr ) {
3 stmt3 ;
4 stmt2 ;
5 }
Si può sempre simulare i cicli determinati usando degli opportuni cicli
indeterminati, ma nel primo caso il linguaggio garantisce la terminazione, nel
secondo deve essere il programmatore a non fare errori. Un esempio corretto
1 for ( i =1; i <4; i +=1 ) x += i ;
Un esempio errato
1 for ( i =1; i <4; i +=1 ) i -=1;
Marco Comini Informatica Multimediale 2021-09-30 26 / 26

Potrebbero piacerti anche