| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
Le elaborazioni di un computer coinvolgono dati che possono essere di vari tipi. La stessa elaborazione può fornire risultati diversi a seconda del tipo di dato: se si considerano, per esempio, i dati 2 e 12 e si vuole stabilire un ordine, la risposta sarà diversa a seconda se si intendono i due dati come numeri o come caratteri. Nel primo caso, facendo riferimento al valore, la risposta sarà 2, 12. Se, invece, l'ordinamento va inteso in senso alfabetico, la risposta sarà 12, 2 (allo stesso modo di AB, B). È necessario stabilire in che senso vanno intesi i valori.
In generale, in rapporto al tipo di elaborazione, in Informatica si fa distinzione fra tipo carattere o alfanumerico e tipi numerici. Se sui dati si vogliono effettuare operazioni aritmetiche, questi devono essere definiti come tipo numerico, in caso contrario vanno definiti come tipo carattere.
In realtà il discorso è più complesso: se per il tipo carattere c'è ben poco da dire, il tipo numerico pone problemi non indifferenti per la conservazione nella memoria di un computer. Basta dire che i numeri sono infiniti e che lo può essere pure la parte decimale di un numero, che la memoria di un computer è limitata, che la codifica interna è in binario e quindi rappresentazioni molto estese per numeri anche piccoli come valore, per affermare che possono esserci più alternative in ragione dello spazio occupato in memoria e della precisione con cui si vuole conservare il numero.
Si aggiunga, a quanto sopra, che nelle applicazioni reali i dati, quasi mai, sono in formato semplice ma si presentano spesso in strutture più complesse.
I linguaggi di programmazione mettono a disposizione un insieme di tipi elementari e dei metodi per costruire strutture complesse: i tipi utente che verranno trattati successivamente.
C++ mette a disposizione 6 tipi elementari identificati dalle parole chiavi: char, int, float, double, bool, void. A parte il tipo void che verrà affrontato più avanti:
le variabili di tipo char possono conservare, ciascuna, un carattere. Il carattere può essere conservato nella variabile utilizzando, al solito modo, lo stream di input cin, o, in una istruzione di assegnazione, racchiudendolo fra singoli apici
... char alfa, beta; cin >> alfa; // riceve da tastiera un carattere e lo mette nella variabile beta = 'Z'; // assegna direttamente il carattere ...
le variabili dei tipi int, float, double possono conservare numeri. Questi tipi permettono anche l'uso di modificatori che variano l'occupazione di memoria della variabile e, quindi, le caratteristiche del numero conservato. I modificatori ammessi sono short, long, unsigned.
#include <iostream>
#include <limits>
using namespace std;
int main()
{
cout << "bit intero " << numeric_limits<int>::digits << endl;
cout << "cifre intero " << numeric_limits<int>::digits10 << endl;
cout << "minimo intero " << numeric_limits<int>::min() << endl;
cout << "massimo intero " << numeric_limits<int>::max() << endl;
cout << "\nbit short " << numeric_limits<short>::digits << endl;
cout << "cifre short " << numeric_limits<short>::digits10 << endl;
cout << "minimo short " << numeric_limits<short>::min() << endl;
cout << "massimo short " << numeric_limits<short>::max() << endl;
cout << "\nbit float " << numeric_limits<float>::digits << endl;
cout << "cifre float " << numeric_limits<float>::digits10 << endl;
cout << "minimo float " << numeric_limits<float>::min() << endl;
cout << "massimo float " << numeric_limits<float>::max() << endl;
cout << "\nbit double " << numeric_limits<double>::digits << endl;
cout << "cifre double " << numeric_limits<double>::digits10 << endl;
cout << "minimo double " << numeric_limits<double>::min() << endl;
cout << "massimo double " << numeric_limits<double>::max() << endl;
cout << "\nbit long double " << numeric_limits<long double>::digits << endl;
cout << "cifre long double " << numeric_limits<long double>::digits10 << endl;
cout << "minimo long double " << numeric_limits<long double>::min() << endl;
cout << "massimo long double " << numeric_limits<long double>::max() << endl;
return 0;
}
il programma proposto serve per far visualizzare alcune caratteristiche importanti delle variabili dichiarate in quel modo. In particolare viene chiesta la visualizzazione, per ogni tipo, di quantità bit occupati (digits), quantità cifre di precisione (digits10), valore minimo (min()) e valore massimo (max()) conservabili. Non è importante spiegare il senso delle singole righe, è importante solo sapere cosa produce questo programma perché è fondamentale, nella scrittura di un programma qualsiasi, conoscere il grado di affidabilità di un valore numerico conservato e come dichiarare la variabile in modo da consentirne la corretta conservazione.
Nella macchina utilizzata per le prove dei programmi riportati in questi appunti, e con il compilatore utilizzato, si ottengono questi risultati:
bit intero 31 cifre intero 9 minimo intero -2147483648 massimo intero 2147483647 bit short 15 cifre short 4 minimo short -32768 massimo short 32767 bit float 24 cifre float 6 minimo float 1.17549e-38 massimo float 3.40282e+38 bit double 53 cifre double 15 minimo double 2.22507e-308 massimo double 1.79769e+308 bit long double 64 cifre long double 18 minimo long double 3.3621e-4932 massimo long double 1.18973e+4932
Ogni variabile di tipo int occupa 31 bit in memoria, può contenere solo numeri interi e i valori ammissibili variano tra i margini riportati (margine di rappresentatività). Se si applica il modificatore short, l'occupazione di memoria cambia e di conseguenza anche il margine di rappresentatività.
... int a; short b; // non e' necessario specificare int ... a = 15; b = 20; ...
Se si vuole conservare un numero con parte intera e parte decimale è necessario dichiarare la variabile di tipo virgola mobile (floating point) float o double. In questi casi il problema, da considerare, non è il margine di rappresentatività, ambedue consentono la conservazione di numeri con valori estremamente elevati (si vedano il valore minimo e massimo scritti in notazione esponenziale), ma la precisione. Il tipo float utilizza 24 bit e garantisce sei cifre di precisione (singola precisione). In pratica il numero può essere molto grande come valore (1038) ma non può contenere più di 6 cifre diverse da 0: va bene 12340000000000000 ma non 123456789. Il secondo valore non è conservato in modo corretto.
Il tipo double, al costo di maggiore occupazione di memoria, garantisce un numero maggiore di cifre precise (doppia precisione). Se si ha necessità di una precisione maggiore si può dichiarare la variabile di tipo long double e si arriva a 18 (quadrupla precisione).
... float c; double d; long double e; ... c = 123.23; d = 456970.345; e = 789.0 // in ogni caso deve essere inserita la parte decimale ...
Il modificatore unsigned potrebbe, per esempio, esserci necessità di utilizzarlo per aumentare il margine di rappresentatività di un int: invece di utilizzare 31 bit per il numero e 1 bit per il segno, si utilizzerebbero tutti e 32 bit per conservare il valore numerico. La variabile potrebbe contenere numeri, fino al doppio del valore precedente, ma solo positivi.
le variabili di tipo bool sono utilizzate quando serve conservare indicatori del verificarsi/non verificarsi di eventi e permettono la conservazione dei valori simbolici true e false.
... bool test; test = false; if (i<100) test = true; ...
| http://ennebi.solira.org |
ennebi@solira.org |