25.05.2013 Visualizzazioni

tipi derivati - Dipartimento di Informatica ed Applicazioni

tipi derivati - Dipartimento di Informatica ed Applicazioni

tipi derivati - Dipartimento di Informatica ed Applicazioni

SHOW MORE
SHOW LESS

Trasformi i suoi PDF in rivista online e aumenti il suo fatturato!

Ottimizzi le sue riviste online per SEO, utilizza backlink potenti e contenuti multimediali per aumentare la sua visibilità e il suo fatturato.

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Tipi <strong>di</strong> Dato Derivati<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Un tipo <strong>di</strong> dato derivato è ottenuto a<br />

partire da <strong>tipi</strong> <strong>di</strong> dato pr<strong>ed</strong>efiniti<br />

attraverso gli operatori *, &, []<br />

definendo enumerazioni<br />

definendo struct<br />

I <strong>tipi</strong> <strong>di</strong> dato <strong>derivati</strong> non sono <strong>tipi</strong> <strong>di</strong> dati<br />

nuovi, ma semplice composizione <strong>di</strong> <strong>tipi</strong> <strong>di</strong><br />

dati esistenti<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 1<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

1


Array<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Un array è un insieme <strong>di</strong> oggetti dello stesso tipo<br />

referenziati da un unico identificatore<br />

Gli oggetti dell’array sono referenziati tramite<br />

l’identificatore dell’array e la loro posizione nell’insieme<br />

(in<strong>di</strong>cizzazione)<br />

int ia[10]; // ia è un vettore <strong>di</strong> 10 interi<br />

int i = ia[2]; // copia il terzo elemento <strong>di</strong> ia in i<br />

ia[7] = i; // copia i sull'’ottavo elemento <strong>di</strong> ia<br />

La <strong>di</strong>mensione dell’array può essere qualsiasi<br />

espressione costante<br />

non può essere variabile<br />

In<strong>di</strong>cizzazione <strong>di</strong> un Array<br />

Le posizioni degli oggetti in un array si contano da 0<br />

Il compilatore non effettua nessun controllo sulla<br />

correttezza dell’in<strong>di</strong>cizzazione<br />

char c[7];<br />

c[7] = `Y’; // scrive Y nell’ottavo elemento <strong>di</strong> c<br />

In<strong>di</strong>cizzazione errata implica un accesso ad aree <strong>di</strong><br />

memoria non allocate all’array<br />

Può provocare errori in esecuzione (segmentation<br />

fault)<br />

Può <strong>di</strong>struggere i dati del programma<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 2<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

2<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

3


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Inizializzazione <strong>di</strong> un Array<br />

L’array è inizializzato dando la lista dei valori<br />

int ia[3] = {0, 1, 2};<br />

Se il vettore è inizializzato si può non specificare la<br />

<strong>di</strong>mensione<br />

int ia[] = {0, 1, 2};<br />

E’ possibile inizializzare parzialmente un array<br />

int ia[3] = {1};<br />

// ia[0] = 1, gli altri elementi valgono 0<br />

Array <strong>di</strong> char<br />

E’ possibile inizializzare un array <strong>di</strong> char<br />

con una stringa costante<br />

Una stringa è un array <strong>di</strong> char con il simbolo<br />

finale `\0’<br />

