Imparare a programmare in C++ | #3 | If e Switch

Imparare a programmare in C++ - If e Switch

Imparare a programmare in C++ | #3 | If e Switch: If e Switch sono due elementi che permettono di verificare se una condizione rispetta dei requisiti ed eseguire istruzioni differenti in base al risultato.

Tempo di lettura stimato: 10 minuti

Imparare a programmare in C++ | #3 | If e Switch

I controlli di verifica dei valori sono fondamentali per qualsiasi linguaggio di programmazione.

Due controlli di base per la verifica di una determinata condizione sono If e Switch.

Questi due controlli permettono di leggere il valore di una variabile e di verificare che rispetti alcuni requisiti.

If then else in C++

Iniziamo con l’if, la sintassi di base è:

if (condizione da verificare)
{
// CODICE DA ESEGUIRE SE VERA
}
else
{
//CODICE DA ESEGUIRE SE FALSA
}

questa sintassi si può estendere con ulteriori condizioni, aggiungendo else if:

if (condizione da verificare)
{
// CODICE DA ESEGUIRE SE VERA
}
else if (seconda condizione da verificare)
{
// CODICE DA ESEGUIRE SE VERA
}
else if (terza condizione da verificare)
{
// CODICE DA ESEGUIRE SE VERA
}
else
{
//CODICE DA ESEGUIRE SE FALSA
}

L’istruzione if controlla ogni condizione nell’ordine in cui è stata scritta, quindi viene verificata prima quella presente nell’if iniziale.

Se dovesse risultare vera, verrebbe eseguito il codice all’interno delle parentesi graffe e verrebbero ignorate le condizioni successive.

Se dovesse risultare falsa si passerebbe alla seconda condizione, poi alla terza, e così via fino a quando non viene trovata una condizione vera.

Nel caso in cui nessuna condizione fosse vera si andrebbe ad eseguire il codice presente nell’else.

Esempio istruzione if

#include <iostream>
using namespace std;

int main() 
{
	int NumeroDaVerificare = 40;
	
	if (NumeroDaVerificare == 20)
	{
		cout << "Hai inserito 20";
	}
	else
	{
		cout << "Non hai inserito 20";
	}
	return 0;
}

Questa condizione va a verificare se la variabile NumeroDaVerificare ha un valore di 20, se fosse vero, eseguirebbe il codice presente nell’if, altrimenti quello dell’else.

Else è obbligatorio?

Non è obbligatorio inserire un’alternativa alla condizione, potremmo infatti anche scrivere solo:

	if (NumeroDaVerificare == 20)
	{
		cout << "Hai inserito 20";
	}

Bisogna però fare molta attenzione quando si utilizza un if senza else perchè potrebbe portare a risultati inattesi del programma e in casi gravi anche a blocchi.

Quando si inserisce un istruzione if bisogna sempre pensare a cosa potrebbe accadere se non fosse vera.

Quindi se ci fossero conseguenze, ed il programma potrebbe continuare tranquillamente, è possibile utilizzare solo l’if.

Se invece è importante che ci sia qualche operazione da eseguire, è fondamentale aggiungere anche l’else.

Operatori di confronto dell’if

Con l’istruzione if possiamo controllare se un valore è:

  • uguale ad un altro
  • diverso da un altro
  • minore di un altro
  • maggiore di un altro

Per farlo dovremo utilizzare i seguenti operatori di confronto:

  • == (valore uguale)
  • != (valore diverso)
  • < (valore minore)
  • > (valore maggiore)
  • <= (valore minore o uguale)
  • >= (valore maggiore o uguale)
// VALORE UGUALE	
if (NumeroDaVerificare == 20)
	{
		cout << "Hai inserito 20";
	}
// VALORE DIVERSO	
if (NumeroDaVerificare != 20)
	{
		cout << "Non hai inserito 20";
	}
// VALORE MINORE
if (NumeroDaVerificare < 20)
	{
		cout << "Il numero e' minore di 20";
	}
// VALORE MAGGIORE
if (NumeroDaVerificare > 20)
	{
		cout << "Il numero e' maggiore di 20";
	}

Gli operatori minore e minore uguale, così come maggiore e maggiore uguale, funzionano nello stesso modo ma si differenziano per un particolare.

Nel caso in cui inserissimo minore di 20 (< 20) l’ultimo numero valido sarà 19, con 20 la condizione sarebbe falsa.

Utilizzando invece <= 20 l’ultimo numero valido sarebbe 20, quindi sarebbe falsa a partire da 21.

Verificare 2 condizioni contemporaneamente

