Corso di Linguaggi di Programmazione

Documenti analoghi
Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

Conoscere l uso delle collezioni in Java. Conoscere il concetto di Generics (programmazione

Metodi di una Collection

Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione

Pile e code. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

tipi di dato astratti

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

Implementare un'interfaccia

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011

Corso di Linguaggi di Programmazione

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Polimorfismo per Genericità in Java

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

Corso di Linguaggi di Programmazione

INFORMATICA III Parte B -Progettazione e Algoritmi

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Cosa sono i Generics?

Standard Template Library

Un approccio possibile sarebbe creare un oggetto con un metodo adeguato per scandire collezioni o stampare i dati dell oggetto:

Informatica 3. LEZIONE 17: Alberi generici. Modulo 1: Definizione e ADT Modulo 2: Implementazione Modulo 3: Alberi e classi di equivalenza

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

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

Programmazione generica

NON ABBIAMO ANCORA CORRETTO LE PROVETTE!!!

Strutture dati. Le liste

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Generics & Collections

Corso sul linguaggio Java

Strutture dati: array & co.

Il linguaggio Java: aggiunte in Java 1.5

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

I container della STL: all interno di

Programmazione. ( a.k.a. Generics )

Programmazione Parametrica ( a.k.a. Generics )

Liste concatenate. Violetta Lonati

Metodologie di Programmazione. ovvero, Principi e Tecniche per la costruzione di programmi

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Programmazione Orientata agli Oggetti in Linguaggio Java

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

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Paradigma a oggetti. Programmazione orientata agli oggetti. Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30

Programmazione ad oggetti. Paradigma a oggetti. Esempio. Esempio L estensione del tipo di dato comporta la ridefinizione del codice

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Vector v1,v2; cout << max(v1,v2) << endl;} T max( max( T p1, p1, T p2 p2 ) { int main() { Per il tipo T deve essere

OLTRE LE CLASSI OLTRE LE CLASSI

Il linguaggio C. Puntatori e dintorni

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

Linguaggio C: Strutture e Liste Concatenate Valeria Cardellini

Fondamenti di Informatica T-1

Programmazione ad oggetti

Corso di Grafica Computazionale

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

SET: specifica INTRODUZIONE. SET: esempio Si stampano i numeri casuali in ordine di generazione e il contenuto dell insieme.

Perché il linguaggio C?

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

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Programmazione ad Oggetti Modulo A (Esame del 9/1/2015)

Scope e visibilità per classi

Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

Programmazione in Java Parte II

Gerarchie e polimorfismo: liste

UML: Aggregazione. class A { int s; public void sets(int){ }; public int gets() { }; class B {A ob; public void usea() { }; }

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

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

Polimorfismo parametrico vs polimorfismo per inclusione

Generic. Contenitori generici per oggetti realizzati tramite il concetto di tipo parametrico. IL NUOVO APPROCCIO (java 1.5)

Introduzione al Java Collections Framework. Progettazione del Software Anno Accademico Interfacce del Collections Framework

Progettazione del Software Anno Accademico

Lezione 11 programmazione in Java. Anteprima. Gestione della memoria

Liste. Costo operazioni Tutte le operazioni hanno costo O(1)

La Standard Template Library Heap, algoritmi e funtori

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

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Programmazione Orientata agli Oggetti e Scripting in Python

Il linguaggio C++ Ugo de Liguoro

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

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

Generics in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Cosa sono i Generics?

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

Programmazione ad oggetti Modulo A Prova scritta 4 Settembre 2013

Riassunto. La programmazione OO. Oggi. Esempio

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

Fondamenti di Informatica T1 Interfaccia Comparable Collezioni

Un interfaccia è una classe completamente astratta, senza attributi(solo una collezione di firme di metodi pubblici e astratti)

Transcript:

Corso di Linguaggi di Programmazione Lezione 19 Alberto Ceselli alberto.ceselli@unimi.it Dipartimento di Informatica Università degli Studi di Milano 14 Maggio 2013

Idea Programma = Algoritmi + Strutture dati (Wirth) idea: rendere l algoritmo indipendente dai dati a cui è applicato Idea: combinare tipi parametrici e overloading

Codice generico in C Il sogno di avere codice generico non è nuovo... #define max(a,b) ( (a) > (b)? (a) : (b) ) codice generico tramite definizione di macro

Scansione di una lista struct Element // This is an extremely simplified definition, { // but enough for this example. int value; struct Element * next; }; int high = list->value; // list points to the first element struct Element * current = list->next; // refers (points) to second element while (current!= NULL) // test if within the group of elements { if (current->value > high) { high = current->value; } current = current->next; // Advance to next element } }

Scansione di un array int high = *array; int * one_past_end = array + size; int * current = array + 1; // starts at second element while (current!= one_past_end) // test if within the group of elements { if (*current > high) { high = *current; } current++; // Advance to the next element }

Container: una classe che contiene una qualsiasi collezione di oggetti (es. vector, list, hash table...) Iterator: una funzione che scandisce questa collezione. La Standard Template Library di C++ è basata, appunto su templates, containers ed iterators.

Scansione di una lista o di un array // list<int>::iterator current = values.begin(); vector<int>::iterator current = values.begin(); int high = *current++; while (current!= values.end()) { if (*current > high) { high = *current; } current++; }

C# Containers: oggetti che implementano IEnumerable Iterators: costrutto foreach.. Esempio: String[] strlist = { Alberto, Chiara, Roberto, Valentina };... foreach (String name in strlist) Console.WriteLine( Nome: {0}, name) in

Java Containers: chiamati Collection in Java List<Integer> mylist = new ArrayList<Integer>(); Iterators simili a C++ void cancelall(collection<timertask> c) { for (Iterator<TimerTask> i = c.iterator(); i.hasnext(); ) i.next().cancel(); } Iterators simili a C# void cancelall(collection<timertask> c) { for (TimerTask t : c) t.cancel(); }

Python Containers: oggetti che implementano len (self) getitem (self, key) setitem (self, key, value) delitem (self, key) contains (self, item) Iterators: restituiti implementando un metodo iter () in un container. Utilizzo: >>> t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) >>> count = 0 >>> for num in t:... count += num... else:... print count... 45

Iterators in Python Esempio: iterator per classe stack

tipi parametrici e meccanismo di tipi e sottotipi possono essere combinati: public class Tree<V extends Comparable>...... anche in modo più esotico public class Tree<V extends Serializable & Comparable<V>>... Java permette anche l utilizzo di wildcards? : public static double sum(tree<? extends Number> t) {... }

Programmi che conoscono se stessi Cosa si intende per reflection? La capacità di un programma di (1) ispezionare lo stato / comportamento (2) modificare lo stato / comportamento... (a) di se stesso (structural reflection) (b) dell interprete che lo sta eseguendo (behavioural reflection)

Programmi che conoscono se stessi Analizzando le 4 combinazioni: 1a Leggere la lista delle proprietà di un oggetto 2a modificare il valore di una proprietà, invocare metodi basandosi in modo riflessivo 1b Ispezionare lo stack frame corrente per capire qual è il metodo attualmente in esecuzione 2b Modificare lo stack o il modo in cui alcune operazioni vengono eseguite Esempi di utilizzo: testing e serializzazione.

Reification Programmi che conoscono se stessi Letteralmente rendere concreto qualcosa di astratto. Esempio: un interprete trova una dichiarazione di tipo, o la definizione di un metodo, e la rappresenta in memoria con strutture opportune... ho ottenuto il nome di un metodo (reflection), ora lo chiamo (reification).

Esempi: Java Programmi che conoscono se stessi Esempio di reflection in Java: Method method = foo.getclass().getmethod("dosomething", null); method.invoke(foo, null);

Esempi: python Programmi che conoscono se stessi # without reflection obj = Foo() obj.hello() # with reflection class_name = "Foo" method = "hello" obj = globals()[class_name]() getattr(obj, method)() # with eval eval("foo().hello()")

Riassumendo Approccio procedurale: Decidi quali procedure vuoi, ed utilizza i migliori algoritmi tu possa trovare. Approccio modulare: Decidi quali moduli vuoi, e partiziona il programma in modo che i dati siano nascosti nei moduli. Approccio ad oggetti: Decidi quali classi di oggetti vuoi, fornisci un set completo di operazioni per ogni classe, e rendi esplicite le parti comuni utilizzando l ereditarietà Approccio generic programming: Decidi quali algoritmi vuoi, e parametrizzali per il maggior numero possibile di tipi e strutture dati. (B. Stroustrup)

Esercizi: Esercizi: Realizzare un ADT Buffer Circolare FIFO (interfaccia, implementazione e codice client) (Lez 8 e 9) Rendere parametrico l ADT rispetto al tipo di dati memorizzato nel Buffer (Lez 9) Estendere il Buffer Circolare in un Buffer Circolare Collegabile, ovvero un buffer che può essere riempito con elementi di un altro buffer.