DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 6 – Info B
Marco D. Santambrogio – [email protected]
Riccardo Cattaneo – [email protected]
Ver. aggiornata al 7 Gennaio 2014
Calendario dei Lab
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• 7 Gennaio 2014, 10am-12.45pm, @ LM1
 MATLAB: strutture di controllo, tipi di dato
strutturato, e vettori
• 14 Gennaio 2014, 10am-12.45pm, @ LM1
 MATLAB: funzioni ricorsive
• 21 Gennaio 2014, 10am-12.45pm, @ LM1
 MATLAB: funzioni ricorsive, funzioni di ordine
superiore, grafici 2D e 3D
2
Nota per i “7”
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Cosa:
 Prova “colpo-singolo”
 No libri, e/o appunti
 1 exe in C in 30’
• Quando
 Domani: martedì 8 Gennaio
 Dalle 12.15 alle 13
• Dove
 BL27.18
3
Lab 6: Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Introduzione a Matlab/Octave
Cicli
Funzioni
4
Lab 6: Agenda
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
 Warm Up (30’)
 Qualche cosa un po' più divertente (60’)
 Altri exe… (90’)
5
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’)
6
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
7
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
8
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
9
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)]);
10
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’)
11
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
12
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)]);
13
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)]);
14
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).
15
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
NOTA: delta, x1 e x2 vengono ritornate al
chiamante, indipendentemente da quello che si
fa nella funzione!
16
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
17
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
18
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));
19
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
20
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
21
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);
22
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
23
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
24
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))]);
25
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/
26
Scarica

V4 - PPT - Dipartimento di Elettronica ed informazione