Programmare in Scilab - Dipartimento di Informatica
Transcript
Programmare in Scilab - Dipartimento di Informatica
Programmare in Scilab: Matrici Booleane – Strutture di Controllo Corso di Informatica CdL: Chimica Claudia d'Amato cl audi a.damat o@di .uni ba.i t Programmazione in Scilab Scilab dispone di un linguaggio di programmazione semplice e completo Differenza principale dagli altri linguaggi le variabili non necessitano di dichiarazione l'inizializzazione comprende la dichiarazione Operatori di confronto e logici Operatori di confronto == uguale a < minore > maggiore <= minore uguale >= maggiore uguale <> o ~= diverso Operatori & | ~ and or not logici Esempi Eseguire i seguenti esempi 3 <> 2 <return> 3 == 3 <return> (2 > 1) & (3 > 5) <return> (2<1) & (3>5) <return> (2>1) | (3<4) <return> (2<1) | (3>5) <return> (2<1) | (3<5) <return> ~(2<1) <return> ~(2>1) <return> ~(2>1) | (3>5) <return> Espressioni di Confronto tra Matrici --> A = [1 2; 3 4]; --> B = [3 4; 0 2]; --> A < B ans = T T F F --> A < 3 ans = T T F F Espressioni Logiche e Matrici Booleane --> a = [%t %f %t]; --> b = [%f %f %t]; --> a & b ans = F F T --> a | b ans = T F T --> ~a ans = F T F Funzioni Booleane applicate a Matrici... La funzione bool2s Applicata a matrici booleane restituisce una matrice dove %t → 1 e %f--> 0 --> bool2s([%t %f %t]) ans = 1 0 1 Applicata a matrici “standard” restituisce una matrice dove tutti i valori non nulli sono rimpiazzati con 1 → bool2s([5 0 3 2 0]) ...Funzioni Booleane applicate a Matrici La funzione find(x) dove x matrice (booleana) Restituisce il vettore degli indici per cui x(i) è "vera". La matrice vuota è restituita se nessun valore vero è ritrovato --> x = [1 3 4 2 0 1]; --> find(x<2) ans = 1 5 6 I cicli Scilab prevede il ciclo while e il ciclo for Ciclo for for indice = valore_iniziale : incremento : valore_finale, ... istruzioni ..., end for indice = valore_iniziale : valore_finale, ... istruzioni ..., end Se l'incremento non è esplicitato è pari a 1 Quando si scrivono degli script le istruzioni possono essere scritte una per linea una linea corrisponde ad una virgola Esempi 1) for k = 1:0.5:4, r=r+k, end <return> //err. 2)r = 1; for k = 1:0.5:4, r=r+k, end <return> 3)r = 1; for k = 1:0.5:4, r=r+k;, end <return> 4)xs=-1.0; dx=0.25; n=10; for j=1:n, x=xs+(j-1)*dx, end <return> 5)for m=1:10, a(m) = m^2, end <return> 6)a <return> Perchè al punto 1) si ha errore mentre al punto 5) non si ha errore??? Ciclo For e Vettori... Se il ciclo for viene usato per ciclare sulle componenti di un vettore la variabile vettore può essere usata per l'inizializzazione dell'indice Il ciclo for itera sulle componenti di un vettore riga il numero di iterazioni è governato dal numero di componenti del vettore riga for variabile=vettore, istruzioni, end ...Ciclo For e Vettori... Esempio: --> v = [1 -1 1 -1] -> y=0; for k=v, y=y+k, end Il numero di iterazioni è governato dal numero di componenti del vettore riga alla i-esima iterazione il valore di k è uguale a v(i) Esercizio: Realizzare un ciclo for con un vettore colonna ...Ciclo For e Vettori Le istruzioni per il seguente for --> v = [1 -1 1 -1] -> y=0; for k=v, y=y+k, end potrebbero essere scritte in modo più naturale e leggibile come y=0; for i=1:4, y=y+v(i), end O meglio ancora come y=0; for i=1:length(v), y=y+v(i), end Ciclo For e Matrici Il ciclo for può essere usato anche per ciclare su elementi di matrici for variabile=matrice, istruzioni, end Il ciclo for itera sulle componenti della matrice colonna per colonna --> z = [1 -1 1 4; -1 5 6 2; 5 7 8 1] -> y=0; for k=z, y=y+z, end il numero di iterazioni è governato dal numero di colonne della matrice alla i-esima iterazione il valore di k è uguale a z(i) Esempio: Media degli elementi di un vettore program1.txt clear //pulisce tutte le varibili x = [10. -1. 3. 5. -7. 4. 2.]; suma = 0; [n,m] = size(x); //alternativa m = length(x) for j=1:m suma=suma+x(j); end mean = suma/m; mean Media Colonne di Matrice n = 10; m = 7; M = rand(n,m); T = zeros(1,m); for j=1:m somma=0; for i=1:n somma = somma + M(i,j); end T(j) = somma / n; end Costrutto while Il costrutto while while condizione, ... instruzioni ..., end Esempio s=100; while s>50, disp(s^2), s=s-5, end <enter> La funzione disp visualizza il contenuto della variabile passata come argomento In uno script (o funzione) è possibile scrivere: s = 100 while s>50 disp(s^2) s = s-5 Esercizio: Realizzare la REPEAT-UNTIL Il ciclo while La sintassi del while while condizione, istruzione1, ..., istruzionen, end In uno script è possibile scrivere while condizione istruzione1 ... istruzionen end Somma degli elementi di un vettore media.sce clear x = [10. -1. 3. 5. -7. 4. 2.]; somma = 0; [n,m] = size(x); //alternativa m = length(x) for j=1:m somma=somma+x(j); end disp(somma) Esercizio: realizzare lo stesso programma con il cotrutto while Il costrutto condizionale: if... then... else... ● ● ● if condizione then istruzioni, end if condizione then istruzioni, else istruzione, end if condizioneA then istruzioni, elseif condizioneB then istruzioni, elseif condizioneC then istruzioni, ...., else istruzioni, end N.B.: In uno script le istruzioni possono essere scritte una per linea senza l'uso delle virgole if... then... else...: Esempi Esempi 1) x=10; y=5; if x>5 then disp(y), end <enter> 2)x=3; y=5; if x>5 then disp(y), else disp(x), end <enter> 3)x=3; y=5; z=4; if x>5 then disp(y), elseif x>6 then disp(x), else disp(z), end <enter> Il costrutto condizionale: select Forma generale: case select varibile, case n1, istuzioni, case n2, istruzioni,...., [else istruzioni,] end Dove n1,n2... sono i valori di “variabile” Esempi: 1) x=-1; select x, case 1, y=x+5, case -1, y=sqrt(x), end <return> 2)r=7; select r, case 1, disp(r), case 2, disp(r^2), case 7, disp(r^3), end <return> N.B.: In uno script le istruzioni possono essere scritte una per linea senza l'uso delle virgole Esempio x = 5; s = x; while s>1 s=s–2 end if s==0 then disp(%t) else disp(%f) Somma degli elementi dispari di un vettore clear x = [10. -1. 3. 5. -7. 4. 2.]; sommadisp = 0; [n,m] = size(x); for j=1:m if modulo(x(j),2)<>0 then sommadisp=sommadisp+x(j); end end disp(sommadisp) Somma degli elementi in posizione pari clear x = [10. -1. 3. 5. -7. 4. 2.]; somma = 0; [n,m] = size(x); for j=1:m if modulo(j,2)==0 then somma=somma+x(j); end end disp(somma)