• Non ci sono risultati.

Fondamenti di Informatica

N/A
N/A
Protected

Academic year: 2021

Condividi "Fondamenti di Informatica"

Copied!
102
0
0

Testo completo

(1)

Fondamenti di Informatica

Fondamenti di Programmazione in MATLAB

Strutture Selettive e Iterative

Prof. Marco Lombardi

(2)

Operatori Relazionali e Logici

Strutture di Controllo di MATLAB

Strutture Selettive

Costrutto IF

Costrutto SWITCH-CASE

Strutture Iterative

Costrutto FOR

Costrutto WHILE

Istruzioni Break e Continue

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

Fondamenti di Programmazione in MATLAB:

Strutture Selettive e Iterative

(3)

Operatori Relazionali – 1/4

Basati sui principi della Logica Booleana

Il loro scopo è quello di fornire risposte di tipo vero/falso a domande

riguardanti il confronto di relazioni tra oggetti

Più precisamente, gli operatori relazionali

confrontano relazioni tra

Tipi numerici

Array, matrici e scalari

Stringhe

Intere espressioni

Il risultato di una comparazione può essere

vero (1) oppure falso (0)

In MATLAB gli operatori relazionali possono operare direttamente

anche su array e matrici

(4)

Operatori Relazionali – 2/4

In MATLAB

• Un confronto falso  dà risultato 0

• Un confronto vero  dà risultato 1 (o un valore diverso da 0)

Operatore Descrizione > Maggiore di < Minore di >= Maggiore o uguale di <= Minore o uguale di == Uguale a ∼= Diverso da

(5)

Operatori Relazionali – 2/4

In MATLAB

• Un confronto falso  dà risultato 0

• Un confronto vero  dà risultato 1 (o un valore diverso da 0)

Operatore Descrizione > Maggiore di < Minore di >= Maggiore o uguale di <= Minore o uguale di == Uguale a ∼= Diverso da NOTA IMPORTANTE:

L’operatore relazionale «Uguale a» è composto da due simboli uguale: ==, da non confondere con l’operatore di assegnazione con un uguale =

(6)

Operatori Relazionali – 2/4

In MATLAB

• Un confronto falso  da risultato 0

• Un confronto vero  da risultato 1 (o un valore diverso da 0)

Operatore Descrizione > Maggiore di < Minore di >= Maggiore o uguale di <= Minore o uguale di == Uguale a ∼= Diverso da NOTA IMPORTANTE: Usare >= Non usare => Usare <= Non usare =<

(7)

Operatori Relazionali – 3/4

Esempio 1 (== applicato a scalari)

>> a=5 a = 5 >> b=9 b = 9 >> a==b ans = 0

(8)

Operatori Relazionali – 3/4

Espressione Valore

Esempio 2

(9)

Operatori Relazionali – 3/4

1 1 0 1 1 1 Espressione Valore • Esempio 2

(10)

Operatori Relazionali – 4/4

Esempio 3 (== applicato a matrici)

>> M1=[4 3 3; 2 8 1; -1 85 28] M1 = 4 3 3 2 8 1 -1 85 28 >> M2=[2 3 4; 3 3 1; 5 6 28] M2 = 2 3 4 3 3 1 5 6 28 >> M1==M2 ans = 0 1 0 0 0 1 0 0 1

(11)

Operatori Relazionali – 4/4

Esempio 4 (> applicato ad array)

>> x = 1 : 8 x = 1 2 3 4 5 6 7 8 >> y = 8 : -1 : 1 y = 8 7 6 5 4 3 2 1 >> bool_res = x > y bool_res = 0 0 0 0 1 1 1 1

(12)

Operatori Logici

• Gli operatori logici forniscono un modo per combinare o negare espressioni

relazionali

• Operatori logici di base: AND, OR e NOT

• Come visto nella prima parte del corso, ciascun operatore logico può essere

specificato mediante una tavola di verità

Operatore Descrizione Note

&& AND A && B da risultato 1 se A e B sono entrambi uguali a 1; A && B da risultato 0, altrimenti

|| OR A || B da risultato 1 se almeno uno tra A e B è uguale a 1; A || B da risultato 0, altrimenti

NOT ~A da risultato 0, se A è uguale a 1 ~A da risultato 1, se A è uguale a 0

(13)

Ordine di Precedenza dei Tipi

di Operatori

Livello di precedenza Tipo di operatore

Primo Parentesi tonde; sono valutate a partire dalla coppia di

parentesi più interne Secondo Operatori aritmetici e

operatore NOT (~); sono valutati da sinistra a destra Terzo Operatori relazionali; sono

valutati da sinistra a destra

Quarto Operatore logico AND

Quinto Operatore logico OR

(14)

Operatori Logici: Esempi – 1/2

Espressione booleana che è vera solo se x è maggiore di 10 AND

minore di 20

>> x = 5;

>> (10 < x) && (x < 20)

ans =

0

(15)

Operatori Logici: Esempi – 2/2

È possibile controllare la precedenza usando le parentesi

>> x = false; >> y = true; >> x && y || true ans = 1 >> x && (y || true) ans = 0 0 OR 1 0 OR 1

(16)

Operatori Logici

(Elemento per Elemento)

Gli operatori logici possono essere applicati agli array

N.B.

Non va confuso l’operatore & con l’operatore &&Non va confuso l’operatore | con l’operatore ||

Operatore logico Descrizione

& AND elemento per elemento

| OR elemento per elemento

