Informatica 2 Liceo Scientifico Scienze Applicate/Istruzione switch: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nuova pagina: ==Istruzione switch== L'istruzione switch permette di eseguire un blocco di codice scelto fra tanti in funzione di un parametro (espressione di tipo intero), viene scelto per esemp...
 
Nessun oggetto della modifica
Riga 1:
{{Informatica 2 Liceo Scientifico Scienze Applicate}}
==Istruzione switch==
L'istruzione switch permette di eseguire un blocco di codice scelto fra tanti in funzione di un parametro (espressione di tipo intero), viene scelto per esempio realizare menù di scelta multipla. Ad esempio se l'utent eIl blocco <tt>switch-case</tt> permette di ''selezionare'' un'istruzione da eseguire in base adseguire una variabile.
 
L'istruzione switch serve per selezionare ed eseguire , in funzione del risultato (intero) di una certa espressione , uno dei blocchi di codice indicizzati nello switch.<br />
===Blocco switch-case semplice===
 
Questo blocco seleziona semplicemente un'istruzione tra le proposte in base ad una variabile.
Viene utilizzata per creare ad esempio un menù di scelta, se l'utente preme il numero 1 viene creato il database, se preme 2 puo' inserire un record, se preme 3 può ricercare un elemento etc.<br />
L'istruzione {{IndexItem|break}}<tt>break</tt> interrompe l'elaborazione del blocco switch, in modo da uscire subito dal blocco se una condizione è vera. L'istruzione break è opzionale, ma se non viene usata, vengono eseguite le istruzioni dei casi seguenti.
 
 
La sintassi del comando e' la seguente<br />
 
 
switch (espressione_dal_risultato_intero)
{ case costanteintera1 : istruzione_1blocco1;
istruzione_2blocco1;
....
istruzione_nblocco1;
break;
case costanteintera2 : istruzione_1blocco2;
istruzione_2blocco2;
....
istruzione_mblocco2;
break;
....
case costanteinterak : case costanteintera2 : istruzione_1blocco2;
istruzione_2blocco2;
....
istruzione_mblocco2;
break;
default : istruzione_1bloccodefault;
istruzione_2bloccodefault;
....
istruzione_mbloccodefault;
break;
}
<br />
 
 
Quando viene eseguito il comando viene valutata l'espressione , questa da come risultato un numero intero, si ricerca fra i numeri scritti affianco alla parola case se c'e' una corrispondenza , se viene trovata vengono eseguite le istruzioni del blocco associato a quel case, se non c'e' una corrispondenza vengono eseguite le istruzioni associate alla parola defaul.
Attenzione che i .... li ho messi per evidenziare che potete aggiungere piu' istruzioni o piu' case.<br />
 
Vediamo un esempio per capire meglio:<br />
 
 
====Sintassi====
<source lang="c">
switch (variabile)
{
case valore1:
// istruzione1
break;
case valore2:
// istruzione2
break;
case valoreN:
// istruzioneN
break;
}
</source>
 
====Esempi d'uso====
<source lang="c">
#include <iostream>
switch (myVar)
 
