Soluzioni - Informatica B

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