~ NOT elemento per elemento

(17)

>> x = 1 : 8 x = 1 2 3 4 5 6 7 8 >> y = 8 : -1 : 1 y = 8 7 6 5 4 3 2 1 >> bool_res = x > y bool_res = 0 0 0 0 1 1 1 1 >> bool_res_neg = ~(x > y) bool_res_neg = 1 1 1 1 0 0 0 0 >> (x > y) & (y <= 2) ans = 0 0 0 0 0 0 1 1 >> (x < 2) | (y < 2) ans = 1 0 0 0 0 0 0 1 Operatori Logici

Elemento per Elemento (Esempio)

(18)

>> x = 1 : 8 x = 1 2 3 4 5 6 7 8 >> y = 8 : -1 : 1 y = 8 7 6 5 4 3 2 1 >> bool_res = x > y bool_res = 0 0 0 0 1 1 1 1 >> bool_res_neg = ~(x > y) bool_res_neg = 1 1 1 1 0 0 0 0 >> (x > y) & (y <= 2) ans = 0 0 0 0 0 0 1 1 >> (x < 2) | (y < 2) ans = 1 0 0 0 0 0 0 1 Operatori Logici

Elemento per Elemento (Esempio)

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

>> x>y ans = 1×8 logical array 0 0 0 0 1 1 1 1 >> y<=2 ans = 1×8 logical array 0 0 0 0 0 0 1 1

(19)

Operatori Logici

(Indicizzazione di Array)

>> salario = [1000, 7000, 6000, 3000, 8000]; >> giorni_lavorativi = [20, 8, 28, 5, 7]; >> matricola_operai = [10001, 10002, 10003, 10004, 10005]; >> salario > 5000 ans = 0 1 1 0 1 >> giorni_lavorativi < 10 ans = 0 1 0 1 1

>> (salario > 5000) & (giorni_lavorativi < 10)

ans =

0 1 0 0 1

>> matricola_operai ((salario > 5000) & (giorni_lavorativi < 10))

ans =

10002 10005 Ottenere la

matricola di tutti gli operai che guadagnano più di 5000 euro e lavorano meno di 10 giorni al mese

(20)

Operatori Logici

(Indicizzazione di Array)

>> salario = [1000, 7000, 6000, 3000, 8000]; >> giorni_lavorativi = [20, 8, 28, 5, 7]; >> matricola_operai = [10001, 10002, 10003, 10004, 10005]; >> salario > 5000 ans = 0 1 1 0 1 >> giorni_lavorativi < 10 ans = 0 1 0 1 1

>> (salario > 5000) & (giorni_lavorativi < 10)

ans =

0 1 0 0 1

>> matricola_operai ((salario > 5000) & (giorni_lavorativi < 10))

ans =

10002 10005 Ottenere la

matricola di tutti gli operai che guadagnano più di 5000 euro e lavorano meno di 10 giorni al mese

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

>> matricola_operai (logical([0,1,0,0,1])) ans =

(21)

Operatori Logici

(Indicizzazione di Array)

>> salario = [1000, 7000, 6000, 3000, 8000]; >> giorni_lavorativi = [20, 8, 28, 5, 7]; >> matricola_operai = [10001, 10002, 10003, 10004, 10005]; >> salario > 5000 ans = 0 1 1 0 1 >> giorni_lavorativi < 10 ans = 0 1 0 1 1

>> (salario > 5000) & (giorni_lavorativi < 10)

ans =

0 1 0 0 1

>> matricola_operai ((salario > 5000) & (giorni_lavorativi < 10))

ans =

10002 10005 Ottenere la

matricola di tutti gli operai che guadagnano più di 5000 euro e lavorano meno di 10 giorni al mese

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

>> matricola_operai (logical([0,1,0,0,1])) ans = 10002 10005 >> matricola_operai ([2,5]) ans = 10002 10005

(22)

Operatori Logici

(Indicizzazione di Matrici)

>> x = [8 2 3; 1 5 0] x = 8 2 3 1 5 0 >> x >= 5 ans = 1 0 0 0 1 0 >> x(x >= 5) ans = 8 5

Notare che nel risultato finale non ci sono differenze

>> x(find(x >= 5)) ans =

8 5

Notare la differenza con il comando find

>> find(x >= 5) ans =

1 4

(23)

Strutture Fondamentali di MATLAB – 1/3

Analogamente ad altri linguaggi di programmazione,

MATLAB fornisce tre

Strutture di Controllo fondamentali

Sequenza

Selezione

Iterazione

(24)

Strutture Fondamentali di MATLAB – 2/3

Sequenza

È definita dalla sequenza lessicografica delle istruzioni

istruzione1 istruzione2 istruzione3 . . . istruzioneN Esecuzione TOP-DOWN (alto verso il basso)

(25)

Strutture Fondamentali di MATLAB – 2/3

Sequenza

È definita dalla sequenza lessicografica delle istruzioni

istruzione1 istruzione2 istruzione3 . . . istruzioneN istruzione1 istruzione2 istruzione3 istruzioneN Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

(26)

Strutture Fondamentali di MATLAB – 3/3

Selezione

Le strutture selettive o decisionali

Ci consentono di scrivere programmi in grado di prendere delle

decisioni

Sono implementate mediante istruzioni condizionali

Possono essere implementate in MATLAB mediante i costrutti IF

(e sue varianti) e SWITCH-CASE

In generale, le istruzioni condizionali contengono una o più

