DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 6 – Info B Marco D. Santambrogio – [email protected] Riccardo Cattaneo – [email protected] Ver. aggiornata al 30 Dicembre 2013 Lab 6: Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Introduzione a Matlab/Octave Cicli Funzioni 2 Lab 6: Agenda DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Warm Up (30’) Qualche cosa un po' più divertente (60’) Altri exe… (90’) 3 Lab 6: Warm up DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Warm Up (30’) Inserisci numeri Temperatura • Qualche cosa un po' più divertente (60’) • Altri exe… (90’) 4 Problema: Inserisci numeri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Acquisiamo numeri da tastiera finché non viene inserito un numero negativo. • In ogni caso non accettiamo più di mille numeri 5 Soluzione: Inserisci numeri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE vector = [ ]; %crea il vettore vuoto for count = 1:1000 %Raccoglierà al max 1000 valori value = input('next number '); if value < 0 break %Se value negativo usciamo dal ciclo else vector(count) = value; end end vector %permette di visualizzare il contenuto di vector 6 Problema: Temperatura DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Scrivere un programma che prende in input la temperatura in gradi Celsius e restituisce in output i gradi Fahrenheit Formula: Fahrnait = Celsius * 9/5 + 32 7 Soluzione: Temperatura DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE temp_c = input('Inserire la temperatura in gradi Celsius: '); temp_f = temp_c * 9/5 + 32; disp(['La temperatura in gradi Fahrenheit è ', num2str(temp_f)]); 8 Lab 6: Un po’ di divertimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Warm Up (30’) • Qualche cosa un po' più divertente (60’) Maggiore Equazione secondo grado • Altri exe… (90’) 9 Problema: Maggiore DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Scrivere un programma che prenda in input un array e conti tutti i numeri che sono maggiore di un numero n inserito dall’utente 10 Soluzione: Maggiore DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE mag = input('Vuoi contare i numeri maggiori di quanto? '); disp('Array (ricorda di inserire i numeri tra parentesi quadre):'); inarray = input(''); counter = 0; for ii=1:length(inarray) if inarray(ii)>mag counter = counter+1; end end disp(['I numeri maggiori di ',num2str(mag),' sono ',num2str(counter)]); 11 Soluzione: Maggiore (in due righe) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE mag = input('Vuoi contare i numeri maggiori di quanto? ’) disp('Array (ricorda di inserire i numeri tra parentesi quadre):’) inarray = input(’’) magV= inarray(inarray>mag); counter = size(magV,2); disp(['I numeri maggiori di ',num2str(mag),' sono ',num2str(counter)]); 12 Problema: Equazione secondo grado DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Scrivere una funzione per il calcolo dell'equazione di secondo grado: ax^2 + bx + c. Inseriti a, b e c la funzione deve ritornare il valore di delta, e i valori delle radici reali (se esistono). In caso che delta sia uguale a 0, x1 contiene la soluzione, mentre x2 non è un numero (NaN). 13 Soluzione: Equazione secondo grado DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE function [delta, x1, x2] = eq2g(a,b,c) delta = b^2-4*a*c; if (delta==0) x1=(-b)/(2*a); x2=(-b)/(2*a); else x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); end 14 Lab 6: Altri exe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Warm Up (30’) • Qualche cosa un po' più divertente (60’) • Altri exe… (90’) Cambio base Scambio elementi Rilievi altimetrici 15 Problema: Cambio base DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Ricevere un vettore che rappresenti le singole cifre di un numero in base 2 stampare a video il valore in base 10 16 Cambio base - Soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE function [ris] = cambioBase(n) % N vettore di 0 e 1 esp=[length(n)-1:-1:0]; Basi=2.^esp; disp(sum(n.*basi)); 17 Problema: Scambio elementi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Scrivere un programma che dati due array scambi gli elementi di indice dispari usare la funzione mod 18 Soluzione: Scambio elementi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE function [inarray1, inarray2] = swapOdd(inarray1, inarray2) for ii=1:min(length(inarray1),length(inarray2)) if (mod(ii,2) == 1) temp=inarray1(ii); inarray1(ii)=inarray2(ii); inarray2(ii) = temp; end end 19 Soluzione: Scambio elementi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE disp('Array1 (ricorda di inserire i numeri tra parentesi quadre):'); inarray1 = input(''); disp('Array2 (ricorda di inserire i numeri tra parentesi quadre):'); inarray2 = input(''); [inarray1, inarray2] = swapOdd(inarray1, inarray2); disp('Ora gli array sono: '); disp(inarray1); disp(inarray2); 20 Esercizio: Rilievi altimetrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Si sviluppi un programma in matlab che acquisisce da tastiera i dati relativi a rilievi altimetrici e stampa a video l’altitudine media di tutti quelli che hanno latitudine compresa tra 10 e 80 e longitudine tra 30 e 60 21 Soluzione (1ma parte): rilievi altimetrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE more = input('vuoi inserire valori altimetrici? (s/n)'); ii=1; while more=='s' arch(ii).altitudine = input('altitudine '); arch(ii).longitudine = input('longitudine '); arch(ii).latitudine = input('latitudine '); ii = ii+1; more = input('vuoi inserire altri valori altimetrici? (s/n)'); end 22 Soluzione (2nda parte): rilievi altimetrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE jj=1; for ii=1:length(arch) %attenzione: la condizione deve essere scritta sulla stessa linea… if arch(ii).latitudine>=10&&arch(ii).latitudine<=80 && arch(ii).longitudine>=30&&arch(ii).longitudine<=60 elemSelez(jj) = arch(ii).altitudine; jj=jj+1; end end disp(['la media degli elementi selezionati e` ' num2str(mean(elemSelez))]); 23 Fonti per lo studio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitoli 2, 3 e 4 • Credits Emanuele Panigati https://sites.google.com/site/engpanigati/ 24