È possibile verificare che un valore rispetti più condizioni contemporaneamente.

Per farlo possiamo usare gli operatori:

  • && (and, verifica che entrambe le condizioni siano vere)
  • || (or, verifica che almeno una delle due condizioni sia vera)
#include <iostream>
using namespace std;

int main() 
{
	int NumeroDaVerificare = 20;
    // IL RISULTATO E' VERO PERCHE' 20 NON E' MAGGIORE DI 22 MA E' MINORE DI 30
	if (NumeroDaVerificare > 22 || NumeroDaVerificare < 30)
	{
		cout << "Il numero rientra nel range scelto";
	}
    // IL RISULTATO E' VERO PERCHE' 20 E' MAGGIORE DI 22 ED E' MINORE DI 30
	if (NumeroDaVerificare > 15 && NumeroDaVerificare < 30)
	{
		cout << "Il numero rientra nel range scelto";
	}


	return 0;
}

ESERCIZIO 1: Chiedere numero in Input

Nell’esempio dell’istruzione If, abbiamo creato una variabile NumeroDaControllare assegnandole un valore di 40.

In questo esercizio andiamo a togliere il valore assegnato e chiediamo all’utente di inserire un numero, poi andiamo a fare la verifica con l’if per controllare se ha inserito 20 oppure no.

Mostra soluzione

// VERIFICA CON INPUT
#include <iostream>
using namespace std;

int main() 
{
	int NumeroDaVerificare;
	cout << "Inserisci un numero..." << endl;
	cin >> NumeroDaVerificare;
	
	if (NumeroDaVerificare == 20)
	{
		cout << "Hai inserito 20";
	}
	else
	{
		cout << "Non hai inserito 20";
	}
	return 0;
}

Switch in C++

Uno switch in C++ permette, partendo da una condizione da verificare, di elencare diversi casi di istruzioni.

La sintassi dello switch è:

int NumeroDaControllare = 20;
switch (NumeroDaControllare)
{
   case 0:
       // ISTRUZIONE DA ESEGUIRE SE VALORE 0
       break;
   case 1:
       // ISTRUZIONE DA ESEGUIRE SE VALORE 1
       break;
   case 2:
       // ISTRUZIONE DA ESEGUIRE SE VALORE 2
       break;
   case 20:
       // ISTRUZIONE DA ESEGUIRE SE VALORE 20
       break;
   default:
       // ISTRUZIONE DA ESEGUIRE IN TUTTI GLI ALTRI CASI
       break;
}

Lo switch ha quindi bisogno diversi case con i valori.

Scrivere case 0: equivale nell’if a scrivere if (NumeroDaControllare == 0)

l’istruzione default equivale all’else dell’if.

Quindi quando nessuno degli altri casi soddisfa i requisiti della condizione viene eseguito il caso predefinito.

È fondamentale inserire break; dopo ogni caso, perchè interrompe il codice ed evita che possano essere eseguite le istruzioni di tutti i casi (vedremo l’utilizzo del break nei prossimi tutorial).

Quando preferire Switch e quando If

Generalmente l’istruzione if offre maggiore libertà, ed è più probabile che si possa adattare meglio alle nostre necessità.

Quando infatti c’è da fare una verifica su più valore (con and e or), oppure quando vogliamo verificare se un valore è maggiore o minore, o ancora quando abbiamo bisogno di effettuare controlli a cascata (inserire quindi un if all’interno di un altro), la scelta migliore è sempre l’if.

Lo switch è invece da preferirsi quando abbiamo la necessità di eseguire diverse istruzioni in base al valore di una determinata variabile.

Se ad esempio sappiamo che una variabile può avere un valore da 1 a 10 e per ognuno di questi valori si deve eseguire un’operazione diversa, utilizzare switch con i diversi casi da 1 a 10 ci permette di eseguire un codice più chiaro e pulito rispetto ad un if.

ESERCIZIO 2: Calcolare l’Età corretta

Nel tutorial precedente abbiamo calcolato l’età di un utente partendo da anno di nascita ed anno attuale.

In questo modo il risultato è potenzialmente sbagliato perchè non prende in considerazione anche il mese ed il giorno.

Quindi l’utente potrebbe non aver ancora compito gli anni.

Ora che abbiamo visto come effettuare controlli sulle variabili con If e Switch, andiamo a riscrivere quel programma controllando anche mese e giorno di nascita.

Utilizziamo quindi come partenza questo codice:

#include <iostream>
using namespace std;


int main() 
{
	int AnnoNascita, MeseNascita, GiornoNascita, AnnoAttuale, MeseAttuale, GiornoAttuale, Eta;
	return 0;
}

