CODEXSPRAWL

sulle tracce della periferia cibernetica

Lezione 5. Le conversioni in C++

Conversione-300x276Abbiamo parlato fin’ora di objects, variables, types, values e assignments dando un’occhiata a vari esempi ed esercizi. Qui si concluderà il capitolo dedicato specificamente a tutto questo: successivamente ci sposteremo verso la computation, o computazione.

CONVERSIONI SICURE

Abbiamo visto, precedentemente, come non sia possibile comparare un double ad un int direttamente poiché il primo è utilizzato per i numeri reali mentre il secondo esclusivamente per quelli interi.

Logicamente con C++ possiamo utilizzare un modo indiretto per fare ciò.

Il char, o character, è un tipo di variabile che consente di memorizzare un singolo carattere. Quando, per esempio, vogliamo trattare un insieme di elementi come un’unità singola (ad esempio, l’insieme A di tutti gli amici con gli occhi verdi) allora possiamo utilizzare questo tipo di variabile. I chars non si possono aggiungere direttamente ma c’è un modo per convertirli in modo che nessuna informazione venga persa: questo passaggio si chiama CHARS-TO-INT.

chars a = 'x';
int i1 = a;
int i2 = 'x';

Il character x nel codice ASCII 8-bit equivale al numero intero 120. Qui, come potete notare, i1 ed i2 prendono il valore, quindi, di 120.

Piccola digressione per chi non ne fosse a conoscenza: ASCII è un acronimo che sta per American Standard Code for Information Interchange. Poiché non esistono caratteri che si possono direttamente immagazzinare si utilizza questo codice per dare loro un valore equivalente in digitale.

Detto questo, e tornando all’esempio, possiamo ora copiare il risultato dell’int nel char ed ottenere così il valore originale:

char a2 = i1;
cout <<a <<'' << i1 <<'' <<c2 << '\n';

Questo stamperà quindi “x120x”.

Se vogliamo, quindi, convertire un valore ad un suo eguale oppure alla sua approssimazione migliore allora le seguenti conversioni si possono dire sicure:

bool to char
bool to int
bool to double
char to int
char to double
int to double

La conversione più utilizzata è quella da int a double (int to double) perché dà la possibilità di mescolare insieme int e doubles all’interno delle espressioni. Va ricordato però che se abbiamo un grosso int la conversione in double perderà la sua precisione.

Vi ricordo che BOOL è una variabile booleana che può assumere solo due valori: vero e falso.

CONVERSIONI NON SICURE

Le conversioni sicure, in realtà, sono molto rare ma C++ ci da anche la possibilità di crearne di non sicure: ciò significa che possiamo implicitamente cambiare un valore da un type ad un altro che non equivale a quello originario. Per esempio:

//Conversione non sicura
#include "iostream"
#include "string"
using namespace std;

int main ()
{
    int a = 20.000;
    char c = a;      //prova a far entrare un grosso int in un piccolo char
    int b = c;       
    if (a! = b)      
             cout <<"oops! " <<a <<"!= " <<b <<'\n';
    else
             cout <<"Wow! Abbiamo grossi caratteri qui!\n";
}

Come sempre sono stati impostati titolo, libreria utilizzata (iostream), il possibile uso di stringhe e il solito std come spiegato precedentemente nelle prime lezioni.

Nel corpo della funzione possiamo notare che, prima di tutto, abbiamo fissato il valore di int a a 20.000 dopodiché abbiamo dato l’ordine al programma di piazzare questo grosso numero in un piccolo insieme chiamato char c. Infine, abbiamo assegnato all’int b il valore derivato da c (int b = c). Da qui abbiamo deciso che se (if) il valore a non è uguale (!) a b il programma dovrà notarlo mentre in un altro caso (else) dovrà notare che stiamo lavorando con dei grossi caratteri.

Questo tipo di conversioni vengono chiamate anche NARROWING, ovvero ristrette, perché piazzano un valore in un oggetto che potrebbe risultare essere troppo piccolo ed è anche per questo che tali conversioni vengono dette non sicure: il valore archiviato, infatti, potrebbe differire enormemente da quello assegnato.

Infatti, un character può contenere valori molto piccoli, in un computer per esempio esso corrisponde ad 1 byte mentre un int equivale a ben 4 bytes. Per intenderci, graficamente:

char:     □
int: □□□□

In un computer la gamma dei valori dei caratteri (char values) è [-128:127] ma solamente [0,127] è trasferibile poiché, come avevamo visto nella Lezione 1, non tutti i computer sono pc e diversi strumenti risultano avere gamme di char values differenti.

Ora, diamo un attimo un’occhiata all’esercitazione, piuttosto lunga, che si trova alla fine del terzo capitolo del libro di Stroustrup su C++ e che serve a ripassare un attimino tutto quello di cui abbiamo fin’ora parlato.

Dopodiché in un articolo successivo che dedicherò esclusivamente a questo posterò una delle possibili soluzioni all’esercizio spiegando come organizzarlo al meglio. Inoltre, farò un piccolo parallelo con lo stesso programma scritto però in Python che, come abbiamo visto nella prima lezione, sicuramente risulterà semplificato rispetto a quello in C++.

ESERCIZIO FINALE DI RICAPITOLAZIONE

Il compito è il seguente. Dovrete provare a scrivere un programma che produca una semplice lettera che corrisponda a questi punti:

  1. Far inserire all’utente il nome della persona a cui vuole scrivere.
  2. Aggiungere una linea di introduzione del tipo “Ciao, come stai? Non ci sentiamo da un po’” ricordando di evitare l’uso diparole accentate per ora.
  3. Far inserire all’utente il nome di un altro amico/a.
  4. Chiedere all’utente se la seconda persona è maschio o femmina utilizzando il char friend_sex ed inizializzandolo con il valore 0. Dopodiché utilizzare due if statments per scrivere qualcosa del tipo:
    “Se vedi Pincopalla per piacere digli di chiamarmi” oppure “Se vedi Vattelapesca chiedile di chiamarmi, per favore”.
  5. Chiedere all’utente di scrivere la propria età e far scrivere al programma “Ho sentito che hai compiuto X anni di recente”.
  6. Se l’età risulta essere 0 o meno oppure dai 110 in su dare il comando al programma di rispondere error(“stai scherzando!)”.
  7. Aggiungere anche i seguenti comandi alla lettera:
    Se il tuo amico ha meno di 12 anni, scrivi “Il prossimo anno avrai age+1”.
    Se il tuo amico ha 17 anni, scrivi “Il prossimo anno potrai finalmente votare”.
    Se il tuo amico ha più di 17 anni, scrivi “Spero di vederti presto per festeggiare”.
  8. Aggiungi in fine “Un abbraccio, ” seguito dal tuo nome o nickname.

Logicamente potrete scrivere la lettera come preferite. Controllate infine se il programma funziona a dovere utilizzando per esempio il sito: cpp.sh.

Ricordatevi una cosa importante: possibilmente il vostro compiler non sarà in grado di riconoscere gli accenti facendo girare il programma quindi, per ovviare a questo inconveniente, limitatevi a sostituirli con l’apostrofo. Per esempio, nel vostro programma il verbo è diverrà e’.

Tra una settimana posterò on-line la soluzione dell’esercizio. Nel frattempo, buono studio!

Lascia un commento

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