Esercitazione 10 21 Dicembre 2010 (2 ore) Riassunto Nell'esecitazione di oggi abbiamo lavorato ancora sulle funzioni. Abbiamo inoltre introdotto alcune delle seguenti funzioni per tracciare i grafici. Funzione per tracciare linee su piano cartesiano: plot(x,y) -> x e y sono dei vettori aventi stessa dimensione contenenti le coordinate dei punti da rappresentare. Funzione per tracciare linee su spazio cartesiano: plot3(x,y,z) -> x,y e z sono dei vettori aventi stessa dimensione contenenti le coordinate dei punti da rappresentare. Gli esercizi svolti sono i seguenti: 1. Funzioni e matrici logiche - TDE 03/02/2009A 2. Esercizio 2 (TDE 20/07/2009) 3. Stringhe palindrome 4. Tariffe telefoniche (plot in 2 dimensioni) Esercizio 1. (Funzioni e matrici logiche - TDE 03/02/2009A) Scrivere una funzione che pre come parametro due matrici A e B, della stessa dimensione, e restituisce i seguenti 3 valori: 1. Il numero di elementi uguali in posizioni corrispondenti. 2. Il numero di elementi di A massimali per la matrice B, cioe' il numero di posizioni, nella matrice A, in cui e' presente un elemento che e' maggiore o uguale a tutti gli elementi presenti nella matrice B. 3. Il numero massimo di elementi di A massimali per la matrice B (secondo la definizione precedente) presenti in una stessa colonna della matrice A. function [r1,r2,r3]=soluzione(a, B) t1 = A==B; M = max(max(b)); t2 = A <= M; r1 = sum(sum(t1)); r2 = sum(sum(t2)); r3 = max(sum(t2));
Esercizio 2 (TDE 20/07/2009) Una matrice Matlab contiene numeri interi. Si vuole progettare una funzione che ricevo la matrice e un array di numeri interi che rappresenta una sequenza, cerchi tale sequenza all interno della matrice. La sequenza può essere disposta, nella matrice, verticalmente dall alto verso il basso od orizzontalmente, da sinistra verso destra. La funzione deve avere la seguente intestazione: function [riga, col, dir] = cercainiziosequenza(matrice, seq) se la sequenza è presente nella matrice allora riga e col indicano gli indici di riga e di colonna del suo primo elemento, mentre dir viene posto uguale al carattere v se la sequenza è disposta verticalmente, o se orizzontalmente (se la sequenza è presente ripetuta in più posizioni, i valori restituiti possono essere quelli relativi a una qualsiasi delle ripetizioni); se la sequenza non è presente, riga e col valgono entrambi 0 e dir vale n. 1. Per codificare la funzione in questione, si sviluppano prima le due seguenti funzioni ausiliarie function [pres] = verificaseqorizzontaledaposizione (matrice, seq, riga, col) function [pres] = verificaseqverticaledaposizione (matrice, seq, riga, col) che ricercano la sequenza nella matrice a partire da una posizione d inizio precisa, in direzione orizzontale o verticale: riga e col sono il punto di inizio; il risultato pres vale 1 se la sequenza è presente, 0 altrimenti. 2. Successivamente si utilizzano queste due funzioni per codificare le due seguenti 1. function [riga, col] = cercainizioseqorizzontale(matrice, seq) 2. function [riga, col] = cercainizioseqverticale(matrice, seq) che ricercano la sequenza in tutta la matrice con disposizione orizzontale e verticale, restituo in riga e col le coordinate del punto d inizio, se la sequenza viene trovata, o il valore 0 altrimenti. 3. Infine si codifichi la funzione cercainiziosequenza faco uso delle due precedenti. Ai fini dell esame, per questioni di tempo, si sviluppino solo le seguenti funzioni, ipotizzando che le altre due siano già state sviluppate: function [pres] = verificaseqorizzontaledaposizione (matrice, seq, riga, col) function [riga, col] cercainizioseqorizzontale = (matrice, seq) function [riga, col, dir] = cercainiziosequenza(matrice, seq) function [pres] = verificaseqorizzontaledaposizione (matrice, seq, riga, col) len=length(seq); pr=matrice(riga,col:col+len-1); pres=all(pr==seq);
function [pres] = verificaseqverticaledaposizione (matrice, seq, riga, col) len=length(seq); pr=matrice(riga:riga+len-1,col); pres=all(pr==seq'); function [riga, col] = cercainizioseqorizzontale (matrice, seq) len = length(seq); [R,C] = size(matrice); for r = 1 : R for c = 1: C-len+1 pres = verificaseqorizzontaledaposizione(matrice, seq, r, c); if pres riga=r; col=c; riga=0; col=0; function [riga, col] = cercainizioseqverticale (matrice, seq) len = length(seq); [R,C] = size(matrice); for c = 1 : C for r = 1: R-len+1 pres = verificaseqverticaledaposizione(matrice, seq, r, c);
if pres riga=r; col=c; riga=0; col=0; function [riga, col, dir] = cercainiziosequenza(matrice, seq) [ro, co] = cercainizioseqorizzontale(matrice, seq); if ro ~= 0 riga = ro; col = co; dir = 'o'; [rv, cv] = cercainizioseqverticale(matrice, seq); if rv ~= 0 riga = rv; col = cv; dir = 'v'; riga=0;
col=0; dir='n'; Esercizio 3. (Stringhe palindrome) Scrivere una funzione ricorsiva che riconosca stringhe palindrome. La funzione ritornerà 1 in caso che la stringa sia palindroma, 0 altrimenti. function [res] = palindrome(seq) if length(seq) == 1 res = 1 elseif seq(1) ~= seq(length(seq)) res = 0 else res = (seq(1) == seq(length(seq))) & palindrome(seq(2:length(seq)-1)) ; Esercizio 4. (Cosa fa) Esercizio 3 (4 punti) Si analizzi la funzione ricorsiva sotto riportata e si spieghi in modo sintetico che cosa calcola. Si indichi inoltre cosa restituisce la funzione quando viene chiamata con argomento pari a 5. function [M]=cosafa(n) if (n == 1) M = 1; else
S = cosafa(n-1); k = size(s,1)+2; M = ones(k)*n; M(2:k-1,2:k-1)=S; Nota: La funzione MATLAB ones(n)restituisce una matrice di dimensione n x n in cui tutti gli elementi sono pari ad 1 La funzione calcola una matrice di dimensione (2 n 1) xi (2 n 1) che ha come elemento centrale 1 le cui cornici concentriche hanno valori che vanno da 2 ad n: octave:3> cosafa(5) ans = 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 5 5 4 3 3 3 3 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 2 1 2 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 3 3 3 3 4 5 5 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 Esercizio 5. (Tariffe telefoniche) Una nota compagnia di telefonia offre due tariffe ai propri clienti. La tariffa T1 ha un costo di 0.17 euro
al minuto tariffati al secondo, la tariffa T2 ha un costo di 0.12 euro al minuto tariffato a scatti di 30 secondi, piu' un ulteriore scatto alla risposta di 0.16 euro. Si chieda l'inserimento di un numero di secondi e si tracci il grafico di entrambe le tariffe a partire da 0 secondi fino al numero di secondi inserito. Codice N=input('Inserire il numero di secondi: '); tempo=0:n; T1=0.17*tempo/60; T2=0.16+0.06*ceil(tempo/30); % 0.06 e' il valore dello scatto (0.12/2) plot(tempo,t1,tempo,t2); title('confronto tariffe telefoniche') xlabel('tempo di conversazione (secondi)') ylabel('costo (euro)') Esecuzione Inserire il numero di secondi: 1000