Programmazione I – Paolo Valente - 2020/2021 Programmazione I – Paolo Valente - 2020/2021
Istruzioni iterative Istruzioni iterative Operatore virgola Operatore virgola
Capitolo 5
Capitolo 5
2 Programmazione I – Paolo Valente - 2020/2021 2
Programmazione I – Paolo Valente - 2020/2021
Semplice programma 1/2 Semplice programma 1/2
Scrivere un programma che, dato un numero Scrivere un programma che, dato un numero naturale
naturale N N, , letto a tempo di esecuzione del letto a tempo di esecuzione del programma stesso
programma stesso, stampi , stampi N N volte la stringa volte la stringa Ciao mondo
Ciao mondo
Senza Senza goto goto
3 Programmazione I – Paolo Valente - 2020/2021 3
Programmazione I – Paolo Valente - 2020/2021
Semplice programma 2/2 Semplice programma 2/2
Semplicissimo, ma al momento non Semplicissimo, ma al momento non sappiamo scriverlo!
sappiamo scriverlo!
4 Programmazione I – Paolo Valente - 2020/2021 4
Programmazione I – Paolo Valente - 2020/2021
Analisi del problema Analisi del problema
Analizziamo il problema Analizziamo il problema
non sappiamo a priori il valore di non sappiamo a priori il valore di N N, per cui , per cui non possiamo semplicemente scrivere un non possiamo semplicemente scrivere un programma con
programma con N N istruzioni di stampa! istruzioni di stampa!
5 Programmazione I – Paolo Valente - 2020/2021 5
Programmazione I – Paolo Valente - 2020/2021
Idee 1/2 Idee 1/2
Siccome non sappiamo a priori di quante istruzioni Siccome non sappiamo a priori di quante istruzioni di stampa abbiamo bisogno,
di stampa abbiamo bisogno,
un'idea sarebbe quella di far ripetere più volte un'idea sarebbe quella di far ripetere più volte la stessa istruzione
la stessa istruzione di stampa
di stampa
Ma come facciamo per 'contare' il numero di Ma come facciamo per 'contare' il numero di stampe effettuate e capire così quando
stampe effettuate e capire così quando fermarci?
fermarci?
6 Programmazione I – Paolo Valente - 2020/2021 6
Programmazione I – Paolo Valente - 2020/2021
Idee 2/2 Idee 2/2
Ci vorrebbe una variabile da incrementare ad ogni Ci vorrebbe una variabile da incrementare ad ogni stampa …
stampa …
Proviamo a tradurre tutte queste idee in un Proviamo a tradurre tutte queste idee in un algoritmo
algoritmo
7 Programmazione I – Paolo Valente - 2020/2021 7
Programmazione I – Paolo Valente - 2020/2021
Verso un algoritmo Verso un algoritmo
Ci serve una variabile inizializzata al valore 1 (o, se Ci serve una variabile inizializzata al valore 1 (o, se preferite, 0)
preferite, 0)
Il valore di tale variabile deve essere Il valore di tale variabile deve essere incrementato incrementato di 1
di 1 dopo ogni stampadopo ogni stampa
Come facciamo a sapere quando dobbiamo fermarci?Come facciamo a sapere quando dobbiamo fermarci?
Ad ogni 'giro' dovremmo confrontare il valore Ad ogni 'giro' dovremmo confrontare il valore corrente della variabile con
corrente della variabile con NN per capire se siamo o per capire se siamo o meno andati oltre
meno andati oltre
In definitiva, per poter completare la definizione In definitiva, per poter completare la definizione dell'algoritmo, i dati che ci occorrono sono:
dell'algoritmo, i dati che ci occorrono sono:
Una variabile NUna variabile N che rappresenti il numero naturale che rappresenti il numero naturale N
N dato dato
Una variabile iUna variabile i che rappresenti un ausilio per che rappresenti un ausilio per
“scorrere” tutti i valori naturali da 1 fino a
“scorrere” tutti i valori naturali da 1 fino a NN
8 Programmazione I – Paolo Valente - 2020/2021 8
Programmazione I – Paolo Valente - 2020/2021
Algoritmo e programma Algoritmo e programma
Inizialmente, iInizialmente, i vale 1 vale 1
Finché i<=NFinché i<=N, ripetere:, ripetere:
stampare "Ciao mondo"stampare "Ciao mondo"
incrementare di 1 il valore corrente di incrementare di 1 il valore corrente di ii
Proviamo a scrivere parzialmenteProviamo a scrivere parzialmente il programma: il programma:
main() main() {{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
finché resta vero che (i<=N),finché resta vero che (i<=N), ripetere il blocco
ripetere il blocco
{ cout<<"Ciao mondo"<<endl; i++; } { cout<<"Ciao mondo"<<endl; i++; } }}
9 Programmazione I – Paolo Valente - 2020/2021 9
Programmazione I – Paolo Valente - 2020/2021
Programma più complesso Programma più complesso
Scrivere un programma che, dato un numero Scrivere un programma che, dato un numero naturale
naturale N N, letto a tempo di esecuzione del , letto a tempo di esecuzione del programma stesso, stampi i primi
programma stesso, stampi i primi N numeri N numeri naturali
naturali
10 Programmazione I – Paolo Valente - 2020/2021 10
Programmazione I – Paolo Valente - 2020/2021
Idee 1/2 Idee 1/2
Siccome non sappiamo a priori di quante Siccome non sappiamo a priori di quante istruzioni di stampa abbiamo bisogno,
istruzioni di stampa abbiamo bisogno,
un'idea sarebbe quella di far ripetere più un'idea sarebbe quella di far ripetere più volte
volte la stessa istruzione la stessa istruzione di stampa, come di stampa, come nel precedente programma
nel precedente programma
Dov'è la differenza rispetto al precedente Dov'è la differenza rispetto al precedente programma?
programma?
11 Programmazione I – Paolo Valente - 2020/2021 11
Programmazione I – Paolo Valente - 2020/2021
Idee 2/2 Idee 2/2
La differenza in questo nuovo programma è La differenza in questo nuovo programma è che che
ogni volta ogni volta l'istruzione deve stampare un l'istruzione deve stampare un valore
valore diverso diverso! !
potremmo allora far stampare a tale potremmo allora far stampare a tale istruzione il valore di una
istruzione il valore di una variabile variabile
l'importante è che l'importante è che dopo ogni stampa dopo ogni stampa tale valore venga
tale valore venga incrementato incrementato! !
12 Programmazione I – Paolo Valente - 2020/2021 12
Programmazione I – Paolo Valente - 2020/2021
Verso un algoritmo 1/2 Verso un algoritmo 1/2
Ci serve una variabile inizializzata al valore 1 (o, Ci serve una variabile inizializzata al valore 1 (o, se preferite, 0)
se preferite, 0)
Quindi il valore di tale variabile deve essere Quindi il valore di tale variabile deve essere stampato e subito dopo
stampato e subito dopo incrementato di 1
incrementato di 1,, quindi di nuovo stampato ...
quindi di nuovo stampato ...
Come facciamo a sapere quando dobbiamo Come facciamo a sapere quando dobbiamo fermarci?
fermarci?
Come nel precedente programma, ad ogni Come nel precedente programma, ad ogni 'giro' dovremmo
'giro' dovremmo confrontare il valore corrente confrontare il valore corrente della variabile con
della variabile con N
N per capire se siamo oper capire se siamo o meno andati oltre
meno andati oltre
13 Programmazione I – Paolo Valente - 2020/2021 13
Programmazione I – Paolo Valente - 2020/2021
Verso un algoritmo 2/2 Verso un algoritmo 2/2
In definitiva, per poter completare la In definitiva, per poter completare la definizione dell'algoritmo, i dati che ci definizione dell'algoritmo, i dati che ci occorrono sono:
occorrono sono:
Una variabile N Una variabile N che rappresenti il numero che rappresenti il numero naturale
naturale N N dato dato
Una variabile i Una variabile i che rappresenti un ausilio che rappresenti un ausilio
per “scorrere” tutti i valori naturali da 1 fino per “scorrere” tutti i valori naturali da 1 fino a
a N N
Ossia, in questo nuovo programma Ossia, in questo nuovo programma
possiamo usare tale variabile sia per la possiamo usare tale variabile sia per la stampa che per capire quando fermarci!
stampa che per capire quando fermarci!
14 Programmazione I – Paolo Valente - 2020/2021 14
Programmazione I – Paolo Valente - 2020/2021
Algoritmo e programma Algoritmo e programma
Inizialmente, iInizialmente, i vale 1 vale 1
Finché i<=NFinché i<=N, ripetere:, ripetere:
stampare il valore corrente di istampare il valore corrente di i
incrementare di 1 il valore corrente di incrementare di 1 il valore corrente di ii
Proviamo a scrivere parzialmenteProviamo a scrivere parzialmente il programma: il programma:
main() main() {
{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
finché resta vero che (i<=N),finché resta vero che (i<=N), ripetere il blocco
ripetere il blocco { cout<<i<<endl; i++; }{ cout<<i<<endl; i++; } }
}
15 Programmazione I – Paolo Valente - 2020/2021 15
Programmazione I – Paolo Valente - 2020/2021
Istruzioni iterative Istruzioni iterative
Come scriviamo in C/C++ la parte mancante in Come scriviamo in C/C++ la parte mancante in entrambi i programmi?
entrambi i programmi?
Abbiamo bisogno dell'ultimo costrutto Abbiamo bisogno dell'ultimo costrutto
fondamentale della programmazione strutturata:
fondamentale della programmazione strutturata:
le istruzione iterative le
istruzione iterative16 Programmazione I – Paolo Valente - 2020/2021 16
Programmazione I – Paolo Valente - 2020/2021
Istruzioni iterative
Istruzioni iterative
17 Programmazione I – Paolo Valente - 2020/2021 17
Programmazione I – Paolo Valente - 2020/2021
Istruzioni iterative Istruzioni iterative
Le istruzioni iterative (o Le istruzioni iterative (o di iterazione
di iterazione, o, o cicliche
cicliche)) forniscono costrutti di controllo che permettono di forniscono costrutti di controllo che permettono di ripetere una certa istruzione
ripetere una certa istruzione fintanto che fintanto che
una certa condizione è vera
una certa condizione è vera
Per il Teorema di Jacopini-Böhm, una struttura di Per il Teorema di Jacopini-Böhm, una struttura di controllo iterativa è sufficiente (insieme
controllo iterativa è sufficiente (insieme all'istruzione composta e di scelta) per all'istruzione composta e di scelta) per implementare qualsiasi algoritmo
implementare qualsiasi algoritmo
Tuttavia, per migliorare l’espressività del Tuttavia, per migliorare l’espressività del
linguaggio, il C/C++ fornisce vari tipi di istruzioni linguaggio, il C/C++ fornisce vari tipi di istruzioni iterative (cicliche):
iterative (cicliche):
while ( ... )
while ( ... )
do ... while ( ... )
do ... while ( ... )
for ( ... ; ... ; ...)
for ( ... ; ... ; ...)18 Programmazione I – Paolo Valente - 2020/2021 18
Programmazione I – Paolo Valente - 2020/2021
Corpo del ciclo ed iterazioni Corpo del ciclo ed iterazioni
L'istruzione da ripetere fintanto che la condizione L'istruzione da ripetere fintanto che la condizione rimane vera viene tipicamente chiamata
rimane vera viene tipicamente chiamata corpo
corpodel ciclo
del ciclo
A seconda dell'istruzione iterativa usata, si A seconda dell'istruzione iterativa usata, si parla di corpo del
parla di corpo del while
while, del , del do … while
do … whileo o del del for
for
Ogni ripetizione dell'esecuzione del corpo del Ogni ripetizione dell'esecuzione del corpo del ciclo viene tipicamente chiamata
ciclo viene tipicamente chiamata iterazione
iterazione (del(del ciclo)
ciclo)
Incominciamo dall'istruzione iterativa Incominciamo dall'istruzione iterativa
whilewhile
19 Programmazione I – Paolo Valente - 2020/2021 19
Programmazione I – Paolo Valente - 2020/2021
Istruzione iterativa Istruzione iterativa
while
while
20 Programmazione I – Paolo Valente - 2020/2021 20
Programmazione I – Paolo Valente - 2020/2021
Istruzione iterativa
Istruzione iterativa while while
<istruzione-while>
<istruzione-while> ::= ::=
while
while (<condizione> (<condizione>) ) <istruzione><istruzione>
<istruzione> costituisce il corpo del<istruzione> costituisce il corpo del ciclo (
ciclo (whilewhile) e viene ripetuta per tutto il tempo in cui ) e viene ripetuta per tutto il tempo in cui
<condizione>
<condizione> rimane vera rimane vera
Se <condizione>Se <condizione> è già inizialmente falsa, il ciclo non viene è già inizialmente falsa, il ciclo non viene eseguito neppure una volta
eseguito neppure una volta
In generale, non è noto a priori quante volte In generale, non è noto a priori quante volte <istruzione> <istruzione>
verrà eseguita verrà eseguita
<condizione>
vera
<istruzione>
falsa
21 Programmazione I – Paolo Valente - 2020/2021 21
Programmazione I – Paolo Valente - 2020/2021
Osservazione Osservazione
Direttamente o indirettamente, <istruzione> Direttamente o indirettamente, <istruzione>
deve modificare prima o poi la condizione deve modificare prima o poi la condizione , , altrimenti si ha un
altrimenti si ha un ciclo infinito ciclo infinito
Per questo motivo, molto spesso <istruzione> Per questo motivo, molto spesso <istruzione>
è una istruzione composta, che contiene, tra le è una istruzione composta, che contiene, tra le varie istruzioni, anche un'istruzione di modifica varie istruzioni, anche un'istruzione di modifica di qualcuna delle variabili che compaiono nella di qualcuna delle variabili che compaiono nella condizione
condizione
Ci sono poi altri modi per uscire da un ciclo Ci sono poi altri modi per uscire da un ciclo
altrimenti infinito, che vedremo nelle prossime altrimenti infinito, che vedremo nelle prossime slide
slide
22 Programmazione I – Paolo Valente - 2020/2021 22
Programmazione I – Paolo Valente - 2020/2021
Esercizio Esercizio
Completare il programma utilizzando Completare il programma utilizzando l'istruzione
l'istruzione while while
23 Programmazione I – Paolo Valente - 2020/2021 23
Programmazione I – Paolo Valente - 2020/2021
Completamento programma Completamento programma
main() main() {{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
finché resta vero che (i<=N),finché resta vero che (i<=N), ripetere il blocco
ripetere il blocco { cout<<i<<endl; i++; }{ cout<<i<<endl; i++; } }
}
main() main() {{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
while (i<=N){while (i<=N){
cout<<i<<endl;
cout<<i<<endl;
i++;
i++;
} } } }
Modifica della variabile
Modifica della variabile i i, e quindi , e quindi della condizione di ripetizione
della condizione di ripetizione
24 Programmazione I – Paolo Valente - 2020/2021 24
Programmazione I – Paolo Valente - 2020/2021
Cosa fa?
Cosa fa?
main() main() {
{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
while (i<=N)while (i<=N)
cout<<i<<endl;
cout<<i<<endl;
i++;
i++;
} }
25 Programmazione I – Paolo Valente - 2020/2021 25
Programmazione I – Paolo Valente - 2020/2021
Equivale a questo Equivale a questo
main() main() {
{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
while (i<=N)while (i<=N)
cout<<i<<endl;
cout<<i<<endl;
i++; i++;
} }
Non esce più dal ciclo Non esce più dal ciclo
Perché l’incremento non è dentro il Perché l’incremento non è dentro il corpo del ciclo
corpo del ciclo
26 Programmazione I – Paolo Valente - 2020/2021 26
Programmazione I – Paolo Valente - 2020/2021
Ciclo infinito 1/2 Ciclo infinito 1/2
Leggere la definizione nella prossima slide Leggere la definizione nella prossima slide
27 Programmazione I – Paolo Valente - 2020/2021 27
Programmazione I – Paolo Valente - 2020/2021
Ciclo infinito 2/2 Ciclo infinito 2/2
Leggere la definizione nella slide precedente Leggere la definizione nella slide precedente
28 Programmazione I – Paolo Valente - 2020/2021 28
Programmazione I – Paolo Valente - 2020/2021
Ciclo infinito Ciclo infinito
Eseguire le istruzioni riportate nelle precedenti Eseguire le istruzioni riportate nelle precedenti due slide porta ad un
due slide porta ad un ciclo infinito ciclo infinito
Sequenza di istruzioni ripetuta Sequenza di istruzioni ripetuta indefinitamente
indefinitamente
Cosa deve accadere affinché il corpo di un ciclo Cosa deve accadere affinché il corpo di un ciclo while
while sia ripetuto indefinitamente? sia ripetuto indefinitamente?
29 Programmazione I – Paolo Valente - 2020/2021 29
Programmazione I – Paolo Valente - 2020/2021
Condizione sempre vera Condizione sempre vera
Come si è visto, è necessario che la condizione Come si è visto, è necessario che la condizione sia sempre vera
sia sempre vera
Come vedremo si può interrompere un ciclo Come vedremo si può interrompere un ciclo
infinito anche inserendo nel corpo del ciclo una infinito anche inserendo nel corpo del ciclo una istruzione speciale di uscita dal ciclo stesso
istruzione speciale di uscita dal ciclo stesso
30 Programmazione I – Paolo Valente - 2020/2021 30
Programmazione I – Paolo Valente - 2020/2021
Esercizi Esercizi
Svolgere la quinta esercitazione fino a Svolgere la quinta esercitazione fino a stampa_secondi_trascorsi.cc
stampa_secondi_trascorsi.cc
Link alla videoregistrazione: Link alla videoregistrazione:
https://drive.google.com/file/d/1uYSz8x9na7nbb90qbq5QRbBwwQ9yu4_8/view?usp=sharing https://drive.google.com/file/d/1uYSz8x9na7nbb90qbq5QRbBwwQ9yu4_8/view?usp=sharing
31 Programmazione I – Paolo Valente - 2020/2021 31
Programmazione I – Paolo Valente - 2020/2021
Struttura dati Struttura dati
Per descrivere i prossimi algoritmi ci conviene Per descrivere i prossimi algoritmi ci conviene introdurre il concetto di struttura dati
introdurre il concetto di struttura dati
Per ora definiamo una struttura dati Per ora definiamo una struttura dati semplicemente come un
semplicemente come un insieme di oggetti, insieme di oggetti, ossia di variabili e/o costanti con nome
ossia di variabili e/o costanti con nome
Spesso una struttura dati viene utilizzata per Spesso una struttura dati viene utilizzata per rappresentare i dati del problema reale
rappresentare i dati del problema reale, o , o almeno la parte di dati necessaria per
almeno la parte di dati necessaria per
permettere all'algoritmo di risolverlo
permettere all'algoritmo di risolverlo
32 Programmazione I – Paolo Valente - 2020/2021 32
Programmazione I – Paolo Valente - 2020/2021
Domanda Domanda
Da cosa era composta la struttura dati nel Da cosa era composta la struttura dati nel precedente esercizio di stampa dei primi precedente esercizio di stampa dei primi N N numeri naturali?
numeri naturali?
33 Programmazione I – Paolo Valente - 2020/2021 33
Programmazione I – Paolo Valente - 2020/2021
Risposta Risposta
Dalle variabili Dalle variabili N ed N ed i i
34 Programmazione I – Paolo Valente - 2020/2021 34
Programmazione I – Paolo Valente - 2020/2021
Problema più complesso Problema più complesso
Dato un numero naturale N Dato un numero naturale N, letto da , letto da stdin stdin, ,
stampare la corrispondente somma dei primi stampare la corrispondente somma dei primi N
N numeri naturali numeri naturali
Bisogna cioè calcolare e stampare il valore Bisogna cioè calcolare e stampare il valore di:
di: S S = 1 + 2 + … + = 1 + 2 + … + N N
Cominciamo come al solito dall'idea Cominciamo come al solito dall'idea
Ci sarà sicuramente da eseguire un ciclo ... Ci sarà sicuramente da eseguire un ciclo ...
35 Programmazione I – Paolo Valente - 2020/2021 35
Programmazione I – Paolo Valente - 2020/2021
Analisi 1/4 Analisi 1/4
Prima di tutto, utilizzando la solita variabile Prima di tutto, utilizzando la solita variabile 'contatore'
'contatore' i i, da incrementare e confrontare , da incrementare e confrontare con
con N N, possiamo gestire il numero di , possiamo gestire il numero di ripetizioni da effettuare
ripetizioni da effettuare
Ora però dobbiamo riuscire a mettere la Ora però dobbiamo riuscire a mettere la somma da qualche parte
somma da qualche parte
Ci vorrebbe una variabile in cui Ci vorrebbe una variabile in cui
Se N == 1, ci finisca 1 Se N == 1, ci finisca 1
Se N == 2, ci finisca 1 + 2 Se N == 2, ci finisca 1 + 2
... ...
36 Programmazione I – Paolo Valente - 2020/2021 36
Programmazione I – Paolo Valente - 2020/2021
Analisi 2/4 Analisi 2/4
Supponendo di inizializzare i Supponendo di inizializzare i ad 1 e di ad 1 e di
incrementarlo solo alla fine di ogni iterazione, incrementarlo solo alla fine di ogni iterazione, che valore è memorizzato dentro
che valore è memorizzato dentro i i all'inizio all'inizio della prima iterazione?
della prima iterazione?
Uno Uno
Ed all'inizio della seconda? Ed all'inizio della seconda?
Due Due
Ed all'N Ed all' N-esima? -esima?
N N
37 Programmazione I – Paolo Valente - 2020/2021 37
Programmazione I – Paolo Valente - 2020/2021
Analisi 3/4 Analisi 3/4
Quindi, nel caso di N Quindi, nel caso di N iterazioni: iterazioni:
S = 1 + 2 + 3 + … + S = 1 + 2 + 3 + … + N N
Valore di Valore di i i alla prima alla prima iterazione iterazione
Valore di Valore di i i alla
alla
seconda seconda iterazione iterazione
Valore di Valore di i i alla terza alla terza iterazione iterazione
Valore di Valore di i i alla
alla
N N-esima -esima iterazione iterazione
Ma allora, se sommiamo i diversi valori Ma allora, se sommiamo i diversi valori assunti da
assunti da i i ad ogni iterazione, non è che ad ogni iterazione, non è che otteniamo proprio il valore
otteniamo proprio il valore S S cercato? cercato?
38 Programmazione I – Paolo Valente - 2020/2021 38
Programmazione I – Paolo Valente - 2020/2021
Analisi 4/4 Analisi 4/4
Come riuscire a ritrovarsi il risultato della Come riuscire a ritrovarsi il risultato della somma dei diversi valori assunti da
somma dei diversi valori assunti da i i memorizzato all'interno di una qualche memorizzato all'interno di una qualche variabile?
variabile?
39 Programmazione I – Paolo Valente - 2020/2021 39
Programmazione I – Paolo Valente - 2020/2021
Idea Idea
Possiamo memorizzare (accumulare) il valore Possiamo memorizzare (accumulare) il valore assunto dalla somma
assunto dalla somma fino all'iterazione fino all'iterazione corrente
corrente all'interno di una ulteriore variabile all'interno di una ulteriore variabile
Ad ogni nuova iterazione, aggiungiamo al Ad ogni nuova iterazione, aggiungiamo al
valore corrente di tale variabile il nuovo valore valore corrente di tale variabile il nuovo valore assunto da
assunto da ii
Ovviamente continueremo fintanto che iOvviamente continueremo fintanto che i sarà minore o uguale di
sarà minore o uguale di NN
Alla fine dell'ultima iterazione tale variabile Alla fine dell'ultima iterazione tale variabile
conterrà necessariamente (avrà accumulato) la conterrà necessariamente (avrà accumulato) la somma di tutti i valori assunti da
somma di tutti i valori assunti da ii
40 Programmazione I – Paolo Valente - 2020/2021 40
Programmazione I – Paolo Valente - 2020/2021
Struttura dati Struttura dati
Ora abbiamo gli elementi per definire la Ora abbiamo gli elementi per definire la struttura dati da utilizzare
struttura dati da utilizzare
Una variabile N Una variabile N che rappresenti il numero che rappresenti il numero naturale
naturale N N dato dato
Una variabile somma Una variabile somma che rappresenti la che rappresenti la somma calcolata
somma calcolata
Una variabile contatore i Una variabile contatore i che rappresenti che rappresenti un ausilio per
un ausilio per scorrere scorrere tutti i valori naturali tutti i valori naturali da 1 fino a
da 1 fino a N N
Definite l'algoritmo (senza dimenticare le Definite l'algoritmo (senza dimenticare le inizializzazioni!)
inizializzazioni!)
41 Programmazione I – Paolo Valente - 2020/2021 41
Programmazione I – Paolo Valente - 2020/2021
Algoritmo Algoritmo
Inizialmente, somma Inizialmente, somma vale 0, vale 0, i i vale 1 vale 1
Finché i Finché i<= <=N N, ripetere: , ripetere:
aggiungere a somma il valore di aggiungere a somma il valore di i i
incrementare di 1 il valore di i incrementare di 1 il valore di i
42 Programmazione I – Paolo Valente - 2020/2021 42
Programmazione I – Paolo Valente - 2020/2021
Programma quasi completo Programma quasi completo
main() main() {{
int i = 1, somma = 0, N; int i = 1, somma = 0, N;
cin>>N; cin>>N;
finché resta vero che (i<=N),finché resta vero che (i<=N), ripetere il blocco
ripetere il blocco { somma += i; i++; }{ somma += i; i++; } cout<<somma<<endl; cout<<somma<<endl;
}}
43 Programmazione I – Paolo Valente - 2020/2021 43
Programmazione I – Paolo Valente - 2020/2021
Programma Programma
main() main() {{
int i = 1, somma = 0, N; int i = 1, somma = 0, N;
cin>>N; cin>>N;
while(i <= N) while(i <= N) {{ somma += i;
somma += i;
i++;i++;
}}
cout<<somma<<endl;cout<<somma<<endl;
} }
44 Programmazione I – Paolo Valente - 2020/2021 44
Programmazione I – Paolo Valente - 2020/2021
Istruzione iterativa Istruzione iterativa
do … while
do … while
45 Programmazione I – Paolo Valente - 2020/2021 45
Programmazione I – Paolo Valente - 2020/2021
Istruzione
Istruzione do … while do … while
<istruzione-do-while>
<istruzione-do-while> ::= ::=
dodo <istruzione> <istruzione> whilewhile ((<condizione><condizione>) ;) ;
È una “variazione sul tema” dell’istruzione È una “variazione sul tema” dell’istruzione whilewhile
A differenza dell'istruzione A differenza dell'istruzione whilewhile, la condizione è , la condizione è controllata
controllata dopodopo aver eseguito aver eseguito <istruzione><istruzione>
Quindi il (corpo del) ciclo viene sempre Quindi il (corpo del) ciclo viene sempre eseguito eseguito almeno una volta
almeno una volta
<condizione>
<istruzione>
vera
falsa
46 Programmazione I – Paolo Valente - 2020/2021 46
Programmazione I – Paolo Valente - 2020/2021
Osservazioni Osservazioni
Non dimenticate il Non dimenticate il ;
;dopo il dopo il
while (...)while (...)
Analogamente al Analogamente al
whilewhile , per evitare il ciclo infinito, , per evitare il ciclo infinito,
<istruzione>
<istruzione>
deve modificare prima o poi la
deve modificare prima o poi lacondizione
condizione
Si noti che, come nel caso del Si noti che, come nel caso del
whilewhile , si esce dal , si esce dal ciclo
ciclo quando la condizione è falsa quando la condizione è falsa
Non è adatta a quei casi in cui il ciclo può non Non è adatta a quei casi in cui il ciclo può non dover essere mai eseguito
dover essere mai eseguito
È adatta a quei casi in cui, per valutare condizione, È adatta a quei casi in cui, per valutare condizione, è necessario aver già eseguito
è necessario aver già eseguito
<istruzione><istruzione>Esempio tipico:
Esempio tipico: Controllo valori di input
Controllo valori di input47 Programmazione I – Paolo Valente - 2020/2021 47
Programmazione I – Paolo Valente - 2020/2021
Controllo valori in input Controllo valori in input
Esempio 1
Esempio 1: : nn deve essere positivo per andare avanti deve essere positivo per andare avanti do
do
cin>>n;
cin>>n;
while (n<=0);
while (n<=0);
Esempio 2
Esempio 2: : nn deve essere compreso fra 3 e 15 (inclusi) deve essere compreso fra 3 e 15 (inclusi) dodo
cin>>n;
cin>>n;
while ((n<3) || (n>15));
while ((n<3) || (n>15));
Esempio 3
Esempio 3: : nn deve essere negativo o compreso fra 3 e 15 deve essere negativo o compreso fra 3 e 15 do
do
cin>>n;
cin>>n;
while ((n>=0) && ((n<3) || (n>15)));
while ((n>=0) && ((n<3) || (n>15)));
48 Programmazione I – Paolo Valente - 2020/2021 48
Programmazione I – Paolo Valente - 2020/2021
Consiglio Consiglio
Il fatto che bisogna scrivere la condizione al Il fatto che bisogna scrivere la condizione al
contrario spesso confonde nei precedenti esempi contrario spesso confonde nei precedenti esempi
Può essere utile allora Può essere utile allora
scrivere la condizione che si vuole che sia vera scrivere la condizione che si vuole che sia vera per uscire dal ciclo
per uscire dal ciclo
e metterci poi un e metterci poi un !
!davanti davanti
49 Programmazione I – Paolo Valente - 2020/2021 49
Programmazione I – Paolo Valente - 2020/2021
Istruzione iterativa Istruzione iterativa
for for
50 Programmazione I – Paolo Valente - 2020/2021 50
Programmazione I – Paolo Valente - 2020/2021
Visibilità della condizione Visibilità della condizione
Se dimenticassimo di inserire la condizione in Se dimenticassimo di inserire la condizione in un ciclo
un ciclo while while o o do … while do … while , il programma , il programma non si compilerebbe affatto
non si compilerebbe affatto
Invece, se la condizione è presente, siamo Invece, se la condizione è presente, siamo portati spontaneamente a leggerla prima di portati spontaneamente a leggerla prima di leggere il corpo del ciclo
leggere il corpo del ciclo
Quindi, nel caso in cui la condizione contenga Quindi, nel caso in cui la condizione contenga errori, la probabilità che ce ne accorgiamo è errori, la probabilità che ce ne accorgiamo è molto alta
molto alta
51 Programmazione I – Paolo Valente - 2020/2021 51
Programmazione I – Paolo Valente - 2020/2021
Domanda Domanda
La correttezza della condizione di un ciclo è La correttezza della condizione di un ciclo è una condizione sufficiente ad assicurare che una condizione sufficiente ad assicurare che siano eseguite
siano eseguite tutte e sole tutte e sole le iterazioni che le iterazioni che devono effettivamente essere eseguite in
devono effettivamente essere eseguite in accordo all'algoritmo da implementare?
accordo all'algoritmo da implementare?
52 Programmazione I – Paolo Valente - 2020/2021 52
Programmazione I – Paolo Valente - 2020/2021
Altre condizioni Altre condizioni
No No
Oltre alla correttezza della condizione del Oltre alla correttezza della condizione del
ciclo, sono fondamentali anche la correttezza ciclo, sono fondamentali anche la correttezza
del valore iniziale e del valore iniziale e
delle istruzioni di modifica delle istruzioni di modifica
delle variabili che determinano la condizione delle variabili che determinano la condizione del ciclo
del ciclo
53 Programmazione I – Paolo Valente - 2020/2021 53
Programmazione I – Paolo Valente - 2020/2021
Problema 1/2 Problema 1/2
In merito possiamo evidenziare che, mentre In merito possiamo evidenziare che, mentre la condizione del ciclo è esplicitata nelle
la condizione del ciclo è esplicitata nelle intestazioni delle istruzioni
intestazioni delle istruzioni while while e e do … do … while
while , mancano , mancano
sia un punto esplicito in cui sia un punto esplicito in cui inizializzare le variabili
inizializzare le variabili
che un punto esplicito in cui inserire che un punto esplicito in cui inserire l'istruzione di modifica
l'istruzione di modifica della condizione della condizione del ciclo
del ciclo
La mancanza dei precedenti punti espliciti fa La mancanza dei precedenti punti espliciti fa sì che ogni programmatore inserisca le
sì che ogni programmatore inserisca le
corrispondenti operazioni di inizializzazione e corrispondenti operazioni di inizializzazione e modifica dove meglio crede
modifica dove meglio crede
54 Programmazione I – Paolo Valente - 2020/2021 54
Programmazione I – Paolo Valente - 2020/2021
Problema 2/2 Problema 2/2
Questo aumenta la difficoltà e la fatica di Questo aumenta la difficoltà e la fatica di controllare la presenza/correttezza di tali controllare la presenza/correttezza di tali operazioni
operazioni
Quindi anche la probabilità di commettere Quindi anche la probabilità di commettere errori
errori
Se invece prevedessimo dei punti espliciti in Se invece prevedessimo dei punti espliciti in cui tali operazioni possano essere inserite, cui tali operazioni possano essere inserite, tali operazioni o la loro assenza salterebbero tali operazioni o la loro assenza salterebbero subito agli occhi (così come accadrebbe per subito agli occhi (così come accadrebbe per la condizione del ciclo)
la condizione del ciclo)
55 Programmazione I – Paolo Valente - 2020/2021 55
Programmazione I – Paolo Valente - 2020/2021
Istruzione iterativa
Istruzione iterativa for for
L'istruzione L'istruzione for for è proprio una estensione è proprio una estensione dell'istruzione
dell'istruzione while while in cui sono previsti, oltre in cui sono previsti, oltre ad un punto in cui inserire la condizione del ad un punto in cui inserire la condizione del ciclo, anche
ciclo, anche
un punto in cui inserire l'istruzione da un punto in cui inserire l'istruzione da eseguire
eseguire subito prima subito prima della prima della prima iterazione
iterazione
un punto in cui inserire l'istruzione da un punto in cui inserire l'istruzione da eseguire
eseguire subito dopo subito dopo ciascuna iterazione ciascuna iterazione
56 Programmazione I – Paolo Valente - 2020/2021 56
Programmazione I – Paolo Valente - 2020/2021
Sintassi e semantica Sintassi e semantica
<istruzione-for>
<istruzione-for> ::= ::=
forfor ((<istr_iniziale><istr_iniziale>;;<condizione><condizione>;;<istr_dopo_iter><istr_dopo_iter>))
<istruzione_corpo>
<istruzione_corpo>
valutazione
<condizione>
vera
falsa
esecuzione
<istruzione_corpo>
esecuzione
<istr_iniziale>
esecuzione
<istr_dopo_iter>
Stessa struttura del while
57 Programmazione I – Paolo Valente - 2020/2021 57
Programmazione I – Paolo Valente - 2020/2021
Intestazione
Intestazione for for
Definiamo intestazione di un'istruzione (o ciclo) Definiamo intestazione di un'istruzione (o ciclo) for
for la parte la parte
for
for ((<istr_iniziale><istr_iniziale>;;<condizione><condizione>;;<istr_dopo_iter><istr_dopo_iter>))
nella precedente definizione della sintassi nella precedente definizione della sintassi dell'istruzione
dell'istruzione for for
58 Programmazione I – Paolo Valente - 2020/2021 58
Programmazione I – Paolo Valente - 2020/2021
Soluzione problemi
Soluzione problemi while while 1/2 1/2
Le istruzioni <istr_iniziale> Le istruzioni <istr_iniziale> ed ed
<istr_dopo_iter>
<istr_dopo_iter> nell'intestazione del ciclo nell'intestazione del ciclo sono tipicamente utilizzate come punti
sono tipicamente utilizzate come punti espliciti per
espliciti per
inizializzare i valori delle variabili inizializzare i valori delle variabili e per e per
modificare le variabili che determinano la modificare le variabili che determinano la condizione del ciclo
condizione del ciclo
Si risolvono così i problemi del Si risolvono così i problemi del while while e del e del do … while
do … while precedentemente descritti precedentemente descritti
59 Programmazione I – Paolo Valente - 2020/2021 59
Programmazione I – Paolo Valente - 2020/2021
Soluzione problemi
Soluzione problemi while while 2/2 2/2
Possiamo schematizzare la cosa nel modo Possiamo schematizzare la cosa nel modo seguente:
seguente:
<uso-istruzione-for-per-esplicitare-inizializz_modifica>
<uso-istruzione-for-per-esplicitare-inizializz_modifica> ::= ::=
forfor ((<istr_inizializzazione><istr_inizializzazione>;;<condizione><condizione>;;<istr_modifica><istr_modifica>))
<istruzione_corpo>
<istruzione_corpo>
Vediamone un esempio illuminante in Vediamone un esempio illuminante in linguaggio C …
linguaggio C …
Come vedremo in dettaglio in seguito, in Come vedremo in dettaglio in seguito, in linguaggio C non esiste l'oggetto
linguaggio C non esiste l'oggetto coutcout e si può e si può stampare una stringa su
stampare una stringa su stdout con la funzionestdout con la funzione printf("Stringa da stampare") ;
printf("Stringa da stampare") ; equivalente a:
equivalente a:
cout<<"Stringa da stampare" ; cout<<"Stringa da stampare" ;
60 Programmazione I – Paolo Valente - 2020/2021 60
Programmazione I – Paolo Valente - 2020/2021
Esempio pratico in C
Esempio pratico in C
61 Programmazione I – Paolo Valente - 2020/2021 61
Programmazione I – Paolo Valente - 2020/2021
Problema iniziale Problema iniziale
Risolviamo il nostro semplice problema iniziale Risolviamo il nostro semplice problema iniziale utilizzando l'istruzione
utilizzando l'istruzione
forfor al posto del al posto del while
while
La traccia era: scrivere un programma che, dato La traccia era: scrivere un programma che, dato un numero naturale
un numero naturale N
N, letto a tempo di, letto a tempo di
esecuzione del programma stesso, stampi i primi esecuzione del programma stesso, stampi i primi
NN numeri naturali
numeri naturali
Modifichiamo opportunamente Modifichiamo
opportunamente e completiamoe completiamo il programma parziale, che era:
il programma parziale, che era:
main() main() {
{
int i = 1, N;int i = 1, N;
cin>>N;cin>>N;
finché resta vero che (i<=N),finché resta vero che (i<=N), ripetere il blocco
ripetere il blocco { cout<<i<<endl; i++; }{ cout<<i<<endl; i++; } }}
62 Programmazione I – Paolo Valente - 2020/2021 62
Programmazione I – Paolo Valente - 2020/2021
Soluzione con
Soluzione con for for
main() main() {{
int i, N;int i, N;
cin>>N;cin>>N;
for(i = 1 ; i <= N ; i++)for(i = 1 ; i <= N ; i++) cout<<i<<endl;
cout<<i<<endl;
} }
Inizializzazione della variabile Inizializzazione della variabile ii
Modifica della Modifica della variabile
variabile ii, e quindi , e quindi della condizione di della condizione di ripetizione
ripetizione
63 Programmazione I – Paolo Valente - 2020/2021 63
Programmazione I – Paolo Valente - 2020/2021
Nuova forma alternativa Nuova forma alternativa
A partire dallo standard C++11 è disponibile A partire dallo standard C++11 è disponibile anche una nuova forma per l'istruzione
anche una nuova forma per l'istruzione for
for
La vedremo dopo aver introdotto i tipi di dato La vedremo dopo aver introdotto i tipi di dato
utilizzati nella definizione di questa nuova forma utilizzati nella definizione di questa nuova forma dell'istruzione
dell'istruzione
forfor
64 Programmazione I – Paolo Valente - 2020/2021 64
Programmazione I – Paolo Valente - 2020/2021
Ulteriore vantaggio del C++
Ulteriore vantaggio del C++
Come abbiamo visto, col linguaggio C++ si Come abbiamo visto, col linguaggio C++ si
possono inserire istruzioni qualsiasi, incluso le possono inserire istruzioni qualsiasi, incluso le definizioni, in ogni punto del
definizioni, in ogni punto del
mainmain
In particolare si può inserire anche una In particolare si può inserire anche una definizione come istruzione iniziale
definizione come istruzione inizialenell'intestazione
nell'intestazione dell'istruzione
dell'istruzione for
for
In questo caso la variabile così definita si può In questo caso la variabile così definita si può utilizzare
utilizzare solo nell'intestazione e nel corpo solo nell'intestazione e nel corpo del del ciclo
ciclo for
for
Modifichiamo il programma precedente per Modifichiamo il programma precedente per sfruttare questa caratteristica
sfruttare questa caratteristica
65 Programmazione I – Paolo Valente - 2020/2021 65
Programmazione I – Paolo Valente - 2020/2021
Esempio Esempio
main() main() {{
int N;int N;
cin>>N;cin>>N;
for(int i = 1 ; i <= N ; i++)for(int i = 1 ; i <= N ; i++) cout<<i<<endl;
cout<<i<<endl;
} }
Definizione con inizializzazione Definizione con inizializzazione della variabile
della variabile ii
66 Programmazione I – Paolo Valente - 2020/2021 66
Programmazione I – Paolo Valente - 2020/2021
Commento Commento
Questa forma di definizione all'interno del ciclo Questa forma di definizione all'interno del ciclo da diversi vantaggi in termini di
da diversi vantaggi in termini di leggibilità
leggibilità ee riduzione del rischio di errori
riduzione del rischio di errori
Tutte le operazioni più importanti Tutte le
operazioni più importanti relativerelative alle variabili di controllo del ciclo (definizione, alle variabili di controllo del ciclo (definizione, inizializzazione, controllo della condizione,
inizializzazione, controllo della condizione, modifica delle variabili) sono
modifica delle variabili) sono raggruppate
raggruppatenell'intestazione
nell'intestazione del ciclo
del ciclo
Variabili che devono essere Variabili che devono essere utilizzate solo nel utilizzate solo nel ciclo
ciclo possono essere possono essere definite in maniera tale definite in maniera tale da
da vivere
vivere solo per la durata del ciclosolo per la durata del ciclo, ,
impedendo così di commettere l'errore di impedendo così di commettere l'errore di utilizzarle inavvertitamente quando non utilizzarle inavvertitamente quando non dovrebbero più essere utilizzate
dovrebbero più essere utilizzate
67 Programmazione I – Paolo Valente - 2020/2021 67
Programmazione I – Paolo Valente - 2020/2021
Istruzioni multiple Istruzioni multiple
Si possono inizializzare più variabili nella Si possono inizializzare più variabili nella istruzione iniziale dell'intestazione del
istruzione iniziale dell'intestazione del for
for
Allo stesso modo si possono effettuare più Allo stesso modo si possono effettuare più operazioni nell'istruzione da eseguire subito operazioni nell'istruzione da eseguire subito dopo la fine di ciascuna iterazione
dopo la fine di ciascuna iterazione
Basta utilizzare l'operatore virgola Basta utilizzare l'operatore virgola
68 Programmazione I – Paolo Valente - 2020/2021 68
Programmazione I – Paolo Valente - 2020/2021
Operatore virgola 1/2 Operatore virgola 1/2
Date le generiche espressioni Date le generiche espressioni
<espr1><espr1>,,
<espr2>
<espr2>, ...,
, ..., <esprN>
<esprN> le si può concatenarele si può concatenare mediante l'operatore virgola per ottenere la mediante l'operatore virgola per ottenere la seguente espressione composta:
seguente espressione composta:
<espr1>
<espr1>
,
, <espr2><espr2>, ...,, ...,
<esprN><esprN>in cui in cui
le espressioni le espressioni <espr1>
<espr1>,, <espr2>
<espr2>, ...,, ..., <esprN>
<esprN>saranno
saranno valutate l'una dopo l'altra
valutate l'una dopo l'altra
il il valore valore dell'espressione composta sarà uguale dell'espressione composta sarà uguale a quello
a quello dell'ultima espressione valutata dell'ultima espressione valutata
69 Programmazione I – Paolo Valente - 2020/2021 69
Programmazione I – Paolo Valente - 2020/2021
Operatore virgola 2/2 Operatore virgola 2/2
Esempi:
Esempi:
int i, j ;
int i, j ;for(i = 1, j = 3 ; i < 5 ; i++, j--)
for(i = 1, j = 3 ; i < 5 ; i++, j--)... ;
... ;70 Programmazione I – Paolo Valente - 2020/2021 70
Programmazione I – Paolo Valente - 2020/2021
Definizione multipla Definizione multipla
Si possono inoltre definire ed inizializzare più Si possono inoltre definire ed inizializzare più
variabili nella istruzione iniziale dell'intestazione variabili nella istruzione iniziale dell'intestazione del del
forfor
Devono essere tutte dello stesso tipo Devono essere tutte dello stesso tipo
for(
for(<tipo_variabili> <tipo_variabili> <nome_variabile1><nome_variabile1>
[ [
== <valore1> <valore1>] ]
, ,
<nome_variabile2><nome_variabile2>
[ [
= = <valore2><valore2>] ]
, … ;, … ;
<condizione><condizione> ; ; <istruzione1><istruzione1>, , <istruzione2><istruzione2>, …), …)
Esempio: Esempio:
for(int i = 1, j = 0 ; i <= N && j <= M; i++, j++) for(int i = 1, j = 0 ; i <= N && j <= M; i++, j++)
71 Programmazione I – Paolo Valente - 2020/2021 71
Programmazione I – Paolo Valente - 2020/2021
Secondo problema Secondo problema
Completiamo la panoramica risolvendo anche Completiamo la panoramica risolvendo anche l'altro problema utilizzando l'istruzione
l'altro problema utilizzando l'istruzione
forfor
Dato un numero naturale N Dato un numero naturale N, letto da , letto da stdin stdin, ,
stampare la corrispondente somma dei primi stampare la corrispondente somma dei primi N numeri naturali N numeri naturali
Nella soluzione sfruttare opportunamente la Nella soluzione sfruttare opportunamente la possibilità di definire variabili
possibilità di definire variabili nell'intestazione del ciclo
nell'intestazione del ciclo
72 Programmazione I – Paolo Valente - 2020/2021 72
Programmazione I – Paolo Valente - 2020/2021
Soluzione Soluzione
main() main() {{
int N, somma = 0;int N, somma = 0;
cin>>N;cin>>N;
for(int i = 1 ; i <= N ; i++)for(int i = 1 ; i <= N ; i++) somma += i;
somma += i;
cout<<somma<<endl;cout<<somma<<endl;
}}
73 Programmazione I – Paolo Valente - 2020/2021 73
Programmazione I – Paolo Valente - 2020/2021
Confronto for/while 1/2 Confronto for/while 1/2