Informatica 2 Liceo Scientifico Scienze Applicate/Altre Istruzioni di Scelta o Diramazione
Operatore ? e istruzioni goto
modificaLe istruzioni di scelta/diramazione sono 4, due sono state analizzate if e switch, mancano il famoso operatore ternario ? (si proprio il punto di domanda) e l'istruzione goto.
Vediamo la sintassi dell'operatore ternario ?
(condizionelogica)?(espressionecasovero):(espressionecasofalso)
in pratica l'operatore ? restituisce a seconda che la condizione sia true o false il valore del risultato dell'espressionecasovero o dell'espressionecasofalso.
z=(a>3)?7:9;
- se a>3 e' true allora ? restituisce il numero 7 che viene trasferito nella variabile z, altrimenti
- se a<3 e' false allora ? restituisce il numero 9 che viene trasferito nella variabile z,
nulla vieta che il comando possa assumere la forma parola=(a>3)?"Luca":"Marco";
oppure k=(a%2)?-a:a*a; pensiamo a e k di tipo intero, valutiamo la condizione a%2 cioe' il resto della divisione a/2, il resto se vale zero viene interpretato come falso, se invece il resto vale 1 viene interpretato coe vero, ora se la condizione vale true(numero a dispari) carico in z il valore -a, se la condizione vale false(numero a pari) carico in z il valore a*a.
il ? e' una forma compatta per scrivere un if a due vie in cui viene dato a una stessa variabile due possibili valori.
quindi z=(a>3)?7:9; poteva (in modo sicuramente piu' comprensibile) essere scritto come
if(a>3) z=7; else z=9;
il vantaggio del ? e' la compattezza del comando e la possibilita' di non dover dichiarare la variabile z se il ? viene combinato in una espressione di calcolo .
Ricordatevi comunque che ? e' il solo operatore ternario
Istruzione goto
modificaL'istruzione goto e' bellissima e internamente al programma che si scrive utilizzata spessisimo, ha il brutto difetto/vantaggio di consentire un salto incondizionato nell'ordine di esecuzione delle istruzioni.Nel passato era utilizzata molto spesso dai programmatori ma tende a rendere difficile lo studio del codice (cioe' capire come si evolve l'esecuzione delle istruzioni in un programma) destrutturando il codice, per questo motivo e' stata messa al bando (specie durante i corsi di programmazione).Si puo' scrivere un qualsiasi programma senza utilizzarla direttamente (sotto il cofano del programma il goto continua a ruggire) mantenendo semplice e chiara la struttura del programma.
Naturalmente puo' capitare per questioni di velocità nella scrittura dei programmi (specie durante le Olimpiadi Informatica) di doverla usare, vediamo come funziona:
Ho omesso quando ho parlato delle istruzioni in C che davanti ad ogni istruzione e' possibile scrivere una label (etichetta /fermaposto), una volta queste label erano solo numeriche ma poi sono diventate alfanumeriche, posso scrivere allora:
nome1label: istruzionedaeseguire ;
non e' detto che si debba mettere una etichetta davanti a ogni istruzione, va fatto quando serve.Le etichette da sole al pari dei commenti non influenzano il programma.
facciamo un esempio
k=1; saltaqua: cout<<"ciao";
ora queste istruzioni impostano la variabile k a 1 e stampano la scritta ciao una volta,l'etichetta saltaqua e' per ora ininfluente, io ora vorrei stampare la scritta ciao per 10 volte, modifico il codice in questo modo
k=1; saltaqua: cout<<"ciao"; k=k+1; if(k<=10) goto saltaqua; istruzionesuccessiva;
l'istruzione goto saltaqua; quando eseguita sposta l'esecuzione delle istruzioni a quella scritta in corrispondenza dell'etichetta saltaqua.Nel nostro caso prima pongo k=1, poi stampo ciao, incremento k di uno (passa a 2), poi eseguo l'if la condizione e' verificata e allora l'istruzione goto saltaqua fa proseguire l'esecuzione dall'istruzione cout (che e' in corrispondenza dell'etichetta saltaqua), stampo per la 2^ volta la scritta ciao e la cosa si ripete ....
dopo aver stampato per 10 volte la scritta ciao (nel frattempo l'istruzione goto ha spostato per 9 volte l'esecuzione a saltaqua) k assume il valore 11, la condizione del if diventa false, l'istruzione goto non viene eseguita e si passa all'istruzionesuccessiva;
Il goto e' una istruzione di salto incondizionato che sebbene utile e potente noi non useremo nei nostri programmi (a meno che non siate alle olimpiadi).