Politecnico di Milano Informatica B - A.A. 2018/2019 Laboratorio 4 26/11/2018 Andrea Tirinzoni ( andrea.tirinzoni@polimi.it ) Pietro Fezzardi ( pietro.fezzardi@polimi.it ) 1. Introduzione 1.1 - Semplici calcoli Si scriva un programma che pra in input una temperatura in gradi Fahrenheit e la converta in gradi Celsius. Formula: Fahrenheit = Celsius * 9/5 + 32 F = input('inserire una temperatura in Fahrenheit: '); C = (F - 32) * (5.0/9.0) 1.2 - Acquisizione da tastiera Si scriva un programma che pra in input una sequenza di numeri, al piu 10, fino a che non viene inserito un valore negativo. a = 0; while (input('dammi un numero, negativo per terminare: ') > 0) a = a + 1; if a >= 10 break; 1.3 - Lettura e moltiplicazione di array Si scriva un programma che pra in input due array, x e y, e stampi il loro prodotto scalare (x*y) e l array risultante dalla loro moltiplicazione elemento per elemento. Suggerimento. A differenza del C, in MATLAB e possibile acquisire direttamente array utilizzando la funzione input().
x = input('dammi un array: '); y = input('dammi un array (della stessa dimensione): '); % Usiamo la funzione disp per stampare i risultati disp(['prodotto scalare: ' num2str(x*y')]); disp(['prodotto elemento per elemento: ' mat2str(x.*y)]); 2. Strutture di Controllo & Array 2.1 - Conteggio negli array Si scriva un programma che pra in input un array e un numero e conti il numero di elementi dell array maggiori di tale valore. Bonus: Si risolva l esercizio senza utilizzare cicli o istruzioni condizionali. Suggerimento. MATLAB e diverso dal C: non considerando la fase di acquisizione, e possibile risolvere l esercizio in una riga di codice senza cicli e condizionali (si cerchino le funzioni opportune...) a = input('inserire un vettore: '); b = input('inserire un numero: '); % Il risultato di a>b e un vettore logico che ad ogni posizione contiene: % - 1 se a(i) > b % - 0 altrimenti % La somma dei suoi elementi e quindi il numero di elementi in cui a(i)>b risultato = sum(a > b) 2.2 - Conversione da base 2 a base 10 Si scriva un programma che, dato un array di cifre binarie rappresentante un numero in base 2, ne stampi il corrispondente valore in base 10. Bonus: si risolva lo stesso esercizio senza utilizzare cicli. (con cicli) risultato = 0; for i = 1:length(a) risultato = risultato + a(i)*(2^(length(a) - i)); disp([mat2str(a) ' in base 10: ' num2str(risultato)]);
(senza cicli) % Supponiamo che contenga N elementi. L idea e la seguente: % - Creiamo un vettore contente N volte 2: [2 2 2 2] % - Eleviamo elemento per elemento per il vettore [N-1 N-2 1 0] % - Otteniamo quindi il vettore: [2^(N-1) 2^(N-2) 2^0] % - Facciamo il prodotto scalare per a (ovvero prima moltiplico poi sommo) risultato = (2*ones(1,length(a))).^((length(a)-1):-1:0) * a'; disp([mat2str(a) ' in base 10: ' num2str(risultato)]); 2.3 - Shift a sinistra Si scriva un programma che, dato un array di cifre binarie, effettui lo shift a sinistra fino a quando non si ottiene un 1 nella prima posizione. Ad esempio: [0 0 1 1 0 1 0] [1 1 0 1 0 0 0] % Uso find per trovare gli indici in cui a non e zero indicinonzero = find(a); % Salvo solo il primo indice non zero primoindicenonzero = indicinonzero(1); % Creo un vettore formato dalle due parti di a: % - Gli elementi dal primo indice non zero fino alla fine % - Gli elementi dal primo al primo indice non zero (escluso) risultato = [a(primoindicenonzero:) a(1:primoindicenonzero-1)] 2.4 - Matrici con righe a somma costante Si scriva un programma che pra in input una matrice (di dimensioni non specificate) e controlli se tutte le righe hanno la stessa somma. a = input('inserire una matrice qualunque: '); % Calcolo le somme su riga (ovvero sommo sulla seconda dimensione di a) somme = sum(a, 2); % Sottraggo la massima somma ad ogni elemento di somme % Se ogni elemento dell array risultate e zero, le somme sono uguali if sum(somme - max(somme)) ~= 0 disp('le somme sono diverse');
else disp('le somme sono uguali'); 2.5 - Rilievi altimetrici Si scriva un programma che pra in input una serie di rilievi altimetrici. Ogni rilievo e costituito da tre variabili: altitudine, latitudine e longitudine. Il programma deve poi calcolare l altitudine media di tutti i rilievi che hanno latitudine compresa tra 10 e 80 e longitudine compresa tra 30 e 60. Si supponga, per semplicita, che tutte le variabili siano comprese fra 0 e 100. % Massimo numero di rilievi da leggere N = 5; % Pre-alloco i vettori che conterrano i rilievi alt = zeros(1, N); lat = zeros(1, N); long = zeros(1, N); % Acquisisco i rilievi for i=1:n disp(['rilievo #' num2str(i)]); alt(i) = input('altitudine: '); lat(i) = input('latitudine: '); long(i) = input('longitudine: '); disp('---'); % Calcolo il risultato risultato = mean(alt(lat>=10 & lat<=80 & long>=30 & long<=60)) 2.6 - Approssimare il numero di Nepero Si scriva un programma che calcoli un approssimazione del numero di Nepero (e) sfruttando l espansione in serie di Taylor dell esponenziale: Il programma pre in input un valore N >0 e approssima la serie di Taylor (per x=1) sommando solo i primi N termini. Si stampi poi l errore assoluto commesso nell approssimazione.
Suggerimento. Non e necessario scrivere il codice per calcolare il fattoriale: MATLAB dispone di una funzione factorial. N = input('inserire N: '); % Calcolo la somma del reciproco dei fattoriali e = sum(1./ factorial(0:n)) % Calcolo l errore assoluto rispetto al vero valore di e (che ottengo con exp(1)) errore = abs(e - exp(1)) 2.7 - Sottomatrici Si scriva un programma che, date due matrici A e B, controlli se B e una sottomatrice di A. Suggerimento. E possibile controllare se due matrici A e B sono uguali utilizzando la funzione isequal(a,b). A = input('inserisci una matrice: '); B = input('inserisci una seconda matrice: '); % Flag sottomatrice = false; % Calcolo le dimensioni di A e B [N_A,M_A] = size(a); [N_B,M_B] = size(b); % Provo tutte le possibili posizioni in cui B puo' essere sottomatrice di A for i=1:n_a-n_b+1 for j=1:m_a-m_b+1 % Controllo se B e' sottomatrice parto da (i,j) if isequal(a(i:i+n_b-1, j:j+m_b-1), B) sottomatrice = true; break; if sottomatrice disp('b è sottomatrice di A'); else disp('b non è sottomatrice di A');