Lezione 6. La computazione in C++

turingmachineL’ultima volta, attraverso lo sviluppo di un esercizio (come scrivere una lettera in C++) abbiamo visto, partendo dalle basi, come meglio sviluppare un programma seguendo tre regole specifiche:

  • Semplicità
  • Correttezza
  • Efficenza

Queste vanno sempre tenute in conto ogni qualvolta ci approcciamo alla scrittura di un qualsiasi tipo di programma.

Oggi, inizieremo ad occuparci della COMPUTATION, ovvero della computazione, la quale definisce il semplice atto di produzione di output basati su degli input come, per esempio, la produzione (output) del risultato “25” proveniente dall’argomento “5” (input) usando la computazione square. In altre parole da “5” otteniamo, utilizzando la funzione del quadrato, il numero “25”.

La costruzione fondamentale di un blocco di programmi è denominata ESPRESSIONE. Questa computa un valore partendo da un numero di operanti (anche il nome delle variabili sono considerate espressioni.

Normalmente i programmi utilizzano parecchie costanti. Per esempio, un programma di geometria potrebbe usare il π (pi greco) denominato, in C++, pi ed un programma di conversione da pollici a centrimetri. Ovviamente per questo tipo di costanti si cercano di utilizzare sigle significative, come pi = 3,14159 poiché non vogliamo, accidentalmente, cambiarle.

Inoltre, C++ offre la nozione di COSTANTE SIMBOLICA che è un oggetto già nominato a cui non su può assolutamente dare un nuovo valore. Un’altra nozione da tenere in conto ESPRESSIONE COSTANTE, ovvero un’espressione con un valore INT composto esclusivamente da costanti.

const int max = 17; //espressione costante
int val = 19
max+2  //espressione costante (un int costante più un letterale
val+2  //non è un'espressione costante: usa una variabile

Nella tabella sottostante potete leggere una lista di più comuni operatori utilizzati presa dal libro di Stroustrup Programming principles and practice using C++.Str1

La contrazione lval indica il valore che appare sulla parte sinistra dell’assignment.

Va notato, inoltre, che l’espressione a<b<c sta per (a<b)<c e che a<b si misura con un valore Booleano ovvero vero o falso. Cosicché a<b<c sarà eguale a true<c e false<c. In specifico questa espressione è inutile poiché è una comparazione tra due operatori e, semmai venisse trovata all’interno di un codice di programmazione, potrebbe essere facilmente un errore.

Un incremento può essere espresso in tre diversi modi: ++a oppure a+=1 o ancora a=a+1 si preferisce utilizzare, però, il primo perché esprime il concetto in modo più diretto e semplice degli altri due.

Spesso nei programmi abbiamo bisogno di scegliere tra varie alternative ed in questo caso si utilizzano l’if-statement e lo switch-statment.

Il primo seleziona semplicemente tra due alternative, vediamo come in specifico:

//Esempio di if-statement
#include "iostream"
#include "string"
using namespace std;
int main ()
{
    int a=0;
    int b=0;
    cout <<"Per favore scrivi due numeri interi \n";
    cin>>a>>b;
    if (a<b)    //condizione
           //prima alternativa presa se la condizione risulta vera:
           cout <<"max(" <<a<< "," <<b<<") is " <<b<<"\n";
     else
           //seconda alternativa presa se la condizione risulta falsa
           cout <<"max(" <<a<< "," <<b<<") is " <<a<< "\n";
return 0;
}

Come possiamo notare dall’esempio, dopo aver scelto come sempre le librerie (iostream e string) ed aver fatto la premessa di utilizzare std dove serve (con il comando using namespace std) abbiamo aperto il corpo della funzione descrivendo i dati: prima di tutto abbiamo azzerato i due int che andiamo ad utilizzare, ovvero a e b dopodiché abbiamo chiesto al programma di dare un input all’utente, ovvero quello di scrivere due numeri primi. L’operatore cin come è già stato più volte detto si riferisce allo standard input stream definito dalla libreria standard e, assieme all’operatore >> che significa “prendi da” specifica dove l’input deve andare.

L’if-statment sceglie tra le due alternative: se la sua condizione è vera il programma esegue il la prima affermazione (ovvero max(a,b) is a); se, invece, è vera la seconda possibilità il programma esegue la seconda soluzione (cioè max(a,b) is b).

In altre parole il programma mette in forma un linguaggio che in semiotica viene chiamato semi-simbolico in cui una categoria dell’espressione corrisponde ad una categoria del contenuto come per esempio verticale/orizzontale e affermazione/negazione. Facendo un esempio pratico: all’espressione semaforo verde corrisponde il contenuto “posso attraversare la strada” ed al semaforo rosso “mi devo fermare”.

Vediamo, ora, un ultimo esempio ovvero il programma di conversione dell’unità di misura da pollici a centrimetri.

//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;
}

Come prima, dopo aver definito le librerie e posto l’std veniamo al corpo della funzione ponendo l’espressione costante di cui abbiamo parlato inizialmente e ponendola come double, ovvero, espressione costante in numeri reali e non interi come avverrebbe, invece, usando int. Quindi, scriveremo const double seguito, in questo caso, dalle unità che vogliamo convertire e ponendo il loro valore specifico di conversione ovvero cm_per_inch = 2.54. Dopodiché utilizzeremo un integer letterale, in questo caso length che significa lunghezza, per inizializzare la variabile e il char, o character che sarebbe un tipo di variabile che consente di memorizzare un singolo carattere, ponendo uno spazio vuoto tra gli apostrofi che servirà successivamente al programma per scegliere tra “p” e “c” (ovvero pollici e centimetri).

Il cout, ormai, sappiamo bene cosa significa: il programma darà un input all’utente per inserire un unità seguita dalla lettera c o p (ancora parliamo sempre si c per centimetri e p per pollici). Ed, ovviamente, come sempre cout sarà seguito da cin come indicato nell’esempio precedente.

Ora, per prima cosa chiediamo al nostro programma di controllare l’unità “p”: if (unit==’p’) e, nel caso l’unità fosse “p”, ovvero pollici, di inserire il calcolo di conversione corretto, ovvero moltiplicherà il valore di conversione con la lunghezza cm_per_inch*lenght.

Se, invece, else if l’unità inserita dall’utente sarà in centimetri (unit==’c’) allora il programma convertirà i centimetri in pollici dividendo la lunghezza per il valore di conversione lenght/cm_per_inches.

E, se, infine else l’utente avrà inserito un unità non riconosciuta dal nostro programma questi avvertirà dell’accaduto grazie al comando cout.

Come sempre, quando scrivete un programma, fate attenzione ai piccoli errori ed alle dimenticanze e ricordatevi che dopo if, if else e else non ci va il punto e virgola mentre, di norma, deve esserci negli altri tipi di comandi.

Potete, inoltre, provare a correre i vostri programmi utilizzando questo link: http://cpp.sh/.

Share the love

Comincia la discussione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.