Introduzione alle classi 2

Documenti analoghi
Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

A.A. 2006/2007 Laurea di Ingegneria Informatica. Fondamenti di C++ Horstmann Capitolo 3: Oggetti Revisione Prof. M. Angelaccio

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Il paradigma OO e le Classi

Gestione dinamica della memoria

Corso di Programmazione ad Oggetti

Metodi di una Collection

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Const, friend, static,this

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Esercizi Strutture dati di tipo astratto

Ottenere una modifica del parametro attuale

Introduzione al linguaggio C Puntatori

Capitolo 5 - Funzioni

Corso di Programmazione ad Oggetti

Programmazione ad Oggetti. Programmazione ad Oggetti. JUnit è un ambiente di test per programmi Java. Sviluppato da Kent Beck

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

PILE E CODE. Pile (stack):

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Laboratorio di Informatica

Template (1) Molte volte l operato di una funzione o le proprietà di una classe non dipendono dal tipo dei dati coinvolti

ADT STACK (PILA) ADT STACK (PILA)

Implementazione Java di un ADT

Programmazione orientata agli oggetti. Ivan Lanese

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

System Call per la gestione dei semafori in Linux. Semafori: modello concettuale. Creazione ed inizializzazione di un semaforo

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Ereditarietà gerarchica

La Struttura Dati Pila

Allocazione dinamica della memoria

La classe std::vector della Standard Template Library del C++

C: panoramica. Violetta Lonati

Abstact Data Type. Abstact Data Type. Pubblico e privato. Struttura di un ADT

La programmazione ad oggetti (OOP)

Espressioni aritmetiche

Capitolo 3 Sviluppo di Programmi Strutturati

Il C nel C++: Funzioni

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 24 Ottobre 2014

strutturare dati e codice

I membri e le restrizioni di accesso

CORSO DI PROGRAMMAZIONE

Question 1: introduction to computer programming

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Esempio su strutture dati dinamiche: ArrayList

La struttura dati PILA

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Capitolo 7 I puntatori in C

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

INPUT: 2 parametri. double atan2( double y, double x) OUTPUT: risultato del calcolo. Le funzioni. Implementazioni di funzioni dell utente

Introduzione all uso delle funzioni in C++

Pile: implementazione. Pile: implementazione. Pile: implementazione con array. Pile: implementazione con array. Pile: implementazione con array

Programmazione ad oggetti

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

in più stringhe,... ADT un tipo è caratterizzato dalle operazioni consentite su di esso: un numero è qualcosa che si può moltiplicare, sommare,...

La struttura dati CODA

Corso di Programmazione a oggetti

Il linguaggio C Strutture

Esercitazioni di Informatica 3

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Calcolatori Elettronici

Strategie di programmazione

Algoritmi e Strutture Dati

Istruzioni semplici e strutturate

Corso di Programmazione a oggetti

Funzioni, Stack e Visibilità delle Variabili in C

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Le classi. Per questo introduciamo le classi. Una classe è un nuovo tipo di dato che integra insieme i dati e le funzioni che possono agire sui dati.

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Esempio su strutture dati dinamiche: ArrayList

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Corso sul linguaggio Java

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Tipi astratti pila e coda

Definizione di classi. Walter Didimo

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

I numeri razionali. Specifica: la sintassi. Specifica: la semantica

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Capitolo 10 - Strutture

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Il linguaggio C. Puntatori e dintorni

Implementazione dell albero binario in linguaggio C++

Introduzione alle classi

Programmazione 2 PILE E CODE

Corso di Algoritmi e Strutture Dati con Laboratorio. The JCF(continua): L interfaccia Map

Corso di Algoritmi e Strutture Dati con Laboratorio. Tipi di dato pila e coda

Pile e Code. Definiamo una collezione come un gruppo di oggetti, detti gli elementi della collezione.

L apertura di un file ci restituisce un puntatore a una struttura chiamata FILE fopen:

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

I template CAPITOLO Introduzione. Obiettivi

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Esercizi di Algoritmi e Strutture Dati

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Programmazione Procedurale in Linguaggio C++

Riconoscitori e analizzatori sintattici. Scanning e parsing. Funzionamento di un parser: la tecnica Shift/Reduce. Esempio

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Transcript:

Introduzione alle classi 2 Corso di Programmazione 3 - Ingegneria dell Informazione e dell Organizzazione 31 ottobre, 2001 Gino Perna

