39
Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 Palermo 24 - 28 Luglio 2017 L.2.5. Elementi di Programmazione www.u4learn.it Arianna Pipitone

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 · Esercizi sulle strutture di controllo ... MATLAB inizializza il valore della variabile contatore all’inizio di ogni ciclo

  • Upload
    buidung

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017Palermo 24 - 28 Luglio 2017

L.2.5. Elementi di Programmazione

www.u4learn.it Arianna Pipitone

L.2.5. Elementi di Programmazione

Cos’è un algoritmo?

Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi elementari.

Il concetto di algoritmo lo applichiamo inconsapevolmente al nostro quotidiano.

Per esempio, quando pensiamo di assaggiare della marmellata, stiamo già definendo ed applicando un algortimo.La pianificazione dei passi e la loro realizzazione (prendo il barattolo, lo apro, prendo il cucchiaio, etc…) definiscono un algoritmo

L.2.5. Elementi di Programmazione

Proprietà di un algoritmo

Le proprietà di un algoritmo sono:

• L’obiettivo da raggiungere (gustare la marmellata);

• La sequenza di istruzioni elementari opportunamente ordinata per raggiungere tale obiettivo;

• L’insieme di entità con le quali bisogna interagire e che bisogna gestire tramite le istruzioni per raggiungere il risultato (il cucchiaio, il barattolo, il coperchio del barattolo).

E’ possibile che esistano più vie per arrivare allo stesso obiettivo, combinando diversamente istruzioni ed entità (posso assaggiare la marmellata intingendo il dito, oppure rompendo il barattolo anziché aprirlo)

L.2.5. Elementi di Programmazione

Dall’algoritmo al programma

L'algoritmo è un concetto fondamentale dell‘Informatica, anzitutto perché è alla base della nozione teorica di calcolabilità: un problema è calcolabile quando è risolvibile mediante un algoritmo.

L'algoritmo è un concetto cardine della fase di programmazione dello sviluppo di un software: preso un problema da automatizzare, la programmazione costituisce essenzialmente la traduzione o codifica di un algoritmo per tale problema in programma scritto in un certo linguaggio, che può essere effettivamente eseguito da un calcolatore.

L.2.5. Elementi di Programmazione

Cosa è la programmazione

Da Wikipedia:

La programmazione, in Informatica, è l’insieme delle attività e tecniche che una o più persone specializzate, programmatori o sviluppatori (developer), svolgono per creare un programma, ossia un software da fare eseguire ad un computer.

L.2.5. Elementi di Programmazione

Programmazione strutturata

Il teorema di Bohm-Jacopini afferma che «qualsiasi algoritmo può essere definito usando esclusivamente le strutture di sequenza, di selezione e di iterazione»

L.2.5. Elementi di Programmazione

Strutture sequenziali

Un struttura sequenziale è un insieme consecutivo di passi ben definito

Ma se dovessimo fare una scelta? Per esempio un bivio dove decidere se andare a destra o a sinistra ?

L.2.5. Elementi di Programmazione

Esercizi sulle strutture sequenziali

Esercizio 25

Scrivere una funzione i2s.m che calcoli gli indici di riga e di colonna dell’elemento di una matrice partendo dal suo indice lineare e dal numero di righe della matrice

L.2.5. Elementi di Programmazione

Strutture di controllo

Le scelte in programmazione vengono implementate tramite le strutture condizionali o di controllo.

Se (IF) si verifica un evento si eseguiranno certe istruzioni altrimenti se ne eseguiranno altre.

L.2.5. Elementi di Programmazione

Strutture di controllo

• If

La struttura del comando di selezione if semplice è la seguente:

if condizione

istruzioni;

end

Se l'espressione logica (condizione) scritta dopo il comando if è vera, MATLAB eseguirà i comandi indicati nel blocco compreso tra if ed end (istruzioni). Se l'espressione è falsa, MATLAB eseguirà la prima istruzione che segue l'end

Per comodità di lettura del codice conviene indentare le istruzioni

È possibile eseguire l'indentazione automatica del testo, selezionando il testo da indentare e premendo i tasti CTRL+I

Se la condizione logica restituisce un array logico, essa verrà considerata vera solo se tutti gli elementi dell'array logico sono uguali a 1 (ossia la condizione è vera per ogni elemento dell'array che verrà valutato)

L.2.5. Elementi di Programmazione

Strutture di controllo

• If / else

La struttura del comando di selezione if / else è la seguente:

if condizione

istruzioni 1;

else

istruzioni 2;

end

Se l'espressione logica (condizione) scritta dopo il comando if è vera, MATLAB eseguirà i comandi indicati nel blocco compreso tra if ed else (istruzioni 1), al termine delle quali eseguirà la prima istruzione che segue l'end

