tipi di dato un tipo di dato t è definito come: un dominio di valori, d un insieme di funzioni f...
TRANSCRIPT
![Page 1: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/1.jpg)
TIPI DI DATO
Un tipo di dato T è definito come:
un dominio di valori, D
un insieme di funzioni F1,..,Fn sul dominio D
un insieme di predicati P1,..,Pm sul dominio D
T = { D, {F1,...,Fn}, {P1,...,Pm} }
![Page 2: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/2.jpg)
COMPATIBILITÀ DI TIPO
Consiste nella possibilità di usare, entro certi limiti, oggetti di un tipo al posto di oggetti di un altro tipo.
Un tipo T1 è compatibile con un tipo T2 se
il dominio D1 di T1 è contenuto nel dominio D2 di T2.
– int è compatibile con float perché Z R
– ma float non è compatibile con int
![Page 3: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/3.jpg)
COMPATIBILITÀ DI TIPO
Se T1 è un tipo compatibile con T2, un operatore definito per T2 può essere utilizzato anche con parametri di tipo T1
In particolare se Op è definito per T2 come:Op: D2 D2 D2
allora può essere utilizzato anche per T1, come:Op: D1 D2 D2Op: D2 D1 D2
Gli operandi di tipo T1 sono convertiti automatica-mente nel tipo T2 - il risultato è sempre di tipo T2.
![Page 4: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/4.jpg)
COMPATIBILITÀ DI TIPO
Se T1 è un tipo compatibile con T2, un operatore definito per T2 può essere anche utilizzato con parametri di tipo T1
In particolare se Op è definito per T2 come:Op: D2 D2 D2
allora può essere utilizzato anche per T1, come:Op: D1 D2 D2Op: D2 D1 D2
Gli operandi di tipo T1 sono convertiti automatica-mente nel tipo T2 - il risultato è sempre di tipo T2.
3 / 4.2 è una divisione fra reali, in cui il primo operando è convertito automaticamente da int a double
3 % 4.2 è una operazione non ammissibile, perché 4.2 non può essere convertito in int
![Page 5: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/5.jpg)
CONVERSIONI IMPLICITE
1) Ogni variabile di tipo char o short (eventualmente con qualifica signed o unsigned) viene convertita in int
2) Se dopo il passo 1 l'espressione è ancora eterogenea, si converte temporaneamente l'operando di tipo inferiore al tipo superiore:
char int long int float double long double
3) A questo punto l'espressione è omogenea e viene invocata l'operazione opportuna. Il risultato è dello stesso tipo.
![Page 6: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/6.jpg)
CONVERSIONI IMPLICITE
Esempio
int x;char y;double r;
L’espressione:(x+y) / r
produce un risultato di tipo double.
![Page 7: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/7.jpg)
COMPATIBILITÀ IN ASSEGNAMENTO
• In un assegnamento, l’identificatore di variabile e l’espressione devono essere dello stesso tipo
• Se così non è, scatta una conversione implicita
Esempioint x=5; char y='a'; double r=3.1415;
x = y; /* conversione da char ad int */x = y+x;r = y; /* char --> int --> double */
![Page 8: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/8.jpg)
COMPATIBILITÀ IN ASSEGNAMENTO• In generale, sono automatiche le conversioni di
tipo che non provocano perdita d’informazione• Espressioni che possono provocare perdita di
informazioni non sono però illegali
Esempioint x=5; float f=2.71F;; double d=3.1415;
f = f+i; /* int convertito in float */i = d/f; /* double convertito in int !*/
f = d; /* arrotondamento o troncamento */Possibile Warning: conversion may lose significant
digits
![Page 9: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/9.jpg)
CAST
• In qualunque espressione è possibile forzare una particolare conversione utilizzando l'operatore di cast
( <tipo> ) <espressione>
Esempi
int i=5; long double x=7.77; double y=7.1;
i = (int) sqrt(384);
x = (long double) y*y;
i = (int) x % (int)y;
![Page 10: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/10.jpg)
TIPI DI DATO
I tipo di dato, scalari o strutturati, si differen-ziano in predefiniti e definiti dall’utente.
tipi di dato
predefiniti definiti
dall'utente
costruttoripredefiniti
definitidall'utenteint
charfloatdouble
enum []structunion
puntatoriscalari strutturati
![Page 11: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/11.jpg)
TIPI DI DATO
Ogni elaboratore è intrinsecamente capace di trattare domini di dati di tipi primitivi
– numeri naturali, interi, reali – caratteri e stringhe di caratteri
e quasi sempre anche collezioni di oggetti, mediante la definizione di tipi strutturati
– array, strutture
Altri tipi possono essere definiti dall’utente.
![Page 12: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/12.jpg)
TIPI DEFINITI DALL’UTENTE
• In C, l’utente può introdurre nuovi tipi tramite una definizione di tipo
• La definizione associa a un identificatore (nome del tipo) un tipo di dato
– aumenta la leggibilità del programma– consente di ragionare per astrazioni
• Il C consente, in particolare, di:– ridefinire tipi già esistenti– definire dei nuovi tipi enumerativi– definire dei nuovi tipi strutturati
![Page 13: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/13.jpg)
TIPI RIDEFINITI
• Un nuovo identificatore di tipo viene dichiarato identico a un tipo già esistente
• Schema generale:
typedef TipoEsistente NuovoTipo ;
• Esempio
typedef int MioIntero;
MioIntero X,Y,Z;
int W;
![Page 14: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/14.jpg)
TIPI ENUMERATIVI
• Un tipo enumerativo viene specificato tramite l’elenco dei valori che i dati di quel tipo possono assumere.
• Schema generale:
typedef enum {a1, a2, a3, ... , aN } EnumType;
• Il compilatore associa a ciascun “identifica-tivo di valore” a1,..aN un numero naturale (0,1,...), che viene usato nella valutazione di espressioni che coinvolgono il nuovo tipo.
![Page 15: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/15.jpg)
TIPI ENUMERATIVI
• Gli “identificativi di valore” a1,... , aN sono a tutti gli effetti delle nuove costanti.
• Esempitypedef enum { lu, ma, me, gi, ve, sa, do} Giorni;typedef enum { cuori, picche, quadri, fiori} Carte;
Carte C1, C2, C3, C4, C5;Giorni Giorno;if (Giorno == do) /* giorno festivo */else /* giorno feriale */
![Page 16: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/16.jpg)
TIPI ENUMERATIVI - NOTE
• Un “identificativo di valore” può comparire una sola volta nella definizione di un solo tipo, altrimenti si ha ambiguità.
• Esempio
typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;
typedef enum { lu, ma, me} PrimiGiorni;
La definizione del secondo tipo enumerativo è scorretta, perché gli identificatori lu, ma, me sono già stati usati altrove.
![Page 17: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/17.jpg)
TIPI ENUMERATIVI - NOTE
• Un tipo enumerativo è totalmente ordinato: vale l’ordine con cui gli identificativi di valo-re sono stati elencati nella definizione.
• Esempio
typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;
Data la definizione sopra,lu < ma è veralu >= sa è falsa
in quanto lu 0, ma 1, me 2, etc.
![Page 18: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/18.jpg)
TIPI ENUMERATIVI - NOTE
• Poiché un tipo enumerativo è, per la mac-china C, indistinguibile da un intero, è possibile in linea di principio mischiare interi e tipi enumerativi
• Esempio
typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;
Giorni g;
g = 5; /* equivale a g = sa */
• È una pratica da evitare ovunque possibile!
![Page 19: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/19.jpg)
TIPI ENUMERATIVI - NOTE
• Poiché un tipo enumerativo è, per la mac-china C, indistinguibile da un intero, è possibile in linea di principio mischiare interi e tipi enumerativi
• Esempio
typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;
Giorni g;
g = 5; /* equivale a g = sa */
• È una pratica da evitare ovunque possibile!
Non c’è alcun controllo sugli estremi: g = 24 verrebbe accettato... Ma con quali conseguenze??
![Page 20: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/20.jpg)
TIPI ENUMERATIVI - NOTE
• È anche possibile specificare i valori natu-rali cui associare i simboli a1,... , aN
• qui, lu 0, ma 1, me 2, etc.:typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;
• qui, invece, lu 1, ma 2, me 3, etc.:typedef enum { lu=1, ma, me, gi, ve, sa, do} Giorni;
• qui, infine, l’associazione è data caso per caso:typedef enum { lu=1, ma, me=7, gi, ve, sa, do} Giorni;
![Page 21: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/21.jpg)
IL TIPO BOOLEAN
• Il boolean non esiste in C, ma si può facilmente definirlo:typedef enum { false, true } Boolean;
• così:
false 0, true 1
false < true
• logica positiva
![Page 22: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/22.jpg)
UN PROBLEMA
• La possibilità di introdurre nuovi tipi pone il problema di stabilire se e quanto due tipi siano compatibili fra loro.
• Due possibili scelte:
– equivalenza strutturaletipi equivalenti se strutturalmente identici
– equivalenza nominaletipi equivalenti se definiti nella stessa definizione oppure se il nome dell’uno è definito espressa-mente come identico all’altro.
Scelta dal C
![Page 23: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/23.jpg)
EQUIVALENZA STRUTTURALE
• Esempio di equivalenza strutturale
typedef int MioIntero;
typedef int NuovoIntero;
MioIntero A;
NuovoIntero B;
• I due tipi MioIntero e NuovoIntero sono equivalenti perché strutturalmente identici (sono entrambi int per la macchina C)
• Quindi, A=B è un assegnamento lecito.
![Page 24: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/24.jpg)
EQUIVALENZA NOMINALE
• Non è il caso del C, ma è il caso, per esempio, del Pascal
• Esempio di equivalenza nominale
type MioIntero = integer;
type NuovoIntero = integer;
var A: MioIntero;
var B: NuovoIntero;
• I due tipi MioIntero e NuovoIntero non sono equivalenti perché definiti in una diversa definizione (A:=B è rigettata!)
![Page 25: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/25.jpg)
DEFINIZIONE DI TIPI STRUTTURATI
• Abbiamo visto a suo tempo come introdur-re variabili di tipo array e struttura:char msg1[20], msg2[20];
struct persona {...} p,q;
• Non potendo però dare un nome al nuovo tipo, dovevamo ripetere la definizione per ogni nuova variabile– per le strutture potevamo evitare di ripetere la parte
fra {..}, ma struct persona andava ripetuto comunque.
![Page 26: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/26.jpg)
DEFINIZIONE DI TIPI STRUTTURATI
• Ora possiamo definire un nuovo tipo array e struttura, come segue:typedef char string[20];
typedef struct {... } persona;
• ciò consente, d’ora in poi, di non dover più ripetere la definizione per esteso ogni volta che si definisce una nuova variabile:string s1, s2; /* due stringhe di 20 caratteri */
persona p1, p2; /* due strutture “persona” */
– per le strutture, ciò rende quasi sempre inutile spe-cificare una etichetta dopo la parola chiave struct
![Page 27: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/27.jpg)
DEFINIZIONE DI TIPI STRUTTURATI
• Ora possiamo definire un nuovo tipo array e struttura, come segue:typedef char string[20];
typedef struct {... } persona;
• ciò consente, d’ora in poi, di non dover più ripetere la definizione per esteso ogni volta che si definisce una nuova variabile:string s1, s2; /* due stringhe di 20 caratteri */
persona p1, p2; /* due strutture “persona” */
– per le strutture, ciò rende quasi sempre inutile spe-cificare una etichetta dopo la parola chiave struct
Attenzione: è una definizione di tipo, non di variabile! Non crea nessuna variabile!
![Page 28: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/28.jpg)
DEFINIZIONE DI NUOVI TIPI
Perché definire nuovi tipi è importante?
• Permette di progettare al nostro livello di astrazione, non a quello della macchina C– Il mondo reale è fatto di giorni, temperature, colori,
stringhe... non di int, char, etc!!– operare su “stringhe”, “matrici”, “vettori” è ben
diverso che operare su char x[20], etc
• Consente di prescindere dalla rappresenta-azione concreta delle cose– temperature, colori, interi... saranno anche tutti int,
alla fine... ma concettualmente sono diversi!
![Page 29: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/29.jpg)
TIPI DI DATO ASTRATTO (ADT)
Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà:
una definizione di tipo implica un dominio, D
un insieme di operazioni ammissibili su oggetti di quel tipo funzioni: calcolano valori sul dominio D
predicati: calcolano proprietà vere o false su D
![Page 30: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/30.jpg)
TIPI DI DATO ASTRATTO IN C
In C, un ADT si costruisce definendo:
il nuovo tipo con typedef una funzione per ogni operazione
Esempio: il contatore una entità caratterizzata da un valore intero
typedef int counter; con operazioni per
resettare il contatore a zero reset(counter);
incrementare il contatore inc(counter);
![Page 31: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/31.jpg)
ORGANIZZAZIONE DI UN ADT IN C
La struttura di un ADT comprende quindi:
un file header, contenente la typedef
la dichiarazione delle funzioni
un file di implementazione, contenente una direttiva #include per includere il proprio
header (per importare la definizione di tipo)
la definizione delle funzioni
![Page 32: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/32.jpg)
L’ADT counter file header counter.h
typedef int counter;void reset(counter);void inc(counter);
file di implementazione counter.c#include "counter.h"void reset(counter c){ c=0; }void inc(counter){ c++; }
Definisce in astratto cos’è un counter e co-sa si può fare con esso.
Ha bisogno di sapere cos’è un counter, e specifica come funziona.
![Page 33: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/33.jpg)
L’ADT counter: un cliente
Per usare un counter occorre includere il relativo file header definire una o più variabili di tipo counter operare su tali “oggetti” mediante le
operazioni (funzioni) previste
#include "counter.h"
main(){ counter c1, c2; reset(c1); reset(c2); inc(c1); inc(c2); inc(c2);}
![Page 34: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/34.jpg)
RIFLESSIONE
Quali operazioni per un ADT?
costruttori costruiscono un oggetto di questo tipo (a partire
dai suoi “costituenti elementari”)
selettori restituiscono uno dei “mattoni elementari” che
compongono l’oggetto
predicati verificano la presenza di una proprietà
sull’oggetto, restituendo vero o falso
![Page 35: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/35.jpg)
RIFLESSIONE
Quali operazioni per un ADT?
funzioni agiscono in vario modo sugli oggetti
trasformatori cambiano lo stato dell’oggetto
Possono esserci o no: se non ci sono, l’oggetto non ha stato, ossia non è modificabile.
Decidere se fare un oggetto con o senza stato è una scelta cruciale di progetto: mai farla a caso!
![Page 36: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/36.jpg)
ESERCIZIO
Realizzare l’ADT che cattura il concetto di“stringa di al più 250 caratteri”
realizzazione fisica basata su un array di caratteri (ed eventualmente la dimensione)
operazioni per estrarre il carattere situato alla i-esima posizione
calcolare la lunghezza
creare una nuova stringa che sia la concatena-zione di due stringhe date
confrontare due stringhe...
![Page 37: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/37.jpg)
ESERCIZIO
Realizzare l’ADT che cattura il concetto di“stringa di al più 250 caratteri”
realizzazione fisica basata su un array di caratteri (ed eventualmente la dimensione)
operazioni per estrarre il carattere situato alla i-esima posizione
calcolare la lunghezza
creare una nuova stringa che sia la concatena-zione di due stringhe date
confrontare due stringhe...
Selettore
Selettore o funzione
Costruttore?
Funzione
Non ci sono trasformatori: questo ADT “stringa” è privo di stato.Una stringa non è un contenitore!!
![Page 38: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/38.jpg)
ESERCIZIO
Realizzare l’ADT che cattura il concetto di“insieme” (di interi)
realizzazione fisica basata, ad esempio, su una struttura con un array e un indice
operazioni per aggiungere un elemento, togliere un elemento,
verificare la presenza di un elemento...
... calcolare l’unione di due insiemi, la differenza fra due insiemi, l’intersezione, etc
ricorda: un insieme non ha una nozione di ordine, e non può avere elementi duplicati
![Page 39: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/39.jpg)
ESERCIZIO
Realizzare l’ADT che cattura il concetto di“insieme” (di interi)
realizzazione fisica basata, ad esempio, su una struttura con un array e un indice
operazioni per aggiungere un elemento, togliere un elemento,
verificare la presenza di un elemento...
... calcolare l’unione di due insiemi, la differenza fra due insiemi, l’intersezione, etc
ricorda: un insieme non ha una nozione di ordine, e non può avere elementi duplicati
Trasformatori
Predicato
Ci sono trasformatori: questo ADT “in-sieme” possiede una nozione di stato.
![Page 40: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/40.jpg)
ADT: PROBLEMI OPERATIVI L’intera struttura degli ADT in C si basa
sulla presenza della typedef nel file header che introduce il tipo
Dubbio tremendo: è una dichiarazione o una definizione..???? a rigore, non crea nuove variabili né nuove
funzioni, non genera un solo byte di codice: dunque, sembrerebbe una dichiarazione...
... e invece per il C è una definizione, e come tale non può essere duplicata!
Argh!
![Page 41: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/41.jpg)
ADT: PROBLEMI OPERATIVI Ogni cliente deve necessariamente
includere il file header che contiene la typedef altrimenti il nome del nuovo tipo risulta ignoto
però, essendo una definizione, se per caso viene inclusa due volte nella stessa unità di traduzione si ha errore di compilazione è un errore di compilazione, non di linking
infatti, poiché la typedef non produce codice, nulla di tutto questo giunge al linker, che quindi non ha motivo di protestare.
![Page 42: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/42.jpg)
ADT: PROBLEMI OPERATIVI Come evitare il problema?
Sfruttando il pre-processore per sopprime-re le eventuali typedef duplicate incluse per errore nella stessa unità di traduzione
Più precisamente, si sfrutta la direttiva
#ifndef simbolo(parte di programma con la typedef)
#endif
che permette di sopprimere la parte di programma “rischiosa” se simbolo è già definito.
![Page 43: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/43.jpg)
USARE LA #ifndef...
Occorre seguire uno schema standard:
#ifndef simbolo
#define simbolo
(parte di programma con la typedef)
#endif
La prima volta, simbolo non è definito lo si definisce si include la parte di programma con typedef
Le volte successive, simbolo è già definito la parte di programma con typedef è soppressa
![Page 44: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/44.jpg)
USARE LA #ifndef...
Occorre seguire uno schema standard:
#ifndef simbolo
#define simbolo
(parte di programma con la typedef)
#endif
La prima volta, simbolo non è definito lo si definisce si include la parte di programma con typedef
Le volte successive, simbolo è già definito la parte di programma con typedef è soppressa
Di solito, simbolo è il nome del fileFile: counter.hSimbolo: counter_h
Importante: perché questo schema funzioni occorre che venga usato in tutti i file di un progetto, sistematica-mente!
![Page 45: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/45.jpg)
L’ADT counter RIFORMULATO
file header counter.h
#ifndef counter_h
#define counter_h
typedef int counter;
#endif
void reset(counter);void inc(counter);
il file counter.c e i clienti rimangono tali e quali a prima, intoccati.
L’endif potrebbe anche essere in fondo al file: non è necessario ma si fa spesso per comodità.
![Page 46: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/46.jpg)
L’ADT IN C: LIMITI
Gli ADT così realizzati funzionano, ma molto dipende dall’autodisciplina del programmatore
Non esiste alcuna protezione contro un uso scorretto dell’ADT l’organizzazione suggerisce di operare sull’oggetto
solo tramite le funzioni previste, ma non riesce a impedire di aggirarle a chi lo volesse
La struttura interna dell’oggetto è sotto gli occhi di tutti (nella typedef)
![Page 47: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P](https://reader038.vdocuments.pub/reader038/viewer/2022110117/5542eb5a497959361e8c67b9/html5/thumbnails/47.jpg)
L’ADT IN C: LIMITI
Gli ADT così realizzati funzionano, ma molto dipende dall’autodisciplina del programmatore
Non esiste alcuna protezione contro un uso scorretto dell’ADT l’organizzazione suggerisce di operare sull’oggetto
solo tramite le funzioni previste, ma non riesce a impedire di aggirarle a chi lo volesse
La struttura interna dell’oggetto è sotto gli occhi di tutti (nella typedef)
Superare questi limiti sarà uno degli obiettivi cruciali della programmazione a oggetti, che vedremo nella seconda parte del corso con il linguaggio Java.