Utilizzo di una classe in C++ UN ESEMPIO DI CLASSE: LO STACK Supponiamo di voler implementare uno stack: quest'ultimo è un algoritmo per immagazzinare dati. Un dato può essere introdotto nello stack - push operation; ma può anche essere rimosso dallo stack - pop operation. I dati nello stack sono immagazzinati nell'ordine last-in-first-out (LIFO). Intuitivamente possiamo immaginare lo stack come una pila di fogli di carta: l'operazione di push corrisponde ad aggiungere un foglio in cima alla pila: dunque l'ultimo foglio aggiunto alla pila si trova sempre in cima alla pila stessa; l'operazione di pop consiste invece nell'estrarre un foglio dalla pila: il foglio estratto è sempre quello che si trova in cima alla pila. In questo esempio, i fogli corrispondono a dati e le operazioni di push e pop sono quelle che si applicano a questi dati: la classe che definirà quindi lo stack sarà descritta - nel caso i dati siano di tipo intero - dal seguente codice: Stack con vettori class stack private: int count; // Number of items in the stack int data[stack_size]; // The items themselves public: // Initialize the stack void init(void);

Un esempio di classe: lo stack // Push an item on the stack void push(const int item); ; // Pop an item from the stack int pop(void); Analizziamo ora in dettaglio la dichiarazione di questa classe: le istruzioni int count; // Number of items in the stack int data[stack_size]; // The items themselves dichiarano due campi: count (il numero di dati contenuti) e data (i dati stessi); STACK?SIZE dovrà essere dichiarato da qualche parte. In una classe però i diversi tipi di dati che vengono dichiarati non sono detti campi - fields - come per le struct, bensì variabili membro - member variables -; la parola chiave private specifica i privilegi di accesso a queste due variabili membro. Esistono 3 diversi privilegi di accesso in C++, specificati da 3 keywords: private dati o funzioni dichiarati come private non possono essere usati al di fuori della classe; public si tratta del privilegio che, al contrario di private, consente sempre l'accesso a dati o funzioni; protected il privilegio protected è simile al private ad eccezione che l'accesso è consentito anche a classi derivate. Abbiamo quindi descritto i dati della classe; ora occorre definire le functions che manipolano questi dati. La sezione public: // Initialize the stack void init(void); // Push an item on the stack void push(const int item); // Pop an item from the stack int pop(void); inizia con la keyword public: ciò indica che tutte le funzioni - dette funzioni membro o metodi della classe - dichiarate come public sono disponibili all'esterno della classe. Utilizzo di una classe in C++ 1

Usare una classe In questo caso sono stati definiti solo prototipi di funzioni membro, il codice di queste funzioni verrà definito dopo. Il codice della funzione init - funzione di inizializzazione dello stack - sarà il seguente void stack::init(void) count = 0; // Zero the stack Prima di dichiarare il nome della funzione abbiamo aggiunto il prefisso stack:: poiché la funzione init appartiene proprio alla classe stack. La funzione init azzera il contatore degli elementi presenti nello stack. Si osservi che questa funzione - per intervenire sullo stack - non ha bisogno dello stack come parametro: poiché la funzione init è una parte della classe stack, ciò non è necessario. E quindi possibile accedere a tutte le variabili membro direttamente. Le funzioni push e pop sarebbero state implementate in una maniera simile. void stack::push(const int item) data[count] = item; ++count; int stack::pop(void) // Stack goes down by one --count; // Then we return the top value return (data[count]); La classe stack è ora completa; non rimane altro che scrivere un programma per mostrare come usarla. Attenzione: Non sono implementate alcuni funzioni di controllo (overflow ed underflow); le vedremo in seguito. USARE UNA CLASSE Per utilizzare una classe è necessario dichiarare una variabile di tipo class: class stack a_stack; // Declare the stack we want to use La keyword class non è necessaria e può essere omessa. stack a_stack; // Declare the stack we want to use 2 Utilizzo di una classe in C++

Usare una classe Accedere ai membri di una classe è molto simile ad accedere a membri di strutture tramite la sintassi variabile.nome_metodo, ad eccezione che i membri di una classe possono essere sia dati sia funzioni: si osservi poi che è possibile accedere solo ai membri dichiarati nella classe come public. La chiamata alla funzione membro init della classe stack sarà a_stack.init(); I metodi pop e push saranno chiamati in maniera simile. a_stack.push(1); result = a_stack.pop(); Esempio: utilizzo della classe stack. /***************************************************** * Stack * * A program implementing a simple stack class * *****************************************************/ #include <stdlib.h> #include <iostream.h> const int STACK_SIZE = 100; // Maximum size of a stack /***************************************************** * Stack Class Description * * * * Member function * * init -- initialize the stack * * push -- put an item on the stack * * pop -- remove an item from the stack * *****************************************************/ // The stack itself class stack private: int count; // Number of items in the stack int data[stack_size]; // The items themselves public: // Initialise the stack void init(void); // Push an item on the stack void push(const int item); ; // Pop an item from the stack int pop(void); /**************************************************** * stack::init -- initialize the stack * ****************************************************/ void stack::init(void) count = 0; // Zero the stack Utilizzo di una classe in C++ 3