Se la condizione è falsa MATLAB eseguirà il blocco di comandi compreso tra else ed end(istruzioni 2), quindi passerà ad eseguire la prima istruzione dopo end

La funzione beep di MATLAB fa generare un beep al computer si può utilizzare come prima istruzione del blocco “istruzioni 2”per far emettere un beep quando la condizione è falsa

L.2.5. Elementi di Programmazione

Esempio strutture di controllo

disp('Programma: ')

a = input('Inserisci prima variabile: ');

b = input('Inserisci seconda variabile: ');

out = a - b;

if out > 0

disp('a è maggiore di b');

end

if out < 0

disp('a è minore di b');

end

L.2.5. Elementi di Programmazione

Esercizi strutture di controllo

Esercizio 27

Scrivere una funzione equal.m che confronti due matrici

restituendo 0 se sono diverse e 1 se sono uguali

L.2.5. Elementi di Programmazione

Strutture di controllo

If / elseif / … / else

La struttura del comando di selezione if / elseif / … / else è la seguente:

if condizione 1

istruzioni 1;

elseif condizione 2

istruzioni 2;

elseif condizione 3

istruzioni 3;

:

:

else

istruzioni n;

end

Fare attenzione a non inserire condizioni ridondanti nelle condizioni 1, 2, ...

L.2.5. Elementi di Programmazione

Esercizi sulle strutture di controllo

Esercizio 29

Scrivere una funzione v2g.m che trasformi il voto numerico in giudizio secondo la seguente tabella di conversione

Commentare i passi salienti del programma

voto giudizio

voto < 0 Non Classificato

0 voto < 4 Scarso

4 voto < 6 Mediocre

voto = 6 Sufficiente

voto = 7 Discreto

voto = 8 Buono

voto = 9 Distinto

voto = 10 Ottimo

L.2.5. Elementi di Programmazione

Esercizi di programmazione

Esercizio 30

Scrivere una funzione equat2.m che risolva in R un’equazione di

secondo grado.

La funzione accetterà come input i coefficienti dell’equazione e

restituirà come output le due soluzioni

L.2.5. Elementi di Programmazione

Strutture di controllo

switch / caseEquivale a if / elseif / … / else ma può migliorare la leggibilità del programmaLa struttura del comando switch / case èswitch variabile

case valore 1

istruzioni 1;

case valore 2

istruzioni 2;

:

case valore n

istruzioni n;

otherwise

istruzioni n+1;

end

La condizione otherwise non è fondamentale, ma può essere usata per completezza. Alla prima condizione vera MATLAB esegue il blocco di istruzioni corrispondente e poi esce dallo switch, quindi non è necessario utilizzare break

L.2.5. Elementi di Programmazione

Esempio strutture di controllo

n = input('Inserisci un numero: ');

switch n

case -1

disp('Uno Negativo')

case 0

disp('Zero')

case 1

disp('Uno Positivo')

otherwise

disp('Altro valore')

end

L.2.5. Elementi di Programmazione

Strutture di controllo

Esercizio 32

Si supponga che il reddito sia tassato secondo la seguente tabella

1. Scrivere una funzione (arrot2.m) che approssimi un numero alla seconda cifra decimale

2. Scrivere una funzione (tasse.m) che chieda all'utente di inserire il proprio reddito, verifichi che il dato inserito sia numerico (altrimenti esca con messaggio di errore) e calcoli la tassazione, approssimata alla seconda cifra decimale con arrot2.m, visualizzando a video il seguente messaggio “Il tuo reddito è: xxxx . La tassazione corrispondente è pari a: yyyy”

Reddito lordo aliquota di tassazione

reddito 10000 € non tassato

10000 < reddito 40000 22%

40000 < reddito 70000 28%

70000 < reddito 100000 34%

reddito > 100000 40%

L.2.5. Elementi di Programmazione

Strutture di iterazione

E se avessimo necessità di ripetere blocchi di istruzioni al verificarsi di certe condizioni?Per esempio, calcolare la media dei voti di ciascuno studente di una classe… non converrebbe procedere sequenzialmente perché scriveremmo tante volte le stesse istruzioni quanti sono gli alunni.

Scriviamo le istruzioni una sola volta e ripetiamole un numero opportuno di volte.

L.2.5. Elementi di Programmazione

Strutture di iterazione

Ci sono strutture iterative con numero di ripetizioni fissato a priori (so già quante volte devo ripetere il blocco di istruzioni, per esempio nel caso degli alunni di una classe).

Ci sono anche strutture iterative il cui numero di ripetizione dipende dal verificarsi di certe condizioni e non è noto a priori.

L.2.5. Elementi di Programmazione

Strutture di iterazione

• for

