Concetti Chiave

  • Il tipo Insieme è implementato con un array e permette l'accesso agli elementi tramite l'operatore [].
  • Funzioni chiave includono inizializza(), cardinalità(), confronta(), copia(), aggiungi() e ricerca() per gestire gli insiemi.
  • La funzione confronta() verifica l'uguaglianza tra elementi senza utilizzare l'operatore di uguaglianza per interi.
  • La funzione copia() consente di trasferire tutti gli elementi da un insieme a un altro in un'unica operazione.
  • Le operazioni di unione e intersezione devono gestire l'aggiunta di elementi senza duplicati negli insiemi.

Unione e intersezione di due insiemi di elementi astratti Supponiamo di disporre di un tipo Insieme composto da elementi astratti di tipo Elemento (non dovete definirlo). Ogni insieme è implementato internamente con un array e ha le seguenti caratteristiche:

· è possibile accedere ai suoi elementi e percorrerli con l’operatore [ ], con indice che parte da zero

· esiste una funzione che inizializza() l'insieme e una che restituisce la sua cardinalità() (numero di elementi)

· esiste una funzione che confronta() due elementi e dice se sono uguali (non si può usare l’operatore di uguaglianza tra interi)

· esiste una funzione che copia() in un insieme tutti gli elementi di un altro insieme (in una sola operazione)

· esiste una funzione aggiungi() che permette di aggiungere un elemento a un insieme

· esiste una funzione ricerca() che permette di determinare se un certo Elemento è presente in un Insieme.

Prototipi delle funzioni in C

1. Dichiarate in C i soli prototipi (senza implementazione!) delle funzioni inizializza(), cardinalità(), confronta(), copia(), aggiungi() e ricerca(), facendo MOLTA attenzione alla modalità di passaggio dei parametri. Indicare anche la direzionalità.

void inizializza (Insieme * set); //O

int cardinalità (const Insieme *set); //I

int confronta (const Elemento *primo, const Elemento *secondo); //I - I

/* Come strcmp() restituisce 0 se uguali, 0 se primo > secondo.

Alternativamente si poteva usare un boolean per verificare la sola (dis)uguaglianza */

void copia (Insieme * destinazione, const Insieme * sorgente); //O - I

void aggiungi (Insieme * set, const Elemento *elem); //O - I

boolean ricerca (const Insieme *set, const Elemento *elem); //I - I

//volendo poteva anche restituire un int

Sfruttando le funzioni dichiarate qui sopra, dichiarate i prototipi, scrivete il codice C che implementa le operazioni di unione() e intersezione() di due insiemi e la chiamata. Attenzione perché in un insieme NON si devono inserire elementi duplicati!

Implementazione delle operazioni di unione

unione()

Insieme unione (const Insieme *a, const Insieme *b)

{

Insieme ris;

int i;

inizializza (&ris);

copia (&ris, a)

for (i=0; i

if (ricerca (&ris, &(b)) == false) //se non c’è già lo aggiungo

aggiungi (&ris, &(b));

return ris;

}

Insieme set1, set2;

Insieme risultato;

…..

risultato = unione(&set1, &set2); // I – I

-----------------------------------------------------------------------------------------------

Implementazione delle operazioni di intersezione

intersezione()

Insieme intersezione (const Insieme *a, const Insieme *b)

{

Insieme ris;

int i;

inizializza (&ris);

for (i=0; i

if (ricerca (b, &(a)) == true) // se è presente in entrambi gli insiemi lo aggiungo

aggiungi (&ris, &(a));

return ris;

}

Insieme set1, set2;

Insieme risultato;

…..

risultato = intersezione(&set1, &set2); // I - I

Domande da interrogazione

  1. Quali sono le principali funzioni disponibili per gestire un insieme di elementi astratti?
  2. Le principali funzioni per gestire un insieme di elementi astratti includono inizializza(), cardinalità(), confronta(), copia(), aggiungi() e ricerca(), ognuna con specifiche modalità di passaggio dei parametri.

  3. Come si implementa l'operazione di unione tra due insiemi?
  4. L'operazione di unione si implementa creando un nuovo insieme, inizializzandolo, copiando il primo insieme e poi aggiungendo gli elementi del secondo insieme, evitando duplicati.

  5. Qual è la funzione utilizzata per verificare se un elemento è presente in un insieme?
  6. La funzione utilizzata per determinare se un certo elemento è presente in un insieme è ricerca(), che restituisce un valore booleano in base alla presenza dell'elemento.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community