Usare una classe /**************************************************** * stack::push -- push an item on the stack * * * * Warning: we do not check for overflow * * * * Parameters * * item -- item to put in the stack * ****************************************************/ void stack::push(const int item) data[count] = item; ++count; /**************************************************** * stack::pop -- get an item from the stack * * * * Warning: we do not check for stack underflow * * * * Returns * * the top item from the stack * ****************************************************/ int stack::pop(void) // Stack goes down by one --count; // Then we return the top value return (data[count]); // A short program to test the stack main() stack a_stack; // Declaration of the stack we want to use a_stack.init(); // Push three values on the stack a_stack.push(1); a_stack.push(2); a_stack.push(3); // Pop the items from the stack cout << "Expect a 3 ->" << a_stack.pop() << '\n'; cout << "Expect a 2 ->" << a_stack.pop() << '\n'; cout << "Expect a 1 ->" << a_stack.pop() << '\n'; return(0); 4 Utilizzo di una classe in C++

Lo stack con allocazione dinamica Esercizio Si completi la classe precedente aggiungendo il metodo che stampa lo stack. Esercizio Si aggiungano due metodi: isempty() Ritorna 1 se lo stack e vuoto 0 altrimenti; isfull() Ritorna 1 se lo stack e pieno 0 altrimenti. LO STACK CON ALLOCAZIONE DINAMICA Ora che si e proceduto all implementazione della classe stack con allocazione statica passiamo ad un utilizzo piu flessibile: L allocazione dinamica. Esercizio Supponiamo di dover implementare uno stack ad allocazione dinamica contenentedati di tipo float. Si implementino i segineti metodi: class DStack private: float *bottom_; float *top_; int size_; public: DStack(int size=20); Inizializza void push(float val); Push valore int num_items(); Numero di elementi float pop(); Pop Valore int full() ; 1 se stack pieno 0 altrimenti int empty() ; 1 se stack vuoto 0 altrimenti void print() ; Stampa il contenuto. ; /************************************************************************/ main Stack dinamico /* Sample C++ "dynamic stack" tester demonstrating the usage of DStack. */ /* The DStack struct is declared and functions are prototyped in dstack.h.*/ /* The C++ code for the functions is in dstack.cc. */ /* */ /* Compile with: */ /* g++ -o tdstack tdstack.cc dstack.cc */ /* or: */ /* CC -o tdstack tdstack.cc dstack.cc */ /* */ /* Usage: */ /* tdstack */ /* */ Utilizzo di una classe in C++ 5

Lo stack con allocazione dinamica /****************************************************************************/ #include<iostream.h> #include "dstack.h" int main() DStack S(4); S.push( 2.31); S.push(1.19); S.push(6.78); S.push(0.54); if (!S.full()) S.push(6.7); // this should do nothing, as // stack is already full. cout << "Popped value is: " << S.pop() << "\n"; S.push(S.pop() + S.pop()); cout << "Replace top two items with their sum: \n"; S.pop(); S.pop(); if (!S.empty()) S.pop(); // this should also do nothing, // as stack is already empty. if (S.num_items()!= 0) cout << "Error: Stack is corrupt!\n"; // destructor for S automatically called return 0; Classe DStack /****************************************************************************/ /* Sample C++ "dynamic stack", as discussed in class. */ /* The DStack class is declared and functions are prototyped in dstack.h.*/ /* Usage is demonstrated in tdstack.cc. */ 6 Utilizzo di una classe in C++

Lo stack con allocazione dinamica /****************************************************************************/ #include<iostream.h> #include "dstack.h" DStack::DStack(int N) // how to initalize a stack with // N items. bottom_ = new float[n]; top_ = bottom_; size_ = N; DStack::~DStack() // how to reclaim memory from local // stacks when exiting functions delete [] bottom_; int DStack::num_items() const return (top_ - bottom_ ); void DStack::push(float val) *top_ = val; top_++; float DStack::pop() top_--; return *top_; // number of items currently in stack // push a new value // pop value from top int DStack::full() const return (num_items() >= size_); // 1 if full, 0 otherwise int DStack::empty() const return (num_items() <= 0); // 1 if empty, 0 otherwise void DStack::print() const cout << "Stack currently holds " << num_items() << " items: " ; for (float *element=bottom_; element<top_; element++) cout << " " << *element; include file // dstack.h -- Dynamic stack (DStack) declaration and function prototypes. // class DStack private: float *bottom_; float *top_; int size_; public: Utilizzo di una classe in C++ 7

Lo stack con allocazione dinamica ; DStack(int size=20); void push(float val); int num_items() const; float pop(); int full() const; int empty() const; void print() const; ~DStack(); 8 Utilizzo di una classe in C++