ESERCIZIO 1 Informatica B - Esercitazione 10 Scrivere un programma che chiede all'utente di inserire un numero positivo (nel caso in cui il numero non sia positivo ripetere inserimento) e: - verifica se il numero è perfetto; - in caso contrario dice se è abbondante o difettivo; Un numero è perfetto se corrisponde alla somma dei suoi divisori, escluso se stesso; abbondante se è maggiore della somma dei suoi divisori; altrimenti è difettivo. - richiede un altro numero e controlla se i due numeri sono amici. a,b sono amici se (somma dei divisori di a) = b e viceversa. functions: - inseriscinumero() - controllaseperfetto() - sommadivisori() - controllaseamici() clear n1 = inseriscinumero(); [p,a] = controllaseperfetto(n1); if(p) disp([num2str(n1), ' è perfetto']) disp([num2str(n1), ' non è perfetto']) if(a) disp([num2str(n1), ' è abbondante']) disp([num2str(n1), ' è difettivo']) n2=inseriscinumero(); amici=controllaseamici(n1,n2); if(amici) disp([num2str(n1), ' e ', num2str(n2),' sono amici']) disp([num2str(n1), ' e ', num2str(n2),' non sono amici']) 1/9
ESERCIZIO 2 Informatica B - Esercitazione 10 Si considerino due matrici di interi A e B, di uguali dimensioni. Diciamo che A domina B se, confrontando i valori in posizioni corrispondenti, risulta che il numero dei valori in A maggiori dei corrispondenti valori in B è più grande del numero di quelli di B maggiori dei corrispondenti in A e inoltre gli elementi corrispondenti non sono mai uguali (se due elementi corrispondenti sono uguali la dominanza non è definita). Si codifichi la funzione domina() che riceve le matrici come parametri e restituisce 1 se la prima domina la seconda, -1 se la seconda domina la prima, 0 altrimenti. functions: - domina() clear all A = rand(8, 8) B = rand(size(a)) risultato = domina(a, B); switch(risultato) case 1 disp('a domina B'); case -1 disp('b domina A'); case 0 disp('dominanza non definita') 2/9
ESERCIZIO 3 Un array quotax di 365 valori interi, rappresenta le quotazioni del titolo azionario X nell?anno solare corrente. Si vuole realizzare un programma in grado di: un programma in grado di: - inizializzare il contenuto dell'array quotax con valori letti da standard input che devono essere compresi tra 1 e 100 (estremi inclusi), scartando eventuali valori fuori dall'intervallo (i valori esterni all intervallo saranno posti uguali all estremo più prossimo). - Salvare in una opportuna/e variabile di tipo struttura la quotazione massima e il primo giorno (espresso come posizione nell'array) in cui tale quotazione è stata memorizzata. - Scrivere la funzione quotacostante che determina e stampa a video il valore ed il numero di giorni dell anno in cui un titolo si è mantenuto costante (ossia, quante volte la medesima quotazione si è presentata in giorni successivi). Ad esempio, se le quotazioni fossero 10 10 15 14 12 12 1 8 9 9 12 12..., il titolo avrebbe avuto 4 periodi di quotazione costante. functions: - inizializzaquotazioni() - quotacostante() clear all quotax = inizializzaquotazioni(); [quotaxmax.valore quotaxmax.giorno] = max(quotax); disp(' ') disp(['quotazione massima raggiunta: ' num2str(quotaxmax.valore)]); disp(['nel giorno: ' num2str(quotaxmax.giorno)]); quotacostante(quotax); function quota = inizializzaquotazioni() quota = input('inserire il vettore delle quotazioni: '); while(length(quota) ~= 365) disp(['sono stati inseriti ' num2str(length(quota)) ' valori. Inserire 365 valori']) disp(' ') quota = input('inserire il vettore delle quotazioni: '); quota(quota > 100) = 100; quota(quota < 1) = 1; function quotacostante(quota) 3/9
periodi_costanti = quota(2:)-quota(1:-1); periodi_costanti = find(periodi_costanti == 0); valori_costanti = unique(quota(periodi_costanti)); for ii = 1:length(valori_costanti) disp(' ') disp(['quota: ' num2str(valori_costanti(ii))]); disp(['costante nei giorni: ' num2str(find(quota == valori_costanti(ii)))]); 4/9
ESERCIZIO 4 Informatica B - Esercitazione 10 Definire le seguenti funzioni usando due variabili funzionali: - f1 = x.^2-y.^2 - f2 = sin(sqrt(x.^2+y.^2))./(sqrt(x.^2+y.^2)); - Rappresentare ogni singola funzione con un grafico tridimensionale valutandola per valori di x ed y rispettivamente pari a: x = [-7:0.1:7] e y = [-7:0.1:7]. - Disegnare la porzione di f1 valutata su y = [0:0.1:7] in bianco e quella valutata su y = [0:-0.1:-7] in blu. - Evidenziare nel grafico di f2 i valori?discreti? di cui è composta la funzione per x = [-7:7] e y = [-7:7]. f1=@(x,y)(x.^2-y.^2); [xx,yy] = meshgrid([0:0.1:7],[0:0.1:7]); zz = f1(xx,yy); disegno la matrice zz che rappresenta i punti della funzione f come una mesh in figura 1 figure(1) mesh(xx,yy,zz); [xx1,yy1] = meshgrid([0:0.1:7],[0:-0.1:-7]); rivaluto f zz1=f1(xx1,yy1); figure(1) hold on mesh(xx1,yy1,zz1,'facecolor','b'); hold off disegno la funzione f2 f2=@(x,y)(sin(sqrt(x.^2+y.^2))./(sqrt(x.^2+y.^2))); [xx,yy] = meshgrid([-7:0.1:7],[-7:0.1:7]); zz = f2(xx,yy); figure(2) surf(xx,yy,zz); definisco il dominio (due *vettori* x e y, contenuti nelle aree sopra xx,yy) [xx,yy] = meshgrid([-7:7],[-7:7]); zz = f2(xx,yy); figure(2) hold on plot3(xx,yy,zz,'ro', 'Linewidth', 2) hold off 5/9
ESERCIZIO 5 Informatica B - Esercitazione 10 1. Implementare una funzione r = cerchio(x, y). La funzione riceve in ingresso due vettori x e y di uguale dimensione che rappresentano le ascisse e le ordinate di un insieme di punti nel piano cartesiano. La funzione restituisce un vettore logico r, di lunghezza pari a quella dei vettori x e y, tale che: r(i) è pari a 1 se e solo se il punto definito dalle coordinate x(i) e y(i) si trova all interno della circonferenza di raggio 3 e centro (0,0). Suggerimento: un punto si trova all interno di una circonferenza se la sua distanza dal centro è inferiore al raggio della circonferenza. Si consideri una famiglia di funzioni in linguaggio Matlab che, ricevo come parametro un numero intero N>0, restituiscano due vettori x e y, di lunghezza N, contenenti rispettivamente le ascisse e le ordinate di N punti nel piano cartesiano. Un esempio di funzione di questo tipo è il seguente: [x, y] = puntisuassex(n) x = 1:N; y = zeros(1, N) La chiamata puntisuassex(5) restituisce i due vettori: X=[1 2 3 4 5] y=[0 0 0 0 0] 2. Implementare la funzione di ordine superiore M = conta(n, genera) che riceve in ingresso: nel parametro N un valore numerico intero positivo non nullo e nel parametro genera una funzione, per esempio la puntisuassex. La funzione conta utilizza la funzione nel parametro genera per produrre N punti nel piano cartesiano e, utilizzando la funzione cerchio sviluppata al punto 1, restituisce, tramite il parametro M, il numero dei punti che non si trovano all?interno della circonferenza di raggio 3 e centro (0,0). Per esempio, la chiamata conta(5, @puntisuassex) restituisce il valore 3, corrispondente ai punti (3,0), (4,0) e (5,0) prodotti dalla chiamata di puntisuassex(5) che non si trovano all?interno della circonferenza data. clear all N = 100; genera = @puntisuassex; genera = @puntisuassey; genera = @punticasuali; rg = 3; M = conta(n, genera, rg) function M = conta(n, genera, rg) if(n > 0) 6/9
[x,y] = genera(n); r = (cerchio(x, y, rg)); M = sum(~r); disp('il valore di N deve essere > 0'); scatter(x, y) hold on scatter(x(r), y(r), 'r') disegna_cerchio; function r = cerchio(x, y, rg) if(length(x) == length(y)) r = sqrt((x).*(x) + y.*y) < rg; disp('i vettori x e y devono avere la stessa dimensione') function [x, y] = punticasuali(n) dev_st = 3; x = dev_st*randn(1, N); y = dev_st*randn(1, N); function [x, y] = puntisuassey(n) y = 1:N; x = zeros(1, N); function [x, y] = puntisuassex(n) x = 1:N; y = zeros(1, N); 7/9
ESERCIZIO 6 Scrivere un programma per l?elaborazione in tempo reali di immagini. Il programma dovrà: - caricare i 3 canali R, G e B di un?immagine all interno di tre matrici R, G e B; - dare la possibilità all utente di eseguire le seguenti elaborazioni: - elaborazione r, g o b, separazione dei canali. L utente può specificare da input il canale da visualizzare; - elaborazione noise, aggiunta di rumore all immagine. Ad ogni matrice R, G, B se ne somma una casuale generata con randn(); - elaborazione chromakey. L utente specifica il codice del colore da sostituire color_in=[r_in g_in b_in] quello del colore sostituente color_out=[r_out g_out b_out]. clear all image = imread('lena.jpg'); separazione dei canali Rin = double(image(:, :, 1)); Gin = double(image(:, :, 2)); Bin = double(image(:, :, 3)); elaborazione = input('elaborazione: '); switch(elaborazione) case 'r' Rout = Rin; Gout = zeros(size(gin)); Bout = zeros(size(bin)); case 'g' Rout = zeros(size(rin)); Gout = Gin; Bout = zeros(size(bin)); case 'b' Rout = zeros(size(rin)); Gout = zeros(size(gin)); Bout = Bin; case 'noise' noise_gain = input('quantità di rumore: '); 8/9
Rout = noise_gain*randn(size(rin)) + Rin; Gout = noise_gain*randn(size(gin)) + Gin; Bout = noise_gain*randn(size(bin)) + Bin; case 'chromakey' color_in = input('colore da sostituire: '); color_out = input('colore sostituente: '); Rout = Rin; Gout = Gin; Bout = Bin; Rindex = find(rin == color_in(1)); Gindex = find(gin == color_in(2)); Bindex = find(bin == color_in(3)); Rout(Rindex) = color_out(1); Gout(Gindex) = color_out(2); Bout(Bindex) = color_out(3); image_processed = uint8(image_processed); imshow(image_processed); 9/9