const char ca[] = {`C’, `+’, `+’}; // ca lungo 3<br />

const char ca[] = “C++”; // ca lungo 4<br />

const char ca[5] = “prova”; // ERRORE<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 3<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

4<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

5


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Operazioni su Array<br />

Non è possibile inizializzare o assegnare un array ad un<br />

altro array<br />

int ia[] = {1, 2, 3};<br />

int ia2[] = ia; // ERRORE<br />

Se si vuole copiare un array bisogna copiare un<br />

elemento per volta<br />

for(int i = 0; i


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Inizializzazione <strong>di</strong> Array<br />

Multi<strong>di</strong>mensionali<br />

Un array bi<strong>di</strong>mensionale è un array <strong>di</strong> array<br />

ogni array inizializzato separatamente<br />

int ia[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};<br />

int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};<br />

E’ possibile inizializzare parzialmente un<br />

array multi<strong>di</strong>mensionale<br />

int ia[3][4] = {0, 1, 2, 3};<br />

int ia[3][4] = {{0}, {4}, {8}};<br />

Accesso a Array Multi<strong>di</strong>mensionali<br />

Per acc<strong>ed</strong>ere ad un elemento <strong>di</strong> un array<br />

multi<strong>di</strong>mensionale bisogna specificare ogni<br />

in<strong>di</strong>ce in una parentesi quadra<br />

int i = ia[2][3];<br />

i = ia[2, 3]; // ERRORE<br />

cosa fa in realtà l'istruzione errata?<br />

assegna ia[3] ad i<br />

ia[3] è un array<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 5<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

8<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

9


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Relazione tra Array e Puntatori<br />

Alla definizione <strong>di</strong> un array il compilatore alloca<br />

spazio per contenere tutti gli elementi dell’array<br />

e definisce un puntatore inizializzato con<br />

l’in<strong>di</strong>rizzo del primo byte allocato<br />

char ac[5];<br />

nome tipo in<strong>di</strong>r.<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

ac<br />

Tipo <strong>di</strong> un Array<br />

char*<br />

Il tipo <strong>di</strong> un array è puntatore al tipo degli<br />

oggetti dell’array<br />

Ogni operazione <strong>di</strong> in<strong>di</strong>cizzazione è<br />

implementata attraverso l’aritmetica dei<br />

puntatori<br />

ia[4] = 3; // implementata come *(ia + 4) = 3<br />

m[1][2] = 0; /* implementata come<br />

*(*(m + 1) + 2) = 0 */<br />

2001/02 6<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

10<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

11


Tipo <strong>di</strong> un Array<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

L’identificatore dell’array si comporta<br />

come un puntatore costante<br />

E’ sempre possibile assegnare un array<br />

ad un puntatore dello stesso tipo<br />

char buffer[256];<br />

char *p = buffer;<br />

// p in<strong>di</strong>rizza il primo elemento <strong>di</strong> buffer<br />

Non è possibile assegnare un puntatore ad un<br />

array<br />

buffer = p; // ERRORE<br />

Differenze tra Array e Puntatori<br />

La definizione <strong>di</strong> un array implica allocazione <strong>di</strong><br />

memoria per tutti gli oggetti dell’array e per il<br />

puntatore che li in<strong>di</strong>rizza<br />

La definizione <strong>di</strong> un puntatore implica<br />

allocazione <strong>di</strong> memoria per un in<strong>di</strong>rizzo<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 7<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

12<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

13


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Il Contenitore vector<br />

La classe vector della libreria standard è una valida<br />

alternativa agli array stile C<br />

#include // include definizione classe vector<br />

Differenze tra vector e array<br />

È possibile definire vector <strong>di</strong> <strong>di</strong>mensione variabile<br />

è possibile mo<strong>di</strong>ficare le <strong>di</strong>mensioni <strong>di</strong> un vector<br />

Non è possibile inizializzare esplicitamente oggetti vector<br />

È possibile assegnare un vector ad un altro vector<br />

Esistono operazioni su vector<br />

Definizione <strong>di</strong> oggetti vector<br />

vector a;<br />

/* Definisce un vettore <strong>di</strong> tipo T il cui<br />

identificatore è a e la cui <strong>di</strong>mensione è 0 */<br />

vector a(5); // equivale a T a[5];<br />

// Definisce un vettore <strong>di</strong> tipo T <strong>di</strong> 5 elementi<br />

vector a(5, 4); // equivale a T a[] = {4, 4, 4, 4, 4}<br />

/* Definisce un vettore <strong>di</strong> tipo T <strong>di</strong> 5 elementi<br />

inizializzati con 4 */<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 8<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

14<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

15


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Accesso a elementi <strong>di</strong> vector<br />

L'accesso al vector può essere fatto tramite<br />

l'operatore []<br />

Simile all'accesso agli array<br />

#include <br />

vector vec(10);<br />

for(int i = 1; i


Iteratori<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

L'iteratore è una classe che implementa l'astrazione del<br />

puntatore<br />

operazioni ammissibili =, *, ++, --<br />

ogni contenitore ha la propria implementazione <strong>di</strong> iteratore,<br />

definita all'interno della classe<br />

Ogni contenitore fornisce meto<strong>di</strong> per recuperare in<strong>di</strong>rizzi<br />

<strong>di</strong> suoi elementi tramite iteratori<br />

è possibile acc<strong>ed</strong>ere e scorrere gli elementi <strong>di</strong> tutti i contenitori<br />

alla stessa maniera<br />

vector::begin(); // primo elemento <strong>di</strong> vector<br />

vector::end(); // elemento successivo all’ultimo<br />

Alcuni meto<strong>di</strong> della classe vector<br />

empty() // restituisce vero se il vettore è vuoto<br />

size() // restituisce # <strong>di</strong> elementi nel vettore<br />

capacity() // restituisce la grandezza del vettore<br />

resize(N) // la nuova <strong>di</strong>mensione del vettore è N<br />

push_back(x) // aggiunge x alla fine del vettore<br />

pop_back() // elimina l’ultimo elemento del vettore<br />

per utilizzare i meto<strong>di</strong> della classe vector si usa l'operatore <strong>di</strong><br />

selezione<br />

vector v;<br />

v.metodo();<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 10<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

18<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

19


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Ri<strong>di</strong>mensionamento <strong>di</strong>namico <strong>di</strong><br />

vector<br />

un oggetto vector può essere allungato <strong>di</strong>namicamente<br />

senza allocare esplicitamente la memoria<br />

#include <br />

#include <br />

vector testo;<br />

string parola;<br />

while(cin >> parola) testo.push_back(parola);<br />

cout


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Esempio uso vector<br />

#include <br />

#include <br />

#include <br />

main() {<br />

int ia[10] = {51, 23, 7, 88, 41, 98, 12, 103, 37, 6}, x;<br />

vector vec(ia, ia+10);<br />

sort(vec.begin(), vec.end());<br />

reverse(vec.begin(), vec.end());<br />

cin >> x;<br />

vector::iterator trovato;<br />

trovato = find(vec.begin(), vec.end(), x);<br />

if(trovato != vec.end())<br />

cout


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Esempio Stringhe<br />

Calcolare la lunghezza della stringa “ciao mondo\n”<br />

#include <br />

char *st = “ciao mondo\n”;<br />

int main() {<br />

int lung = 0;<br />

char *p = st;<br />

while( *p != `\0’ ) {<br />

lung = lung + 1;<br />

p = p+1;<br />

}<br />