clausole

if

(se),

else

(altrimenti) ed

elseif

(altrimenti se)

(27)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione blocco_istruzioni end espressione blocco_istruzioni VERA FALSA

(28)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione

blocco_istruzioni

end

Se l’espressione è vera (1) allora le istruzioni del blocco

(blocco_istruzioni)sono eseguite

Se l’espressione è falsa (0) allora le istruzioni del blocco

(blocco_istruzioni)non sono eseguite

(29)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione

blocco_istruzioni

end

N.B. Ogni clausola

if

deve essere associata ad una clausola

end

Quest’ultima

clausola

indica

la

fine

delle

istruzioni

(blocco_istruzioni) che devono essere eseguite se

l’espressione logica è vera

L’espressione logica può essere anche un’espressione composta

(30)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione

blocco_istruzioni

end

Uno spazio deve separare la parola chiave

if

dall’espressione

logica

(31)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione

blocco_istruzioni

end

Le istruzioni possono essere formate da una singola istruzione o da

una serie di istruzioni

Di solito le istruzioni vengono rientrate verso destra (indentazione),

per specificare che esse appartengono alla clausola

if

ed alla

corrispondente clausola

end

Istruzione 1; Istruzione 2; . . . Istruzione n;

(32)

Costrutto IF – 1/4

Selezione Semplice (Sintassi MATLAB)

if espressione blocco_istruzioni end • Esempio x = input('Inserisci x: '); y = input('Inserisci y: '); if x == y

disp('x e y sono uguali');

end

(33)

Costrutto IF – 2/4

Quando un processo decisionale comporta più azioni, è possibile

utilizzare, insieme alla clausola

if,

anche le seguenti clausole

• else

• Che caratterizza una selezione a due vie • elseif

• Che caratterizza una selezione “a cascata”

(34)

Costrutto IF – 2/4

Selezione a Due Vie (Sintassi MATLAB) if espressione blocco_istruzioni_1 else blocco_istruzioni_2 end espressione blocco_istruzioni_1 blocco_istruzioni_2 VERA FALSA

(35)

Costrutto IF – 2/4

Selezione a Due Vie (Sintassi MATLAB) if espressione

blocco_istruzioni_1 else

blocco_istruzioni_2 end

Se l’espressione è vera (1) allora le istruzioni del blocco 1

(blocco_istruzioni_1) sono eseguite

Altrimenti (se l’espressione è falsa (0) allora) le istruzioni del blocco 2

(blocco_istruzioni_2) sono eseguite

(36)

Costrutto IF – 2/4

Selezione a Due Vie (Sintassi MATLAB) if espressione blocco_istruzioni_1 else blocco_istruzioni_2 end

Esempio 1

x = input('Inserisci x: '); if x > 0

disp('Hai inserito un valore positivo');

else

disp('Hai inserito un valore negativo');

end

(37)

Costrutto IF – 2/4

Selezione a Due Vie (Sintassi MATLAB) if espressione blocco_istruzioni_1 else blocco_istruzioni_2 end

Esempio 2

n = input('Inserisci n: '); if n < 100 disp([num2str(n), ' è MINORE di 100']); else

disp([num2str(n), ' è MAGGIORE O UGUALE di 100']);

end

(38)

Costrutto IF – 2/4

Selezione a Due Vie (Sintassi MATLAB) if espressione blocco_istruzioni_1 else blocco_istruzioni_2 end

Esempio 3

if voto_esame < 18

disp('GRRRRRRRR...Il prof mi ha preso in antipatia!!!');

else

disp('E vai!!! Ho superato l’esame! Bye bye prof');

end

(39)

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

Costrutto IF – 3/4

espr1 espr2 esprN bloco_istr_1 bloco_istr_2 bloco_istr_N bloco_istr_altrimenti VERA VERA VERA FALSA FALSA FALSA if espressione1 blocco_istruzioni_1 elseif espressione2 blocco_istruzioni_2 . . . elseif espressioneN blocco_istruzioni_N else blocco_istruzione_altrimenti end • Selezione a «Cascata»

(40)

Costrutto IF – 3/4

Selezione a «Cascata» (Sintassi MATLAB)

if espressione1 blocco_istruzioni_1 elseif espressione2 blocco_istruzioni_2 . . . elseif espressioneN blocco_istruzioni_N else blocco_istruzione_altrimenti end

(41)

Costrutto IF – 3/4

Selezione a «cascata»: Esempio

if prezzo >= 999

perc_sconto = 35;

elseif prezzo >= 599 && prezzo < 999

perc_sconto = 25;

elseif prezzo > 0.99 && prezzo < 599

perc_sconto = 19;

elseif prezzo <= 0.99

perc_sconto = 0;

disp('Nessuno sconto! Spendi di più per averlo!!!')

else

disp('Prezzo non corretto!')

end

(42)

Costrutto IF – 3/4

Selezione a «cascata»: Esempio

if prezzo >= 999

perc_sconto = 35;

elseif prezzo >= 599 && prezzo < 999

perc_sconto = 25; elseif prezzo < 599

perc_sconto = 19; elseif prezzo <= 0.99

perc_sconto = 0;

disp('Nessuno sconto! Spendi di più per averlo!!') else

disp('Prezzo non corretto!') end

NOTA: Equivale a

599 ≤ 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 < 999

(43)

Costrutto IF – 3/4

Selezione a «cascata»: Esempio

if prezzo >= 999

perc_sconto = 35;