{
using namespace std;
case 1:
/* realizza un menu di scelta tramite uno switch che permetta di calcolare
printf("myVar è uguale a 1");
l'area del trapezio o l'area del cerchio o quella del rettangolo
break;
per scegliere quale area calcolare premi 1,2,3
*/
case 2:
printf("myVar è uguale a 2");
int main(int argc, char *argv[])
break;
{ int x;
}
float baseminore,basemaggiore,altezza,base,raggio;
</source>
float area;
<source lang="c">
cout<<"inserisci 1 per area rettangolo"<<endl;
switch (myVar)
cout<<"inserisci 2 per area trapezio"<<endl;
{
cout<<"inserisci 3 per l'area del cerchio"<<endl;
case 1:
cin>>x;
case 2:
printf("myVar è uguale a 1 o a 2");
switch(x)
break;
{case 1 : cout<<"calcolo dell'area del rettangolo"<<endl;
case 3:
cout<<"inserisci la base ";
printf("myVar è uguale a 3");
cin>>base;
// Cade nel caso 4
cout<<"inserisci l'altezza ";
case 4:
cin>>altezza;
printf("myVar è uguale a 3 o 4");
area=base*altezza;
break;
cout<<"l'area vale"<<area<<endl;
break;
case 2 : cout<<"calcolo dell'area del trapezio"<<endl;
cout<<"inserisci la base minore ";
cin>>baseminore;
cout<<"inserisci la base maggiore ";
cin>>basemaggiore;
cout<<"inserisci l'altezza ";
cin>>altezza;
area=(baseminore+basemaggiore)*altezza/2;
cout<<"l'area vale"<<area<<endl;
break;
case 3: cout<<"calcolo dell'area del cerchio"<<endl;
cout<<"inserisci il raggio";
cin>>raggio;
area=raggio*raggio*3.14;
cout<<"l'area vale"<<area<<endl;
break;
default : cout<<"devi premere 1,2,3"<<endl;
}
cout<<"questa e' l'istruzione dopo lo switch "<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
 
</source>
 
In questo programma si e' realizzato un menu' di scelta <br />
Dopo l'ultimo caso, l'istruzione "break" è inutile, ma è meglio inserirla ugualmente per evitare errori nel caso si aggiungessero altri casi.
 
* se l'utente preme 1 si esegue il blocco di codice per calcolare l'area di un rettangolo
Quasi sempre, prima di una parola-chiave "case", c'è:
* se seleziona 2 si esegue il blocco di codice per il calcolo del trapezio
* Un altro "case".
* se si seleziona 3 il blocco di codice per il calcolo dell'area del cerchio
* Un'istruzione "break" o "return" o "continue" o "goto" (che non è molto consigliato), che fa uscire dal blocco "switch".
<br />
 
in questo caso l'espressione intera da valutare e' costituita da una sola variabile la x, ma poteva anche essere del tipo 2*x*y-4 , basta che il risultato sia un numero intero.<br />
Nei casi, come quello dell'esempio precedente, in cui non fosse così, è bene segnalare la situazione con un commento.
 
poi ci sono 3 case, ciascuno con associato un numero intero, il primo case ha come costante numerica associata il numero 1, il secondo case il numero 2 , il terzo case il numero 3. Il fatto che il primo case abbia come numero associato il valore 1 e' un puro caso poteva benissimo avere come costante numerica il numero 37 , stessa cosa dicasi per i case successivi, ad esempio il secondo case poteva avere il numero 10, quindi non bisogna neppure rispettare un ordine crescente nella scelta delle costanti numeriche.<br />
In questo esempio le istruzioni vengono eseguite se myVar è uguale a 1 o a 2.
 
dopo il numero che rappresenta la costante numerica compaiono i : che ci vanno e poi vengono scritte le istruzioni associate a quel case, questo blocco di istruzioni di solito termina con l'istruzione break che termina lo switch, se nel corso dell'esecuzione del programma ci sarà corrispondenza fra il valore assunto dalla x e la costante di un case verrà eseguito il blocco di codice corrispondente. Nel nostro caso se premo 1 la x assume quel valore , c'e' corrispondenza con la costante numerica (1) del primo case e quindi si avviano le istruzione per eseguire il calcolo dell'area del rettangolo.
==={{IndexItem|default}}Istruzione switch-case-default===
Se il numero digitato fosse stato 3, la x assumeva quel valore , il primo e il secondo case venivano ignorati perchè avevano una costante numerica diversa dal valore della x, e si arrivava al terzo case che aveva come costantenumerica lo stesso valore della x, ora il codice ad essere eseguito e' quello che serve per risolvere il calcolo dell'area del cerchio. L'esecuzione dei blocchi di codice si ferma quando viene incontrata l'istruzione break, se non c'e' l'esecuzione prosegue con il blocco successivo e cosi' via fino a trovare un break o in ultima istanza la parentesi graffa di chiusura che termina lo switch.
Quindi e' possibile omettere il break in uno o piu' blocchi se si trae vantaggio da questa prosecuzione nel blocco successivo.Se nessuna costante numerica corrisponde al valore della x viene eseguito il blocco di codice messo dopo i : la parola default fino alla parentesi graffa di chiusura dello switch. La parola default e il relativo blocco di istruzioni possono essere omessi in questo caso se non ci sono corrispondenze fra la x e i valori costanti dei diversi case non viene eseguito nessun blocco e l'istruzione switch termina e l'esecuzione passa all'istruzione successiva.<br />
 
Nel C le variabili char vengono memorizzate come interi, e' allora possibile usarle come possibile espressione di scelta, le costanti dei diversi case che simboleggiano dei singoli caratteri vanno scritte fra singoli apici, le variabili costanti se sono stringhe vengono scritte fra doppi apici, se sono dei char fra singoli apici e se sono numeri senza niente.Non possiamo usare delle parole (string) come espressioni di scelta , solo interi o singoli char;<br />
Come la precedente, solo che se non si avvera nessuna delle condizioni, viene eseguita l'istruzione specificata dal caso <tt>default</tt>.
Il programma di prima allora diventa<br />
 
<source lang="Cc">
#include <iostream>
int main(void)
using namespace std;
{
/* realizza un menu di scelta tramite uno switch che permetta di calcolare
int scelta;
l'area del trapezio o l'area del cerchio o quella del rettangolo
 
per scegliere quale area calcolare premi t,c,r
printf("Inserisci Una Scelta: ");
*/
scanf("%d", &scelta);
 
int main(int argc, char *argv[])
switch(scelta){
{ char x;
case 1: printf("Scelta 1\n"); break;
float baseminore,basemaggiore,altezza,base,raggio;
case 2: printf("Scelta 2\n"); break;
float area;
case 3: printf("Scelta 3\n"); break;
cout<<"inserisci r per area rettangolo"<<endl;
default: printf("Altra Scelta\n"); break;
cout<<"inserisci t per area trapezio"<<endl;
}
cout<<"inserisci c per l'area del cerchio"<<endl;
cin>>x;
switch(x)
{case 'r' : cout<<"calcolo dell'area del rettangolo"<<endl;
cout<<"inserisci la base ";
cin>>base;
cout<<"inserisci l'altezza ";
cin>>altezza;
area=base*altezza;
cout<<"l'area vale"<<area<<endl;
break;
case 't' : cout<<"calcolo dell'area del trapezio"<<endl;
cout<<"inserisci la base minore ";
cin>>baseminore;
cout<<"inserisci la base maggiore ";
cin>>basemaggiore;
cout<<"inserisci l'altezza ";
cin>>altezza;
area=(baseminore+basemaggiore)*altezza/2;
cout<<"l'area vale"<<area<<endl;
break;
case 'c': cout<<"calcolo dell'area del cerchio"<<endl;
cout<<"inserisci il raggio";
cin>>raggio;
area=raggio*raggio*3.14;
cout<<"l'area vale"<<area<<endl;
break;
}
cout<<" hai visto che funziona?";
system("PAUSE");
return EXIT_SUCCESS;
}
 
</source>
</source >
 
dove potete vedere per confronto le modifiche da fare nel caso la variabile di scelta sia di tipo char.
[[Categoria:Informatica 2 Liceo Scientifico Scienze Applicate|Informatica Teorica]]
{{Avanzamento|100%|5 ottobre 2014}}