6. Tipi di dato Informatica - CDL in Ingegneria Industriale- A.A Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Indice Tipi di dato astratti Classificazione dei tipi di dato Tipi semplici predefiniti Costruzione di nuovi tipi semplici Tipi strutturati Regole di compatibilità Informatica - CDL in Ingegneria Industriale- A.A
Tipi di dati astratti Tipo di dato : tipo di informazione, di natura eterogenea( interi, reali, caratteri, array, fatture, conti correnti, pagine web, …) Definizione generale di tipo di dato: Insieme di valori e di operazioni ad esso applicabili Tipo astratto: conta la visione esterna, non la rappresentazione interna, ovvero il punto di vista di chi usa il tipo, non di chi lo realizza –Immaginiamo di dover trattare direttamente come stringhe di bit la divina commedia, una pagina web, … –Inoltre potremo talvolta usare diverse rappresentazioni concrete per la stessa astrazione Informatica - CDL in Ingegneria Industriale- A.A
Dichiarazioni di tipo In C è necessario associare un tipo a tutte le variabili, al momento della dichiarazione; ciò comporta che: –Per ogni variabile è possibile determinare l’insieme dei valori ammissibili e delle operazioni ad essa applicabili –Per ogni variabile è calcolabile a priori la quantità di memoria necessaria: la memoria per l’esecuzione di tutto il programma può essere calcolata in fase di compilazione (eccezione: allocazione dinamica) –E’ possibile rilevare errori nell’uso delle variabili durante la compilazione del programma: espressioni o assegnamenti coinvolgenti variabili eterogenee Informatica - CDL in Ingegneria Industriale- A.A
In base alla complessità delle informazioni rappresentate: –Tipi semplici (interi, caratteri, reali, …): rappresentano informazione logicamente indivisibile –Tipi strutturati (array, …): rappresentano informazione logicamente scomponibile In base all’ utilizzabilità nel linguaggio: –Tipi predefiniti nel linguaggio(built in): interi, caratteri, … –Tipi definiti dall’utente per soddisfare le infinite e imprevedibili esigenze(user defined): fattura, data,… –N:B. tale classificazione dipende dal linguaggio: in C variabili come età, data, conto_corrente non sono predefiniti(devono essere costruiti dal programmatore); in altri linguaggi “special purpose” potrebbero esserlo (e.g. data nei fogli elettronici) Informatica - CDL in Ingegneria Industriale- A.A Tipi di dato: classificazioni Informatica - CDL in Ingegneria Industriale- A.A
Tipi semplici predefiniti del C Tipo predefinitoDenominazioni alternative char signed char unsigned char signed short intsigned short, short signed intsigned, int signed long intlong int, signed long, long unsigned short intunsigned short unsigned intunsigned unsigned long intunsigned long float double long double charcaratteri intinteri floatreali doublereali in precisione doppia Tipi base shortcondizionano lo spazio allocato per le variabili long signedcondizionano i valori assumibili dalle variabili unsigned Qualificatori Informatica - CDL in Ingegneria Industriale- A.A
Il tipo int: dominio Il tipo int in C è un approssimazione del tipo intero matematico, dai valori infiniti Lo spazio allocato per la rappresentazione e l’insieme dei valori dipendono dalla macchina: in genere un variabile di tipo int è memorizzata in una parola di memoria Se il compilatore gestisce short e long int vale la regola: spazio allocato (short int)≤ spazio allocato (int) ≤ spazio allocato (long int) I tipi unsigned int e signed int sono gestiti come visto per i naturali e i relativi nel capitolo 4 – spazio allocato (signed int)= spazio allocato (unsigned int) – cambia l’insieme dei valori rappresentabili, ma non lo spazio di rappresentazione Informatica - CDL in Ingegneria Industriale- A.A
Operazioni built-in per dati di tipo int =Assegnamento di un valore int a una variabile int +Somma (tra int ha come risultato un int) -Sottrazione (tra int ha come risultato un int) *Moltiplicazione (tra int ha come risultato un int) /Divisione con troncamento della parte non intera (risultato int) %Resto della divisione intera ==Relazione di uguaglianza !=Relazione di diversità <Relazione “minore di” >Relazione “maggiore di” <=Relazione “minore o uguale a” >=Relazione “maggiore o uguale a” Informatica - CDL in Ingegneria Industriale- A.A Il tipo int: operazioni Informatica - CDL in Ingegneria Industriale- A.A
I tipi float e double: dominio Approssimano i numeri reali come limite e precisione di rappresentazione Due diverse rappresentazioni: 1. la normale rappresentazione decimale, o in virgola fissa: la rappresentazione in virgola mobile (floating point) mantissa ed esponente (della base 10), separate dal carattere “E” può essere rappresentato in virgola mobile nei modi seguenti: E E E+6, …. Le notazioni sono interscambiabili e la macchina provvede automaticamente alle necessarie conversioni La quantità di memoria allocata dipende dalla macchina ma vale la seguente regola: Spazio allocato (float) spazio allocato (double) spazio allocato (long double) Informatica - CDL in Ingegneria Industriale- A.A
I tipi float e double: operazioni Operazioni built-in per dati di tipo float e double =Assegnamento +Somma -Sottrazione *Moltiplicazione /Divisione (a risultato reale) ==Relazione di uguaglianza !=Relazione di diversità <Relazione “minore di” >Relazione “maggiore di” <=Relazione “minore o uguale a” >=Relazione “maggiore o uguale a” Informatica - CDL in Ingegneria Industriale- A.A
I tipi float e double La standard library fornisce anche diverse funzioni matematiche predefinite: (sqrt, pow, exp, sin, cos, tan...) (per double ). Attenzione agli arrotondamenti: –(x/y) * y == x potrebbe risultare falsa ! –Invece di scrivere if (x == y)...è meglio scrivere: if (x <= y && y <= x ).. Informatica - CDL in Ingegneria Industriale- A.A
Il tipo char L’insieme dei dati di tipo char, è l’insieme dei caratteri ASCII, e contiene tutte le lettere, le cifre e i simboli disponibili sulle normali tastiere. caratteri di controllo: –\n = “a capo”, \b = “backspace”, \t = “horizontal tab”, \r = “carriage return”, ETX, EOF,.... La codifica ASCII consente la rappresentazione di ciascun carattere attraverso un opportuno valore intero, per cui le operazioni sono quelle definite sugli interi: –È definito l’ordinamento dei valori: per qualsiasi coppia di caratteri x e y, x < y se e solo se x precede y nell’elenco dei caratteri –Sono definite le operazioni di assegnamento (=), le operazioni aritmetiche (+, –, *, /, %) e quelle relazionali (==, !=, < ecc.) La memoria allocata è di un byte, anche con i qualificatori signed e unsigned Informatica - CDL in Ingegneria Industriale- A.A
Esempio /* Programma Manipolazione Caratteri */ #include main() { char C, CM; printf("Inserire un carattere – # per terminare il programma\n"); scanf(“ %c", &C); /*NB lo spazio prima di %*/ while (C != '#') { printf("Il codice ASCII del carattere %c è %d\n", C, C); /* Se il carattere è una lettera minuscola */ if (C >= 'a' && C <= 'z') { /* La differenza 'a' – 'A' è lo scarto fra la rappresentazione ASCII delle lettere maiuscole e minuscole dell'alfabeto */ CM = C – ('a' –'A'); printf("La lettera maiuscola per %c è %c e il suo codice ASCII è %d\n", C, CM, CM); } printf("Inserire un carattere – # per terminare il programma\n"); scanf(“ %c", &C); } Informatica - CDL in Ingegneria Industriale- A.A
La costruzione di nuovi tipi in C Regola sintattica: typedefintanno; Una volta definito e identificato un nuovo tipo ogni variabile può essere dichiarata di quel tipo come di ogni altro tipo già esistente: –charx; –annoy; NB: typedef non consente di costruire veri e propri nuovi tipi astratti (mancano le operazioni …) Informatica - CDL in Ingegneria Industriale- A.A
Ridefinizione typedef TipoEsistente NuovoTipo; TipoEsistente può essere sia un tipo built-in (predefinito), sia un tipo precedentemente definito: – typedefinttipo1; –typedefchartipo2; –typedeftipo1tipo3; –typedeftipo2tipo4; Informatica - CDL in Ingegneria Industriale- A.A
Enumerazione esplicita dei valori typedef enum{lun, mar, mer, gio, ven, sab, dom} GiornoDellaSettimana; typedefenum{rosso, verde, giallo, arancio, marrone, nero} colore; typedefenum{Giovanni, Claudia, Carla, Simone, Serafino} persone; typedefenum{gen, feb, mar, apr, mag, giu, lug, ago, set, ott, nov, dic} mese; Dichiarazioni: –personeindividuo, individuo1, individuo2; Istruzioni: –individuo = Giovanni; –if (individuo1 == individuo2) individuo = Claudia; Informatica - CDL in Ingegneria Industriale- A.A
Enumerazione esplicita dei valori Alcune osservazioni: –Spesso i valori del nuovo tipo sono rappresentati da nomi; però il compilatore associa a tali nomi un progressivo valore intero –Per esempio, x di tipo mese: gen è in realtà 0, apr è in realtà 3, ecc. Operazioni applicabili: le stesse degli interi –Le seguenti operazioni: apr < giu rosso < arancio producono come risultato un intero diverso da 0 (valore logico “true”); –Le seguenti operazioni: dom < lun Simone < Giovanni producono 0 (valore “false”). Informatica - CDL in Ingegneria Industriale- A.A
Enumerazione esplicita dei valori Un importante caso particolare: typedefenum{false, true} boolean; boolean flag, ok; flag e ok possono così essere definite come variabili in grado di assumere valore vero (true) o falso (false) durante l’esecuzione di un programma che le usi. NB: non invertire l’ordine! Informatica - CDL in Ingegneria Industriale- A.A
Tipi strutturati Il C non mette a disposizioni tipi strutturati built in E’ possibile usare dei costruttori di tipo per definire tipi strutturati: –Array : costruisce un tipo di dato i cui elementi sono sequenze omogenee di valori appartenenti ad un unico tipo –Struct: costruisce un tipo di dato i cui elementi sono sequenze eterogenee di valori appartenenti a tipi diversi –Puntatore: costruisce tipi semplici tramite l’indirizzo della cella di memoria che li contiene Informatica - CDL in Ingegneria Industriale- A.A
I tipi strutturati: Il costruttore array Gli array si dichiarano come segue: –Tipo di dato Identificatore array[numero elementi] –Esempio: intlista[20]; La dichiarazione è un’abbreviazione per: typedefintarrayAnonimo[20]; /*Definizione del nuovo tipo arrayAnonimo*/ arrayAnonimo lista; /*Dichiazione di variabile di tipo arrayAnonimo*/ Si possono costruire array che contengono elementi di tipo user defined typedef enum {bianco, rosso, verde}colore colore colori[20] Informatica - CDL in Ingegneria Industriale- A.A
Dichiarazione mediante nuovo tipo: typedef doubleVettoreDiReali[20]; VettoreDiRealiv1, v2, v3; Più semplice e altrettanto chiara: doublev1[20], v2[20], v3[20]; Dichiarazione mediante nuovi tipi: typedefdoublePioggeMensili[12]; typedefdoubleIndiciBorsa[12]; PioggeMensiliPiogge01, Piogge02, Piogge03; IndiciBorsaIndici01, Indici02, Indici03; Preferibile a: doublePiogge01[12], Piogge02[12], Piogge03[12], Indici01[12], Indici02[12], Indici03[12]; Array: Quando esplicitare il nome del tipo? Informatica - CDL in Ingegneria Industriale- A.A
Matrici E’ possibile definire un array di array (una matrice): typedefintVettore[20]; typedefVettoreMatriceIntera20Per20[20]; MatriceIntera20Per20matrice1; –Oppure, più brevemente: typedefintMatriceIntera20Per20[20][20]; MatriceIntera20Per20matrice1; –Ancor più brevemente: int matrice1[20][20]; E’ possibile definire array di array di array…: intmatriceTridimensionale1[10][20][30] Informatica - CDL in Ingegneria Industriale- A.A
Dimensione degli array Un array ha dimensioni fisse minor flessibilità del linguaggio typedef charString[30]; StringNome, Cognome; –Parole corte provocano spreco di memoria (fisica) –Parole lunghe: dovremmo anche prevedere istruzioni del tipo: if (LunghezzaParola == 30) printf("Parola troppo lunga"); Perché? Principio dell’allocazione statica della memoria: stimando a priori la grandezza delle variabili si evita di ricercare parti della memoria fisicamente disponibili sulla macchina stessa durante l’esecuzione Informatica - CDL in Ingegneria Industriale- A.A
Un parziale rimedio (1) /* Programma InvertiSequenza */ #include main() { intContatore; intMemorizzazione[100]; Contatore = 0; while (Contatore < 100) /* si ricordi che il valore dell'indice di un array di 100 elementi varia da 0 a 99 */ { scanf("%d", &Memorizzazione[Contatore]); Contatore = Contatore + 1; } Contatore = Contatore – 1; while (Contatore >= 0) { printf("%d\n", Memorizzazione[Contatore]); Contatore = Contatore – 1; } E se invece di 100 la sequenza fosse lunga 1000? Informatica - CDL in Ingegneria Industriale- A.A
Un parziale rimedio (2) /* Program InvertiSequenza */ #include #define LunghezzaSequenza 100 main() { intContatore; intMemorizzazione[LunghezzaSequenza]; Contatore = 0; while (Contatore < LunghezzaSequenza) { scanf("%d", &Memorizzazione[Contatore]); Contatore = Contatore + 1; } Contatore = Contatore – 1; while (Contatore >= 0) { printf("%d\n", Memorizzazione[Contatore]); Contatore = Contatore – 1; } NB: la stessa cosa non si poteva fare con la dichiarazione const Informatica - CDL in Ingegneria Industriale- A.A
Assegnamento tra array: attenzione! Dati i seguenti array: typedefintanArray[10]; anArrayArray1, Array2; L’istruzione: Array2 = Array1; E’ scorretta! Sarà necessaria un’istruzione ciclica che “scorra” i singoli elementi dell’array(capiremo il perché in seguito) Informatica - CDL in Ingegneria Industriale- A.A
Programma concatenazione stringhe (1) #include #define LunghezzaArray 50 main() { inti, j, k; charTempCar; charArray1[LunghezzaArray], Array2[LunghezzaArray]; /* Nella seguente dichiarazione il valore LunghezzaArray]*2 è un valore costante calcolato a tempo di compilazione */ charArrayConc[LunghezzaArray*2]; /* Legge la prima stringa assicurandosi che essa non superi la dimensione dell'array, 50 caratteri /* i = 0; while (i < LunghezzaArray) /* Si ricordi che il valore dell'indice di un array di LunghezzaArray elementi è compreso fra 0 e LunghezzaArray–1 */ { scanf("%c", &TempCar); Array1[i] = TempCar; i = i + 1; } Informatica - CDL in Ingegneria Industriale- A.A
… /* Legge la seconda stringa assicurandosi che essa non superi la dimensione dell'array, 50 caratteri /* i = 0; while (i < LunghezzaArray) { scanf("%c", &TempCar); Array2[i] = TempCar; i = i + 1; } /* Confronta le due stringhe per capire quale precede l'altra in ordine alfabetico */ i = 0; while (i < LunghezzaArray && Array1[i] == Array2[i]) i = i+1; if(i == LunghezzaArray || Array1[i] < Array2[i]) /* Le due stringhe sono uguali o la prima precede la seconda in ordine alfabetico */ … Programma concatenazione stringhe (2) Informatica - CDL in Ingegneria Industriale- A.A
… /* Le due stringhe sono uguali o la prima precede la seconda in ordine alfabetico */ { k = 0; j = 0; while (j < LunghezzaArray) { ArrayConc[k] = Array1[j]; k = k + 1; j = j + 1; } j = 0; while (j < LunghezzaArray) { ArrayConc[k] = Array2[j]; k = k + 1; j = j + 1; } else … Programma concatenazione stringhe (3) Informatica - CDL in Ingegneria Industriale- A.A
… /* Se la seconda stringa precede la prima in ordine alfabetico, ossia se (Array2[i] < Array1[i]) */ { k = 0; j = 0; while (j < LunghezzaArray) { ArrayConc[k] = Array2[j]; k = k + 1; j = j + 1; } j = 0; while (j < LunghezzaArray) { ArrayConc[k] = Array1[j]; k = k + 1; j = j + 1; } /* Stampa la stringa ottenuta dalla concatenazione */ k = 0; while (k < (LunghezzaArray*2)) {printf("%c", ArrayConc[k]); k = k + 1;} } Programma concatenazione stringhe (4) Informatica - CDL in Ingegneria Industriale- A.A
I tipi strutturati: Il costruttore struct Esempi di informazioni da formalizzare con i tipi strutturati: –Tipo impiegato: nome, cognome, codice fiscale, indirizzo, numero di telefono, eventuali stipendio, data di assunzione… –Tipo famiglia: un certo insieme di persone, un patrimonio, costituito a sua volta da un insieme di beni, ognuno con un suo valore, un reddito annuo, spese varie, … Queste strutture informative sono eterogenee: l’array non si presta a questo tipo di aggregazione. Il costruttore di record (parola chiave struct in C) è la risposta a questo tipo di esigenze Gli elementi eterogenei aggregati in un’unica struttura si chiamano campi della struttura Informatica - CDL in Ingegneria Industriale- A.A
typedef char String[50 ]; typedef struct{intGiorno; intMese; intAnno; } Data; typedef struct{StringDestinatario; intImporto; Data DataEmissione; } DescrizioneFatture; Il costruttore struct: Esempi Informatica - CDL in Ingegneria Industriale- A.A
typedef enum {On, Off} AccType; typedef struct{intCanale; AccTypeAccensione; doubleCursoreLuminosita, CursoreColore, CursoreVolume; } CanaliTV; Il costruttore struct: Esempi Informatica - CDL in Ingegneria Industriale- A.A
typedef enum {Dirigente, Impiegato, Operaio} CatType; typedef struct{StringNome; String Cognome; int Stipendio; char CodiceFiscale[16]; Data DataAssunzione; CatTypeCategoria; } Dipendenti; Il costruttore struct: Esempi Informatica - CDL in Ingegneria Industriale- A.A
La dichiarazione di variabili procede poi come al solito: DipendentiDip1, Dip2; Oppure è possibile definire il nuovo tipo in forma anonima e nello stesso tempo dichiarare le variabili: struct{ StringNome; StringCognome; int Stipendio; char CodiceFiscale[16]; DataDataAssunzione; CatTypeCategoria; } Dip1, Dip2; Il costruttore struct: Dichiarazione di variabili Dichiarazione di variabili Informatica - CDL in Ingegneria Industriale- A.A
Per accedere alle singole componenti del record, si usa una notazione detta dot notation: Dip1.Stipendio = Dip1.Stipendio + (Dip1.Stipendio*10) / 100; Dip1.DataAssunzione.Giorno = 3; Dip1.DataAssunzione.Mese = 1; Dip1.DataAssunzione.Anno = 1993; if (Dip1.Cognome[0] == 'A') … DichiarazioneFattureArchivioFatture[1000]; if(ArchivioFatture[500].DataEmissione.Anno <= 2000) printf("%d", ArchivioFatture[500].Importo); else printf("La fattura in questione è stata emessa dopo il 2000\n"); Accesso alle componenti del record Informatica - CDL in Ingegneria Industriale- A.A
Assegnamento tra record Una stranezza del C: come abbiamo visto, non è permesso scrivere un assegnamento tra array Array2 = Array1; Invece: Dip1 = Dip2; E’ lecito e fa esattamente ciò che ci si aspetta: copia l’intera struttura Dip1 in Dip2, comprese le sue componenti che sono costituite da array! Il perché di questa stranezza risiede nel modo in cui in C sono realizzati gli array Informatica - CDL in Ingegneria Industriale- A.A
Il costruttore puntatore (1) Informatica - CDL in Ingegneria Industriale- A.A Puntatore ad una variabile: –indica l’indirizzo della variabile a cui fa riferimento –costruisce tipi semplici –Consente di riferirsi ad una variabile tramite indirizzo e non solo tramite nome Dichiarazione di una variabile puntatore: typedefTipoDato*TipoPuntatore; definisce il tipo TipoPuntatore come un puntatore ad una cella di memoria contenente un valore di tipo TipoDato Dereferenziazione: *P indica la cella di memoria il cui indirizzo è contenuto in P typedefTipoDato*TipoPuntatore; TipoPuntatoreP; TipoDatox; P Valore di tipo TipoDato Informatica - CDL in Ingegneria Industriale- A.A
Il costruttore puntatore (2) L’operatore unario & significa “indirizzo di” ed è il duale dell’operatore ‘ * ’. typedefTipoDato*TipoPuntatore; TipoPuntatoreP, Q; TipoDatoy, z; P = &y; Q = &z; P = Q; y e z sono di tipo TipoDato mentre P e Q sono puntatori a variabili di tipo TipoDato. Informatica - CDL in Ingegneria Industriale- A.A
*P = x; P 23 x Il costruttore puntatore : Esempi P x *P = 14; x = 23; Informatica - CDL in Ingegneria Industriale- A.A
P x P x x = *P; Il costruttore puntatore : Esempi Informatica - CDL in Ingegneria Industriale- A.A
P = &y; P 14 y Q = &z; Q 23 z Attenzione: è vero che P = Q; *P = *Q; ?? P = Q; Il costruttore puntatore : Esempi Informatica - CDL in Ingegneria Industriale- A.A
typedefTipoDato*TipoPuntatore; typedefAltroTipoDato*AltroTipoPuntatore; TipoDato*Puntatore; TipoDato**DoppioPuntatore; TipoPuntatoreP, Q; AltroTipoPuntatoreP1, Q1; TipoDatox, y; AltroTipoDatoz, w; istruzioni corrette:istruzioni scorrette : Puntatore = &y; P1 = P; (warning) DoppioPuntatore = &P; w = *P; (error) Q1 = &z; *DoppioPuntatore = y; (warning) P = &x; Puntatore = DoppioPuntatore; (warning) P = Q; *P1 = *Q; (error) *P = *Q; *Puntatore = x; P = *DoppioPuntatore; z = *P1; Puntatore = P; Puntatori e tipi Informatica - CDL in Ingegneria Industriale- A.A
Una tipica abbreviazione del C... Definiamo un record e dichiariamo una variabile puntatore: typedef struct{intPrimoCampo; charSecondoCampo; } TipoDato; TipoDato x, *P; P = &x; Accesso al campo PrimoCampo di x, attraverso il puntatore P, usando la dot notation: (*P).PrimoCampo = 12; /* Inserisce 12 nel campo PrimoCampo di x */ Esiste una sintassi abbreviata: P–>PrimoCampo = 12; /* Inserisce 12 nel campo PrimoCampo di x */ Informatica - CDL in Ingegneria Industriale- A.A
Costruttore puntatore: operazioni Operazioni applicabili a variabili puntatori: –assegnamento dell’indirizzo di una variabile tramite l’operatore unario &; –assegnamento del valore di un altro puntatore; –assegnamento del valore speciale NULL. Se una variabile puntatore ha valore NULL, *P è indefinito: P non punta ad alcuna informazione significativa. –l’operazione di dereferenziazione, indicata dall’operatore *; –il confronto basato sulle relazioni ==, !=, >, =; –operazioni aritmetiche –l’assegnamento di indirizzi di memoria a seguito di operazioni di allocazione esplicita di memoria Informatica - CDL in Ingegneria Industriale- A.A
Esempio /* Programma Dirigenti */ #include main() { typedef enum{dirigente, impiegato, operaio CatLav; typedef struct{charNome[30]; charCognome[30]; CatLavCategoria; intStipendio; charCodiceFiscale[16]; } Lavoratore; LavoratoreDatiLavoratori[300]; Lavoratore*Management[10];... Informatica - CDL in Ingegneria Industriale- A.A
/* Programma Dirigenti (continuazione) */... i = 0; while (i < 10) { if (Management[i]–>Stipendio > ) { j = 0; while (j < 30) { printf("%c", Management[i]–>Cognome[j]); j = j + 1; } printf("%d \n", Management[i]–>Stipendio); } i = i + 1; } Esempio Informatica - CDL in Ingegneria Industriale- A.A
“Rischi” dei puntatori Effetti collaterali (side effects): –Esempio *P = 3; *Q = 5; P= Q; /* a questo punto *P = 5 */ *Q = 7; A questo punto *Q = 7, ma anche *P = 7 Un assegnamento esplicito alla variabile puntata da Q determina un assegnamento nascosto alla variabile puntata da P. Caso particolare di aliasing, ovvero del fatto che uno stesso oggetto viene identificato in due modi diversi Informatica - CDL in Ingegneria Industriale- A.A
Array e puntatori (1) Il nome di una variabile di tipo array viene considerato in C come l’indirizzo della prima parola di memoria che contiene il primo elemento della variabile di tipo array (lo 0-esimo …). Se ne deduce: –a “punta” a una parola di memoria esattamente come un puntatore; –a punta sempre al primo elemento della variabile di tipo array (è un puntatore “fisso” al quale non è possibile assegnare l’indirizzo di un’altra parola di memoria) Informatica - CDL in Ingegneria Industriale- A.A
Compatibilità tra tipi (1) Espressioni che coinvolgono elementi eterogenei in tipo Un’espressione aritmetica come x + y è caratterizzata dal valore e dal tipo del risultato. Il tipo degli operandi condiziona l’operazione che deve essere eseguita. (A operandi di tipo int si applica l’operazione di somma propria di tale tipo, diversa è l’operazione di somma che si applica a operandi di tipo float ecc.) Se x è di tipo short e y di tipo int è necessario convertire una delle due variabili per rendere omogenea l’espressione e applicare la corretta operazione. x viene temporaneamente convertita in int e la somma tra interi restituisce un risultato intero Informatica - CDL in Ingegneria Industriale- A.A
Compatibilità tra tipi (2) Regole di conversione implicita: –ogni variabile di tipo char o short (incluse le rispettive versioni signed o unsigned) viene convertita in variabile di tipo int; –se dopo l’esecuzione del passo 1 l’espressione risulta ancora eterogenea rispetto al tipo degli operandi coinvolti, rispetto alla gerarchia int < long < unsigned < unsigned long < float < double < long double si converte temporaneamente l’operando di tipo inferiore facendolo divenire di tipo superiore; il risultato dell’espressione avrà tipo uguale a quello di più alto livello gerarchico Informatica - CDL in Ingegneria Industriale- A.A
Compatibilità tra tipi (3) Assegnamenti che coinvolgono elementi eterogenei in tipo Le regole di conversione implicita esposte vengono utilizzate anche per la valutazione di assegnamenti tra variabili eterogenee in tipo: –Esempio Double d; inti; d = i; provoca una temporanea conversione del valore dell’intero i a double e successivamente l’assegnamento di tale valore double a d Invece: i = d; comporta, normalmente, una perdita di informazione. Il valore di d subisce infatti un troncamento alla parte intera con perdita della parte decimale. Puntatori e tipizzazione delle variabili puntate: Viene segnalato dal compilatore il tentativo di utilizzo congiunto di puntatori dichiarati come puntanti a dati di tipo differente Informatica - CDL in Ingegneria Industriale- A.A
Errori a Compile-time ed errori a Run-time Le regole di uso dei tipi del C sono tutte verificabili “a compile-time” Questa caratteristica viene anche indicata come tipizzazione forte; non tutti i linguaggi ne sono dotati Altri errori “a compile-time”: –Errato annidamento di parentesi –Mancata o errata dichiarazione di variabile –… Errori a run-time: –Divisione per 0 –Indice di un array fuori dai limiti –Accesso ad una variabile non inizializzata –… Informatica - CDL in Ingegneria Industriale- A.A
Esempi completi da svolgere in classe 1.Un reparto ospedaliero deve gestire la situazione dei propri posti letto. Ogni posto letto è caratterizzato da un numero di stanza, un piano, una lettera che indica il letto all’interno della stanza, una disponibilità (libero o occupato). Si progetti tramite flow-chart strutturato e si codifichi successivamente in C un programma che consenta di: –Acquisire i posti letto in una struttura dati opportuna –Visualizzare il numero di posti disponibili in reparto e quelli totali Informatica - CDL in Ingegneria Industriale- A.A
Esempio 1, flow-chart Informatica - CDL in Ingegneria Industriale- A.A inizio elenco[i].stanza, elenco[i].piano, elenco[i].letto, elenco[i].dispo fine “Inserisci letto (stanza, piano, lettera e disponibilità (0-libero, 1-occupato)” elenco[i]. dispo==0 si no i=0 i<n n “Quanti letti?” i++ si no i=0; d=0 i<n i++; d=d+1 no si d,n
Esempi completi da svolgere in classe 2.Una società che conduce sondaggi deve realizzare un programma per gestire i risultati dei sondaggi in una struttura dati opportuna. Ogni risultato è caratterizzato dalle seguenti informazioni: voto espresso (può assumere uno dei valori: sì, no, non so, non rispondo), percentuale di voti, numero assoluto di votanti. Si progetti tramite flow-chart strutturato e si codifichi successivamente in C un programma che consenta di acquisire i risultati e calcolare la percentuale coperta dagli intervistati che non hanno espresso opinioni (che hanno votato non so oppure non rispondo). Informatica - CDL in Ingegneria Industriale- A.A
Esempio 2, flow-chart Informatica - CDL in Ingegneria Industriale- A.A inizio fine risultato[i].valore ==2||risultato[i]. valore ==3 si no i=0 i<4 i++ si no i=0; tot=0 i<4 i++; tot=tot+ risultato[i].percentuale no si tot Inserisci voto: valore(0-si, 1-no, 2-non so, 3-non rispondo), percentuale e numero votanti risultato[i].valore, risultato[i].percentuale, risultato[i].votanti no si no
Esempi completi da svolgere in classe 3. Date le seguenti definizioni: typedef enum {Battesimo, Prima_Comunione, Compleanno, Cresima} tipo_festa; typedef struct { tipo_festa tipo; int ora; char luogo[30]; char CF[16]; float costo; }festa; festa *p, *q, festa1; dire se ciascuna delle seguenti istruzioni è valida e perché: *p.luogo= q->luogo; p->ora = festa1->ora; festa1.tipo=”Battesimo”; *q.tipo= Cresima; Informatica - CDL in Ingegneria Industriale- A.A
Esercizi 1.Un’agenzia immobiliare deve tenere taccia delle proposte d’acquisto relative agli appartamenti che ha in vendita. Ogni proposta è caratterizzata da un codice che individua l’appartamento, un proprietario, un probabile acquirente, un costo proposto e una data. Scrivere un programma che consenta di acquisire le informazioni di un record e successivamente mostrarle a video 2.Un centro di rilevazione meteo deve gestire le informazioni giornaliere relative alle temperature del mese di Febbraio Ogni record è caratterizzato dalle seguenti informazioni: il giorno di Febbraio interessato, la città, la temperature minima, la temperatura massima, l’eventuale presenza di precipitazioni e un campo descrittivo del tipo di precipitazione (pioggia, neve o grandine), che deve risultare vuoto in caso di assenza di precipitazioni. Scrivere un programma che consenta di acquisire le informazioni di un record e successivamente mostrarle a video. Informatica - CDL in Ingegneria Industriale- A.A
Esercizi 1.Una società di capitale deve tenere traccia dei propri soci e di tutte le informazioni che li riguardano in una struttura dati opportuna. Ogni socio è caratterizzato dalle seguenti informazioni: il nome, il cognome, il codice fiscale, la quota societaria posseduta(in percentuale), il ruolo (che può essere socio semplice, amministratore o consigliere). Scrivere un programma che consenta di acquisire le informazioni di tutti i soci e successivamente calcolare la percentuale coperta dai soci che hanno cariche speciali (amministratore o consigliere). 2.Date le seguenti definizioni: typedef enum {Battesimo, Prima_Comunione, Compleanno, Cresima} tipo_festa; typedef struct { tipo_festa tipo; int ora; char luogo[30]; char CF[16]; float costo; }festa; festa *p, *q, festa1; dire se ciascuna delle seguenti istruzioni è valida e perché: *p.costo= 350; p->ora = q.ora; festa1.tipo=5; *q.tipo=Cresima; Informatica - CDL in Ingegneria Industriale- A.A