elseif prezzo >= 599 && prezzo < 999

perc_sconto = 25;

elseif prezzo < 599

perc_sconto = 19;

elseif prezzo <= 0.99

perc_sconto = 0;

disp('Nessuno sconto! Spendi di più per averlo!!')

else

disp('Prezzo non corretto!')

end

N.B.

Le clausole

else

ed

elseif

possono essere omesse quando non

necessario

Tuttavia, se vengono utilizzate

entrambe, la clausola

else

deve

essere posta dopo

elseif

(44)

Costrutto IF – 3/4

Selezione a «cascata»: Esempio

if prezzo >= 999

perc_sconto = 35;

elseif prezzo >= 599 && prezzo < 999

perc_sconto = 25;

elseif prezzo < 599

perc_sconto = 19;

elseif prezzo <= 0.99

perc_sconto = 0;

disp('Nessuno sconto! Spendi di più per averlo!!')

else

disp('Prezzo non corretto!')

end

N.B.

La clausola

elseif

non richiede

un’apposita clausola

end

(45)

Costrutto IF – 4/4

Le

strutture decisionali possono essere annidate

• Una struttura può essere inclusa all’interno di un’altra struttura che, a sua

volta, può contenerne un’altra e così via…

Il rientro verso destra di alcune righe del codice mette in evidenza i

gruppi delle istruzioni associate a ciascuna clausola

end

Si noti che ogni clausola

if

è associata ad una clausola

end

if espressione1 blocco_istruzioni_1 if espressione2 blocco_istruzioni_2 end end

(46)

Costrutto IF – 4/4

Esempio 4

cena = true;

fa_i_compiti = true; sistema_stanza = false;

if cena && fa_i_compiti

if ~sistema_stanza

disp('Bravo/a ragazzo/a');

else

disp('Ragazzo/a eccezionale');

end else disp('Ragazzaccio/a'); end N.B. Ciascun elsefa riferimento all’ultimo

if che non è stato

chiuso da una clausola

end

(47)

Costrutto SWITCH-CASE – 1/3

• Il costrutto switch-case consente di selezionare un gruppo di istruzioni

da eseguire, in base al valore di una variabile presa in input

• Tale costrutto risulta essere utile per le enumerazioni ma poco appropriato

per gli intervalli

switch variabile case valore1 blocco_istruzioni_valore_1 case valore2 blocco_istruzioni_valore_2 . . . case valoreN blocco_istruzioni_valore_N otherwise blocco_istruzioni_otherwise end

(48)

switch variabile case valore1 blocco_istruzioni_valore_1 case valore2 blocco_istruzioni_valore_2 . . . case valoreN blocco_istruzioni_valore_N otherwise blocco_istruzioni_otherwise end

Costrutto SWITCH-CASE – 1/3

• Il costrutto switch-case consente di selezionare un gruppo di istruzioni

da eseguire, in base al valore di una variabile presa in input

• Tale costrutto risulta essere utile per le enumerazioni ma poco appropriato

per gli intervalli

• N.B. Ogni valore di case deve

essere scritto su una singola riga del programma

(49)

switch variabile case valore1 blocco_istruzioni_valore_1 case valore2 blocco_istruzioni_valore_2 . . . case valoreN blocco_istruzioni_valore_N otherwise blocco_istruzioni_otherwise end

• Il costrutto switch-case consente di selezionare un gruppo di istruzioni

da eseguire, in base al valore di una variabile presa in input

• Tale costrutto risulta essere utile per le enumerazioni ma poco appropriato

per gli intervalli

Costrutto SWITCH-CASE – 1/3

• La variabile di input viene

confrontata con il valore che segue ciascuna clausola case

• Se esiste una clausola case seguita da

un valore identico a quello assunto dalla variabile presa in input, MATLAB esegue il blocco di istruzionirelativo a tale clausola

• Poi prosegue l’elaborazione con le

istruzioni che si trovano dopo la relativa clausola end

(50)

switch variabile case valore1 blocco_istruzioni_valore_1 case valore2 blocco_istruzioni_valore_2 . . . case valoreN blocco_istruzioni_valore_N otherwise blocco_istruzioni_otherwise end

Costrutto SWITCH-CASE – 1/3

• Il costrutto switch-case consente di selezionare un gruppo di istruzioni

da eseguire, in base al valore di una variabile presa in input

• Tale costrutto risulta essere utile per le enumerazioni ma poco appropriato

per gli intervalli

• N.B. vengono eseguite soltanto le

istruzioni corrispondenti al primo valore di case equivalente alla

variabiledi input

(51)

Costrutto SWITCH-CASE – 2/3

Esempio 1

mese = input('Inserisci il tuo mese di nascita (valore numerico): ');

switch mese case 1 meseStr = 'Gennaio'; case 2 meseStr = 'Febbraio'; case 3 meseStr = 'Marzo'; ... ... ... case 12 meseStr = 'Dicembre'; otherwise

disp('Errore: Il valore deve essere compreso tra 1 e 12')

end

disp(['Ciao, sei nato il mese di ', meseStr])

(52)

Costrutto SWITCH-CASE – 3/3

Esempio 2 – Più espressioni per blocco case

cifra = input('Inserisci cifra > 0 : ');

switch cifra

case {2,4,6,8}

disp('Cifra PARI');

case {1,3,5,7,9}

disp('Cifra DISPARI');

otherwise

disp('Errore: La cifra deve essere compresa tra 1 e 9')

