Oggetti funzione (1) Laboratorio di Informatica Antonio Monteleone 177

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

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

Laboratorio di Algoritmi e Strutture Dati

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

Overloading di operatori

Laboratorio di Informatica

I Template in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di: Giancarlo Cherchi

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

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

Esercizi su programmazione ricorsiva 1. Pericle Perazzo 23 marzo 2012

La classe string. Tale classe evita agli utilizzatori tutte le problematiche di allocazione e de-allocazione dei buffer di caratteri

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati. Dizionari

Il paradigma OO e le Classi

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2012

Cognome Nome Matricola Postazione PC. Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a Gennaio 2015

Costruttori/distruttori. Sovraccarico degli operatori. Costruttori/distruttori. Necessità di un cotruttore

Sottoprogrammi: astrazione procedurale

Lezione 3 Tipi di Dato Derivati

Algoritmi di Ricerca. Esempi di programmi Java

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a febbraio 2013

Ricerca binaria (o dicotomica) di un elemento in un vettore

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Fondamenti di Informatica

Gestione di files Motivazioni

Corso di Programmazione ad Oggetti

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Implementazione dell albero binario in linguaggio C++

Ancora sull I/O di File in C++

Dal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Esame Informatica Generale 13/04/2016 Tema A

Corso di Fondamenti di Informatica

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 3 Novembre 2014

Corso di Programmazione ad Oggetti

Corso di Fondamenti di Informatica. La ricorsione

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

Istruzioni semplici e strutturate

Corso di Programmazione ad Oggetti

Studente (Cognome Nome):

Const, friend, static,this

Informatica 1. Prova di recupero 21 Settembre 2001

template class <T> swap(t &a, T &b); template class <T> class List {...};

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Università di Roma Tor Vergata L6-1. iterazione: struttura di controllo per ripetere più volte uno stesso comando

Fondamenti di Informatica T-1 Modulo 2

Algoritmi di Ricerca. Esempi di programmi Java

Dati aggregati. Violetta Lonati

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Fondamenti di Informatica

Operatore di indirizzo

Laboratorio di Informatica

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

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Programmazione I - Laboratorio

Classi e oggetti Seconda parte. Oggetti dinamici

Ereditarietà gerarchica

Espressioni logiche. Espressioni logiche. Operatori logici. Operatori logici. Operatori logici. Espressioni Logiche e Istruzione di Test

Linguaggio C++ Linguaggi di terza generazione

Lezione 7. Introduzione ai Template

Partiamo da un esempio: voglio realizzare un sw per la gestione dei miei contatti personali

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

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a Febbraio 2016 Testo

Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Algoritmi di ordinamento e ricerca. Classe SelSort.java

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Fondamenti di Programmazione. Antonio Pescapè e Marcello Esposito Parte Quinta v1.0

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Problem solving elementare su dati vettoriali

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

L organizzazione dei programmi

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

4. Accesso diretto per gli archivi con record a lunghezza costante

Corso Programmazione 1 Capitolo 01: Concetti Elementari

Esercizi. Stringhe. Stringhe Ricerca binaria

Le strutture di controllo in C++

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Corso di Fondamenti di Informatica II

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a gennaio 2012

Esempio: Interfacce. Gioco Interfacce

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Indice. Introduzione PARTE PRIMA LE BASI DEL C++: IL LINGUAGGIO C 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Soluzione del 25 giugno 2015

Laboratorio di Informatica

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esempio: Interfacce. Gioco Interfacce

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Esempi. Esempio utilizzo di classi

Gestione di stringhe. Le stringhe in C/C++

Transcript:

Oggetti funzione (1) In C++ è possibile ridefinire l operatore di chiamata a funzione operator() valore_di_ritorno operator() (lista_argomenti); Un oggetto funzione è l istanza di una classe per la quale è stato ridefinito l operatore di chiamata a funzione Gli oggetti funzione generalizzano i puntatori a funzione A differenza dei puntatori a funzione un oggetto funzione può incapsulare dei dati e quindi avere uno stato Laboratorio di Informatica Antonio Monteleone 177

Oggetti funzione (2) template <class T> class Matrix public: Matrix(int rowcount, int colcount) : m_rowcount(rowcount), m_colcount(colcount), m_items(new T[m_rowCount*m_colCount]) fill(m_items, m_items + m_rowcount*m_colcount, T()); ~Matrix delete [] m_items; T & operator() (int i, int j) // oggetto funzione return m_items[i*m_colcount+j]; // altri metodi private: int m_rowcount; int m_colcount; T *m_items; ; template <class T> T trace(const Matrix<T> &M) assert(m.rowcount() == M.colCount()); T val; for (int i=0;i<m.rowcount(); ++i) val += M(i,i); return val; Laboratorio di Informatica Antonio Monteleone 178

Algoritmi generici su contenitori: for_each E possibile scrivere algoritmi generici (funzioni template) applicabili alle classi contenitore che forniscono iteratori appropriati namespace labinfo // Applica f a tutti gli elementi del container template<typename InputIter, typename UnaryFun> UnaryFun for_each(inputiter first, InputIter last, UnaryFun f) for ( ; first!= last; ++first) f(*first); return f; Laboratorio di Informatica Antonio Monteleone 179

Algoritmi generici su contenitori: count // conta tutti gli elementi uguali a value template<typename InputIter, typename EqCmparable> int count(inputiter first, InputIter last, const EqCmparable & value) int acc=0; for ( ; first!= last; ++first) if (*first == value) ++acc; return acc; Laboratorio di Informatica Antonio Monteleone 180

