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.