end

(53)

Strutture Iterative – 1/3

Abbiamo visto che MATLAB fornisce tre strutture

fondamentali

• Sequenza • Selezione • Iterazione

(54)

Strutture Iterative – 2/3

Abbiamo visto che MATLAB fornisce tre strutture

fondamentali

• Sequenza • Selezione • Iterazione

(55)

Strutture Iterative – 3/3

Perché abbiamo bisogno dell’

Iterazione?

• Se una sezione di codice può essere potenzialmente ripetuta, essa deve

essere inserita in una struttura iterativa (o ciclo)

• Un ciclo (o loop) è una struttura di controllo che permette di ripetere

l’esecuzione di istruzioni per un certo numero di volte

• Ogni ripetizione del ciclo è detta iterazione o (passo)

MATLAB fornisce di due tipologie di struttura iterativa

• Ciclo for

• Utilizzato quando il numero di iterazioni è noto a priori • Ciclo while

• Utilizzato quando il numero di iterazioni non è noto a priori

• Il ciclo termina quando è soddisfatta una particolare condizione

(56)

Ciclo FOR – 1/9

Ciclo

for

(Sintassi MATLAB)

• L’espressione m:s:n assegna il valore iniziale m alla variabile di ciclo, che viene incrementata del valores (detto step o incremento)

• Le istruzioni (blocco_istruzioni) vengono eseguite una sola volta per

ogni iterazione, utilizzando il valore corrente della variabile di ciclo

• L’elaborazione continua finché la variabile di ciclo supera il valore finale

per n

• Di solito, la variabile di ciclo è uno scalare, ma può essere anche un

vettore o una matrice

for

variabile = m:

s

:

n

blocco_istruzioni

end

(57)

Ciclo FOR – 1/9

Ciclo

for

(Sintassi MATLAB)

• Si noti che ogni for deve essere associato ad una clausola end • end indica la fine delle istruzioni da eseguire all’interno del ciclo

for

variabile = m:

s

:

n

blocco_istruzioni

end

(58)

Ciclo FOR – 1/9

Ciclo

for

(Sintassi MATLAB)

Fra la clausola

for

ed il nome della variabile di ciclo deve essere

inserito uno spazio

for

variabile = m:

s

:

n

blocco_istruzioni

end

(59)

Ciclo FOR – 1/9

Ciclo

for

(Sintassi MATLAB)

È buona norma indentare (rientrare) verso destra le istruzioni del

ciclo

for

e la corrispondente clausola

end

, per mettere in evidenza

quali istruzioni appartengono al ciclo

for

variabile = m:

s

:

n

blocco_istruzioni

end

(60)

Ciclo FOR – 1/9

for

k = 1

:

1

:

10

x = k^2

end

M-File Script per calcolare l’elevazione al quadrato degli interi da 1 a 10 (potenza.m) >> potenza x = 1 x = 4 x = 9 x = 16 x = 25 x = 36 x = 49 x = 64 x = 81 x = 100 Esecuzione

(61)

Ciclo FOR – 1/9

for

k = 1

:

1

:

10

x = k^2

end

M-File Script per calcolare l’elevazione al quadrato degli interi da 1 a 10 (potenza.m)

L’istruzione

x = k^2

viene eseguita

una sola volta per ogni iterazione,

utilizzando il valore corrente della

variabile di ciclo k

(62)

Ciclo FOR – 2/9

Ciclo

for

(Sintassi alternativa MATLAB)

for

variabile = valori_array

blocco_istruzioni

end

(63)

Ciclo FOR – 2/9

Ciclo

for

(Usare array e matrici come indice di ciclo)

Il ciclo

for

risulta essere molto utile anche per la

manipolazione di array e matrici

for

variabile = valori_array

blocco_istruzioni

end

(64)

Ciclo FOR – 2/9

Ciclo

for

(Usare array e matrici come indice di ciclo)

Il ciclo

for

risulta essere molto utile anche per la

manipolazione di array e matrici

for

variabile = valori_array

blocco_istruzioni

end

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

for k = [4,9,15] disp(k) end 4 9 15 Esempio

(65)

Ciclo FOR – 3/9

Esempio 1

for i = [1:1:10] disp(i)

end

(66)

Ciclo FOR – 3/9

Esempio 1

[1:1:10] equivale al vettore [1 2 3 4 5 6 7 8 9 10]

for i = [1:1:10] disp(i) end

(67)

Ciclo FOR – 3/9

Esempio 1

Output

for i = [1:1:10] disp(i) end 1 2 3 4 5 6 7 8 9 10

(68)

Ciclo FOR – 4/9

Esempio 2

for i = 2:2:10 disp(i)

end

(69)

Ciclo FOR – 4/9

Esempio 2

Output

• Numeri pari da 2 a 10 for i = 2:2:10 disp(i) end 2 4 6 8 10

(70)

Ciclo FOR – 5/9

Esempio 3

• Funzione che prende in input un array x e restituisce in output la somma

degli elementi che esso contiene

function [somma] = somma_array(x) s = 0

for i = 1:length(x)restituisce la dimensione di x

s = s + x(i); end

somma = s; end

(71)

Ciclo FOR – 5/9

Esempio 3

Esempi d’uso

function [somma] = somma_array(x) s = 0 for i = 1:length(x) s = s + x(i); end somma = s; end >> mio_array = [200 -1 5 24 8]; >> somma_mio_array = somma_array(mio_array) somma_mio_array = 236 >> somma = somma_array(1:10) somma = 55

