Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti Dipartimento di Elettronica e Informazione Informatica B Prof. Marco Masseroli LAB 4: MATLAB/OCTAVE ESERCIZI DI STRUTTURE DI CONTROLLO, ARRAY E MATRICI SOLUZIONI Stefano Bonacina 2 1 - Esercizi introduttivi Problema 1 Scrivere un programma che prende in input la temperatura in gradi Celsius e restituisce in output i gradi Fahrenheit (Formula: Fahrenheit = Celsius * 9/5 + 32). Nota: Usare la funzione “input” per l'inserimento di interi. Stefano Bonacina 3 1 - Esercizi introduttivi Soluzione Problema 1 celsius = input('Inserire la temperatura in gradi Celsius'); fahrenheit = celsius * (9/5) + 32; fprintf('La temperatura in gradi Fahrenheit e'': %f', fahrenheit); Stefano Bonacina 4 1 - Esercizi introduttivi Soluzione - Problema 2 Scrivere un programma che, avendo come dati in ingresso i parametri a,b,c, risolva la generica equazione di secondo grado, anche nel caso di soluzioni complesse e coniugate. Considerare anche i casi di equazione di primo grado e uguaglianza (che rimane da verificare). Il programma deve stampare il valore di delta, e i valori delle radici con anche messaggi adeguati. Stefano Bonacina 5 1 - Esercizi introduttivi Soluzione - Problema 2 fprintf("Consider the Second degree equation : ax^2 + bx + c = 0 \n"); a= input("Enter the a integer parameter \n"); b= input("Enter the b integer parameter \n"); c= input("Enter the c integer parameter \n"); if (a ~= 0) delta = b*b-4*a*c; fprintf("Delta = %f\n\n", delta); x1= (-b - sqrt(delta))/(2*a); x2= (-b + sqrt(delta))/(2*a); if (delta ==0) fprintf("The equation has two coincident real solutions.\n"); elseif (delta >0) fprintf("There are two distinct real solutions.\n"); elseif (delta <0) fprintf("There are two complex solutions.\n"); end fprintf("Solution x1 ="); disp(x1); fprintf("Solution x2 ="); disp(x2); elseif (b~=0) x= -c/b; fprintf("This is a first degree equation. There is one real solution.\n"); fprintf("X= %f\n\n", x); elseif (c==0) fprintf("This is not an equation.\n"); fprintf("There is an equality: 0 is equal to 0.\n"); else fprintf("The number %d is different from 0: inequality.\n", c); end Stefano Bonacina 6 2 -Media Problema 3 Scrivere un programma che calcoli la media di 3 numeri inseriti dall’utente. Risolvere il programma in due modi: - i tre valori vengono memorizzati in tre variabili diverse. - i tre valori vengono memorizzati come elementi di un vettore. In questo secondo caso, la media si può calcolare come “mean(v)”, se “v” è il vettore costruito. Stefano Bonacina 7 2 -Media Soluzione Problema 3 Modo 1 a = input('Inserire il primo numero'); b = input('Inserire il secondo numero'); c = input('Inserire il terzo numero'); media = (a + b + c) / 3; fprintf('la media dei tre numeri, utilizzando il primo metodo, e'': %f\n', media); Modo 2 a(1) = input('Inserire il primo numero'); a(2) = input('Inserire il secondo numero'); a(3) = input('Inserire il terzo numero'); fprintf('la media dei tre numeri, utilizzando il secondo metodo, e'': %f\n', mean(a)); Stefano Bonacina 8 2 -Media Problema 4 Estensione: usando la seconda implementazione, è facile gestire l'inserimento di un numero arbitrario di valori, chiesto come prima cosa all'utente. L'inserimento deve essere in questo caso gestito tramite un ciclo for. Stefano Bonacina 9 2 -Media Soluzione - Problema 4 numero = 0; while (numero <=0 ) numero = input ("Inserisci il numero di elementi da considerare"); end for ii= 1:numero a(ii) = input ("Inserisci un numero"); end fprintf('la media dei numeri e'': %f\n', mean(a)); Stefano Bonacina 10 3 - Tabellina del prodotto Problema 5 Scrivere un file Matlab/Octave per produrre le tabelline dei prodotti di tutti i numeri da 1 a N (N = 10). Per ogni numero mostrare le prime M moltiplicazioni. Il risultato dev'essere una matrice di M righe ed N colonne. Stefano Bonacina 11 3 - Tabellina del prodotto Soluzione - Problema 5 k = input('Inserire il numero di moltiplicazioni da effettuare: '); for m = 1:k for n = 1:10 tab(m,n) = m*n; end end disp(tab) Stefano Bonacina 12 3 - Tabellina del prodotto Problema 6 Estensione: Il programma può anche essere risolto senza l'utilizzo di cicli, utilizzando in particolare la funzione “repmat”, e seguendo questi passi: - generare un vettore riga contenente i valori da 1 a N; - generare un vettore colonna contenente i valori da 1 a M; - ricopiare il vettore riga M volte verso il basso, tramite la funzione repmat. Si ottiene una matrice MxN; - ricopiare il vettore colonna N volte verso destra, tramite la funzione repmat. Si ottiene una matrice MxN; - effettuare il prodotto elemento per elemento delle due matrici MxN calcolate prima. Stefano Bonacina 13 3 - Tabellina del prodotto Soluzione - Problema 6 n=10; m = input('Inserire il numero di righe da utilizzare: '); x = 1:1:n y = (1:1:m)‘ x1 = repmat(x,m,1); x2 = repmat(y,1,n); disp(x1.* x2) Stefano Bonacina 14 4 – Le città Problema 7 Sono date N città definite dalle loro coordinate euclidee (x,y). Tali coordinate sono scritte in due vettori di N elementi ciascuno (un vettore per le x, uno per le y). Ad esempio, x(1) e y(1) rappresentano le coordinate per la prima città. - Generare casualmente i vettori x e y come segue: x=rand(1,N); y=rand(1,N); osservare i valori risultanti, ed eventualmente moltiplicare i due vettori per 100 in modo che tali valori possano essere interpretati come coordinate espresse in km. - Disegnare la posizione di ogni città (plot) - Calcolare e stampare la matrice NxN delle distanze, in cui ogni cella (i,j) rappresenta la distanza euclidea tra la città i e la città j, calcolata tramite il teorema di Pitagora. - Impostare a NaN tutti gli elementi sulla diagonale principale (in modo da non si considerare la distanza tra una città e stessa). Facoltativo: visualizzare la matrice tramite il comando image. Stefano Bonacina 15 4 – Le città Soluzione - Problema 7 n = input('Inserire il numero di città da utilizzare: '); x = rand(1,n).*100; y = rand(1,n).*100; for ii = 1:n distanza(ii,:) = sqrt((x(ii)-x).^2 + (y(ii)-y).^2); distanza(ii,ii) = NaN; end; plot(x,y,"o"); image(distanza); Stefano Bonacina 16