La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Corso di programmazione, Simulazione, ROOT, code, ecc. ecc.

Presentazioni simili


Presentazione sul tema: "Corso di programmazione, Simulazione, ROOT, code, ecc. ecc."— Transcript della presentazione:

1 Corso di programmazione, Simulazione, ROOT, code, ecc. ecc.
Per il Servizio Elettronica e Rivelatori INFN Sezione di Napoli Luca Lista, UniNa & INFN

2 Programmazione ad oggetti in C++

3 Classi in c++ Le classi sono una significativa evoluzione delle struct C, ed aggiungono funzioni oltre alle variabili Oltre ad aumentare le funzionalità, rappresentano un cambio di paradigma La programmazione si può focalizzare sul comportamento di classi di oggetti e delle loro relazioni anziché sull'algoritmo e sulla struttura dei dati Oltre alla semplice estensione delle struct C, le classi offrono molte ulteriori possibilità

4 Classe Histogram: dichiarazione
Histogram.h #ifndef HISTOGRAM_H #define HISTOGRAM_H class Histogram { public: Histogram(int bins, double xmin, double xmax); //costruttore ~Histogram(); //distruttore void fill(double x); //metodo void print() const; //metodo (accesso costante) private: int _bins; double _xmin, _xmax; double * _entries; }; #endif Interfaccia pubblica attributi privati

5 Class Histogram: uso Histogram_main.cpp #include <cstdlib> #include "Histogram.h" int main() { Histogram h(10, 0, 1); for(int i = 0; i < 100; i++) { h.fill(drand48()); } h.print(); }

6 Class Histogram: Implementazione
Histogram.cc #include "Histogram.h" #include <iostream> #include <iomanip> #include <cmath> Histogram::Histogram(int bins, double xmin, double xmax) : _bins(bins), _xmin(xmin), _xmax(xmax) { _entries = new double[bins]; for(int i = 0; i < bins; ++i) _entries[i] = 0; } Histogram::~Histogram() { delete [] _entries; } void Histogram::fill(double x) { int bin = (x - _xmin)/(_xmax - _xmin) * _bins; if(bin < 0 || bin >= _bins) return; _entries[bin]++; } void Histogram::print() const { double dx = (_xmax - _xmin)/_bins; for(int i = 0; i < _bins; i++) { double x1 = i * dx; double x2 = x1 + dx; std::cout << "[" << std::fixed << std::setw(5) << std::setprecision(4) << x1 << ", " << std::setw(5) << std::setprecision(4) << x2 << "] "; for(int j = 0; j < _entries[i]; j++) std::cout << "="; std::cout << " (" << std::setw(5) << std::setprecision(4) << _entries[i] << ")\n"; } }

7 Ereditarietà come estensione
Persona.h Utente.h class Persona { public: void print() const; private: string _nome, _cognome; date: _nascita; }; #include "Persona.h" class Utente : public Persona { public: void login(const string & passwd) const; private: string _userName; string _encriptedPasswd; }; Una sottoclasse eredita tutti i metodi e gli attributi dalla classe principale public specifica che tutti i metodi pubblici della classe di base restano pubblici anche nella sottoclasse

8 funzioni virtuali Shape.h Rectangle.h
class Shape { // virtual void Draw() = 0; // }; class Rectangle : public Shape { Rectangle(double x1, double y1, double x2, double y2); virtual void Draw(); }; Le funzioni definite virtual corrispondono ad una tabella di puntatori in memoria per ogni oggetto (virtual table) La possibilità di chiamare la funzione giusta a run time ha una (piccola) penalità di velocità dovuta all'indirezione tramite puntatore

9 Ereditarietà e polimorfismo

10 Ereditarietà e polimorfismo
Soldato

11 Templates template<typename T> struct Node { T val;
struct node * next; }; template<typename T> class List { void push(const T& t); T & front(); T & back(); pop_front(); pop_back(); private: struct Node<T> * _front; };

12 Standard Template Library
La STL è una libreria di contenitori di oggetti Il tipo di oggetti che può essere contenuto è generico, grazie all'implementazione che usa i templates L'interfaccia dei vari contenitori è standardizzata Lo scorrimento attraverso i contenitori è implementato attraverso classi ausiliarie dette iteratori Contiene diverse utility di manipolazione (es.: ordinamento)

13 StD::vector #include <vector> #include <iostream> int main() { std::vector<int> v; for(int i = 0; i < 10; i++) v.push_back(i); std::cout << v.size() << std::endl; for(int i = 0; i < v.size(); ++i) std::cout << v[i] << std::endl; for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; }

14 Std::sort #include <algorithm> // bool reverse_sort(double x, double y) { return x > y; } int main() { // std::sort(v.begin(), v.end()); for(std::vector<double>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; std::cout << "------" << std::endl; std::sort(v.begin(), v.end(), reverse_sort); for(std::vector<double>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; }

15 Stringhe in C++ #include <string> int main() { std::string str1; str1 = "Ciao"; int s = s1.length(); std::cout << str1 << std::endl; std::string str2 = str1 + " ciao"; int f = 0; if(str2 != "Ciao") f = str2.find(str1); const char * c = str1.c_str(); }

16 Auto std::vector<int> v {12, 13, 14}; std::vector<int>::iterator iter_std = v.begin(); auto iter = v.begin(); Semplifica l'uso di tipi molto lunghi da scrivere Il tipo è determinato dal lato a destra del segno = nell'assegnazione

17 STL Riferimenti Tutorial: programming/tutorials/power-up-c-with-the-standard-template- library-part-1/ programming/tutorials/power-up-c-with-the-standard-template- library-part-2/ Overview: library-stl/ Contenitori:


Scaricare ppt "Corso di programmazione, Simulazione, ROOT, code, ecc. ecc."

Presentazioni simili


Annunci Google