Logo dell'Università di Catania: Siciliae Studium Generale 1434 Logo del Centro IPPARI, Programmazione
matite e gomma
Loghi istituzionali: Siciliae Studium Generale 1434, Centro ricerche IPPARI, Università di Catania, Facoltà di Scienze Matematiche, Fisiche, Naturali, Insegnamento di Programmazione

Costrutti di base per strutture dati

Lezione 7 di Programmazione 2

struct, puntatori, array

Docente: Giuseppe Scollo

Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2007-8

Logo di Conformità WCAG-1 di Livello Tripla A, W3C-WAI Web Content Accessibility Guidelines 1.0 Validazione XHTML 1.0 Validazione CSS 2

Indice

  1. Costrutti di base per strutture dati
  2. strutture dati eterogenee: struct
  3. esempio: metrica cartesiana
  4. accesso indiretto ai dati: puntatori
  5. esempio: coordinate polari
  6. strutture dati omogenee: array
  7. esempio: crivello di Eratostene
  8. array e allocazione dinamica di memoria
  9. esercizi

strutture dati eterogenee: struct

struttura dati eterogenea : aggregato di valori di tipi possibilmente diversi

costrutti nei linguaggi di programmazione: struct in C++, record in Pascal, etc.

in termini matematici, il tipo di dati di tali strutture è un prodotto cartesiano degli insiemi di valori dei tipi componenti, con proiezioni : funzioni di accesso ai valori dei componenti

nella terminologia OO i componenti di una struttura eterogenea sono detti membri della struttura, e si accede al loro valore attraverso il loro nome, che con la dot notation designa (in forma postfissa) la funzione di proiezione

ad es., la struttura dati di un punto nello spazio bidimensionale, con coordinate cartesiane, può essere specificata dalla seguente definizione di tipo :

se p è una variabile di tipo punto2D, le sue proiezioni cartesiane sono p.x e p.y

esempio: metrica cartesiana

una più ricca struttura dati per i punti dello spazio bidimensionale, dotata non solo di proiezioni cartesiane ma anche di una funzione che calcola la distanza fra due punti, è specificata dalla seguente interfaccia :

se Punto2D.h è il nome del file contenente questa interfaccia, la seguente è una sua implementazione :

accesso indiretto ai dati: puntatori

se t è un tipo, t* designa il tipo dei puntatori o riferimenti a oggetti di tipo t

se p è una variabile di tipo t*, allora *p designa l'oggetto (di tipo t) a cui p fa riferimento

i puntatori sono di solito implementati come indirizzi di memoria: l'operatore prefisso "&" dà l'indirizzo dell'oggetto a cui è applicato, dunque *&a e &*a equivalgono ad a

il passaggio dei parametri per riferimento è utile ad almeno due scopi :

e in C++ può effettuarsi tecnicamente in due modi :

esempio: coordinate polari

vediamo come si possa codificare una funzione che effettui la conversione da coordinate cartesiane a coordinate polari, con il passaggio dei parametri per riferimento nei due modi suddetti (e le funzioni sqrt e atan2 di libreria):

strutture dati omogenee: array

struttura dati omogenea : aggregato di valori dello stesso tipo

gli array sono strutture dati ad accesso diretto, diffuse nei linguaggi di programmazione

in termini matematici, il tipo di dati di tali strutture è quello delle funzioni finite (viste come oggetti), con essenzialmente due operazioni:

di solito il tipo indice è totalmente ordinato, per il qual motivo si pensa spesso (alquanto impropriamente) agli array come a strutture dati sequenziali

in C++ il tipo indice è il tipo elementare predefinito int, limitato a valori non negativi, e le locazioni di memoria degli elementi sono contigue, in ordine d'indice

sintassi:

esempio: crivello di Eratostene

algoritmo, risalente al III secolo a.C, che "setaccia" i numeri primi minori di N

come funziona: per 1 < i < N, si eliminano i multipli di i minori di N, a partire da i2

complessità dell'algoritmo: proporzionale a N lg N

array e allocazione dinamica di memoria

nel programma precedente l'allocazione di memoria all'array è statica, cioè nota a tempo di compilazione: ciò ha qualche vantaggio, però... se si vuole generare un maggior numero di primi, occorre modificare il valore della costante N nel sorgente e ricompilare :(

in C++ è possibile l'allocazione dinamica della memoria per un array, dove ad es. la dimensione dell'array è determinata da linea di comando a tempo di esecuzione

a tal scopo si può adoperare l'operatore    new t [d]    che genera un array di d elementi di tipo t e restituisce un puntatore al( primo elemento del)l'array

ciò è coerente con il fatto che, in C++, il nome di un array è un puntatore al suo primo elemento (di indice 0); tenendo conto della contiguità di memorizzazione e della aritmetica dei puntatori, in C++ le espressioni   *(a+i)   e   a[i]   sono equivalenti

una modifica del programma precedente per il dimensionamento dinamico dell'array consiste nel sostituire le tre righe che precedono il ciclo di inizializzazione con le seguenti:

esercizi

  1. definire interfaccia e implementazione del tipo di dato dei punti nello spazio cartesiano tridimensionale, con una funzione che calcoli la distanza di due punti
  2. definire, con una struct, interfaccia e implementazione del tipo di dato dei punti nel piano in coordinate polari, con una funzione che calcoli la distanza di due punti
    • (l'implementazione può ben essere client del tipo di dato che specifica i punti in coordinate cartesiane e le usa per il calcolo della distanza)
  3. definire interfaccia e implementazione del tipo di dato dei punti nello spazio cartesiano a N dimensioni, con una funzione che calcoli la distanza fra due punti, dove N sia un parametro del tipo di dato; inoltre, definire un client che accetta N da linea di comando, quindi genera due punti con coordinate pseudocasuali nell'intervallo [0, 1] e produce in output coordinate e distanza dei due punti
    • (nell'interfaccia si rappresenti il punto come una struct con due membri: N e un puntatore alle coordinate; nell'implementazione si assuma che queste siano memorizzate in array; il client allochi dinamicamente la memoria per esse)
  4. il testo (Sedgewick, 2003) propone un programma per la simulazione del lancio di monete (Programma 3.7, p. 88), affetto da un errore: trovarlo.