Informatica 5 Liceo Scientifico Scienze Applicate/Istruzioni Programmazione Octave
Istruzioni di scelta e di ripetizione in Octave
modificaPer poter scrivere dei programmi spesso non basta eseguirli in ordine sequenziale (uno dopo l'altro), ma c'e' la necessita' di eseguire certe istruzioni quando si verifica una particolare condizione. Se ad esempio si deve risolvere una equazione di secondo grado, solo se il discriminante e' maggiore o uguale a zero e' possibile calcolare le due radici (soluzioni del problema), altrimenti non ci sono soluzioni. Altro esempio: quando si deve calcolare la matrice inversa, questa esiste solo se il determinante e' diverso da zero; altre volte c'e' la necessita' di ripetere un comando un certo numero di volte e non e' agevole scriverlo all'interno del codice e in alcuni casi nemmeno possibile, ad esempio se si vuole trovare il numero massimo contenuto in un vettore bisogna analizzare ciascun elemento del vettore e confrontarlo con il valore massimo temporaneo trovato fino a quel momento.
Se volete vedere la guida di riferimento che descrive i comandi base disponibili in Octave la trovate qui
Per poter eseguire dei comandi in funzione di una o piu' condizioni si usano le istruzioni if o l'istruzione switch, mentre per ripetere una o piu' istruzioni si puo' usare l'istruzione for, l'istruzione while e l'istruzione repeat-until. Analizziamo ciascuna istruzione, scrivendone la sintassi (cioe' la regola grammaticale con cui si impartisce l'ordine ) e alcuni esempi. Prima di questo si ricorda che una condizione (logica) e' una qualsiasi espressione che valutata da come risultato vero o falso (true /false, 1/0), quindi se scrivo
a>5 | |
c==4 | Testo della cella |
z<=3 | Testo della cella |
(a>=4) && (a<23) | la condizione complessiva e' data dall'unione ,tramite operatore AND chiamato operatore di congiunzione con simbolo &&, di due condizioni piu' semplici (a>=4) e (a<23), in questo caso la condizione complessiva e' vera solo se entrambe le condizioni che l'operatore AND congiunge sono vere |
!(a<3) | il ! esclamativo scritto davanti a una condizione logica la nega, quindi nel nostro caso la condizione e' "non sia a minore di 3", l'operatore NOT simbolo detto operatore di negazione simbolo !, inverte il valore logico della condizione che nega, quindi se (a<3) fosse vera allora !(a<3) diventa falsa e viceversa se (a<3) fosse falsa la sua negata !(a<3) assume il valore vero |
(a<3) || (a>=50) | la condizione complessiva e' data dalla'unione ,tramite operatore OR chiamato anche operatore di disgiunzione con simbolo ||, di due condizioni piu' semplici (a<3) e (a>=50), in questo caso la condizione complessiva e' vera solo se almeno una delle condizioni che l'operatore OR disgiunge e' vera |
sono tutte condizioni, mentre se parlo di una espressione intera, intendo una espressione che valutata mi da come risultato un numero intero, ad esempio
3+5 a nel caso a sia una variabile di tipo intero a*3-b nel caso sia a e sia b siano variabili di tipo intero
una istruzione e' invece un qualsiasi comando
una costante intera e' un numero del tipo 5, 453 ,0, -3
Istruzione IF
modificasintassi if semplice (e' il caso piu' semplice)
if (condizionelogica) istruzcasovero1 istruzcasovero2 .... istruzcasoveron end
l'istruzione if valuta la condizione logica, e se questa e' vera esegue la sequenza di istruzioni fino all'end, per passare poi l'esecuzione al comando successivo (scritto dopo l'end), altrimenti se la condizione e' falsa non fa niente e passa l'esecuzione al comando successivo (quello scritto dopo l'end). Detto in altro modo le istruzioni del caso vero vengono eseguite solo se la condizione risulta vera.
Ad esempio posso scrivere :
if(a>5) b=3; k=a-2*7; B=inv(A); end
Quindi solo se la condizione a>5 è verificata le istruzioni b=3; k=a-2*7; e B=inv(A) vengono eseguite.
Esiste una seconda forma dell'if, detta if a due vie. La sintassi e'
if (condizionelogica) istruzcasovero1 istruzcasovero2 .... istruzcasoveron else istruzcasofalso1 istruzcasofalso2 .... istruzcasofalsom end
In questo caso l'if valuta la condizione e se questa è vera esegue le istruzioni del caso vero, altrimenti esegue le istruzioni del caso falso (quelle scritte dopo la parola else). In questo caso esistono 2 blocchi di istruzioni che vengono eseguite in alternativa a seconda del valore logico assunto dalla condizione. Ad esempio scrivo
if(a>3)
k=7;
r=8;
else
k=9;
r=2;
p=678;
end
In questo caso se a>3 vengono eseguite le istruzioni k=7; r=8; altrimenti vengono eseguite le istruzioni k=9; r=2; p=678;
Nel caso di piu' condizioni (mutuamente esclusive), che magari riguardano la stessa variabile, si usa il costrutto if-elseif
ad esempio
if(a==4)
fprintf(" a vale quattro");
else if(a==7)
fprintf(" a vale sette");
else if(a==8)
fprintf(" a vale otto");
else
fprintf(" a non e' né 4 né 7 né 8");
end
questa istruzione if else if e' in realtà un particolare caso di if in cui nel blocco else si e' inserita una istruzione if (quindi abbiamo un if con un if al suo interno e si parla allora di if annidato)
la sintassi e'
if (condizionelogica1) istruz1casovero1 istruz2casovero1 .... istruzncasovero1 else if (condizionelogica2) istruz1casovero2 istruz2casovero2 .... istruzncasovero2 ..... else if (condizionelogicak) istruz1casoverok istruz2casoverok .... istruzncasoverok else istruz1casotuttiprecedentifalsi istruz2casotuttiprecedentifalsi .... istruzncasotuttiprecedentifalsi end
Istruzione switch
modificaQuesta istruzione serve per eseguire uno dei tanti blocchi di istruzioni che la compongono, parametrizzati mediante un valore intero. Detto in altro modo in base al valore assunto da una espressione numerica (ridotta molto spesso a una singola variabile) si esegue solo il blocco di istruzioni del corrispondente case, cioe' quello con costante numerica uguale al valore assunto dall'espressione intera. Se nessun case soddisfa la corrispondenza viene eseguito il blocco di istruzioni associate al otherwise.
Vediamo la sintassi
switch(espressioneintera) case costante1 : istruz1casecostante1 istruz2casecostante1 .... istruzncasecostante1 case costante2 : istruz1casecostante2 istruz2casecostante2 .... istruzncasecostante2 .... case costantek : istruz1casecostantek istruz2casecostantek .... istruzncasecostantek otherwise : istruz1otherwise istruz2otherwise .... istruznotherwise end
ad esempio
switch( n )
case 3 :
c=15;
case 12 :
c=23;
fprintf("ciao");
case 13 :
z=8;
otherwise :
c=456;
end
viene valutata l'espressione ( e' costituita dalla sola variabile n): se vale tre si eseguono le istruzioni del primo case, se vale dodici si eseguono le istruzioni del secondo case, se vale tredici si eseguono le istruzioni del terzo case, se non è né 3 né 12 né 13 vengono eseguite le istruzioni associate all'otherwise.
Istruzione FOR
modificaL'istruzione for serve per ripetere un blocco di istruzioni un numero prefissato di volte; alla variabile contatore ad ogni ciclo viene associato uno dei valori contenuti in un vettore. Vediamo la sintassi:
for contatore = valoreiniziale: passoincrementale: valorefinale istruzione1; istruzione2; ... istruzionen; end
ad esempio scrivo
for k= 1:2:15
z=k+z;
printf("ciao");
end
il contatore e' k, i valori che assume sono i valori da 1 a 15 con passo 2 cioè 1 3 5 7 9 11 13 15 (nel primo ciclo k vale 1 nel secondo ciclo 3 nel terzo ciclo 5 e così via).
Le istruzioni ripetute ad ogni ciclo sono z=k+z;vv printf("ciao");
Se si omette di scrivere esplicitamente il passoincrementale viene usato il valore 1
quindi 1:10 genera la sequenza 1 2 3 4 5 6 7 8 9 10
Istruzione WHILE
modificaL'istruzione while e' una istruzione di ripetizione, il blocco di codice viene rieseguito finche' la condizione e' vera, visto che il controllo della condizione avviene prima dell'esecuzione del blocco di codice, se la condizione e' immediatamente falsa, il blocco di codice non viene mai eseguito. Si dice che la condizione e' in testa.
Vediamo la sintassi
while(condizionelogica) istruzione1; istruzione2; ... istruzionen; end
passiamo all'esempio:
while(a<10)
z=z+23;
a=a+1;
end
finché il valore di a e' minore di dieci vengono ripetute le istruzioni z=z+23; a=a+1; Da notare che se non si vuole avere infiniti cicli le variabili coinvolte nella condizione devono assumere valori diversi e quindi nelle istruzioni da ripetere c'e' ne almeno una che modifica la valutazione della condizione stessa.
Istruzione do-until
modificaL'istruzione do-until e' una istruzione di ripetizione, il blocco di codice viene rieseguito finche' la condizione e' falsa. Visto che il controllo della condizione avviene dopo l'esecuzione del blocco di codice, il blocco di codice viene sempre eseguito almeno una volta. Si dice che la condizione e' in coda.
Vediamo la sintassi
do istruzione1; istruzione2; ... istruzionen; until (condizionelogica)
passiamo all'esempio:
do
z=z+23;
a=a+1;
until (a>10)
finché il valore di a non e' maggiore di dieci vengono ripetute le istruzioni z=z+23; a=a+1; Da notare che se non si vuole avere infiniti cicli le variabili coinvolte nella condizione devono assumere valori diversi e quindi nelle istruzioni da ripetere ce n'e' almeno una che modifica la valutazione della condizione stessa.
Commenti
modificaPer fare un commento su una sola linea o un commento multilinea si utilizza
% Commento su una sola riga
%{
Commento multilinea
multilinea
multilinea
%}
Pulizia e Cancellazione
modificaIl comando clc pulisce la finestra del Comand Window
mentre il comando clear elimina tutte le variabili, per cancellare una sola variabile ad esempio la matrice A date il comando clear A