Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dati Ing. Simona Colucci
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Indice Tipi di dati astratti Classificazione dei tipi di dati Tipi semplici predefiniti Costruzione di nuovi tipi semplici Tipi strutturati Regole di compatibilità
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 linsieme dei valori ammissibili e delle operazioni ad essa applicabili –Per ogni variabile è calcolabile a priori la quantità di memoria necessaria: la memoria per lesecuzione di tutto il programma può essere calcolata in fase di compilazione (eccezione: allocazione dinamica) –E possibile rilevare errori nelluso delle variabili durante la compilazione del programma: espressioni o assegnamenti coinvolgenti variabili eterogenee
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dato: classificazioni 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 dallutente 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)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 linsieme 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 linsieme dei valori rappresentabili, ma non lo spazio di rappresentazione
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Il tipo int: operazioni 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 )..
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Il tipo char Linsieme dei dati di tipo char, è linsieme 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 lordinamento dei valori: per qualsiasi coppia di caratteri x e y, x < y se e solo se x precede y nellelenco 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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); }
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 …)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Ridefinizione typedef TipoEsistente NuovoTipo; TipoEsistente può essere sia un tipo built-in (predefinito), sia un tipo precedentemente definito: – typedefinttipo1; –typedefchartipo2; –typedeftipo1tipo3; –typedeftipo2tipo4;
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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;
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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).
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 lesecuzione di un programma che le usi. NB: non invertire lordine!
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 lindirizzo della cella di memoria che li contiene
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 è unabbreviazione 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 colore{bianco, rosso, verde} colore colori[20]
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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?
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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]
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 dellallocazione statica della memoria: stimando a priori la grandezza delle variabili si evita di ricercare parti della memoria fisicamente disponibili sulla macchina stessa durante lesecuzione
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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?
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Assegnamento tra array: attenzione! Dati i seguenti array: typedefintanArray[10]; anArrayArray1, Array2; Listruzione: Array2 = Array1; E scorretta! Sarà necessaria unistruzione ciclica che scorra i singoli elementi dellarray(capiremo il perché in seguito)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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; }
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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: larray 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 ununica struttura si chiamano campi della struttura
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A typedef char String[50 ]; typedef struct{intGiorno; intMese; intAnno; } Data; typedef struct{StringDestinatario; intImporto; DataDataEmissione; } DescrizioneFatture; Il costruttore struct: Esempi
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A typedef enum {On, Off} AccType; typedef struct{intCanale; AccTypeAccensione; doubleCursoreLuminosita, CursoreColore, CursoreVolume; } CanaliTV; Il costruttore struct: Esempi
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A typedef enum {Dirigente, Impiegato, Operaio} CatType; typedef struct{StringNome; StringCognome; intStipendio; charCodiceFiscale[16]; DataDataAssunzione; CatTypeCategoria; } Dipendenti; Il costruttore struct: Esempi
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 lintera 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Il costruttore puntatore (1) Puntatore ad una variabile: –indica lindirizzo 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Il costruttore puntatore (2) Loperatore unario & significa indirizzo di ed è il duale delloperatore *. 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.
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A *P = x; P 23 x Il costruttore puntatore : Esempi P x *P = 14; x = 23;
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A P x P x x = *P; Il costruttore puntatore : Esempi
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 */
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Operazioni applicabili a variabili puntatori: –assegnamento dellindirizzo di una variabile tramite loperatore 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. –loperazione di dereferenziazione, indicata dalloperatore *; –il confronto basato sulle relazioni ==, !=, >, =; –operazioni aritmetiche –lassegnamento di indirizzi di memoria a seguito di operazioni di allocazione esplicita di memoria Costruttore puntatore: operazioni
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A /* 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];... Esempio
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Array e puntatori (1) Il nome di una variabile di tipo array viene considerato in C come lindirizzo 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 lindirizzo di unaltra parola di memoria)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Compatibilità tra tipi (1) Espressioni che coinvolgono elementi eterogenei in tipo Unespressione aritmetica come x + y è caratterizzata dal valore e dal tipo del risultato. Il tipo degli operandi condiziona loperazione che deve essere eseguita. (A operandi di tipo int si applica loperazione di somma propria di tale tipo, diversa è loperazione 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 lespressione e applicare la corretta operazione. x viene temporaneamente convertita in int e la somma tra interi restituisce un risultato intero
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 lesecuzione del passo 1 lespressione risulta ancora eterogenea rispetto al tipo degli operandi coinvolti, rispetto alla gerarchia int < long < unsigned < unsigned long < float < double < long double si converte temporaneamente loperando di tipo inferiore facendolo divenire di tipo superiore; il risultato dellespressione avrà tipo uguale a quello di più alto livello gerarchico
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 dellintero i a double e successivamente lassegnamento 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale - 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 –…