Informatica 6 Tipi di dato
Nelle celle di memoria di un calcolatore ci sono solo “0” e “1”, fisicamente realizzati tramite due diversi livelli di tensione elettrica A seconda di come questi “0” e “1” vengono interpretati dal calcolatore, si hanno diversi tipi di informazione Un tipo di dato definisce i possibili valori che il dato può assumere, e le possibili operazioni che si eseguono su di esso
Classificazione dei tipi (1) Tipi semplici vs. tipi strutturati – i tipi semplici sono quelli più adatti a rappresentare informazioni semplici, tipicamente a carattere numerico (ad es.: una temperatura) – i tipi strutturati sono quelli usati per rappresentare unità di informazione più complesse, con diverse componenti (ad es.: una data)
Classificazione dei tipi (2) Tipi built-in vs. tipi user-defined – i tipi built-in (o predefiniti) sono quelli già presenti nel linguaggio di programmazione (ad es.: int) – i tipi user-defined (o definiti dall’utente) sono quelli definiti dal programmatore tramite appositi comandi, forniti dal linguaggio, di costruzione di nuovi tipi
Tipi semplici e built-in int è un tipo numerico semplice e built-in char è un tipo non-numerico bensì alfabetico, ma sempre semplice e built-in (i suoi valori vanno sempre scritti tra apici: char c = ‘d’; a differenza delle stringhe che sono strutturate e vogliono le virgolette: string s = “ciao”;) In memoria, una variabile int occupa 4 byte, mentre una variabile char solo 1 byte Altri tipi numerici semplici e built-in sono (con le rispettive dimensioni di variabile): short int (2 byte), long int (4 byte), float (4 byte), double (8 byte) Naturalmente, maggiore è la dimensione dedicata a una variabile di un tipo, più vasta è la gamma di valori che tale variabile può assumere: una variabile int può assumere valori tra e 32767, una variabile long int da a
Tipi user-defined (1) Tramite la parola chiave typedef, in C++ è data al programmatore la possibilità di definire nuovi tipi, in diversi modi Ridenominazione (typedef ) typedef int intero; /*si definisce un nuovo tipo chiamato “intero” che è esattamente come int*/ intero x = 5;
Tipi user-defined (2) Enumerazione (typedef { } ) typedef {blu, rosso, verde} colore; /*si definisce un nuovo tipo chiamato “colore” le cui variabili possono assumere uno dei valori elencati*/ colore c = blu; Il calcolatore costruisce una corrispondenza implicita tra i valori elencati e gli interi: blu == 0, rosso == 1, verde == 2
Tipi user-defined (3) Tipi strutturati user-defined (typedef { } ) typedef {int giorno; int mese; int anno;} data; /*si crea il tipo “data” le cui variabili contengono 3 “campi”, chiamati “giorno”, “mese”, “anno”, che sono tutti di tipo int*/
Tipi user-defined (4) I diversi campi di una struttura possono essere di tipi diversi, a loro volta strutturati Per accedere a un campo di una variabile strutturata si usa la “dot notation” (notazione col punto) data oggi; oggi.giorno = 15; oggi.mese = 1; oggi.anno = 2010;
Conversioni automatiche di tipo (1) Attenzione: se si mischiano variabili di diverso tipo in una stessa istruzione, il calcolatore esegue delle conversioni automatiche di tipo Ad es.: int totale; float x = 5.75; int y = 3; totale = x + y; /*quanto vale totale?*/ totale vale 8, perché anche se esiste una regola che prevede che, sommando numeri di tipo diverso, tutti gli addendi vengano convertiti al tipo più generale (quindi: 3 -> 3.0 perché float è più generale di int), alla fine la variabile di destinazione è di tipo int, quindi la parte decimale viene troncata (non approssimata)
Conversioni automatiche di tipo (2) Esiste inoltre una convenzione che regola la conversione tra int e bool bool -> int true viene interpretato come 1, false come 0 int -> bool 0 viene interpretato come false, tutti gli altri interi come true E’ sconsigliato fare uso di queste conversioni nei programmi