(72)

Ciclo FOR – 6/9

Esempio 4

• Funzione che prende in input un array x e restituisce in output la somma

degli elementi con indice pari e la somma degli elementi con indice dispari function [somma_pari, somma_disp] = somma_pari_dispari(x)

somma_pari = 0; somma_disp = 0;

for i = 1:1:length(x)

if (mod(i, 2) == 0) % indice pari

somma_pari = somma_pari + x(i);

else % indice dispari

somma_disp = somma_disp + x(i);

end end

end

N.B.: I commenti (riportati in verde) saranno ignorati da MATLAB. Essi

sono di aiuto solo a chi scrive/legge il codice sorgente della funzione.

(73)

Ciclo FOR – 6/9

Esempio 4

• Funzione che prende in input un array x e restituisce in output la somma

degli elementi con indice pari e la somma degli elementi con indice dispari function [somma_pari, somma_disp] = somma_pari_dispari(x)

somma_pari = 0; somma_disp = 0;

for i = 1:1:length(x)

if (mod(i, 2) == 0) % indice pari

somma_pari = somma_pari + x(i);

else % indice dispari

somma_disp = somma_disp + x(i);

end end

end

N.B.: I commenti (riportati in verde) saranno ignorati da MATLAB. Essi

sono di aiuto solo a chi scrive/legge il codice sorgente della funzione

N.B. i vari livelli di indentazione

(74)

Ciclo FOR – 6/9

Esempio 4

• Funzione che prende in input un array x e restituisce la somma degli

elementi con indice pari e la somma degli elementi con indice dispari function [somma_pari, somma_disp] = somma_pari_dispari(x)

somma_pari = 0; somma_disp = 0;

for i = 1:1:length(x)

if (mod(i, 2) == 0) % indice pari

somma_pari = somma_pari + x(i);

else % indice dispari

somma_disp = somma_disp + x(i);

end end

end

N.B.: I commenti (riportati in verde) saranno ignorati da MATLAB. Essi

sono di aiuto solo a chi scrive/legge il codice sorgente della funzione

N.B. i vari livelli di indentazione

N.B.

• È possibile annidare i cicli for

e le istruzioni condizionali • Si noti che fored ifdevono

essere sempre accompagnati dalla relativa clausola end

(75)

Ciclo FOR – 6/9

Esempio 4

• Funzione che prende in input un array x e restituisce in output la somma

degli elementi con indice pari e la somma degli elementi con indice dispari

function [somma_pari, somma_disp] = somma_pari_dispari(x)

somma_pari = 0; somma_disp = 0;

for i = 1:1:length(x)

if (mod(i, 2) == 0) % indice pari

somma_pari = somma_pari + x(i);

else % indice dispari

somma_disp = somma_disp + x(i);

end end end

