Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoGianni Castaldo Modificato 11 anni fa
1
Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 CDL in Ingegneria Meccanica - A.A. 2008-2009 6. Tipi di dati Ing. Simona Colucci
2
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Indice Tipi di dati astratti Classificazione dei tipi di dati Tipi semplici predefiniti Costruzione di nuovi tipi semplici Tipi strutturati Regole di compatibilità
3
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
4
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
5
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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)
6
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
7
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
8
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
9
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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: 3.14 1 234.543 328 543. 0.000 076 2. la rappresentazione in virgola mobile (floating point) mantissa ed esponente (della base 10), separate dal carattere E 1 780 000.000 0023 può essere rappresentato in virgola mobile nei modi seguenti: 178 000.000 000 23E1 17 800 000 000 023E-7 1.780 000 000 0023E+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)
10
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
11
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 +.000001 && y <= x +.000001)..
12
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
13
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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); }
14
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 …)
15
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Ridefinizione typedef TipoEsistente NuovoTipo; TipoEsistente può essere sia un tipo built-in (predefinito), sia un tipo precedentemente definito: – typedefinttipo1; –typedefchartipo2; –typedeftipo1tipo3; –typedeftipo2tipo4;
16
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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;
17
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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).
18
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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!
19
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
20
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 I tipi strutturati: Il costruttore array Gli array si dichiarano come segue: –Tipo di dati 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]
21
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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?
22
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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]
23
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
24
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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?
25
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
26
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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)
27
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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; }
28
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 … /* 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)
29
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 … /* 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)
30
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 … /* 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)
31
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
32
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 typedef char String[50 ]; typedef struct{intGiorno; intMese; intAnno; } Data; typedef struct{StringDestinatario; intImporto; DataDataEmissione; } DescrizioneFatture; Il costruttore struct: Esempi
33
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 typedef enum {On, Off} AccType; typedef struct{intCanale; AccTypeAccensione; doubleCursoreLuminosita, CursoreColore, CursoreVolume; } CanaliTV; Il costruttore struct: Esempi
34
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 typedef enum {Dirigente, Impiegato, Operaio} CatType; typedef struct{StringNome; StringCognome; intStipendio; charCodiceFiscale[16]; DataDataAssunzione; CatTypeCategoria; } Dipendenti; Il costruttore struct: Esempi
35
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
36
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
37
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
38
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
39
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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.
40
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 *P = x; P 23 x Il costruttore puntatore : Esempi P 23 14 x *P = 14; x = 23;
41
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 P 23 14 x P x x = *P; Il costruttore puntatore : Esempi
42
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 P = &y; P 14 y Q = &z; Q 23 z Attenzione: è vero che P = Q; *P = *Q; ?? P = Q; Il costruttore puntatore : Esempi
43
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
44
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 */
45
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 (gli ultimi due casi verranno trattati in seguito); Costruttore puntatore: operazioni
46
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 /* 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
47
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 /* Programma Dirigenti (continuazione) */... i = 0; while (i < 10) { if (Management[i]–>Stipendio > 5000000) { j = 0; while (j < 30) { printf("%c", Management[i]–>Cognome[j]); j = j + 1; } printf("%d \n", Management[i]–>Stipendio); } i = i + 1; } Esempio
48
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
49
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Array e puntatori (1) Loperatore sizeof produce il numero di byte occupati da ciascun elemento di un array o da un array nel suo complesso. –Se si usano quattro byte per la memorizzazione di un valore int: inta[5]; allora sizeof(a[2]) restituisce il valore 4 e: sizeof(a) restituisce il valore 20. 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)
50
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Array e puntatori (2) Il C consente di eseguire operazioni di somma e sottrazione su puntatori. Se p e a forniscono lindirizzo di memoria di elementi di tipo opportuno, p+i e a+i forniscono lindirizzo di memoria delli-esimo elemento successivo di quel tipo Se i è una variabile intera: la notazione a[i] è equivalente a *(a+i) Analogamente, se p è dichiarato come puntatore a una variabile di tipo int: la notazione p[i] è equivalente a *(p+i). Ne segue che: p = aè equivalente a p = &a[0]; p = a+1è equivalente ap = &a[1]; Mentre non sono ammessi assegnamenti ad a del tipo: a = p; a = a +1;
51
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Array e puntatori (3) Se p e q puntano a due diversi elementi di un array, p–q restituisce un valore intero pari al numero di elementi esistenti tra lelemento cui punta p e lelemento cui punta q, non la differenza tra il valore dei puntatori Supponendo che il risultato di p–q sia pari a 3 e supponendo che ogni elemento dellarray sia memorizzato in 4 byte, la differenza tra lindirizzo contenuto in p e lindirizzo contenuto in q darebbe 12
52
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
53
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
54
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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
55
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 –…
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.