1 Pila h versione 6 struct Pila class

  • Slides: 29
Download presentation
1 Pila. h versione 6 struct Pila { class Pila { private: int size;

1 Pila. h versione 6 struct Pila { class Pila { private: int size; int default. Growth. Size; int marker; int * contenuto; void cresci(int increment); public: Pila(int initial. Size) ; Pila(); ~Pila() ; void copy(Pila * to) ; void inserisci(int k) ; int estrai() ; void stampa. Stato() ; }; };

La Pila in Java - 1 package strutture; public class Pila { int size;

La Pila in Java - 1 package strutture; public class Pila { int size; int default. Growth. Size; int marker; int contenuto[]; final int initial. Size=3; Pila() { size=initial. Size; default. Growth. Size=initial. Size; marker=0; contenuto=new int[size]; }

La Pila in Java - 1 package strutture; public class Pila { int size;

La Pila in Java - 1 package strutture; public class Pila { int size; int default. Growth. Size; costante int marker; int contenuto[]; final int initial. Size=3; Pila() { size=initial. Size; default. Growth. Size=initial. Size; marker=0; contenuto=new int[size]; }

La Pila in Java - 2 private void cresci(int dim){ size+=dim; int temp[ ]=new

La Pila in Java - 2 private void cresci(int dim){ size+=dim; int temp[ ]=new int[size]; for (int k=0; k<marker; k++) temp[k]=contenuto[k]; contenuto=temp; }

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

La Pila in Java - 3 void inserisci(int k) { if (marker==size){ cresci(default. Growth. Size; )} 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]; }

La Pila in Java - 4 public static void main(String args[]) { int dim=10;

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()); } }

Using assertions (da Java 1. 4) int estrai() { assert(marker>0): "Invalid marker"; return contenuto[--marker];

Using assertions (da Java 1. 4) int estrai() { assert(marker>0): "Invalid marker"; return contenuto[--marker]; } Compilare con: java –ea Pila. java. lang. Assertion. Error: Invalid marker at pila. Pila. estrai(Pila. java: 22) at pila. Pila. main(Pila. java: 39)

Using System. array. Copy() System. arraycopy( Object src, int src_position, Object dst, int dst_position,

Using System. array. Copy() 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.

La Pila in Java - 2 private void cresci(int dim){ size+=default. Growth. Size; int

La Pila in Java - 2 private void cresci(int dim){ size+=default. Growth. Size; int temp[ ]=new int[size]; System. arraycopy( contenuto, 0, temp, 0, marker-1); contenuto=temp; }

Tipi di dato derivati (reference data) n. Java, come tutti i linguaggi OO, permette

Tipi di dato derivati (reference data) n. Java, come tutti i linguaggi OO, permette di definire NUOVI TIPI DI DATO (classi). n. Alcuni tipo tipi di dato (classi) sono predefinite: nad esempio le stringhe. (String) Operatore identificatore costruttore di creazione n. Point punto = new Point(10, 10); n. No Structures or Unions Java 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.

“Java non ha i puntatori” Ma è vero? Point punto = new Point(10, 10);

“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 n.

Confronto dell’operatore new in C++: in Java: Point * punto = new Point(10, 10);

Confronto dell’operatore new in C++: in Java: Point * punto = new Point(10, 10); Point punto. x di Java punto = new Point(10, 10); equivale a punto->x del C++ In Java gli oggetti sono accessibili SOLO per referenza n.

memory management La gestione (dinamica) della memoria e’ automatica, tramite la creazione (operatore new

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()

memory management - costruttori Operazioni da eseguirsi alla nascita di un oggetto vanno definite

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 }

memory management - distruttori Operazioni da associarsi con l’eliminazione di un oggetto possono essere

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. run. Finalization() subito DOPO la System. gc()

System agisce come libreria System. out. println(…); System. gc(); System. run. Finalization(); System. exit(int

System agisce come libreria System. out. println(…); System. gc(); System. run. Finalization(); System. exit(int status); System. arraycopy(Object src, int src. Pos, Object dest, int dest. Pos, int length); long System. current. Time. Millis();

I parametri del main sono inclusi in un vettore di String Parametri di ingresso

I parametri del main sono inclusi in un vettore di String Parametri di ingresso /* sum and average command lines */ class Sum. Average { public static void main (String args[]) { int sum = 0; float avg = 0; for (int i = 0; i < args. length; i++) { sum += Integer. parse. Int(args[i]); } System. out. println("Sum is: " + sum); System. out. println("Average is: " + (float)sum / args. length); } } prompt> java Sum. Average 7 9 12

Arrays E’ possibile definire arrays di tutti i tipi di dati (elementari o classi).

Arrays E’ possibile definire arrays di tutti i tipi di dati (elementari o classi). In fase di DEFINIZIONE non e’ necessario specificare la dimensione del vettore. Solo al momento della ALLOCAZIONE viene richiesto lo spazio desiderato. String[ ] strings; // this variable can refer to any String array strings = new String[10]; // one that contains 10 Strings strings = new String[20]; // or one that contains 20. int f[ ][ ] = new int[5][3]; //array bidimensionale char s[]={'+', '-', '*', '/', '=', 'C'}; // array inizializzato in creazione

Convenzioni I nomi delle Classi iniziano con la MAIUSCOLA I nomi degli Oggetti iniziano

Convenzioni I nomi delle Classi iniziano con la MAIUSCOLA I nomi degli Oggetti iniziano con la MINUSCOLA Pila p=new Pila();

Passaggio di parametri Le variabili dei tipi di dati primitivi sono sempre passati per

Passaggio di parametri Le variabili dei tipi di dati primitivi sono sempre passati per copia. Gli oggetti sono sempre passati per referenza. (a pensarci, é ovvio: si copia l’identificatore dell’oggetto)

Passaggio di parametri public class Numero { public int valore=0; Numero(int valore) { this.

Passaggio di parametri public class Numero { public int valore=0; Numero(int valore) { this. valore=valore; } }

Passaggio di parametri public class Parametri { void incrementa(int x) {x++; } void incrementa(Numero

Passaggio di parametri public class Parametri { void incrementa(int x) {x++; } void incrementa(Numero x) { x. valore++; } public static void main(String a[]){ Parametri p=new Parametri(); } Parametri() { int z=5; incrementa(z); System. out. println(z); Numero n=new Numero(z); incrementa(n); System. out. println(n. valore); } } public class Numero { public int valore=0; Numero(int valore) { this. valore=valore; } } Output: 5 6

Class String

Class String

Class String

Class String

Class String

Class String

Class String

Class String

Class String

Class String

String Per trasformare il contenuto di una stringa in un intero: int Integer. parse.

String Per trasformare il contenuto di una stringa in un intero: int Integer. parse. Int(String s) Per trasformare il contenuto di una stringa in un float: float Float. parse. Float(String s)

29 Esercizio: Costruite una Coda analoga alla Pila

29 Esercizio: Costruite una Coda analoga alla Pila