N.B.: I commenti (riportati in verde9 saranno

ignorati da MATLAB. Essi sono di aiuto solo a chi scrive/legge il codice sorgente della funztion

Esempi d’uso

>> [sommap, sommad] = somma_pari_dispari([1 2 3 4 5]) sommap =

6 sommad =

9

>> [sommap, sommad] = somma_pari_dispari([1 3 5 7]) sommap =

10 sommad =

6

(76)

Ciclo FOR – 7/9

Esempio 5

• Funzione che prende in input un array x e restituisce in output l’elemento

con valore massimo

function [massimo] = massimo(x) massimo = x(1); for i = 2:length(x) if x(i) > massimo massimo = x(i); end end end

(77)

Ciclo FOR – 7/9

Esempio 5

• Funzione che prende in input un array x e restituisce in output l’elemento

con valore massimo

function [massimo] = massimo(x) massimo = x(1); for i = 2:length(x) if x(i) > massimo massimo = x(i); end end end Esempi d’uso >> max = massimo([10 20 40 500 35]) max = 500 >> max = massimo([-8 -1 -25 -10 -45]) max = -1 >> max = massimo([1.5 2.25 1/1000 2/3 8/29]) max = 2.2500

(78)

Ciclo FOR – 8/9

Esempio 6

• Funzione che prende in input due array a e b (entrambi della stessa lunghezza)

e restituisce in output un array c, in cui ogni elemento c(i) contiene il valore dell’elemento massimo tra a(i) e b(i)

Esempio Input/output funzioneINPUT

• a = [ 29 14 44 58 ]

• b = [ 11 49 2 54 ]

OUTPUT

• c = [ 29 49 44 58 ]

Suggerimento: possiamo utilizzare la funzione massimo, che abbiamo

definito in precedenza

(79)

Ciclo FOR – 8/9

Esempio 6

• Funzione che prende in input due array a e b (entrambi della stessa

lunghezza) e restituisce in output un array c, in cui ogni elemento c(i) contiene il valore dell’elemento massimo tra a(i) e b(i)

function [c] = massimi_valori(a, b)

for i = 1:length(a)

c(i) = massimo([a(i) b(i)]);

end end

(80)

Ciclo FOR – 8/9

Esempio 6

• Funzione che prende in input due array a e b (entrambi della stessa

lunghezza) e restituisce in output un array c, in cui ogni elemento c(i) contiene il valore dell’elemento massimo tra a(i) e b(i)

function [c] = massimi_valori(a, b)

for i = 1:length(a)

c(i) = massimo([a(i) b(i)]);

end end Esempi d’uso >> c = massimi_valori([2 3], [1, 8]) c = 2 8 >> c = massimi_valori([ 29 14 44 58 ], [ 11 49 2 54]) c = 29 49 44 58

(81)

Ciclo FOR – 9/9

Esempio 7

• Funzione che prende in input una matrice A e restituisce in output la

somma degli elementi di A

Soluzione 1

function [somma] = somma_matrice(A)

[m n] = size(A); somma = 0;

for r = 1:m %indicizza le righe della matrice

for c = 1:n %indicizza le colonne della matrice

somma = somma + A(r, c);

end end

end

(82)

Esempio 7

• Funzione che prende in input una matrice A e restituisce in output la

somma degli elementi di A

Soluzione 1

Ciclo FOR – 9/9

function [somma] = somma_matrice(A)

[m n] = size(A); somma = 0;

for r = 1:m %indicizza le righe della matrice

for c = 1:n %indicizza le colonne della matrice

somma = somma + A(r, c);

end end end 34 9 6 3 2 21 4 6 57 3 63 0 1 4 8 6 43 35 2 7 m n

(83)

Ciclo FOR – 9/9

Esempio 7

• Funzione che prende in input una matrice A e restituisce in output la

somma degli elementi di A

Soluzione 2 (Mediante la funzione somma_array definita precedentemente)

function [somma] = somma_matrice_soluzione2(A) [m n] = size(A);

somma = 0;

for r = 1:m

riga_A = A(r, :); % estraggo r-esima riga di A

somma = somma + somma_array(riga_A);

end end

(84)

Ciclo WHILE – 1/3

Ciclo

while

(Sintassi MATLAB)

• Finché la condizione del while è verificata (risulta essere vera), le

istruzioni contenute nel corpo del ciclo (blocco_istruzioni) verranno

eseguite

• D’altro canto, non appena la condizione non sarà più verificata (risulterà falsa), il

ciclo terminerà

• Il ciclo while è estremamente utile quando non è noto a priori il numero di

iterazioni che dovranno essere eseguite

• Ad es., quando si vuole continuare un processo finché non è soddisfatta una

particolare condizione

while

condizione

blocco_istruzioni

end

(85)

Ciclo WHILE – 2/3

Ciclo

while

(Sintassi MATLAB)

Ogni clausola

while

deve essere associata alla relativa clausola

end

while

condizione

blocco_istruzioni

end

(86)

Ciclo WHILE – 2/3

Ciclo

while

(Sintassi MATLAB)

Le istruzioni del ciclo (

blocco_istruzioni

) dovrebbero essere

rientrate verso destra per agevolare la lettura dei programmi

while

condizione

blocco_istruzioni

end

(87)

Output

Ciclo WHILE – 3/3

Esercizio 1

x = 20;

while

x < 50

disp(x);

x = x + 3;

end

20 23 26 29 32 35 38 41 44 47 M-File Script

(88)

Output

Ciclo WHILE – 3/3

Esercizio 1

x = 20;

while

x < 50

disp(x);

x = x + 3;

end

20 23 26 29 32 35 38 41 44 47

Affinché il ciclo

while

possa operare

correttamente, devono verificarsi due

condizioni

• La variabile di ciclo (in questo caso x) deve

avere un valore prima che venga eseguito il while

M-File Script

(89)

Output

Ciclo WHILE – 3/3

Esercizio 1

x = 20;

while

x < 50

disp(x);

x = x + 3;

end

20 23 26 29 32 35 38 41 44 47

Affinché il ciclo

while

possa operare

correttamente, devono verificarsi due

condizioni

• La variabile di ciclo (in questo caso x) deve

avere un valore prima che venga eseguito il while

• La variabile di ciclo deve essere modificata

in qualche modo dalle istruzioni del ciclo stesso

M-File Script

(90)

Output

Ciclo WHILE – 3/3

Esercizio 1

x = 20;

while

x < 50

disp(x);

x = x + 3;

end

20 23 26 29 32 35 38 41 44 47

Le istruzioni sono eseguite una volta per

ogni iterazione del ciclo, utilizzando il

valore corrente della variabile di ciclo (in

questo caso x)

M-File Script

(91)

Ciclo WHILE – 3/3

Esercizio 2

• Esegue il ciclo finché non viene immesso un valore negativo

Esempio d’uso

somma = 0; x = input('Inserisci x (> 0): '); while x > 0 somma = somma + x; x = input('Inserisci x (> 0): '); end disp(['somma: ', num2str(somma)]); Inserisci x (> 0): 10 Inserisci x (> 0): 9 Inserisci x (> 0): 8 Inserisci x (> 0): -1 somma: 27 M-File Script

(92)

Ciclo WHILE – 3/3

Esercizio 2

• Esegue il ciclo finché non viene immesso un valore negativo

Esempio d’uso

somma = 0; x = input('Inserisci x (> 0): '); while x > 0 somma = somma + x; x = input('Inserisci x (> 0): '); end disp(['somma: ', num2str(somma)]); Inserisci x (> 0): 10 Inserisci x (> 0): 9 Inserisci x (> 0): 8 Inserisci x (> 0): -1 somma: 27 M-File Script Prestare estrema attenzione alla condizione di terminazione del ciclo

• Potrebbe accadere che il ciclo non abbia mai termine

(93)

Ciclo DO/WHILE

MATLAB

non offre una sintassi per il ciclo

do/while

• È comunque possibile ottenere un comportamento simile a quello del

do/whileimpiegando un while come segue:

continua_ciclo = true; while continua_ciclo blocco_istruzioni; if ~condizione continua_ciclo = false; end end continua_ciclo = true; i = 1; while continua_ciclo disp(i); if ~(i < 10) continua_ciclo = false; end i = i + 1; end Ese m pi o

(94)

break e continue

Le clausole

break

e

continue

possono essere usate all’interno di

un ciclo per terminare o modificare l’esecuzione del ciclo stesso

(95)

break e continue – 1/2

Le clausole

break

e

continue

possono essere usate all’interno di

un ciclo per terminare o modificare l’esecuzione del ciclo stesso

• La clausola break (to break  rompere) termina il ciclo, anche se non si è raggiunta la fine dello stesso)

