CODEXSPRAWL

sulle tracce della periferia cibernetica

Lezione 7. Loop: Switch, While and For-Statement in C++

perfection loop 1Nella 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-statmentIl 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 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

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *