-
n1md4.
User deleted
I tipi di dati e gli operatori
I Tipi di dati offerti dal linguaggio C++
Ok, sarà un pò noioso, ma alla fine se non avrete letto le lezioni di teoria introduttiva, non capirete nulla dei programmi. Vi limiterete a copiare il codice e a farlo funzionare, magari cambiando il nome dell'autore nel vostro?? Brutta cosa :/
Invece, con una conoscenza basilare del linguaggio, potrete modificare i programmi a vostro piacimento e crearne di vostri. Detto ciò fate come vi pare. Io inizio..
C++ definisce vari tipi di dati che vanno dai numeri interi (6), ai valori cosiddetti "booleani" (Vero o Falso), ai caratteri ('D'), ai numeri in virgola mobile (6.54), alle stringhe ("Ciao io sono paolo."), e così via...
Esistono 7 tipi standard:
Tipo Significato
char Caratteri
wchar_t Caratteri estesi
int Numeri interi
float Numeri in virgola mobile
double Numeri in virgola mobile a precisione doppia
bool Valori booleani
void Non-valori
Inoltre il linguaggio C++ consente di impiegare vari "modificatori" dei tipi base detti sopra. Un "modificatore" altera il significato del tipo base e lo rende più adatto alla situazione del programma. I modificatori sono:
signed
unsigned
long
short
Al tipo int per esempio, possono essere applicati tutti. Al tipo char invece solo "signed" e "unsigned". Al tipo double solo il modificatore "long", e così via... Per utilità, vi riporto una tabella che mostra tutte le combinazioni valide di tipi e modificatori assieme al loro intervallo minimo garantito.
- Tutti i tipi di dati numerici definiti dal linguaggio C++ con i valori minimi garantiti dallo standard ANSI / ISO
TIPO INTERVALLO MINIMO
char da -127 a 127
unsigned char da 0 a 255
signed char da -127 a 127
int da -32 767 a 32 767
unsigned int da 0 a 65 535
signed int come int
short int da -32 767 a 32 767
unsigned short int da 0 a 65 535
signed short int come short int
long int da -2 147 483 647 a 2 147 483 647
signed long int come long int
unsigned long int da 0 a 4 294 967 295
float da 1E-37 a 1E+37, con sei cifre di precisione
double da 1E-37 a 1E+37, con dieci cifre di precisione
long double da 1E-37 a 1E+37, con dieci cifre di precisione
Non spaventatevi di questa tabella, perché non serve a molto. Tenete presente che comunque se scrivete un programma che sfora di poco questi valori, molte volte il programma non subisce nessun errore. Infatti la vera ampiezza dell'intervallo dati, dovrebbe essere riportata nella documentazione del compilatore. Inoltre dipendono dall'ambiente dove si lavora (ad esempio su Windows 2000 si va a 32 bit), ma a voi questo non interessa troppo per ora.
Gli Interi (int)
Come già visto, le variabili "int" possono contenere numeri interi senza componenti frazionari. Le variabili di tipo int vengono spesso utilizzate per contare i cicli (come abbiamo visto nel ciclo "for") o le istruzioni condizionali ("if"). Inoltre i tipi "int" possono essere con segno o senza segno ("signed" o "unsigned"). Per default, (cioé per impostazione predefinita), gli int sono presi per numeri con segno "signed", dunque scrivere
signed int var;
è considerato ridondante, cioé ripetitivo e inutile. Un intero con segno può dunque essere positivo o negativo. Un intero senza segno invece, "unsigned", può essere solo positivo. La differenza tra "signed" e "unsigned" è piuttosto complessa perché si basa sull'interpretazione dei bit di ordine più elevato. Siccome vi complicherei solo la vita, non ve lo spiegherò, tanto non vi servirebbe a nulla oltre che per conoscenza personale. Ricordate solo che un valore "signed" e uno "unsigned" sono diversi. Giusto un solo esempio:
CODICE:SPOILER (click to view)#include <iostream>
void main()
{
short int i; //Intero short con segno
short unsigned j; //Intero short senza segno
j = 60000;
i = j;
printf("%d", i);
printf("n");
printf("%d", j);
}
Questo programma dà come output
-5536
60000
perché il numero 60000 rientra nell'intervallo di un "unsigned short int", ma non nell'intervallo di un "signed short int". Pertanto nell'assegnamento a ' i ' verrà interpretato come un valore negativo. Tutto questo solo per dirvi che una conversione da un intero senza segno ad uno con segno, può generare errori. Stateci attenti.
I Caratteri
Le variabili di tipo char contengono caratteri interi ASCII a 8 bit come A, Z o G o qualsiasi altra quantità a 8 bit. Per specificare un carattere, questo deve essere racchiuso tra apici:
char letter;
letter = 'X';
printf("%c", letter);
L'output di questo pezzo di codice è X. Notare che per stampare a video un carattere singolo si usa il flag " %c ". Anche il tipo char può essere modificato con "signed" o "unsigned". Nella maggior parte dei compilatori un valore char è dotato di segno. Ecco un esempio di utilizzo del tipo char per stampare a video tutte le lettere dell'alfabeto:
CODICE:SPOILER (click to view)//Stampa a video tutto l'alfabeto
#include <iostream>
void main()
{
char letter;
for(letter = 'A'; letter <= 'Z'; letter++)
printf("%cn", letter);
}
In queso codice, il ciclo "for" può sembrare un pò strano, ma in verità è del tutto normale. Le lettere sono rappresentate ciascuna da un numero (vedi il codice ASCII ). La lettera 'A' è il 65, mentre la 'B' il 66, la 'C' il 67 e così via. Dunque il ciclo "for" interpreta le lettere come interi con segno da 65 a 90 ( 'Z' ) ed esegue l'operazione senza problemi.
Il tipo wchar_t contiene caratteri di un set molto esteso. Infatti questo tipo è stato aggiunto al linguaggio C++ per integrare gli insufficienti 8 bit per altre lingue come il cinese, che definiscono un gran numero di caratteri. Non parleremo del tipo wchar_t perché non credo che dobbiate scrivere programmi in cinese.
I tipi in virgola mobile
I tipi float e double vengono utilizzati ogni qualvolta devono essere definiti numeri con componenti frazionari. Una variabile double conserva numeri 10 volte più grandi di una di tipo float. Inoltre il tipo più utilizzato è il double poiché quasi tutte le funzioni matematiche definite nella libreria del C++, usano valori double. Ecco un semplice esempio del Teorema di Pitagora:
CODICE:SPOILER (click to view)/*
Uso del teorema di Pitagora per trovare la
lunghezza dell'ipotenusa data la lunghezza
dei due lati opposti.
*/
#include <iostream>
#include <cmath> //Header necessario per "sqrt"
void main()
{
double x, y, z;
x = 3;
y = 4;
z = sqrt(x*x + y*y);
printf("L'ipotenusa e' %g", z);
}
L'output del programma è : "L'ipotenusa e' 5". Poiché "sqrt" fa parte della libreria di funzioni matematiche, richiede l'utilizzo dell'header . Il tipo long double consente di far lavorare con numeri estremamente grandi o piccoli. Di solito si usa per applicazioni scientifiche, come l'analisi di dati astronomici.
Il tipo bool "booleano"
Il tipo bool è relativamente recente per il linguaggio C++. Questo definisce due costanti booleane: true (vero) e false (falso) che sono gli unici due valori che può assumere una variabile bool. Ogni valore diverso da 0, in C++ viene interpretato come true, ogni valore pari a 0, come false. Ecco un programma di esempio:
CODICE:SPOILER (click to view)//Uso dei valori booleani
#include <iostream>
void main()
{
bool b;
b = false;
printf("b e' %d", b);
printf("n");//A capo
b = true;
printf("b e' %d", b);
printf("n");//A capo
//Controllo dell'istruzione "if" con un valore booleano
if (b)
printf("Questa istruzione e' eseguita");
b = false;
if (b)
printf("Questa istruzione non e' eseguita");
printf("n");//A capo
//Risultato di un operatore relazionale: vero o false
printf("10 > 9 e' %d", (10 > 9));
printf("n");//A capo
}
L'output sarà:
b e' 0
b e' 1
Questa istruzione e' eseguita
10 > 9 e' 1
Per il controllo di una variabile booleana, con l'istruzione "if", non è necessario scrivere
if (b == true)...
Basta scrivere solo if (b) ... poiché la variabile di tipo bool basta da sola.
Il tipo void
Per ora non dico molto perché potrebbe complicare le cose inutilmente. Il tipo void specifica un'espressione senza valore, come una funzione che per esempio chiude il programma e non vogliamo nessun valore di ritorno, cioé non ce ne frega se è andata a buon fine o se ha fallito.
I letterali stringa
C++ supporta le stringhe. Una stringa è un insieme di caratteri racchiuso tra doppi apici. Ad esempio "Ciao io sono paolo". Già abbiamo visto vari esempi di stringhe nei programmi fatti fin qui. Alcune sequenze di caratteri hanno un significato particolare per il compilatore, (ad esempio n fa tornare a capo la riga), allo stesso modo alcuni caratteri specifici, (se noi volessimo inserire dei doppi apici all'interno della stringa?). Per questo esistono delle sequenze di escape per caratteri. Ecco l'elenco di queste sequenze:
CODICE SIGNIFICATO
b Backspace (cancella carattere precedente)
f Form Feed
n New Line
r Carriage Return
t Tabulazione Orizzontale
" Doppi apici
' Apice
Barra Inversa
v Tabulazione Verticale
a Segnale acustico
? Punto interrogativo
N Costante ottale (dove N è una costante ottale)
xN Costante esadecimale (dove N è una costante esadecimale)
Nota bene: una stringa di un carattere, non è uguale ad un tipo carattere: "K" non è uguale a 'K'. Forse in sostanza le due cose possono produrre simili risultati, ma il per il compilatore, sono due tipi totalmente diversi.
Gli operatori aritmetici
Gli operatori aritmetici sono i seguenti:
OPERATORE SIGNIFICATO
+ Somma
- Sottrazione (e meno unario)
* Moltiplicazione
/ Divisione
% Modulo
++ Incremento
-- Decremento
Gli operatori +, -, * e / sono normali operatori algebrici e possono essere utilizzati per qualsiasi tipo di dati numerico, compreso il tipo char. L'operatore di modulo % fornisce il resto di una divisione intera. Quando si fa una divisione con un numero intero, il resto viene troncato. Per esempio 10 / 3 è 3. Per ottenere il resto di una divisione si usa %. 10 % 3 sarà uguale a 1. Attenzione: % può essere applicato solo agli operandi interi, non ai tipi in virgola mobile. Gli operatori di incremento e decremento li abbiamo già visti, unica cosa da aggiungere è che possono essere scritti sia così:
y = x++;
sia così:
y = ++x;
Infine la precedenza degli operatori aritmetici è questa :
Più elevata ++ --
- (meno unario)
* / %
Meno elevata + -
Gli operatori aventi lo stesso livello di precedenza sono valutati da sinistra a destra. Naturalmente si possono usare delle parentesi.
Operatori Logici
Credo che a scuola abbiate fatto tutti gli operatori logici, in caso contrario questa parte vi creerà qualche problema. Gli operatori logici sono usati per supportare le operazioni logiche di base e sono AND, OR e NOT. Questi funzionano secondo la seguente tabella delle verità:
p q p AND q p OR q NOT p
False False False False True
False True False True True
True True True True False
True False False True False
La sintassi degli operatori logici è la seguente:
OPERATORI LOGICI SIGNIFICATO
&& AND
|| OR
! NOT
CODICE:SPOILER (click to view)//Uso degli operatori logici
#include <iostream>
void main()
{
bool a;
bool b;
a = true;
b = false;
if(a && b)
printf("a && b = true");
else
printf("a && b = false");
printf("n");
if(a || b)
printf("a || b = true");
else
printf("a || b = false");
printf("n");
if(!(a && b))
printf("!(a & b) = true");
else
printf("!(a & b) = false");
}
L'output del programma è
Gli operatori logici hanno una precedenza più bassa di quelli aritmetici. Un'espressione come 10 > 1 + 12 verrà valutata come 10 > (1 + 12). Il risultato è dunque falso. La precedenza degli operatori logici è la seguente:
Più elevata !
> >= < <=
== !=
&&
Meno elevata ||
Conversioni Cast
E' possibile infine forzare una espressione trasformandola in un altro tipo. Una conversione cast è appunto una conversione esplicita di tipo. Anche queste conversioni sono considerate degli operatori. Eco un esempio di conversione cast:
CODICE:SPOILER (click to view)//Conversioni cast
#include <iostream>
void main()
{
int i;
for (i = 1; i <= 10; ++i)
printf("%d / 2 e' uguale a: %gn", i, (float)i / 2 /*conversione !*/);
}
L'output del programma è
Questa lezione è stata abbastanza prolissa, ma adesso ne sono rimaste veramente poche di lezioni teoriche. Giusto qualche altro approfondimento e poi partiamo.
fonte: AlexMark.