Chiediamo quindi all’utente di inserire tutte le informazioni, il mese deve essere in formato numerico.

Possiamo eseguire l’esercizio in 2 modi:

  1. Chiedere tutti i dati in input all’utente
  2. Fare la sottrazione AnnoAttuale – AnnoNascita
  3. Controllare mese di nascita e poi giorno di nascita
  4. Se non sono già passati sottrarre 1 all’età
  5. Altrimenti mostrare Età

In alternativa:

  1. Chiedere tutti i dati in input all’utente
  2. Controllare mese di nascita e poi giorno di nascita
  3. Se sono già passati calcolare AnnoAttuale – AnnoNascita
  4. Altrimenti AnnoAttuale – AnnoNascita – 1

Andiamo a vedere entrambi i casi.

Mostra soluzione METODO 1 – Età calcolata prima e poi sottratto 1

#include <iostream>
using namespace std;
int main() 
{
	int AnnoNascita, MeseNascita, GiornoNascita, AnnoAttuale, MeseAttuale, GiornoAttuale, Eta;
	// Inseriamo prima tutti gli input
	cout << "Inserisci il tuo anno di nascita:" << endl;
	cin >> AnnoNascita;
	cout << "Inserisci il tuo mese di nascita:" << endl;
	cin >> MeseNascita;
	cout << "Inserisci il tuo giorno di nascita:" << endl;
	cin >> GiornoNascita;
	cout << "Inserisci l'anno attuale:" << endl;
	cin >> AnnoAttuale;
	cout << "Inserisci il mese attuale:" << endl;
	cin >> MeseAttuale;
	cout << "Inserisci il giorno attuale:" << endl;
	cin >> GiornoAttuale;
	// Andiamo Ora a verificare l'anno di nascita e ad assegnare il valore
	Eta = AnnoAttuale - AnnoNascita;
	// Controlliamo ora che il mese di nascita sia già passato
	if (MeseNascita > MeseAttuale)
	{
		/*
		Nel primo if controlliamo il mese di nascita
		se superiore non abbiamo bisogno di controllare anche il giorno
		*/
		Eta = Eta - 1;
	}
	else if (MeseNascita = MeseAttuale && GiornoNascita > GiornoAttuale)
	{
		/*
		Nel secondo controllo verifichiamo che il mese sia lo stesso
		in questo caso andiamo quindi a verificare che il giorno sia
		già trascorso.
		*/
		Eta = Eta - 1;
	}
	else
	{
		/*
		Non abbiamo bisogno di un else perchè abbiamo già assegnato
		il valore dell'età in precedenza
		*/
	}
	cout << "Hai " << Eta << " anni";
	return 0;
}

Mostra soluzione METODO 2 – Età calcolata all’interno dell’if in tutti i casi

#include <iostream>
using namespace std;


int main() 
{
	int AnnoNascita, MeseNascita, GiornoNascita, AnnoAttuale, MeseAttuale, GiornoAttuale, Eta;
	// Inseriamo prima tutti gli input
	cout << "Inserisci il tuo anno di nascita:" << endl;
	cin >> AnnoNascita;
	cout << "Inserisci il tuo mese di nascita:" << endl;
	cin >> MeseNascita;
	cout << "Inserisci il tuo giorno di nascita:" << endl;
	cin >> GiornoNascita;
	cout << "Inserisci l'anno attuale:" << endl;
	cin >> AnnoAttuale;
	cout << "Inserisci il mese attuale:" << endl;
	cin >> MeseAttuale;
	cout << "Inserisci il giorno attuale:" << endl;
	cin >> GiornoAttuale;
	// Controlliamo ora che il mese di nascita sia già passato
	if (MeseNascita > MeseAttuale)
	{
		/*
		Nel primo if controlliamo il mese di nascita
		se superiore non abbiamo bisogno di controllare anche il giorno
		*/
		Eta = AnnoAttuale - AnnoNascita - 1;
	}
	else if (MeseNascita = MeseAttuale && GiornoNascita > GiornoAttuale)
	{
		/*
		Nel secondo controllo verifichiamo che il mese sia lo stesso
		in questo caso andiamo quindi a verificare che il giorno sia
		già trascorso.
		*/
		Eta = AnnoAttuale - AnnoNascita - 1;
	}
	else
	{
		/*
		Nell'else andiamo semplicemente a sottrarre l'anno di nascita
		dall'anno attuale
		*/
		Eta = AnnoAttuale - AnnoNascita;
	}
	cout << "Hai " << Eta << " anni";
	return 0;
}

Video