Il comando for permette di eseguire il set di istruzioni (compreso tra il for e l’end) un numero di volte fissato a priori

La struttura del comando for è:for k = a : p : b

istruzioni;

break;

end

k è la variabile contatore, a è il valore iniziale di k, b è quello finale e p è il passo d’incremento della variabile contatore (se non è specificato p=1)

La variabile contatore k può essere incrementata o decrementata partendo da un qualunque valore. Se k cresce a b e p >0. Se k decresce a b e p<0

Il ciclo verrà eseguito |b-a|+1 volte

Il break è opzionale e serve per anticipare l’uscita dal ciclo. È preferibile non usarlo, sforzandosi di trovare condizioni equivalenti

interrompe il ciclo in anticipo (opzionale)

L.2.5. Elementi di Programmazione

Strutture di iterazione

A volte è utile che la variabile contatore assuma solo determinati valori, in questo caso si può utilizzare la seguente sintassi del comando forfor k = v

istruzioni;

break;

end

Al passo i-esimo del ciclo la variabile contatore k assumerà il valore vi

Il ciclo verrà eseguito n volte (dove n = length(v))

Anche in questo caso il break è opzionale

MATLAB inizializza il valore della variabile contatore all’inizio di ogni ciclo

Anche se non è buona programmazione è possibile usare lo stesso nome della variabile contatore k anche all’interno del ciclo. MATLAB distinguerà sempre la variabile k contatore dalla variabile k usata dentro il ciclo

Quando possibile è preferibile vettorizzare il computo piuttosto che usare cicli

interrompe il ciclo in anticipo (opzionale)

L.2.5. Elementi di Programmazione

Strutture di iterazione

Per renderci conto della differenza tra variabile contatore k e variabile k editiamo il seguente scritpt e mandiamolo in esecuzione

MATLAB distingue tra k-contatore e k-variabile.

Al termine dell’esecuzione del ciclo il valore di k sarà quello di k-variabile e non quello di k-contatore, lo si può verificare digitando k nella Command Window

for k = 1 : 5

['valore del contatore k = ' num2str(k)]

k = 3;

['valore della variabile k = ' num2str(k)]

end

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 33

Siano Pi(xi, yi, zi) punti dell spazio R3. Scrivere una funzione mindist che calcoli la minima distanza da O(0, 0, 0) dei punti Pi.

function d = mindist(x, y, z)

d = Inf;

for i = 1:length(x)

d_i = sqrt(x(i)^2 + y(i)^2 + z(i)^2);

if d_i < d

d = d_i;

end

end

L.2.5. Elementi di Programmazione

Strutture di iterazione

Potevamo vettorizzare la funzione mindist?

La risposta è si

Potevamo facilmente vettorizzare la funzione ed evitare il ciclo for nel modo seguente

function d = mindist_best(x, y, z)

d =min(sqrt(x.^2 + y.^2 + z.^2));

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 34

Scrivere la funzione remzeros che rimuova gli elementi nulli di un vettore

function y = remzeros(x)

k = 1;

for i = 1:length(x)

if x(i) ~= 0

y(k) = x(i);

k = k+1;

end

end

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 35

Scrivere la funzione sommacum che si comporti come il comando cumsum di MATLAB, ossia che applicata ad un vettore x restituisca un vettore y tale che

i

j=1

y(i) = x(j)

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 36

Scrivere la funzione fibonacci che calcoli n-esimo numero della successione di Fibonacci partendo dai valori iniziali f1 = 0 e f2 = 1

Ricordiamo che l’i-esimo numero di Fibonacci si ottiene sommando i precedenti due, cioè:

fi = fi-1 + fi-2

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 37

Dato il seguente array

x=[1.92 0.05 -2.43 -0.02 0.09 0.85 -0.06],

creare un programma per sostituire tutti gli elementi di x tali che -0.1 ≤ xi≤ 0.1 con il valore 0.

L.2.5. Elementi di Programmazione

Strutture di iterazione

• while

Il comando while permette di eseguire un set di istruzioni fino a quando una certa condizione è vera

La struttura del comando while èwhile condizione

istruzioni;

break

end

A differenza del ciclo for, il ciclo while non verrà eseguito un numero di volte fissato a priori, infatti la condizione viene verificata prima di cominciare ogni ciclo

La condizione può essere anche il valore di una variabile k che deve essere inizializzata prima del ciclo while e deve essere variata dalle istruzioni (altrimenti si entra in un loop infinito)

Il comando CTRL+C interrompe qualsiasi esecuzione di MATLAB (utile nel caso si entri in un ciclo infinito)

interrompe il ciclo in anticipo (opzionale)

L.2.5. Elementi di Programmazione

Strutture di iterazione

Consideriamo le due funzioni seguenti:

