Nellaย lezione precedente avevo spiegato un po’ cos’era la computazione e si era visto comeย spesso nei programmi abbiamo bisogno di scegliere tra varie alternative. Per fare ciรฒ si utilizzano lโif-statement e loย switch-statment.ย Il primo seleziona semplicemente tra due alternative mentre il secondo risulta essere piรน indicato nei casi in cui vengano utilizzate piรน variabili.
Diamo un’occhiata veloce, quindi, al programma scritto precedentemente per convertire le lunghezzeย da pollici a centrimetri tanto per avere un’idea di cosa cambierร utilizzando, poi, lo switch-statement al posto dell’if.
//Esempio di if-statement e conversione da pollici a centimetri
#include "iostream"
#include "string"
using namespace std;
int main ()
{
const double cm_per_inch=2.54; //numero di centimetri in un pollice
int length=1; //lunghezza in pollici o centimetri
char unit=' '; //uno spazio non รจ un'unitร
cout <<"Per favore inserisci una lunghezza seguita da un unitร (c o p):\n";
cin>>length>>unit;
if (unit=='p')
cout <<length<< " pollici == " <<cm_per_inch*length<< " centimetri\n";
else if (unit=='c')
cout <<length<< " centimetri == " <<length/cm_per_inch << " pollici\n";
else
cout <<"Scusa, non conosco nessuna unita' chiamata '" << unit<< "'\n";
return 0;
}
Per le spiegazioni relative al soprastante esempio vi rimando qui. Ora, il nostro interesse si sposterร a come riscrivere questo programma utilizzando al posto dell’if-statement il while-statement. Come potete notare qui sotto la prima parte resta invariata fino a chรฉ non si raggiunge il blocco specifico con la dicituraย switch (unit) {.
//Esempio di while-statement #include "iostream" #include "string" using namespace std; int main() { const double cm_per_inch = 2.54; //numero di centimetri in un pollice int length = 1; //lunghezza in pollici o centimetri char unit = ' '; //uno spazio non รจ un'unitร cout << "Per favore inserisci una lunghezza seguita da un unitร (c o p):\n"; cin >> length >> unit; switch (unit){ case 'p': cout << length << " pollici==" << cm_per_inch*length << " cm\n"; break; case 'c': cout << length << " centimetri==" << length / cm_per_inch << " p\n"; break; default: cout << "Mi dispiace, non conoscono l'unitร denominata '" << unit << "'\n"; break; } }
Concentrandoci, quindi, sulla seconda parte del programma possiamo notare alcune differenze rispetto all’esempio precedente. Innanzitutto bisogna sottolineare come il valore dello switch possa essere solamente un numero intero (integer), un char (carattere) o un tipo qualsiasi di enumerazione ma non potrร mai essere una stringa.
Ogni costante, inoltre, รจ presentata come parte di unaย case labelย ciรฒ significa che il valore della costante in essa contenuta non puรฒ variare nรฉ essere usuale ad una giร presente in un’altra case label e, quindi, avremo l’etichettaย case ‘p’ per i pollici eย case ‘c’ per i centimetri. Ma, soprattutto, dovremo sempre ricordarci di concludere ogni case label con ilย break cosa che se non sarร fatta il compiler non segnalerร come errore.
Diamo, ora un’occhiata a qualche loop o iterazioneย sia in C++ย che utilizzeremo per spiegare meglio ilย for-statement.
Stroustrup nel suo libroย Programming Principles and Practice using C++ utilizza il seguente esempio mutuato daย EDSAC e creato da David Sheeler nel 1949 alla Cambridge University per calcolare e scrivere liste semplici di quadrati. In C++ questo programma risulterebbe scritto come segue:
//Calcola e scrivi una tavola di quadrati da 0 a 99 usando il while-statement #include "iostream" #include "string" #include "math.h" using namespace std; int main() { int i=0; //inizia da 0 while (i<100) { cout << i << '\t' << sqrt (i) << '\n'; ++i; //incrementa i (ovvero i diventa i+1) } }
Qui, notiamo subito che a parte includere le solite librerie, ovvero iostream e string, dobbiamo aggiungere math.h questo perchรฉ le altre non supportano il calcolo del quadrato. Ovviamente, aggiungiamo il nostro beneamato e sempre presente using namespace std per evitare di doverlo reiterare ogni qualvolta vi รจ bisogno nella forma std::.
Il corpo della nostra funzione inizia posizionando l’integer denominato i a zero con int i=0 questo permetterร al nostro programma di iniziare il calcolo di tutti i quadrati partendo, appunto, da zero. Dopodichรฉ ordineremo al nostro programma di contare fino a cento while (i<100) in altre parole mentre i risulta minore di 100 e di scrivere il quadrato (sqrt) per ogni i contata lasciando uno spazio tab tra i ed il suo quadrato grazie a ‘\t’. Il comando ++i semplicemente aumenterร il numero successivo di i+1 ovvero di 0+1, poi 1+1, 2+1, 3+1 etc. che funzionerร come un loop fino ad arrivare al fatidico 100 momento in cui il programma si fermerร . Notiamo, infine, che ilย body loop (corpo del loop) รจ racchiuso in un block (blocco), ovvero รจ delimitatoย da delle parentesi graffe { } e che la variabile nel while-statement va sempre inizializzata prima di esso.
Ilย for-statement funziona esattamente come il while-statement a parte il fatto che la variabile per il loop chiamataย loop variableย oย control variable non si posiziona prima ma all’interno dello statement.
Un errore comune nella scrittura di questo programma puรฒ essere:ย “‘square’ was not declared in this scope” in tal caso รจ altamente probabile che abbiate scritto invece di sqrt qualcos’altro come, per esempio, square per esteso oppure abbiate dimenticato di includere la libreria math.h in apertura.
Lo stesso programma per calcolare i quadrati dei numeri fino a 100 puรฒ essere reso con il for-statement in questo modo:
//Calcola e scrivi una tavola di quadrati da 0 a 99 usando il for-statement #include "iostream" #include "string" #include "math.h" using namespace std; int main() { int i=0; //inizia da 0 for (int i=0; i<100; ++i); cout <<i<<'\t'<<sqrt(i)<<'\n'; }
Per creare il loop bisogna dichiarare la variabile i ed inizializzarla con zero o qualsivoglia numero come avviene nel while-statement. Dopodichรฉ preceduti dalย for e tra parentesi metteremo in ordine l’integer i, la condizione necessaria per concludere il loop a 100ย ed il loop stesso per aumentare ogni volta il numero precedente di 1:ย (int i=0; i<100; ++i).
Il comandoย sqrt(i)ย รจ una funzione, ovvero una sequenza di affermazioni che possono dare un risultato, dove la (i) รจ il suo argomento. Normalmente si definisce una funzione separatamente per rendere la computazione logicamente separata e chiara, per testarla facilmente e per poterla utilizzare in piรน sezioni del nostro programma.
Lascia un commento