Facoltà di Ingegneria
Laboratorio di Fondamenti di Informatica Ing. Dario Sguassero - Prof. Paolo Michelini
6ª Lezione 15 dicembre 2008
a.a. 2008/09
ESERCIZIO parola_quiz.m %parola_quiz mistero=parola_casuale(1); str_lower='abaco'; str_upper='zuzzurellone'; parola=''; while ~strcmp(lower(parola),lower(mistero)) && ~strcmp(lower(parola),'esci') clc; disp(str_lower); disp('--------------'); disp(str_upper); sprintf('\n\n'); %accetto solo parole comprese nell'intervallo definito (oppure 'esci') while (parola_confronta(parola,str_lower) <= 0 || parola_confronta(parola,str_upper) >= 0) && ~strcmp(upper(parola),'ESCI') parola = input('Qual è la parola misteriosa? [scrivi ESCI per uscire] ','s'); end %ridefinisco gli estremi if parola_confronta(parola,mistero) == 1 str_upper = parola; elseif parola_confronta(parola,mistero) == -1 str_lower = parola; end end %pubblico il risultato if strcmp(upper(parola),upper(mistero)) disp ('Bravo, hai indovinato!'); else fprintf('La parola misteriosa era: %s \n',mistero); end
parola_casuale.m function [parola] = parola_casuale(inutile) %sceglie una parola a caso da un dizionario precostituito max_parole=10; scelta=fix(rand(1)*max_parole); switch scelta case 0 parola='mamma'; case 1 parola='guardiano'; case 2 parola='Milano'; case 3 parola='presumere'; case 4 parola='facocero'; case 5 parola='rettore'; case 6 parola='fenicottero'; case 7 parola='ghiro'; case 8
2
parola='pusillanime'; case 9 parola='licantropo'; end disp('Parola creata...');
parola_confronta.m function risultato = parola_confronta(s1,s2) % confronta due parole, case insensitive % restituisce 1 quando s1 < s2 % restituisce -1 quando s1 > s2 % altrimenti sono uguali e restituisce 0 l1=length(s1); l2=length(s2); lun=min(l1,l2); risultato=0; for a=[1:lun] if upper(s1(a)) > upper(s2(a)) risultato=1; break; end if upper(s1(a)) < upper(s2(a)) risultato=-1; break; end end if (risultato==0 && l1>l2) risultato=1; elseif (risultato==0 && l1
ESEMPIO Es. creare un programma che consenta di disegnare sullo schermo %disegno disp('Premi il tasto destro del mouse sul grafico per terminare. Per continuare ora premi il tasto invio...'); pause; clc; axes('Position',[0.1 0.1 1.0 1.0]); axis([0 1 0 1]); hold on; button=0; while button ~= 3; [x,y,button] = ginput(1); plot(x,y,'rO'); end disp('END');
GRAFICI CON ASSE DEI TEMPI Volendo rappresentare un grafico con date e/o sull'asse delle ascisse bisogna ricorrere ai comandi datetick, per la conversione della visualizzazione, e datenum per il calcolo delle date. Datenum accetta come parametri una data in formato testo, oppure una vettore [anno mese giorno] oppure [anno mese giorno ore minuti secondi]. Le date in Matlab sono memorizzate come il numero di giorni che sono trascorsi dal 1 gennaio dell'anno zero (in altri sistemi questo riferimento potrebbe differire). Es. tre modi per visualizzare il numero di giorni trascorsi dal 1 gennaio 0000 >> datenum('01/01/2009'), datenum([2009 01 01]), datenum(2009,1,1) 3
ans = 733774 Es. il 2008 è bisestile? >> datenum(2009,1,1)-datenum(2008,1,1) ans = 366 Il comando now restituisce la data attuale in formato numerico, mentre datestr(num) converte il formato numerico in stringa (sono disponibili diversi formati, vedere help datestr). Dato l'asse dei tempi numerato in base a questi criteri, è possibile convertire il suo formato a data mediante il comando datetick(asse,formato). Es. visualizzare un grafico con l'andamento ipotetico delle maree >> t = [now:now+10]; marea=sin((t-now)/0.05);plot(t,marea);datetick('x',20')
1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 14/12/08
21/12/08
28/12/08
GRAFICI 3D Un curva a 3 dimensioni è rappresentabile mediante il comando plot3 che, similmente a plot, richiede 3 vettori con la descrizione a punti dell'andamento della curva.
4
Es. disegnare una spirale con andamento costante, e un'altra con spire crescenti >> z=[0:0.1:100]; x=sin(z); y=cos(z); plot3(x,y,z);
100 80 60 40 20 0 1 0.5
1 0.5
0 0 -0.5
-0.5 -1
-1
Per creare una superficie 3D bisogna invece definire innanzitutto una griglia di valori x,y con l'ausilio di meshgrid, quindi assegnargli un valore per la z. Se non specificato diversamente, con mesh Matlab utilizzerà questo valore z per colorare opportunamente la superficie 3D.
5
Es. creare un grafico tridimensionale >> x=[0:0.1:4]; y=[0:0.2:8]; [x,y]=meshgrid(x,y); z=cos(x).*cos(y); mesh(x,y,z);
1
0.5
0
-0.5
-1 8 6
4 3
4 2 2
1 0
0
Con surf invece la figura risulta piena
6
Es. disegnare una figura con surf x=[0:0.1:4]; y=[0:0.2:8]; [x,y]=meshgrid(x,y); z=cos(x).*cos(y); surf(x,y,z);
1
0.5
0
-0.5
-1 8 6
4 3
4 2 2
1 0
0
CELLE Le celle sono array costituiti da dati eterogenei, in cui ogni elemento "cella" può contenere a sua volta un array di tipo o dimensioni diversi. Consentono di gestire database complessi con estrema flessibilità. Ci sono due modalità per creare un array di celle: •
assegnare ad un elemento dell'array un valore di tipo cella (racchiudendo il valore tra parentesi graffe), che a sua volta può essere una matrice di tipo qualsiasi
•
oppure assegnare ad una cella dell'array una matrice di tipo qualsiasi
Il risultato dell'assegnazione è lo stesso. Es. assegnare valori di tipo diverso ai 4 elementi di un array di celle 2x2 A(1,1) = {'id_studente'} A(1,2) = {'voti'} A(2,1)= {13124} A(2,2) = {[18 24 30 20 28 27 30 19 24]} nella seconda modalità le assegnazioni sarebbero state: A{1,1} = 'id_studente' A{1,2} = 'voti' 7
A{2,1}= 13124 A{2,2} = [18 24 30 20 28 27 30 19 24] La differenza tra un elemento dell'array di celle, e il contenuto di un elemento dell'array di celle si nota utilizzando le funzioni, perché alcune ammettono solo il secondo tipo di valore, mentre altre entrambe le tipologie. Un array può essere creato aggiungendo cella su cella, oppure come array di celle con il comando cell(x,y). Es. creare un'array di celle vuote B >> B=cell(2,3); oppure estendere A con celle piene e vuote: A(1,3)={'nominativo'}; A(2,3)=[]; Ci sono diverse modalità per visualizzare il contenuto di un array di celle, a seconda del livello di raggruppamento desiderato. Es. per A si può digitare: >> A A = 'id_studente' 'voti' [ 13124] [1x9 double] >> celldisp(A) A{1,1} = id_studente A{2,1} = 13124 A{1,2} = voti A{2,2} = 18 24 30 20 28 27 30 19 24 >> cellplot(A)
8
ids tudente
voti
13124
Per riferirsi ad una singola cella si può usare sia l'indirizzamento dell'array A(1,2) che dell'array di celle A{1,2} e il risultato differirà perché nel primo caso sarà di tipo cella, nel secondo sarà la matrice contenuta nella cella. Es. visualizzare il contenuto del vettore nella posizione 2,2 >> A{2,2} ans = 18 24 30 20 28 27 30 19 24 >> A(2,2) ans = [1x9 double] Per indirizzare invece uno specifico valore di una matrice all'interno di un array di celle bisogna prima indirizzare l'array di celle tra {} e poi l'elemento della matrice tra (). Es. identificare il valore del terzo voto >> voto = A{2,2}(1,3) voto = 30 Es. cambiare il valore del terzo voto >> A{2,2}(1,3) = 29; A{2,2}(1,3) ans = 29 Nota: è importante notare che A{2,2} identifica la matrice contenuta nella relativa cella, mentre A(2,2) identifica una cella (di tipo cella), perciò i due tipi di dati sono diversi. Non tutte le funzioni ammettono come valori di ingresso anche le celle (es. il comando menu ammette una cella per definire la lista delle voci da selezionare, mentre il comando fprintf non accetta questo tipo di valori). 9
ESERCIZIO Dati due file Excel con l'elenco dei nomi degli studenti e dei voti, creare un programma che memorizzi questi valori in un unico array di celle e visualizzi le statistiche sui voti dei singoli studenti a richiesta. studenti_nomi.xls 2 1 4 6 3 5
Mario Rossi Giovanni Verdi Antonia Bruni Sara Bianchi Pino Neri Lara Mori
Prima colonna: id_studente; seconda colonna: nominativo studenti_voti.xls
4
21
1
18
5
27
1
22
5
22
1
23
4
23
5
29
5
27
2
19
2
19
2
21
1
25
6
23
2
21
4
27
2
19
4
27
4
21
4
28
5
27
3
23
6
27
2
21
2
22
2
24
1
18
1
20
6
26
6
24
3
21
2
19
3
26
3
23
6
23
4
24
6
24
4
25
1
21
2
20
5
23
6
30
5
25
5
28
4
24
6
29
4
21
1
22
1
21
5
27
3
23
1
20
4
25
5
23
6
26
1
19
5
26
6
30
1
20
6
28
4
22
1
23
3
21
4
26
2
20
3
21
6
25
5
23
5
29
3
27
5
25
1
21
2
25
5
27
2
23
6
28
3
20
4
27
6
27
5
27
1
25
4
26
5
24
3
26
6
27
2
22
3
21
6
23
3
20
1
24
5
24
1
25
4
22
4
23
3
26
3
26
2
23
6
25
2
26
6
25
1
22
1
18
6
27
1
23
3
27
1
24
1
18
6
27
5
24
4
25
6
24
4
22
2
20
2
21
6
24
2
20
2
20
1
20
2
23
5
25
3
21
1
23
3
26
6
28
1
19
1
21
2
22
4
22
6
23
3
21
4
27
5
27
1
18
3
24
3
23
5
25
4
23
5
22
2
25
3
26
1
24
5
26
Prima colonna: id_studente; seconda colonna: voto 10
Nota: i valori dei voti non è importante, basta che l'id studente contenuto nella prima colonna sia coerente con l'id studente contenuti nella prima tabella studenti_nomi.xls studenti_leggi.m %lettura dati studenti disp('Lettura nomi studenti'); [id,nome]=xlsread('studenti_nomi.xls') disp('Lettura voti studenti'); [voti]=xlsread('studenti_voti.xls'); %inserisco i valori letti in un unico array di celle STUD for a=1:length(id) STUD(a,1)={id(a)}; STUD(a,2)={nome(a,2)}; c=1; for b=1:length(voti) if voti(b,1)==id(a) STUD{a,3}(1,c) =voti(b,2); c=c+1; end end end scelta=inf; while scelta >= 1 scelta = menu('Studenti (chiudi menù per uscire)',STUD{:,2}); %calcolo della media if scelta > 0 id_stud=STUD{scelta,1}; nominativo=STUD{scelta,2}; media=mean(STUD{scelta,3}); massimo=max(STUD{scelta,3}); minimo=min(STUD{scelta,3}); disp(nominativo); fprintf('id: %g \n',id_stud); fprintf('media: %4.2f \n',media); fprintf('voto massimo: %g \n',massimo); fprintf('voto minimo: %g \n\n\n',minimo); end end
11