• Non ci sono risultati.

Capitolo 5 Capitolo 5

N/A
N/A
Protected

Academic year: 2021

Condividi "Capitolo 5 Capitolo 5"

Copied!
104
0
0

Testo completo

(1)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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 o

per capire se siamo o meno andati oltre

meno andati oltre

(13)

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)

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)

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 iterative

(16)

16 Programmazione I – Paolo Valente - 2020/2021 16

Programmazione I – Paolo Valente - 2020/2021

Istruzioni iterative

Istruzioni iterative

(17)

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)

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

corpo

del 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 … while

o 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

while

while

(19)

19 Programmazione I – Paolo Valente - 2020/2021 19

Programmazione I – Paolo Valente - 2020/2021

Istruzione iterativa Istruzione iterativa

while

while

(20)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

44 Programmazione I – Paolo Valente - 2020/2021 44

Programmazione I – Paolo Valente - 2020/2021

Istruzione iterativa Istruzione iterativa

do … while

do … while

(45)

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)

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

while

while , per evitare il ciclo infinito, , per evitare il ciclo infinito,

<istruzione>

<istruzione>

deve modificare prima o poi la

deve modificare prima o poi la

condizione

condizione

Si noti che, come nel caso del Si noti che, come nel caso del

while

while , 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 input

(47)

47 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)

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)

49 Programmazione I – Paolo Valente - 2020/2021 49

Programmazione I – Paolo Valente - 2020/2021

Istruzione iterativa Istruzione iterativa

for for

(50)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

60 Programmazione I – Paolo Valente - 2020/2021 60

Programmazione I – Paolo Valente - 2020/2021

Esempio pratico in C

Esempio pratico in C

(61)

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

for

for 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

N

N numeri naturali

numeri naturali

Modifichiamo opportunamente Modifichiamo

opportunamente e completiamo

e 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)

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)

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

for

for

(64)

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

main

main

In particolare si può inserire anche una In particolare si può inserire anche una definizione come istruzione iniziale

definizione come istruzione iniziale

nell'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)

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)

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à e

e riduzione del rischio di errori

riduzione del rischio di errori

Tutte le operazioni più importanti Tutte le

operazioni più importanti relative

relative 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

raggruppate

nell'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 ciclo

solo 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)

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)

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ò concatenare

le 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)

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)

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

for

for

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)

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

for

for

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)

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)

73 Programmazione I – Paolo Valente - 2020/2021 73

Programmazione I – Paolo Valente - 2020/2021

Confronto for/while 1/2 Confronto for/while 1/2

Terminiamo confrontando le soluzioni Terminiamo confrontando le soluzioni del problema scritte utilizzando le due del problema scritte utilizzando le due istruzioni

istruzioni

Riferimenti

Documenti correlati

[r]

Analizzare il datapath per identificare i controlli che determinano il trasferimento tra registri. Progettare la logica

Figura 22 Figura 23 Mostra dell'incisione contemporanea slovena, catalogo della mostra, Trieste, Galleria dello Scorpione, 29 dicembre - 15 gennaio

Available Open Access on Cadmus, European University Institute Research Repository.... SUZUMURA (1988), “Individual Rights Revisited,” Fachbereich

Vi sono altri termini relativi ai ruoli di genere, all’età e all’orientamento sessuale pressoché sconosciuti dalla maggioranza degli informatori: çavo, dal romani

Il Comprehensive Assessment consiste in una revisione della qualità degli attivi (asset quality review AQR), allo scopo di testare se il common equity tier 1 sia in grado di

Nell’ultimo decennio la produzione e l’utilizzo del biogas ottenuto dalla co-digestione anerobica di reflui zootecnici e biomasse agricole ha registrato un notevole incremento

L’acqua presente nelle nuvole scende sulla terra sotto forma di vento. Pioggia, neve e grandine sono dette