Il nostro esempio guida: La costruzione di uno stack

51
1 Il nostro esempio guida: La costruzione di uno stack

description

Il nostro esempio guida: La costruzione di uno stack. Costruiamo uno stack. stackapplet.html. #include #include #define DEBUG struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; } ;. contenuto. size. marker. 16. 5. 12. 2. - PowerPoint PPT Presentation

Transcript of Il nostro esempio guida: La costruzione di uno stack

Page 1: Il nostro esempio guida: La costruzione di uno stack

1

Il nostro esempio guida:La costruzione di uno stack

Page 2: Il nostro esempio guida: La costruzione di uno stack

2

Costruiamo uno stack

stackapplet.html

Page 3: Il nostro esempio guida: La costruzione di uno stack

3

#include <iostream.h>#include <cassert>#define DEBUG

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto;} ;

marker

size

contenuto

212

516

Page 4: Il nostro esempio guida: La costruzione di uno stack

4

Pila * crea(int initialSize) {//crea una Pila cout<<"entro in crea"<<endl; Pila * s= new Pila ; s->size=initialSize; s->defaultGrowthSize=initialSize; s->marker=0; s-> contenuto=new int[initialSize]; return s;}

Page 5: Il nostro esempio guida: La costruzione di uno stack

5

void distruggi(Pila * s) {//distruggi lo Pila cout<<"entro in destroy"<<endl; delete [](s->contenuto); delete s;}

Page 6: Il nostro esempio guida: La costruzione di uno stack

6

void cresci(Pila *s, int increment){//aumenta la dimensione dello Pila cout<<"entro in cresci"<<endl; s->size+=increment; int * temp=new int[s->size]; for (int k=0; k<s->marker;k++) { temp[k]=s->contenuto[k]; } delete [](s->contenuto); s->contenuto=temp;}

Page 7: Il nostro esempio guida: La costruzione di uno stack

7

void inserisci(Pila *s, int k) {//inserisci un nuovo valore cout<<"entro in inserisci"<<endl; if (s->size==s->marker)

cresci(s,s->defaultGrowthSize); s->contenuto[s->marker]=k; s->marker++;}

Page 8: Il nostro esempio guida: La costruzione di uno stack

8

int estrai(Pila *s) {//estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(s->marker>0); return s->contenuto[--(s->marker)];}

Page 9: Il nostro esempio guida: La costruzione di uno stack

9

void stampaStato(Pila *s) { //stampa lo stato dello Pila cout <<"=================="<< endl; cout << "size = "<<s->size<<endl; cout << "defaultGrowthSize = “

<<s->defaultGrowthSize<<endl; cout << "marker = "<<s->marker <<endl; for (int k=0;k<s->marker;k++)

cout << "["<<(s->contenuto[k])<<"]"; cout << endl; cout <<"=================="<< endl; }

Page 10: Il nostro esempio guida: La costruzione di uno stack

10

Pila * copia(Pila * from) { cout<<"entro in copia"<<endl; Pila * to=crea(from->size); to->defaultGrowthSize=from->defaultGrowthSize; for (int k=0; k<from->marker;k++) { to->contenuto[k]=from->contenuto[k]; } to->marker=from->marker; return to;}

Page 11: Il nostro esempio guida: La costruzione di uno stack

11

int main() { Pila * s=crea(5); cout<<"s";stampaStato(s); for (int k=1; k<10;k++) inserisci(s,k); cout<<"s"; stampaStato(s); Pila * w = copia(s); cout<<"w"; stampaStato(w); for (int k=1; k<8;k++)

cout<<estrai(s)<<endl; cout<<"s"; stampaStato(s); distruggi(s); cout<<"s"; stampaStato(s); for (int k=1; k<15;k++)

cout<<estrai(w)<<endl; cout<<"w";stampaStato(w);}

Page 12: Il nostro esempio guida: La costruzione di uno stack

12

bash-2.02$ gcc Pila.cc -lstdc++ -o Pila.exebash-2.02$ Pila.exeentro in creas==================size = 5defaultGrowthSize = 5marker = 0

==================entro in inseriscientro in inseriscientro in inseriscientro in inseriscientro in inseriscientro in inseriscientro in crescientro in inseriscientro in inseriscientro in inserisci

s==================size = 10defaultGrowthSize = 5marker = 9[1][2][3][4][5][6][7][8][9]==================entro in copiaw==================size = 10defaultGrowthSize = 10marker = 9[1][2][3][4][5][6][7][8][9]==================

Page 13: Il nostro esempio guida: La costruzione di uno stack

13

entro in estrai9entro in estrai8…entro in estrai4entro in estrai3s==================size = 10defaultGrowthSize = 5marker = 2[1][2]==================

entro in distruggis==================size = 1627775824defaultGrowthSize = 1627775824marker = 2[1627775848][1627775848]==================entro in estrai9entro in estrai8…entro in estrai2entro in estrai1entro in estraiassertion "s->marker>0" failed: file "Pila.cc", line 72bash-2.02$

Page 14: Il nostro esempio guida: La costruzione di uno stack

14

#include <Pila.h>int main() { Pila * s=crea(5); cout<<"s"; stampaStato(s);

for (int k=1; k<10;k++) inserisci(s,k); cout<<"s"; stampaStato(s);

Pila * w=s; cout<<"w"; stampaStato(w); for (int k=1; k<8;k++)

cout<< estrai(s)<<endl; cout<<"s"; stampaStato(s); cout<<“w"; stampaStato(w);}

Una copia(troppo)

sbrigativa…

Perchè abbiamo scritto il metodo copia?

Page 15: Il nostro esempio guida: La costruzione di uno stack

15

s==================size = 10defaultGrowthSize = 5marker = 9[1][2] [3][4] [5] [6] [7] [8] [9]================== w==================size = 10defaultGrowthSize = 5marker = 9[1][2] [3][4] [5] [6] [7] [8] [9]================== entro in estrai9entro in estrai8…

…entro in estrai4entro in estrai3s==================size = 10defaultGrowthSize = 5marker = 2[1][2]==================w==================size = 10defaultGrowthSize = 5marker = 2[1][2]==================

Page 16: Il nostro esempio guida: La costruzione di uno stack

16

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto;} ;

Pila * crea(int initialSize) ;void distruggi(Pila * s) ;Pila * copia(Pila * from) ;void cresci(Pila *s, int increment);void inserisci(Pila *s, int k) ;int estrai(Pila *s) ;void stampaStato(Pila *s) ;

Pila.h

Page 17: Il nostro esempio guida: La costruzione di uno stack

17

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; int estrai() ;} ;Pila * crea(int initialSize) ;void distruggi(Pila * s) ;Pila * copia(Pila * from) ;void cresci(Pila *s, int increment);void inserisci(Pila *s, int k) ;// int estrai(Pila *s) ; vecchia versionevoid stampaStato(Pila *s) ;

Pila.hversione 2

Page 18: Il nostro esempio guida: La costruzione di uno stack

18

int estrai(Pila *s) {//estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(s->marker>0); return s->contenuto[--(s->marker)];}

Re-implementazione di estrai

int estrai() {//estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this-> contenuto[--(this-> marker)];}

Page 19: Il nostro esempio guida: La costruzione di uno stack

19

int main() { Pila * s=crea(5); cout<<"s";stampaStato(s); for (int k=1; k<10;k++) inserisci(s,k); cout<<"s"; stampaStato(s); Pila * w = copia(s); cout<<"w"; stampaStato(w); for (int k=1; k<8;k++)

//cout<<estrai(s)<<endl;cout<<s->estrai()<<endl;

…}

Re-implementazione del main

Page 20: Il nostro esempio guida: La costruzione di uno stack

20

Re-implementazione di estrai: dove scrivo il codice?

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; int estrai() { //estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this->contenuto[--(this->marker)]; }};

Page 21: Il nostro esempio guida: La costruzione di uno stack

21 Re-implementazione di estrai: dove scrivo il codice?

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; int estrai();};int Pila::estrai() { //estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this->contenuto[--(this->marker)];}

Page 22: Il nostro esempio guida: La costruzione di uno stack

22

int estrai(Pila *s) {//estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(s->marker>0); return s->contenuto[--(s->marker)];}

Re-implementazione di estrai con thisimplicito

int estrai() {//estrai l’ultimo valore cout<<"entro in estrai"<<endl; assert(marker>0); return contenuto[--(marker)];}

Page 23: Il nostro esempio guida: La costruzione di uno stack

23

Pila * crea(int initialSize) { Pila * s= new Pila ; s->size=initialSize; s->defaultGrowthSize=initialSize; s->marker=0; s-> contenuto=new int[initialSize]; return s;}

Re-implementazione di crea

Pila::Pila(int initialSize) { size=initialSize; defaultGrowthSize=initialSize; marker=0; contenuto=new int[initialSize];}

“Il costruttore”

Page 24: Il nostro esempio guida: La costruzione di uno stack

24

void Pila:: distruggi () {//distruggi lo Pila cout<<"entro in distruggi"<<endl; delete []contenuto; delete this;}

Re-implementazione di distruggi

Pila::~Pila() {//distruggi lo Pila cout<<"entro nel distruttore"<<endl; delete []contenuto; // NO! delete this;}

“Il distruttore”

Page 25: Il nostro esempio guida: La costruzione di uno stack

25

int main() { Pila * s=new Pila(5); // OLD: =crea(5) cout<<"s";s->stampaStato(); for (int k=1; k<10;k++) s->inserisci(k); cout<<"s"; s->stampaStato(); Pila * w = s->copia(); cout<<"w"; w->stampaStato(); for (int k=1; k<8;k++)

cout<< s->estrai()<<endl; cout<<"s"; s->stampaStato(); delete s; // OLD: s->distruggi(); cout<<"s"; s->stampaStato(); for (int k=1; k<15;k++)

cout<< w->estrai()<<endl; cout<<"w"; w->stampaStato();}

Re-implementazione del main

Page 26: Il nostro esempio guida: La costruzione di uno stack

26

struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; Pila(int initialSize) ; ~Pila() ; Pila * copia() ; void cresci(int increment); void inserisci(int k) ; int estrai() ; void stampaStato() ;} ;

Pila.hversione 3

Variabili di istanza,Dati membro

Metodi,Funzioni membro

Page 27: Il nostro esempio guida: La costruzione di uno stack

27

struct Pila { Pila(int initialSize) ;

Pila(); ~Pila() ; void copia(Pila * to) ; void inserisci(int k) ; int estrai() ; void stampaStato() ; private:

int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment);} ;

Pila.hversione 4

Page 28: Il nostro esempio guida: La costruzione di uno stack

28

class Pila {int size;

int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public:

Pila(int initialSize) ;Pila();

~Pila() ; void copy(Pila * to) ; void inserisci(int k) ; int estrai() ; void stampaStato() ;} ;

Pila.hversione 5

Page 29: Il nostro esempio guida: La costruzione di uno stack

29

struct Pila { private:

int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public:

Pila(int initialSize) ;Pila();

~Pila() ; void copy(Pila * to) ; void inserisci(int k) ; int estrai() ; void stampaStato() ;} ;

Pila.h versione 6class Pila { private:

int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public:

Pila(int initialSize) ; Pila(); ~Pila() ; void copy(Pila * to) ; void inserisci(int k) ; int estrai() ; void stampaStato() ;} ;

Page 30: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 1package strutture;public class Pila { int size; int defaultGrowthSize; int marker; int contenuto[]; final int initialSize=3;

Pila() { size=initialSize; defaultGrowthSize=initialSize; marker=0; contenuto=new int[size]; }

Page 31: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 1package strutture;public class Pila { int size; int defaultGrowthSize; int marker; int contenuto[]; final int initialSize=3;

Pila() { size=initialSize; defaultGrowthSize=initialSize; marker=0; contenuto=new int[size]; }

costante

Page 32: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 2 private void cresci(int dim){ size+=defaultGrowthSize;

int temp[ ]=new int[size]; for (int k=0;k<marker;k++)

temp[k]=contenuto[k];

contenuto=temp;}

Page 33: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 3void inserisci(int k) { if (marker==size){

cresci(defaultGrowthSize;)} contenuto[marker]=k; marker++; }

int estrai() { if (marker==0) { System.out.println(

"Non posso estrarre da una pila vuota"); System.exit(1); } return contenuto[--marker]; }

Page 34: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 4

public static void main(String args[]) { int dim=10; Pila s=new Pila(); for (int k=0;k<2*dim;k++)

s.inserisci(k); for (int k=0;k<3*dim;k++) System.out.println(s.estrai()); }

}

Page 35: Il nostro esempio guida: La costruzione di uno stack

Using assertions (da Java 1.4)

int estrai() {

assert(marker>0):"Invalid marker";

return contenuto[--marker];

}

Compilare con:java –ea Pila.java

java.lang.AssertionError: Invalid markerat pila.Pila.estrai(Pila.java:22)at pila.Pila.main(Pila.java:39)

Page 36: Il nostro esempio guida: La costruzione di uno stack

Using System.arrayCopy()

System.arraycopy(

Object src, int src_position,

Object dst, int dst_position, int length

);

Copies the specified source array, beginning at the specified position, to the specified position of the

destination array.

Page 37: Il nostro esempio guida: La costruzione di uno stack

La Pila in Java - 2 private void cresci(int dim){ size+=defaultGrowthSize;

int temp[ ]=new int[size];System.arraycopy(

contenuto, 0, temp, 0, marker-1);

contenuto=temp;}

Page 38: Il nostro esempio guida: La costruzione di uno stack

Tipi di dato derivati (reference data)

Java, come tutti i linguaggi OO, permette di definire NUOVI TIPI DI DATO (classi).

Alcuni tipi di dato (classi) sono predefinite:ad esempio le stringhe. (String)

Point punto = new Point(10,10);

No Structures or UnionsJava does not support C struct or union types. Note, however, that

a class is essentially the same thing as a struct, but with more features. And you can simulate the important features of a union by subclassing.

tipo identificatore costruttoreOperatore

di creazione

Page 39: Il nostro esempio guida: La costruzione di uno stack

“Java non ha i puntatori”

Ma è vero?Point punto = new Point(10,10);

l’identificatore di un oggetto (“punto”)sembra proprio un puntatore!

Quel che Java non ha èl’aritmetica dei puntatori

.

Page 40: Il nostro esempio guida: La costruzione di uno stack

Confronto dell’operatore new

in C++: Point * punto = new Point(10,10);

in Java: Point punto = new Point(10,10);

punto.x di Java equivale a punto->x del C++

In Java gli oggetti sono accessibili SOLO per referenza

.

Page 41: Il nostro esempio guida: La costruzione di uno stack

memory management

La gestione (dinamica) della memoria e’ automatica, tramite la creazione (operatore new ) e la distruzione (garbage collection) di oggetti.

GC interviene quando serve memoria.

GC elimina gli oggetti per i quali non vi sono piu’ riferimenti attivi.

GC puo’ essere attivato su richiesta esplicita: System.gc()

Page 42: Il nostro esempio guida: La costruzione di uno stack

memory management - costruttori

Operazioni da eseguirsi alla nascita di un oggetto vanno definite nel metodo “costruttore”.

Ogni classe deve avere uno (o più) costruttori.

I costruttori possono differire per numero e tipo di parametri.Es.:Pila() {

size=100; …}

Pila(int size) {this.size=size

}

Page 43: Il nostro esempio guida: La costruzione di uno stack

memory management - distruttori

Operazioni da associarsi con l’eliminazione di un oggetto possono essere definite nel metodo “distruttore” finalize() (opzionale)

NOTA: il metodo finalize POTREBBE NON ESSERE CHIAMATO DAL SISTEMA (es. se il programma finisce prima…)

Per essere certi che vengano chiamati i metodi finalize, occorre chiamare la

System.runFinalization() subito DOPO la System.gc()

Page 44: Il nostro esempio guida: La costruzione di uno stack

System agisce come libreria

System.out.println(…);System.gc();System.runFinalization();System.exit(int status);System.arraycopy(Object src, int srcPos, Object dest, int

destPos, int length);long System. currentTimeMillis();

Page 45: Il nostro esempio guida: La costruzione di uno stack

Class String

Page 46: Il nostro esempio guida: La costruzione di uno stack

Class String

Page 47: Il nostro esempio guida: La costruzione di uno stack

Class String

Page 48: Il nostro esempio guida: La costruzione di uno stack

Class String

Page 49: Il nostro esempio guida: La costruzione di uno stack

Class String

Page 50: Il nostro esempio guida: La costruzione di uno stack

String

Per trasformare il contenuto di una stringa in un intero:

int Integer.parseInt(String s)

Per trasformare il contenuto di una stringa in un float:

float Float.parseFloat(String s)

Page 51: Il nostro esempio guida: La costruzione di uno stack

51

Esercizio:Costruite una Coda analoga alla

Pila