Algoritmi generici su contenitori: count_if // conta tutti gli elementi che soddisfano il // predicato p template<typename InputIter, typename Predicate> int count_if(inputiter first, InputIter last, Predicate p) int acc=0; for ( ; first!= last; ++first) if (p(*first)) ++acc; return acc; Laboratorio di Informatica Antonio Monteleone 181

Algoritmi generici su contenitori: transform // trasforma la sequenza [first, last) mediante // l applicazione della funzione unaria f // il risultato della trasformazione è inserito // nella sequenza iterata da result template <typename InputIter, typename OutputIter, typename UnaryFunction> OutputIter transform(inputiter first, InputIter last, OutputIter result, UnaryFunction f) for ( ; first!= last; ++first, ++result) *result = f(*first); return result; Laboratorio di Informatica Antonio Monteleone 182

Algoritmi generici su contenitori: sort template <typename T> void swap(t&a, T&b) T tmp = a; a = b; b = tmp; // Ordina la sequenza [first, last) template <typename RandomIter> void sort(randomiter first, RandomIter last) ++first; for ( ; first!= last; ++first) for (RandomIter j = last-1; j>first-1; --j) if ((*j) < (*(j-1))) swap(*j, *(j-1)); Laboratorio di Informatica Antonio Monteleone 183

Algoritmi generici su contenitori: sort // Ordina la sequenza [first, last) utilizzando // il predicato binario comp per il confronto template <typename RandomIter, typename LessThanFunctor> void sort(randomiter first, RandomIter last, LessThanFunctor comp) ++first; for ( ; first!= last; ++first) for (RandomIter j = last-1; j>first-1; --j) if (comp(*j, (*(j-1)))) swap(*j, *(j-1)); // namespace labinfo Laboratorio di Informatica Antonio Monteleone 184

Algoritmi generici su contenitori: un esempio d uso class Student public: Student(const string &lname, const string &fname, const string &id) : m_lname(lname), m_fname(fname), m_id(id) string getlastname() const return m_lname; string getfirstname() const return m_fname; string getid() const return m_id; friend ostream & operator<<(ostream &, const Student &); private: string m_lname; string m_fname; string m_id; ; Laboratorio di Informatica Antonio Monteleone 185

Algoritmi generici su contenitori: un esempio d uso using namespace labinfo; void main() Student *students[6]; typedef Student Stdt; students[0] = new Stdt ("Rossi", "Mario", "72"); students[1] = new Stdt ("Bianchi", "Enrico","93"); students[2] = new Stdt("Neri", "Luca", "82"); students[3] = new Stdt ("Rossi","Aldo", "22"); students[4] = new Stdt ("Neri","Ugo", "62"); students[5] = new Stdt ("Rossi","Carlo", "12"); int size = 6; // stampa a video l'elenco di studenti for_each(students, students+size, printstudent); cout << endl; Laboratorio di Informatica Antonio Monteleone 186

Algoritmi generici su contenitori: un esempio d uso // conta gli studenti di cognome "Rossi": funzione pura int c = count_if(students, students+size, isrossi); // conta gli studenti di cognome "Neri": oggetto funzione c = count_if(students, students+size, MatchesLastName("Neri")); // ordina per cognome e stampa a video // L'uso del funtore lessthanbylastname è // necessario poichè si ha a che fare con una // sequenza di puntatori a Student. // Se avessi scritto sort(students, students+size) // la sequenza sarebbe stata ordinata rispetto al valore // dei puntatori e non rispetto al cognome di Student sort(students, students+size, lessthanbylastname); for_each(students, students+size, printstudent); for_each(students, students+size, deletestudent); Laboratorio di Informatica Antonio Monteleone 187

Algoritmi generici su contenitori: un esempio d uso void printstudent(const Student *student) cout << *student << endl; void deletestudent(const Student *student) delete student; bool isrossi(const Student *student) return student->getlastname() == "Rossi"; Laboratorio di Informatica Antonio Monteleone 188

Algoritmi generici su contenitori: un esempio d uso class MatchesLastName // oggetto funzione public: MatchesLastName(const string &lname) : m_lname(lname) bool operator()(const Student *student) return student->getlastname() == m_lname; private: string m_lname; ; bool lessthanbylastname(const Student *s1, const Student *s2) return s1->getlastname() < s2->getlastname(); Laboratorio di Informatica Antonio Monteleone 189

Algoritmi generici su contenitori -- template <typename BidirectionalIter> void reverse(bidirectionaliter first, BidirectionalIter last) while (true) if (first == last first == --last) return; else swap(*first++, *last); -- template <typename RandomIter> void reverse2(randomiter first, RandomIter last) for ( ; first < last; ++first) swap(*first, *--last); Laboratorio di Informatica Antonio Monteleone 190

Algoritmi generici su contenitori -- template <typename InputIter> inline int distance(inputiter first, InputIter last) int d = 0; while (first++ < last) ++d; return d; -- template <typename InputIter, typename Distance> inline void advance(inputiter &i, Distance n) while (n--) ++i; Laboratorio di Informatica Antonio Monteleone 191

Algoritmi generici su contenitori -- template <typename ForwardIter, typename T> inline ForwardIter lower_bound(forwarditer first, ForwardIter last, const T &val) int len = distance(first, last); while (len > 0) int half = len >> 1; ForwardIter middle =first; advance(middle, half); if (*middle < val) first = middle; ++first; len = len - half - 1; else len = half; return first; Laboratorio di Informatica Antonio Monteleone 192

Algoritmi generici su contenitori -- template <typename ForwardIter, typename T> inline bool binary_search(forwarditer first, ForwardIter last, const T &val) ForwardIter i = lower_bound(first, last, val); return i!= last &&!(val < *i); Laboratorio di Informatica Antonio Monteleone 193