Informatica 5 Liceo Scientifico Scienze Applicate/Istruzioni Programmazione Octave

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
CopertinaInformatica 5 Liceo Scientifico Scienze Applicate/Copertina

Istruzioni di scelta e di ripetizione in Octave[modifica]

Per 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[modifica]

sintassi 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[modifica]

Questa 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[modifica]

L'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[modifica]

L'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[modifica]

L'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.