Istruzione if (superiori)

lezione
lezione
Istruzione if (superiori)
Tipo di risorsa Tipo: lezione
Materia di appartenenza Materia: Informatica (istituti tecnici) per le superiori
Avanzamento Avanzamento: lezione completa al 100%

Operatori di Confronto

modifica

Gli operatori di confronto che servono per scrivere delle espressioni logiche (che hanno cioe' come risultati i valori booleani true e false) sono:

<    minore
<=   minore o uguale
>    maggiore
>=   maggiore o uguale
==   uguale
!=   non uguale, cioe' diverso, il ! ne indica negazione

quindi per sapere se la variabile z e' uguale a 5 si deve scrivere la seguente condizione z==5 , e' un doppio uguale perche' il singolo uguale e' invece l'operatore di assegnazione (che non serve per confrontare)

Istruzione if

modifica

Non sempre e' possibile risolvere un problema usando soltanto istruzioni disposte sequenzialmente, alcune volte in base a una condizione si vuole eseguire in alternativa o un certo gruppo di istruzioni o un altro gruppo di istruzioni(diverse).
Ad esempio posso dire se marco ha più di 10 euro prima saluta gli amici poi compra della pizza altrimenti torna a casa e poi va a giocare a calcio.
Oppure possiamo dire se la merce acquistata ha un valore maggiore di 50 euro il negoziante fa uno sconto del 10% altrimenti uno sconto del 5%, in questo caso l'istruzione sconto del 10% e' in alternativa a quella dove lo sconto e' 5% e la scelta di quale sconto applicare dipende dalla condizione (spesa superiore a 50 euro)

L'istruzione per realizzare una scelta fra 2 blocchi di istruzioni e' l'istruzione if
Vediamo ora la sintassi dell'if ( la sintassi e' la regola grammaticale con cui impartiamo l'ordine ) :

if  (condizione logica)
   {istruzione 1 caso vero;
    istruzione 2 caso vero;
    ....
    istruzione n caso vero;
 
   }
else
  {istruzione 1 caso falso;
   istruzione 2 caso falso;
   ....
   istruzione m caso falso;
  }


Ad esempio posso scrivere

if (spesa>50)
   { percentualesconto=0.10;
   }
else
   { percentualesconto=0.05;
   }

Guardando alla sintassi del comando si ha :

  • che la condizione logica è una qualsiasi espressione che ha come risultato un valore booleano (cioè o true o false)
  • poi c'e' un primo blocco d'istruzioni racchiuse fra parentesi graffe (quella di apertura allineata con quella di chiusura) che sono eseguite se la condizione logica e' true, questo blocco di istruzioni e' detto blocco istruzioni caso vero
  • poi c'e' dopo l'else un secondo blocco d'istruzioni racchiuse fra parentesi graffe (quella di apertura allineata con quella di chiusura) che sono eseguite se la condizione logica e' false, questo blocco di istruzioni e' detto blocco istruzioni caso falso
  • la parola if corrisponde all'italiano se ed è una parola riservata perche' indica un'istruzione
  • la parola else corrisponde all'italiano altrimenti, e' una parola riservata ed usata insieme ad un if ( e quindi mai da sola)


possiamo riassumere dicendo che if-else funziona in questo modo:
se la condizione e' verificata esegui le istruzioni del blocco caso vero altrimenti quelle del blocco caso falso.


per rappresentare graficamente un if-else ho il seguente diagramma di flusso
 


ci sono delle varianti al comando , ad esempio può mancare la parte else , in questo caso si parla di if semplice (quello precedente e' detto invece if a 2 vie).La sintassi del if semplice e'


if  (condizione logica)
   {istruzione 1 caso vero;
    istruzione 2 caso vero;
    ....
    istruzione n caso vero;
   }


ad esempio


if(a>4)
 { z=3;
   k=7;
 }

in questo caso solo se la condizione a>4 è verificata le istruzioni del blocco vero sono eseguite,e il diagramma di flusso e' il seguente

 


si nota che la struttura e' uguale a quella di prima ma non ci sono istruzioni da eseguire nel caso falso . Sia che ci sia l'esecuzione del blocco vero o sia che venga eseguito quello falso poi ci si ricongiunge in un punto e si prosegue con le istruzioni successive. Se un blocco di istruzioni contiene una sola istruzione allora le graffe di quel blocco possono essere omesse, cioe' posso avere:

if (a<3)
 z=5;
else
 { z=3;
   x=4;
 }


oppure

if (a<3)
  { z=7;
    x=8;
  }
else
  z=5;


oppure

if (a<3)
    x=8;
else
  z=5;


nel caso di if semplice si ha invece

if (a<3)
    x=8;


che possiamo scrivere anche su una sola riga

if (a<3)  x=8;


Le istruzioni del blocco vero o falso possono essere qualsiasi , se le istruzioni di un blocco (vero o falso di un if) contengono a loro volta un'istruzione if si parla di istruzione if annidata, ad esempio


if(a>10)
  { z=7;
    if(a>70)
      {cout<<"a e' maggiore di 70;
      }
    else
      {cout<<"a e' compreso fra 10 e 70;
      }
   }
else
   {cout<<"a minore di 10";
   }


naturalmente nel comando precedente qualche graffa poteva essere omessa arrivando a:


if(a>10)
  { z=7;
    if(a>70)
      cout<<"a e' maggiore di 70;
      
    else
      cout<<"a e' compreso fra 10 e 70;
   }
else
   cout<<"a minore di 10";

Qualche volta quando si usano degli if annidati si creano delle situazioni particolari

if(a>10)
    if(a>70)
      cout<<"a e' maggiore di 70;
else
  cout<<"Ob-la-dì Ob-la-da";


in questo caso ho un solo else a quale if appartiene? in questo caso la regola vuole che l'if appartenga all'if più interno (cioe' al if(a>70) ), posso identare (spaziando) meglio il codice per evidenziare come l'istruzione vienen eseguita


if(a>10)
    if(a>70)
      cout<<"a e' maggiore di 70;
    else
      cout<<"Ob-la-dì Ob-la-da";   


per ottenere l'effetto opposto bisogna giocare con le parentesi graffe, in modo da raggruppare in modo diverso le istruzioni, si ha allora

if(a>10)
   { if(a>70)
      cout<<"a e' maggiore di 70;
   }
else
   cout<<"Ob-la-dì Ob-la-da";   


Gli annidamenti del if danno luogo a delle strutture dette if-elseif del tipo


if(a==1)
  cout<<" e' 1";
else 
  if (a==4)
     cout<<"e' 4"; 
  else  
     if((a==7)
        cout<<"e' 7"; 
     else  
        if(f((a==9)
           cout<<"e '9"; 
        else  
          if(a==12)
             cout<<"e '12"; 
          else  
             cout<<"diverso da 1 4 7 9 e 12"; 


in questo caso anche se l'identazione e' corretta perche' evidenzia la corretta struttura if else if, si preferisce ricompattarla per motivi di spazio nella seguente forma:

if(a==1)
  cout<<" e' 1";
else if (a==4)
  cout<<"e' 4"; 
else if((a==7)
 cout<<"e' 7"; 
else if(f((a==9)
 cout<<"e '9"; 
else if(a==12)
 cout<<"e '12"; 
else  
 cout<<"diverso da 1 4 7 9 e 12"; 


che evidenzia che si ha un if multiplo che serve per gestire una serie di casi ( a pari a 1, a pari a 4 etc ) e la relativa azione intrapresa.


Nel C non esistono le variabili booleani, che sono state introdotte nel c++, nel c per rappresentare una variabile booleana (vero/falso) si usa un intero, se l'intero vale 0 la condizione e' falsa , se e' diverso da zero la condizione e' vera, quindi l'espressione logica (condizione) con i booleani può essere sostituita da una espressione che restituisce un intero

se z vale 10 e scrivo

if( z-6) 
  cout<<"ciao";
else 
  cout<<"bravo";


vedo sullo schermo comparire ciao perche' z-6 fa 4 e quattro e' un numero diverso da zero e quindi se interpretato come il risultato di una espressione logica si ha vero.