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-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.


Scopri di piรน da CODEXSPRAWL

Abbonati per ricevere gli ultimi articoli inviati alla tua e-mail.

Lascia un commento

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