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

Slides:



Advertisements
Presentazioni simili
BCX (user guide: cineca
Advertisements

Funzioni In C++ le funzioni sono caratterizzate da un nome, dal tipo della variabile ritornata e da una lista di parametri (opzionali) La lista dei parametri.
Esercitazioni If nidificati
Sottoprogrammi: funzioni e procedure
Uso avanzato di C.
Preincremento e PostIncremento in C++
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Linguaggio C++ Operatori – numeri pseudocasuali - costanti.
Numeri casuali.
Procedure e funzioni In linguaggio C.
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
Si consideri il seguente programma: class Up extends Object { public static int x; public int y; public static void metodo(Up o) {Up w=o.metodo1(x); o.y=w.y+6;}
Le funzioni.
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Algoritmi in C++ (1) da completare
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Costruzione di Interfacce Lezione 12 C++STL
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
9) If e else. Lab.Calc.I AA2002/03 - cap.92 espressione.
7) Creazione di un programma eseguibile
Lab. Calc. AA 2005/061 Classi. Lab. Calc. AA 2005/062 C e C++ Fino a questo punto abbiamo introdotto gli elementi base di qualsiasi linguaggio di programmazione,
1 laboratorio di calcolo II AA 2003/04 terza settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Il main program Ogni programma in C++, per essere eseguibile, deve contenere una funzione main() da cui l’esecuzione comincerà main() deve avere un tipo.
Le liste dinamiche La ricorsione
Il compilatore Dev-C++
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Uso delle funzioni Uso delle funzioni
void binario(int n); …………………
Creazione progetto in C++/DEV
Lo sviluppo top down Le funzioni
Passaggio di parametri per indirizzo
Esercizi Liste.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Conversione da base 10 a base X (Utilizzo della pila)
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Pippo.
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
Le funzioni Rassegna degli argomenti trattati LS Tron 14/15 Prof. Carla Fanchin.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Dato un vettore di reali di dimensione DIM, si inseriscano N elementi presi da tastiera, si utilizzi 0 per terminare l’inserimento. Ordinare gli elementi.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Template.
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
CORSO DI PROGRAMMAZIONE II
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Strutture Dati.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Esercizio 2. Si mostri l’evoluzione dello stato (ambiente di classi, heap, pila) durante la valutazione delle seguenti dichiarazioni di classe nei punti.
Lezione X Laboratorio di Programmazione. Struttura di un programma Definizione classe e specifica (parziale) classe.hclasse.cpp main.cpp Specifica metodi.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,

Pila.h struct Pila { int size; int defaultGrowthSize; int marker;
Richiami di C++ di base.
Operatori – numeri pseudocasuali - costanti
Transcript della presentazione:

1 Il nostro esempio guida: La costruzione di uno stack

2 Costruiamo uno stack stackapplet.html

3 #include #define DEBUG struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; } ; marker size contenuto

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

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

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 marker;k++) { temp[k]=s->contenuto[k]; } delete [](s->contenuto); s->contenuto=temp; }

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++; }

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

9 void stampaStato(Pila *s) { //stampa lo stato dello Pila cout <<"=================="<< endl; cout size<<endl; cout << "defaultGrowthSize = defaultGrowthSize<<endl; cout marker <<endl; for (int k=0;k marker;k++) cout contenuto[k])<<"]"; cout << endl; cout <<"=================="<< endl; }

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

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

12 bash-2.02$ gcc Pila.cc -lstdc++ -o Pila.exe bash-2.02$ Pila.exe entro in crea s================== size = 5 defaultGrowthSize = 5 marker = 0 ================== entro in inserisci entro in cresci entro in inserisci s================== size = 10 defaultGrowthSize = 5 marker = 9 [1][2][3][4][5][6][7][8][9] ================== entro in copia w================== size = 10 defaultGrowthSize = 10 marker = 9 [1][2][3][4][5][6][7][8][9] ==================

13 entro in estrai 9 entro in estrai 8 … entro in estrai 4 entro in estrai 3 s================== size = 10 defaultGrowthSize = 5 marker = 2 [1][2] ================== entro in distruggi s================== size = defaultGrowthSize = marker = 2 [ ][ ] ================== entro in estrai 9 entro in estrai 8 … entro in estrai 2 entro in estrai 1 entro in estrai assertion "s->marker>0" failed: file "Pila.cc", line 72 bash-2.02$

14 #include 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?

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

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

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 versione void stampaStato(Pila *s) ; Pila.h versione 2

18 int estrai(Pila *s) { //estrai lultimo valore cout<<"entro in estrai"<<endl; assert(s->marker>0); return s->contenuto[--(s->marker)]; } Re-implementazione di estrai int estrai() { //estrai lultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this-> contenuto[--(this-> marker)]; }

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 estrai()<<endl; … } Re-implementazione del main

20 Re-implementazione di estrai: dove scrivo il codice? struct Pila { int size; int defaultGrowthSize; int marker; int * contenuto; int estrai() { //estrai lultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this->contenuto[--(this->marker)]; } };

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 lultimo valore cout<<"entro in estrai"<<endl; assert(this->marker>0); return this->contenuto[--(this->marker)]; }

22 int estrai(Pila *s) { //estrai lultimo valore cout<<"entro in estrai"<<endl; assert(s->marker>0); return s->contenuto[--(s->marker)]; } Re-implementazione di estrai con this implicito int estrai() { //estrai lultimo valore cout<<"entro in estrai"<<endl; assert(marker>0); return contenuto[--(marker)]; }

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

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

25 int main() { Pila * s=new Pila(5); // OLD: =crea(5) cout stampaStato(); for (int k=1; k inserisci(k); cout stampaStato(); Pila * w = s->copia(); cout stampaStato(); for (int k=1; k<8;k++) cout estrai()<<endl; cout stampaStato(); delete s; // OLD: s->distruggi(); cout stampaStato(); for (int k=1; k<15;k++) cout estrai()<<endl; cout stampaStato(); } Re-implementazione del main

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.h versione 3 Variabili di istanza, Dati membro Metodi, Funzioni membro

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.h versione 4

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.h versione 5

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

La Pila in Java - 1 package 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]; }

La Pila in Java - 1 package 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

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

La Pila in Java - 3 void 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]; }

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]; } Compilare con: java –ea Pila.java java.lang.AssertionError: Invalid marker at pila.Pila.estrai(Pila.java:22) at pila.Pila.main(Pila.java:39)

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.

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

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 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. tipo identificatore costruttore Operatore di creazione

Java non ha i puntatori Ma è vero? Point punto = new Point(10,10); lidentificatore di un oggetto (punto) sembra proprio un puntatore! Quel che Java non ha è laritmetica dei puntatori.

Confronto delloperatore 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.

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

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

Class String

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)

51 Esercizio: Costruite una Coda analoga alla Pila