Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
3 4
Esempio – 1a soluzione 7
Esempio – 1a soluzione 8
Esempio – 1a soluzione 11 12
Esempio – 2a soluzione 15
Esempio – 2a soluzione 16
I metodi counter.h
L’accesso all’ADT avviene sempre attraverso il /* Tipo Counter */
typedef struct CounterInnerType *Counter;
corrispondente handler: /* Costruttore di un Counter = 0 */
i costruttori costruiscono un oggetto Counter newCounter(void);
(o istanza) e ne restituiscono l’handler /* Costruttore di un Counter con val */
Counter newInitializedCounter(int initialValue);
i distruttori distruggono un oggetto, quello di cui
/* Restituisce il valore del Counter */
viene passato l’handler int getCounter(Counter c);
i metodi di accesso accedono tramite l’handler /* Restituisce il numero di Counter */
all’oggetto, non lo modificano int howmanyCounter(void);
i metodi di manipolazione accedono tramite /* Azzera un Counter */
l’handler all’oggetto, lo modificano void resetCounter(Counter c);
/* Incrementa un Counter */
void incCounter(Counter c);
/* Distruttore di un Counter */
void deleteCounter(Counter c);
Esempio – 2a soluzione 19
Esempio – 2a soluzione 20
counter.c counter.c
#include <stdlib.h> /****************************/
#include "counter.h" /*prototipi e tipo Counter*/ /* VARIABILI PRIVATE LOCALI */
/****************************/
/* Struttura su cui si basa Counter */
/* è definito qui e non nell'header perche' non
/* Variabile (globale) che tiene conto di quanti
sia visibile fuori dal file */
Counter sono stati creati. Deve essere privata
struct CounterInnerType
dell'ADT, quindi static */
{
static int numCounters = 0;
int x;
};
counter.c counter.c
/****************************/ /*****************/
/* FUNZIONI PRIVATE LOCALI */ /* COSTRUTTORI 1 */
/****************************/ /*****************/
/* Imposta il valore di un Counter al valore dato, /* Costruttore di un Counter con val iniz 0 */
e' una funzione di supporto: non deve essere Counter newCounter(void)
utilizzata se non dai metodi di questo ADT, {
quindi static per renderla locale,
inoltre non e' nell’interfaccia */ Counter c;
static void setCounter(Counter c, int value)
{ c = (Counter)malloc(sizeof(CounterInnerType));
c->x = value; resetCounter(c);
} numCounters++;
return c;
}
Esempio – 2a soluzione 23
Esempio – 2a soluzione 24
counter.c counter.c
/*****************/ /*********************/
/* COSTRUTTORI 2 */ /* METODI DI ACCESSO */
/*****************/ /*********************/
counter.c counter.c
/***************************/ /***************/
/* METODI DI MANIPOLAZIONE */ /* DISTRUTTORI */
/***************************/ /***************/
/* Azzera un Counter */
/* Distruttore di un Counter */
void resetCounter(Counter c)
void deleteCounter(Counter c)
{
{
c->x = 0;
} free(c);
numCounters--;
/* Incrementa un Counter */ }
void incCounter(Counter c)
{
(c->x)++;
}
Esempio – 2a soluzione 27 28
main.c Esercizi
#include<stdio.h>
1. Si realizzi un ADT che implementi uno stack
#include "counter.h"
main() con un vettore di interi, il numero di elementi
{ int v; venga passato al costruttore. Stessa
Counter x = newCounter(); interfaccia dell’esercizio visto nelle funzioni,
salvo che serve passare anche l’handler allo
Counter y = newInitializedCounter(10);
v = getCounter(x);
v = howmanyCounter(); stack da utilizzare. Il main deve poter agire
incCounter(x); sulle due istanze degli stack a scelta.
v = getCounter(x);
resetCounter(x); 2. Si realizzi un ADT che implementi una coda
v = getCounter(x); circolare con un vettore di interi, il numero di
deleteCounter(y); elementi venga passato al costruttore. Il resto
v = howmanyCounter();
è come per l’esercizio precedente.
deleteCounter(x);
}
29 30
Homework 12 Homework 13
Si realizzi un ADT che implementi un tipo di dato Si realizzi un ADT (con controlli di errore e
denominato Matrice contenente una matrice documentazione) che realizzi con liste le
di valori int, con metodi per: funzionalità di uno stack e di una pila di int.
creare una matrice date le dimensioni
Si usino opportune typedef o #define per
distruggerla dato l’handler
azzerare una matrice
poter permettere di cambiare facilmente il tipo
inserire un valore in una casella (riga,colonna)
primitivo int in un altro.
restituire il valore di una casella Fare il test dell’ADT mediante un main che
visualizzare tutta la matrice istanzi due o più pile e stack.
sommare due matrici
moltiplicare due matrici
Si facciano gli opportuni controlli sui possibili
errori
31 32
Homework 14 Homework 14
Si continui l’Homework precedente aggiungendo Inoltre si modifichi la gestione dei cursori in
i metodi seguenti. modo che ce ne possa essere più di uno, a tal
listShowAll (mostra tutta la lista da head) scopo si aggiungano opportune typedef per
listMerge (mette insieme due liste, in modo che il tipo e i metodi:
la prima contenga anche i valori della seconda, la listNewCursor (crea un nuovo cursore)
seconda sarà azzerata; se una delle due è listDeleteCursor (cancella un cursore)
ordinata, la lista risultante deve essere ordinata)
listSplit (divide una lista – ordinata o no – in
due liste, viene passato come argomento l’indice
dell’elemento che sarà il primo della seconda lista,
restituita dal metodo come valore di ritorno)
listClearFrom (elimina la parte della lista che
inizia dall’elemento indicato, incluso)