• Il flusso di esecuzione del programma “salta” alla prossima istruzione

fuori dal ciclo

for i = 1 : 6 disp(i) if i > 3 break; end end 1 2 3 4 Output

(96)

break e continue – 1/2

Le clausole

break

e

continue

possono essere usate all’interno di

un ciclo per terminare o modificare l’esecuzione del ciclo stesso

• La clausola break (to break  rompere) termina il ciclo, anche se non si è raggiunta la fine dello stesso)

• Il flusso di esecuzione del programma “salta” alla prossima istruzione

fuori dal ciclo

for i = 1 : 6 disp(i) if i > 3 break; end end 1 2 3 4 Output

• È possibile utilizzare un’istruzione if

per “saltare fuori” dal ciclo, prima che la variabile di ciclo abbia raggiunto il suo valore finale

• Per fare questo è possibile usare l’istruzione break, che termina

un ciclo senza concludere l’intero programma

(97)

break e continue – 2/2

Le clausole

break

e

continue

possono essere usate all’interno di

un ciclo per terminare o modificare l’esecuzione del ciclo stesso

• La clausola continue salta un’iterazione del ciclo, ma fa si che il flusso di esecuzione rimanga comunque all’interno del ciclo

• Il flusso di esecuzione del programma “salta” alla fine del ciclo

(bypassando tutte le istruzioni presenti tra la clausola continue e

quella end) e comincia con la prossima iterazione del ciclo

for i = 1 : 6 if mod(i, 2) == 0 continue; end disp(i) end 1 3 5 Output

(98)

break e continue – 2/2

Le clausole

break

e

continue

possono essere usate all’interno di

un ciclo per terminare o modificare l’esecuzione del ciclo stesso

• La clausola continue salta un’iterazione del ciclo, ma fa si che il flusso di esecuzione rimanga comunque all’interno del ciclo

• Il flusso di esecuzione del programma “salta” alla fine del ciclo

(bypassando tutte le istruzioni presenti tra la clausola continue e

quella end) e comincia con la prossima iterazione del ciclo

for i = 1 : 6 if mod(i, 2) == 0 continue; end disp(i) end 1 3 5 Output

•Questa istruzione passa il controllo del programma alla successiva iterazione del ciclo foro whilein cui figura, ignorando

tutte le istruzione restanti nel corpo del ciclo

• Nei cicli annidati, l’istruzione continue

passa il controllo del programma alla successiva iterazione del ciclo foro whilein cui è contenuta

(99)

Esercizio 1

Espressione Valore

(100)

Soluzione 1

Espressione Valore

Fondamenti di Programmazione in MATLAB: Strutture Selettive e Iterative

1 1 0 0 1 0

(101)

Esercizio 2

Simulare una sequenza di

20 lanci di un dado a 6 facce

• Se per 2 lanci consecutivi esce il numero 6

• Viene stampato «Hai Vinto!» e la simulazione si arresta

Se non sono capitati due lanci consecutivi in cui è uscito il numero 6

• Viene stampato «Riprova» e la simulazione si arresta

(102)

Soluzione 2

vittoria=0;

prec=0; for i=1:20 dado = ceil(6*rand(1)); disp(dado);

if prec==6 && dado==6 vittoria=1; break; end prec = dado; end if(vittoria==1)

disp('Hai vinto!'); else

disp('Riprova.'); end

Riferimenti

Documenti correlati

By comparing the response to Fe deficiency in two Strategy I species, cucumber and soybean, it emerged that the different aptitudes to induce the PM-ATPase are accompanied by other

compilazione,
 ad
 esempio
 delle
 tabelle
 di
 valutazione,
 accedendo
 alle
 informazioni
 già
 presenti
 ed
 integrandole
 ove
 necessario
 con


Però in questa diminuzione c'è un anche un effetto &#34;automa- tico&#34;: si è allargata l'area della povertà con l'in- gresso di nuclei che non sono in condizioni drammatiche

Aggiungo che, stampando già io la raccolta dei classici latini e cristiani scrittori da adottarsi nelle scuole cattoliche (che al tutto si debbono ristorare),

Chi, invece, difende l’‘onore’ di Tucidide come storico veritiero, ha ripiegato sulla soluzione ap- parentemente più ‘comoda’: che cioè la condanna fosse dovuta alla

Questa pagina può essere fotocopiata esclusivamente per uso didattico - © Loescher Editore..

L’esperienza cristiana e operaia di Carlo Carlevaris, una serie di interventi ripercorrerà alcuni degli aspetti salienti della sua biografia: l’infanzia e la formazione

Le ricerche del nostro gruppo da sempre si sono in- centrate sulla caratterizzazione fitochimica e attività biologica degli estratti delle piante che crescono in