Process synchronization Operating System Operating System Lab 6 – Info B Luca M. Cassano – luca.cassano@polimi.it Sadegh M. Astaneh – sadegh.astaneh@unimi.it Matteo Papini – matteo.papini@polimi.it © 2005 William Fornaciari © 2005 William Fornaciari 1
Process synchronization Lab 6: Obiettivi Operating System Introduzione a Matlab/Octave Grafici Funzioni Ricorsive Strutture 2 © 2005 William Fornaciari
Process synchronization Grafici Operating System Superficie di rotazione Disegno 2D Mappamondo 3 © 2005 William Fornaciari
Process synchronization Superficie di rotazione Operating System Scrivere un programma che permetta di visualizzare la funzione bidimensionale sin(r)/r, lungo le due direzioni x e y N.B.: r è la distanza dall'origine nel piano XY 4 © 2005 William Fornaciari
Process synchronization sin(r)/r Operating System 5 © 2005 William Fornaciari
Process synchronization Soluzione Operating System [X,Y] = meshgrid(-8:.5:8); R = sqrt(X.^2 + Y.^2) + eps; Z = sin(R)./R; mesh(X,Y,Z) 6 © 2005 William Fornaciari
Process synchronization Disegno 2D Operating System Scrivere un programma di disegno 2D interattivo: L'utente può scegliere se disegnare un segmento o un cerchio Segmento: l'utente fornisce i due estremi come array di Matlab (e.g. [-1,-1] e [2,3]) Cerchio: l'utente fornisce centro e raggio L'utente sceglie se disegnare altre figure (segmenti e cerchi) o smettere Tutte le figure devono essere disegnate sullo stesso piano 7 © 2005 William Fornaciari
Process synchronization Suggerimenti Operating System Equazione parametrica del segmento: Equazione parametrica del cerchio: 8 © 2005 William Fornaciari
Process synchronization Esempio Operating System 9 © 2005 William Fornaciari
Process synchronization Soluzione Operating System function [ xx,yy ] = segmento(x0,y0,x1,y1) lambda = 0:.01:1; xx = x0*lambda + x1*(1-lambda); yy = y0*lambda + y1*(1-lambda); end function [xx,yy] = cerchio(x0,y0,r) t = 0:pi/180:2*pi; xx = x0 + r*cos(t); yy = y0 + r*sin(t); end 10 © 2005 William Fornaciari
Process synchronization Soluzione (cont'd) Operating System figure; hold on; title('Disegno'); again = 1; target = '?'; while(again) target = input('Cosa vuoi disegnare?\n','s'); switch(target) case('segmento') p0 = input('Inserire primo punto\n'); p1 = input('Inserire secondo punto\n'); [xx,yy] = segmento(p0(1),p0(2),p1(1),p1(2)); seg = plot(xx,yy); set(seg,'Linewidth',2); case('cerchio') c = input('Inserisci centro\n'); r = input('Inserisci raggio\n'); [xx,yy] = cerchio(c(1),c(2),r); cer = plot(xx,yy); set(cer,'LineWidth',2); case('esci') again = 0; end 11 © 2005 William Fornaciari
Process synchronization Mappamondo Operating System Scrivere un programma che permetta di visualizzare località sul mappamondo date le coordinate geografiche Rappresentare il mappamondo con una sfera di raggio unitario Visualizzare sulla sfera l'equatore e il meridiano di Greenwich In modo interattivo, l'utente può inserire latitudine (da - 90° a 90°) e longitudine (da -180° a 180°). Visualizzare il punto corrispondente sulla sfera 12 © 2005 William Fornaciari
Process synchronization Un po' di geografia Operating System Latitudine: da -90° (Sud) a 90° (Nord) Longitudine: da -180° (Ovest) a 180° (Est) Equatore: cerchio di latitudine 0 Meridiano di Greenwich: semicerchio di longitudine 0 13 © 2005 William Fornaciari
Process synchronization Suggerimenti Operating System Equazione parametrica del cerchio: Equazione parametrica della sfera: 14 © 2005 William Fornaciari
Process synchronization Esempio Operating System 15 © 2005 William Fornaciari
Process synchronization Soluzione Operating System function [XX,YY,ZZ] = punto_sfera(r,t1,t2) XX = r*cos(t1).*cos(t2); YY = r*cos(t1).*sin(t2); ZZ = r*sin(t1); end 16 © 2005 William Fornaciari
Process synchronization Soluzione (cont'd) Operating System figure; %Sfera r = 1; [t1,t2] = meshgrid(0:pi/180:2*pi); [XX,YY,ZZ] = punto_sfera(r,t1,t2); mesh(XX,YY,ZZ); hold on %Equatore t3 = 0:pi/180:2*pi; xx = r*cos(t3); yy = r*sin(t3); eq = plot(xx,yy); set(eq,'Linewidth',2); %Greenwich t4 = -pi/2:pi/180:pi/2; yy = zeros(length(t4)); xx = r*cos(t4); zz = r*sin(t4); eq = plot3(xx,yy,zz); ... 17 © 2005 William Fornaciari
Process synchronization Soluzione (cont'd) Operating System ... %Punti ii = 1; punti = []; again = ('si'); while(~strcmp(again,'no')) lat = -100; while(lat<-90 || lat>90) lat = input('Inserire latitudine\n'); end lat = pi*lat/180; lon = -200; while(lon<-180 || lon>180) lon = input('Inserire longitudine\n'); lon = pi*lon/180; [x,y,z] = punto_sfera(r,lat,lon); punti(ii) = plot3(x,y,z,'ro'); set(punti(ii),'MarkerFaceColor','r'); again = input('Vuoi disegnare ancora?\n','s'); N.B. La stessa funzione (punto_sfera) può essere usata per generare un luogo di punti o un singolo punto! 18 © 2005 William Fornaciari
Process synchronization Strutture Operating System Scrivere un programma che chieda all’utente di inserire una serie di dati contenenti ognuno i seguenti attributi: città (stringa) giorno (intero positivo) mese (intero positivo) anno (intero positivo) tipo di misurazione (char) valore (reale) 19 © 2005 William Fornaciari
Process synchronization Strutture Operating System Ad esempio, l’utente potrà inserire: Milano 04 12 2017 N 10.5 20 © 2005 William Fornaciari
Process synchronization Strutture Operating System Dopo aver acquisito una certa quantità di dati, il programma dovrà chiedere all’utente il nome di una città e un tipo di misurazione. A questo punto il programma cercherà nell’archivio tutti i record riguardanti la città e il tipo di misurazione richiesti. Stamperà poi a video i dati selezionati ed il relativo valore minimo, massimo e medio dei valori. 21 © 2005 William Fornaciari
Process synchronization Soluzione Operating System function dati = acquisizione_dati_meteo() next = 1; dati = []; ii = 0; while next == 1 ii = ii + 1; dati(ii).city = input('Citta'': ','s'); dati(ii).giorno = input('Giorno: '); dati(ii).mese = input('Mese: '); dati(ii).anno = input('Anno: '); dati(ii).tipo = input('Tipo: ','s'); dati(ii).valore = input('Valore: '); next = input('Per inserire un nuovo record premere 1,altrimenti 0: '); end fprintf('%d dati inseriti.\n', ii); 22 © 2005 William Fornaciari
Process synchronization Soluzione Operating System function [city, tipo] = interrogazione_archivio_meteo() city = input('Citta` di interesse: ', 's'); tipo = input('Tipo misura da selezionare: ', 's'); End function [dati_sel, min, medio, max] = calc_statistiche_meteo(dati, city, tipo) for ii = 1:numel(dati) res(ii) = strcmp(dati(ii).city,city); end indici = res & [dati.tipo] == tipo; dati_sel = dati(indici); minimo = min([dati_sel.valore]); massimo = max([dati_sel.valore]); medio = mean([dati_sel.valore]); 23 © 2005 William Fornaciari
Process synchronization Soluzione Operating System function stampa_statistiche(dati_sel, city, tipo, minimo, medio, massimo) fprintf('Statistiche della misura %c in citta'' %s\n', tipo, city); for r = dati_sel fprintf('%d/%d/%d %f\n', r.giorno, r.mese, r.anno, r. valore); end fprintf('\nMin: %3.2f, med: %3.2f, max: %3.2f\n', minimo,medio, massimo); end 24 © 2005 William Fornaciari
Process synchronization funzioni ricorsive Operating System I numeri di Fibonacci (dinamiche di popolazione) Il Massimo Comun Divisore (algoritmo di Euclide) Il problema delle torri di Hanoi 25 © 2005 William Fornaciari
Process synchronization I numeri di Fibonacci Operating System Idea di base 1) fib(n)=1 se n=0 oppure n=1 2) fib(n)= fib(n-1) + fib(n-2) se n>1 26 © 2005 William Fornaciari
Process synchronization I numeri di Fibonacci Operating System 1) fib(n)=1 se n=0 opp. n=1 2) fib(n)= fib(n-1) + fib(n-2) se n>1 Vengono usati per modellare la crescita di animali per diverse generazioni function [f]=fib (n) if n==1 | n==2 f = 1; else f = fib(n - 2) + fib(n - 1); end 27 © 2005 William Fornaciari
Process synchronization Il MCD Operating System Definizione: 1) MCD(m,n)=m se m=n 2a) MCD(m,n)= MCD(m-n,n) se m>n 2b) MCD(m,n)=MCD(m,n-m) se n>m esempio: MCD(21,56) = MCD(21,35) = MCD(21,14)= = MCD(7,14) = MCD(7,7) = 7 28 © 2005 William Fornaciari
Process synchronization IL MCD Operating System Iterativo: function [M]=MCDeuclid(m,n) while m ~= n if m>n m=m-n; else n=n-m; end M=m; 29 © 2005 William Fornaciari
Process synchronization IL MCD Operating System Ricorsivo: function [M]=MCDeuclidRic(m,n) if m==n M=m; else if m>n M = MCDeuclidRic(m-n,n); else M = MCDeuclidRic(m,n-m); end Iterativo: function [M]=MCDeuclid(m,n) while m ~= n if m>n m=m-n; else n=n-m; end M=m; Attenzione alla condizione di terminazione!!!!! N.B. è sempre possibile trovare un corrispondente iterativo di un programma ricorsivo!!! 30 © 2005 William Fornaciari
Process synchronization Le torri di Hanoi Operating System http://www.cs.cmu.edu/~cburch/survey/recurse/hanoi.html Problema: spostare tutti i dischi dalla torre A alla torre B (usando la torre C come “supporto intermedio”) in modo che si trovino nello stesso ordine 31 © 2005 William Fornaciari
Process synchronization Le torri di Hanoi Operating System Scriveremo una funzione ricorsiva che prende come parametro il numero del disco più grande che vogliamo spostare (da 0 a 5 come nel disegno) La funzione prenderà anche tre parametri che indicano: da quale asta vogliamo partire (source), a quale asta vogliamo arrivare (dest), l’altra asta, che possiamo usare come supporto temporaneo (spare). 32 © 2005 William Fornaciari
Process synchronization L’idea di base Operating System Voglio spostare n anelli dal piolo sorgente, a quello destinazione, usando come appoggio il piolo ausiliario Devo quindi prima spostare n - 1 anelli dal sorgente all'ausiliario, usando come appoggio il piolo destinazione Poi sposto l'unico anello rimasto dal sorgente al piolo destinazione Infine sposto gli n - 1 anelli che si trovano sull'ausilliario all'anello destinazione.. 33 © 2005 William Fornaciari
Process synchronization L’uso della ricorsione Operating System Quando si spostano gli n - 1 anelli la funzione hanoi richiama se stessa, cioè effettua una chiamata ricorsiva, semplificando però il problema perché bisogna spostare un numero di anelli inferiore. In pratica, con la ricorsione il problema viene continuamente ridotto di complessità fino alla soluzione banale in cui rimane solo un anello, che viene semplicemente spostato nel piolo destinazione. 34 © 2005 William Fornaciari
Process synchronization Le torri di Hanoi: strategia Operating System Ridurremo il problema a quello di spostare 5 dischi dalla torre C alla torre B, dopo che il disco 5 è stato già messo nella posizione giusta 35 © 2005 William Fornaciari
Process synchronization Pseudocodice Operating System FUNCTION MoveTower(disk, source, dest, spare): IF disk == 0, THEN: move disk from source to dest ELSE: MoveTower(disk - 1, source, spare, dest) /* (Passo 1) */ move disk from source to dest // /* (Passo 2) */ MoveTower(disk - 1, spare, dest, source) // /* (Passo 3) */ END IF Nota: l’algoritmo aggiunge un caso base: quando il disco è il più piccolo (il numero 0). In questo caso possiamo muoverlo direttamente perché non ne ha altri sopra. Negli altri casi, seguiamo la procedura descritta per il disco 5. 36 © 2005 William Fornaciari
Process synchronization Soluzione in codice MATLAB con simulazione Operating System function []=hanoi(n, da, a, per) if (n>1) hanoi(n-1, da, per, a); end; fprintf('\n sposta un disco dal piolo %d al piolo %d \n', da, a); if (n>1) hanoi(n-1, per, a, da); end; hanoi(3, 1, 2, 3) hanoi(2, 1, 3, 2) hanoi(2, 3, 2, 1) hanoi(1, 1, 2, 3) hanoi(1, 2, 3, 1) hanoi(1, 3, 1, 2) >> hanoi(3, 1, 2, 3) sposta un disco dal piolo 1 al piolo 2 sposta un disco dal piolo 1 al piolo 3 sposta un disco dal piolo 2 al piolo 3 sposta un disco dal piolo 3 al piolo 1 sposta un disco dal piolo 3 al piolo 2 >> 37 © 2005 William Fornaciari