Le due funzioni calcolano entrambe la somma parziale n-esima della serie geometrica di ragione x

Benché usino due cicli diversi i tempi di esecuzione sono gli stessi

function y=seriegeomf(x,n)

% x = ragione, n = limite

y=0;

for k = 0 : n

y = y + x .^ k;

end

function y=seriegeomw(x,n)

% x = ragione, n = limite

y=0;

k=0;

while k <= n

y = y + x .^ k;

k = k + 1;

end

L.2.5. Elementi di Programmazione

Esempio strutture di iterazione

Sommare tutti i voti di uno studente e farne la media, senza doverne conoscere a priori il numero

nvoti = 0;

somma = 0;

voto = input('Voto (0 per finire) ');

while voto ~= 0

somma = somma + voto;

nvoti = nvoti + 1;

voto = input(‘Voto (0 per finire) ');

end

media = somma/nvoti;

L.2.5. Elementi di Programmazione

Strutture di iterazione

All’interno di un ciclo è possibile usare particolari comandi opzionali che possono tornarci utili in alcune occasioni

break

Il comando break può essere usato all’interno di un qualsiasi ciclo for o while per interrompere anticipatamente i cicli

continue

Il comando continue può essere usato all’interno di un qualsiasi ciclo per non eseguire, solo per quel passo, il blocco di istruzioni che segue il comando

keyboard

Quando il comando è inserito in un m-file (script o funzione) il comando ferma l’esecuzione del programma e lascia il controllo alla tastiera

return

Quando la tastiera ha il controllo di MATLAB (in seguito al comando keyboard) digitando return da tastiera si ritorna ad eseguire il programma che era stato interrotto

L.2.5. Elementi di Programmazione

Strutture di iterazione

return

Quando il comando return è utilizzato in un mfile interrompe l’esecuzione del programma

pause

Ferma l’esecuzione di un programma fino a quando non si preme un tasto qualsiasi da tastiera

pause(n)

Ferma l’esecuzione di un programma per n secondi

error(‘stringadavisualizzare’)

Termina l’esecuzione del programma, facendo emettere un beep al computer e visualizzando la stringadavisualizzare in rosso nella Command Window

errordlg(‘stringadavisualizzare’)

Come error, ma visualizza il messaggio in un box di errore

L.2.5. Elementi di Programmazione

Strutture di iterazione

Esercizio 38

Costruire una funzione (fattorialew.m) che calcoli il fattoriale di un numero n usando un ciclo while

La funzione dovrà verificare che il numero inserito sia un intero positivo e non sia vuoto. In caso contrario dovrà riproporre all’utente di immettere il correttamente il numero fino al corretto inserimento

L.2.5. Elementi di Programmazione

Calcolo dei tempi di esecuzione

tic, comandi; toc

La coppia di comandi tic e toc permette di calcolare il tempo (in secondi) impiegato da MATLAB per eseguire i comandi compresi tra le istruzioni tic e toc. L’istruzione tic fa partire il "cronometro", l’istruzione toc calcola il tempo passato dall’ultimo tic>> tic, magic(4), toc

ans =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

Elapsed time is 0.000999 seconds.

>> tic, magic(4); toc

Elapsed time is 0.000216 seconds.

include il tempo di visualizzazione

non include il tempo di visualizzazione

L.2.5. Elementi di Programmazione

Calcolo dei tempi di esecuzione

t = tic; comandi; toc(t);

È possibile fissare diversi punti iniziali del tempo assegnando il valore di ogni tic ad una variabile diversa e misurando i toc relativi ad un dato tic

t = tic; comandi; tempo = toc(t) oppure tic, comandi; tempo = toc

È possibile assegnare ad una variabile il valore della misura di un intervallo di tempo associato ad un tic (o la misura assoluta dell’intervallo). In questo caso MATLAB non mostrerà a video la misura del tempo impiegato ma (se omettiamo il ; finale) mostrerà il valore della variabile a cui è stata assegnata la misura del tempo

>> tic, magic(100); misura_tempo = toc

misura_tempo =

0.0019

L.2.5. Elementi di Programmazione

Calcolo dei tempi di esecuzione

Esercizio 40

Scrivere una funzione che costruisca il vettore dei primi 10.000 numeri pari e restituisca come output il tempo impiegato per costruire tale vettore (senza visualizzare il vettore) nei tre modi diversi

1. con un ciclo for

2. con un ciclo for preceduto dalla preallocazione del vettore di output

3. con l’istruzione di MATLAB che utilizza l’operatore : per costruire i vettori

Notare le differenze dei tempi di esecuzione!!!

Questo ci fa riflettere circa la dispendiosità dei cicli for, l’utilità della preallocazione e della trasformazione in notazione vettoriale dei problemi.