cout


Il Tipo string<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

La libreria standard fornisce una nuova<br />

implementazione delle stringhe come classe<br />

Principali <strong>di</strong>fferenze<br />

Inizializzare una stringa con un'altra stringa<br />

Copia <strong>di</strong> stringhe<br />

Accesso ai singoli elementi della stringa<br />

Operazioni <strong>di</strong> confronto tra stringhe<br />

Operazioni <strong>di</strong> concatenazione e calcolo lunghezza<br />

Operazioni <strong>di</strong> manipolazione stringhe<br />

Controllo stringa vuota<br />

Conversione a stringa C-style<br />

Esempio uso <strong>di</strong> string<br />

Calcolare la lunghezza della stringa “ciao mondo\n”<br />

#include <br />

#include <br />

string st = “ciao mondo\n”;<br />

int main() {<br />

int lung = st.size();<br />

cout


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Alcuni meto<strong>di</strong> della classe string<br />

bool empty()<br />

// restituisce vero se la stringa è vuota<br />

int size()<br />

// restituisce # <strong>di</strong> caratteri nella stringa<br />

string operator+(const string&)<br />

string operator+=(const string&)<br />

// concatena due stringhe<br />

const char* c_str()<br />

// converte la stringa in stile C<br />

Enumerazioni<br />

Un’enumerazione è un insieme <strong>di</strong> costanti simboliche<br />

intere<br />

Insieme <strong>di</strong> attributi da associare ad un oggetto<br />

enum stato { caldo, fr<strong>ed</strong>do };<br />

// caldo = 0, fr<strong>ed</strong>do = 1;<br />

Gli enumeratori non sono singolarmente in<strong>di</strong>rizzabili<br />

non si può applicare l’operatore (&) ad un enumeratore<br />

Definizione <strong>di</strong> un’enumerazione<br />

enum colore { giallo, rosso, verde = 1, bianco };<br />

// giallo = 0, rosso = 1, verde = 1, bianco = 2<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 15<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

28<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

29


Enumerazioni<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

E’ possibile definire una variabile del tipo definito da<br />

un’enumerazione<br />

colore vernice = giallo;<br />

//vernice può assumere solo i valori<br />

giallo, rosso, verde e bianco<br />

Non è possibile assegnare valori interi ad una variabile<br />

<strong>di</strong> tipo enumerazione<br />

E' possibile assegnare una variabile <strong>di</strong> tipo<br />

enumerazione ad una variabile int<br />

vernice = giallo; // giallo contiene il valore 0<br />

vernice = 0; // ERRORE<br />

int i = vernice; // i = 0<br />

Tipo bool<br />

Una variabile <strong>di</strong> tipo bool può assumere<br />

come valori solo i valori true e false<br />

bool trovato = false;<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 16<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

30<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

31


Struct<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Uno struct è un insieme <strong>di</strong> oggetti, non<br />

necessariamente dello stesso tipo, memorizzati<br />

sequenzialmente <strong>ed</strong> identificati da un unico nome<br />

Gli elementi <strong>di</strong> uno struct sono referenziati attraverso<br />

l’identificatore dello struct <strong>ed</strong> il loro specifico<br />

identificatore attraverso gli operatori <strong>di</strong> selezione (.) e<br />

(->)<br />

Classi<br />

struct record {<br />

string nome, cognome, in<strong>di</strong>rizzo;<br />

int eta;<br />

};<br />

record <strong>di</strong>pendente;<br />

<strong>di</strong>pendente.nome = “mario”;<br />

La classe è una generalizzazione dello struct<br />

Insieme <strong>di</strong> oggetti e funzioni (meto<strong>di</strong>) che operano su questi<br />

oggetti<br />

Ogni elemento <strong>di</strong> una classe ha un livello <strong>di</strong> visibilità<br />

Una funzione può acc<strong>ed</strong>ere soltanto agli elementi <strong>di</strong> visibilità<br />

public <strong>di</strong> oggetti della classe<br />

Per ogni classe si definisce un’interfaccia pubblica che<br />

consente <strong>di</strong> interagire con oggetti <strong>di</strong> quella classe<br />

l’interfaccia pubblica è un insieme <strong>di</strong> meto<strong>di</strong> che hanno visibilità<br />

public<br />

La classe implementa il concetto <strong>di</strong> Abstract Data Type<br />

string e vector sono classi<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 17<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

32<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

33


Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Esempio <strong>di</strong> classe String<br />

class String {<br />

public:<br />

String(); // String str;<br />

String(const char *); // String str("ciao");<br />

String(const String&); // String str1 = str;<br />

~String();<br />

String& operator=(const String&);<br />

bool operator==(const String&);<br />

char& operator[](int);<br />

int size();<br />

char* c_str();<br />

private:<br />

int <strong>di</strong>m;<br />

char *arr;<br />

};<br />

Typ<strong>ed</strong>ef<br />

L’operatore typ<strong>ed</strong>ef consente <strong>di</strong> assegnare un<br />

identificatore ad un tipo <strong>di</strong> dato derivato<br />

Il typ<strong>ed</strong>ef non crea un nuovo tipo <strong>di</strong> dato<br />

typ<strong>ed</strong>ef char* stringa;<br />

Il tipo definito dal typ<strong>ed</strong>ef può essere utilizzato come<br />

specificatore <strong>di</strong> tipo in una definizione o <strong>di</strong>chiarazione<br />

stringa c = “ciao”;<br />

Il typ<strong>ed</strong>ef è usato per <strong>di</strong>minuire la complessità<br />

notazionale delle definizioni<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 18<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

34<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

35


Variabili Volatili<br />

Lezione 3<br />

Tipi <strong>di</strong> Dato Derivati<br />

Una variabile è <strong>di</strong>chiarata volatile se il suo valore<br />

può cambiare al <strong>di</strong> fuori del controllo del<br />

programma<br />

Variabili che leggono il time dal sistema<br />

Il compilatore deve evitare <strong>di</strong> applicare tecniche<br />

<strong>di</strong> ottimizzazione del co<strong>di</strong>ce a queste variabili<br />

volatile int time;<br />

volatile char* buffer;<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati<br />

2001/02 19<br />

Laboratorio <strong>di</strong> Algoritmi e Strutture Dati 2001-02<br />

36

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!