Corso di Fondamenti di Informatica Macroarea di Ingegneria 2018/19 Tutor: prof. Francesco De Vincenzi
function q = quadratoRicorsivo (n, m) if m==0 q=0; else q=n+quadratoRicorsivo(n,m-1); end Funzione ricorsiva che calcola il quadrato di un numero(non negativo). function f = fattoriale (n) if n==1 f=1; else f=n*fattoriale(n-1); end Funzione ricorsiva che calcola il fattoriale di un numero n: n*n-1*n-2*….*1 function d = dueallaN (n) if n==0 d=1; else d=2*dueallaN(n-1); end Funzione ricorsiva che calcola 2 elevato ad n.
function p = prodottoVettoreRicorsivo (V) len=length(V); if len==0 p = 1; else p = V(1)*prodottoVettoreRicorsivo(V(2:len)); end Funzione ricorsiva che prende in input un vettore V e calcola il prodotto dei suoi elementi function c = contaZeriVettoreRicorsiva (V) len=length(V); if len==0 c=0; else if V(1)==0 c=1+contaZeriVettoreRicorsiva(V(2:len)); c=contaZeriVettoreRicorsiva(V(2:len)); end Funzione ricorsiva che prende in input un vettore V e conta quanti zeri ci sono
Funzione ricorsiva che prende in input due vettori e produce un valore booleano true se sono uguali(stessi valori nelle stesse posizioni) o false Funzione ricorsiva che prende in input un vettore V e trova il suo valore minimo function m = minimoVettoreRicorsiva (V) len=length(V); if len==1 m=V(1); else minimoResto=minimoVettoreRicorsiva(V(2:len)); if V(1) < minimoResto m=minimoResto; end function uguali = confrontaVettoriRicorsiva (V1, V2) len1=length(V1); len2=length(V2); if len1~=len2 uguali=false; else if len1==0 uguali=true; if V1(1)~=V2(1) uguali=confrontaVettoriRicorsiva(V1(2:len1),V2(2:len2)); end
Strutture dati array e matrici Le strutture dati viste finora consentono di memorizzare solo dati dello stesso tipo (omogenee). Inoltre un array non consente di memorizzare elementi di dimensione diversa. Non possibile: Matlab converte automaticamente i dati ad un tipo unico 3 1.5 ‘h’ 1 2 5 4 6 Non possibile: Le matrici devono avere in ogni riga lo stesso numero di colonne 2 5 9 7 5 10 4
Strutture dati non omogenee La struttura dati Cell consente di ospitare elementi di qualsiasi tipo e di qualsiasi «forma». >> a = { 5 } >> b = { [ 1 2; 3 4] } >> c = {'ciao' } >> c={ ['c','i','a','o'] } b a c 1 2 3 4 5 c i a o a è una cell che contiene un array 1x1 di double b è una cell che contiene una matrice 2x2 di double c è una cell che contiene un array 1x4 di char
Contenitore e contenuto Si può indicizzare con parentesi tonde () e parentesi graffe { } Tramite parentesi tonde accedo alla cell, tramite parentesi graffa al suo contenuto >> b = { [ 1 2; 3 4] } >> b (1) ans = { [1,1] = 1 2 3 4 } >> b {1} ans = 1 2 3 4 >> b {1}(1,:) ans = 1 2 1 2 3 4 1 2 3 4 1 2
Contenitore e contenuto Si può indicizzare con parentesi tonde () e parentesi graffe { } Tramite parentesi tonde accedo alla cell, tramite parentesi graffa al suo contenuto >> c = { ‘ciao’ } >> c(1) ans = { [1,1] = ciao } >> c{1} ans = ciao >> c{1}(2:2:4) ans = io i o c i a o c i a o
Cell Array Combinando più cell (in forma di array o di matrici) si ottengono i cell array. >> x x = { [1,1] = 1 [1,2] = 2 [1,3] = 3 [1,4] = 4 } >> x{1} ans = 1 >> x{2} ans = 2 >> x = { 1, 2, 3, 4 } >> x(1) ans = { [1,1] = 1 } >> x(2) ans = { [1,1] = 2 } 1 2 3 4 cell array 1x4 cell array 1x1 di double Una cell non è altro che un cell array di dimensione 1x1.
Cell Array Combinando più cell (in forma di array o di matrici) si ottengono i cell array. >> x x = { [1,1] = 1 [2,1] = 3 [1,2] = 2 [2,2] = 4 } >> x{1,1} ans = 1 >> x{2,2} ans = 4 >> x = {1,2;3,4} >> x(1,1) ans = { [1,1] = 1 } >> x(2,2) ans = { [1,1] = 4 } 1 2 3 4
Cell Array >> x = { 12 , [4,5,6] , [1 2;3 4], true, ‘ok’ } 1 2 3 4 12 4 5 6 1 o k >> x{1} ans = 12 >> x{2} ans = 4 5 6 >> x{2}(3) ans = 6 >> x(1) ans = { [1,1] = 12 } >> x{3}(2,2) ans = 4 >> x(2) ans = { [1,1] = 4 5 6 } >> x{5}(2) ans = k
Cell Array 4 5 6 >> x={4 {5 6}} x = { [1,1] = 4 [1,2] = [1,1] = 4 [1,2] = [1,1] = 5 [1,2] = 6 } 4 5 6 >> x{2}(1) ans = { [1,1] = 5 } >> x{1} ans = 4 >> x{2} ans = { [1,1] = 5 [1,2] = 6 } >> x(2) ans = { [1,1] = [1,1] = 5 [1,2] = 6 } >> x(1) ans = { [1,1] = 4 } >> x{2}{1} ans = 5
Creazione di cell array vuoti Il procedimento è analogo alla creazione di array o matrici vuote. >> cell(2) ans = [] [] [] [] >> cell(2, 4) ans = [] [] [] [] [] [] [] [] >> cell([1, 5]) ans = [] [] [] [] []
Manipolazione di cell array: indicizzazione >> X = { 1 [2 3] [4 5 6; 7 8 9] 0 } 4 5 6 7 8 9 1 2 3 >> X(1:2) >> X{1:2} L’uso delle graffe «smonta» la struttura del cell array. Indicizzando da 1 a 2 otteniamo due risposte, non una sola struttura. >> [a b] = X{1:2} 1 2 3 1 2 3
Manipolazione di cell array: concatenazione >> X = { 1 [2 3] [4 5 6; 7 8 9] 0 } >> X = [ X(1:2) X(4) ] 1 2 3 1 2 3 TEST: Cosa fa questa istruzione? [X{1} X{2} X{3}(1,:) X{3}(2,:) X{4}]
Manipolazione di cell array: cancellazione >> X = { 1 [2 3] [4 5 6; 7 8 9] 0 } >> X{3}=[] X = { [1,1] = 1 [1,2] = 2 3 [1,3] = [](0x0) [1,4] = 0 } 1 2 3 >> X(3)=[] X = { [1,1] = 1 [1,2] = 2 3 [1,3] = 0 } 1 2 3
Manipolazione di cell array: cosa fanno questi comandi? >> X = { 1 [2 3] [4 5 6; 7 8 9] 0 } >> Z = { X{1:2} } >> Z = [ X{1:2} ] >> [x y] = X{:}
Manipolazione di cell array: cosa fanno questi comandi? >> X = { 1 [2 3] [4 5 6; 7 8 9] 0 } >> Z = { X{1:2} } >> Z = [ X{1:2} ] >> [x y] = X{:} 1 2 3 x 1 y 2 3 1 2 3 >> Z={[X{1:2}]} 1 2 3
Esercizio: Misurazione inquinamento Sviluppare uno script MatLab che consente di inserire, per ciascun giorno dal Lunedì alla Domenica, una serie di valori di monossido di carbonio rilevati in una città.Il programma deve produrre un report (cell array) con il valore medio associato a ciascun giorno. Lunedi Martedi Domenica 9.4 11.6 6.4
Esercizio: Misurazione inquinamento Funzione di servizio per fare la media dei valori di un vettore… function m = mediaVettore(V) m = sum(V)/length(V); end Script inquinamento.m %valori costanti del programma nomiGiorni={'Lunedi','Martedi','Mercoledi','Giovedi','Venerdi','Sabato','Domenica'}; giorni=7; %cell array dei valori di inquinamento inizialmente vuoto inquinamento={};
for i=1:giorni %per ciascun giorno della settimana Script inquinamento.m for i=1:giorni %per ciascun giorno della settimana inquin_giorno=[]; %il vettore delle temperature del giorno è inizialmente vuoto disp(nomiGiorni{i}); %mostro il giorno della settimana misurazioni=input('Inserire il numero di misurazioni: '); %chiedo quante misurazioni for j=1:misurazioni %per ciascuna misurazione misura=input('Inserisci una misura: '); %ne chiedo il valore inquin_giorno=[inquin_giorno misura]; %la aggiungo in coda alle temperature end inquinamento= [ inquinamento inquin_giorno]; %aggiungo al cell array delle temperature
medie={}; %cell array chiesto in output Script inquinamento.m medie={}; %cell array chiesto in output for i=1:giorni %riempio ciascuna posizione con un array cell formato da nome del giorno medie{i}= {nomiGiorni{i} mediaVettore(inquinamento{i})}; %e media delle temperature end
Esercizio: Atleta Lunedi Martedi Domenica 9 12 4 6.4 6.2 6.05 Realizza un programma in MatLab che consente di creare un report degli allenamenti di un atleta del salto in lungo. L’atleta si allena tutti i giorni provando a saltare ad una distanza di 6 metri, segnando le misure dei salti e ripetendo il salto finché questo riesce. Il report deve contenere Per ogni giorno della settimana: il giorno, il numero di salti e la distanza massima saltata. Lunedi Martedi Domenica 9 12 4 6.4 6.2 6.05
nomestruttura.nomecampo Struct Una struct è una struttura dati caratterizzata da un nome e da un insieme di campi Ciascun campo è indicato da un nome. Per accedere al contenuto del campo, la sintassi da usare è ad esempio, per rappresentare i dati di uno studente possiamo definire una struct con queste istruzioni: nomestruttura.nomecampo studente.nome = "Franco"; studente.eta = 24; studente.voti = [26 28 19 30];
Struct Ciascun campo può essere una variabile semplice, un vettore, una matrice, un cell array o un’altra struct: comune.nome = "Frascati"; comune.abitanti = 22331; comune.frazioni = {"Cisternole", "Cocciano", "Selvotta", "Vermicino"}; comune.sindaco.cognome = "Mastrosanti"; comune.sindaco.eta = 52;
Vettore di struct Si possono assemblare più struct per contenere struct dello stesso tipo: comuniRoma(1).nome= "Ciampino"; comuniRoma(1).abitanti = 38533; comuniRoma(2).nome= "Frascati"; comuniRoma(2).abitanti = 22331; … comuniRoma(87).nome= "Grottaferrata"; comuniRoma(87).abitanti = 20450;
Vettore di struct Calcolare il numero medio di abitanti dei comuni di Roma numeroComuni = length(comuniRoma); totale=0; for i=1:numeroComuni totale=totale + comuniRoma(i).abitanti; end media = totale/numeroComuni; Esercizi: mostrare il nome del comune con più abitanti Dopo aver chiesto in input un numero di abitanti, costruire il vettore con le coppie nome comune e numero abitanti dei soli comuni con almeno il numero abitanti specificato
s=struct('nome','Franco','eta',24);