SlideShare a Scribd company logo
1 of 462
C/C++/JAVA Refresh rapido
Cominciamo col C
Struttura di un programma C /* This is  a comment */ // This is a one-line comment # include <stdio.h> /* includes header files */ main() /* Must have a main function. First function  { printf (&quot;Hello World!&quot;); /* stdio functions */ }
Tipi ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
printf ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Operatori ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Incremento e decremento ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzioni e prototipi #include <stdio.h> int add1(int); void main() { int x; x=5; x=add1(x); printf(&quot;%d“,x); } int add1(int i) { int y; y=i+1; return (y); }
Operatori sui bit ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tabella di “verità”
Esempio shifting
Condizionali ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Array int x[10]; double y[15]; x[10]=10; char c[15];
Puntatori!!! int a, *b, c; // b is a pointer b = &a; // Store in b the address of a c = *b; // Store in c the value at  // address b (i.e., a)
Puntatori a caratteri e array char *y; char x[100]; y = &x[0]; y = x; // Does the same as the line above *(y+1) gives x[1] *(y+i) gives x[i]
Ancora puntatori int x,y; int *p1,*p2; 1000 1004 1008 1012 x y p1 p2
Ancora puntatori(2) x=-42; y=163 1000 1004 1008 1012 x y p1 p2 -42 163
Ancora puntatori(3) p1=&x; p2=&y; 1000 1004 1008 1012 x y p1 p2 -42 163 1000 1004
Ancora puntatori(4) *p1=17; 1000 1004 1008 1012 x y p1 p2 17 163 1000 1004
Ancora puntatori(5) p1=p2; 1000 1004 1008 1012 x y p1 p2 17 163 1000 1004
Ancora puntatori(6) ,[object Object],[object Object],[object Object],[object Object]
Strutture struct emprec { char name[25]; int age; int pay; }; struct emprec employee; employee.age=32;
C++ extend C ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Introduzione al C++ e alla programmazione ad oggetti
Introduzione ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Il rapporto Dato-Algoritmo Linguaggio  Bits  Bits macchina Programmazione  Dati  Algoritmi   Livello di astrazione Assemblers  Symbolic  Op-code Words Compilatori  Variables &  Statements  Types Linguaggi  Data  Subroutines strutturati  structures Ada (Modula)  Abstract  Packages  Data Types  (Modules)  Object Oriented  Objects  Objects
Cos’è un  oggetto ? ,[object Object],[object Object],[object Object],[object Object],[object Object]
Un esempio...
Soldato
…  cos’è un  oggetto : ,[object Object],Funzione Funzione Funzione Codice funzione Codice funzione Codice funzione Dato  Dato  Dato
Incapsulazione ,[object Object],[object Object],[object Object],[object Object],[object Object]
Approccio OO ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Perché programmare  per oggetti ? ,[object Object],[object Object],[object Object],[object Object]
Caratteristiche del software  non mantenibile   ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Programmazione ad oggetti ,[object Object],[object Object],[object Object],[object Object],[object Object]
C++  e Object Orientation ,[object Object],[object Object],[object Object],[object Object],[object Object]
Programmazione procedurale ,[object Object],COMMON /MYDATA/ P1(4), P2(4),  +  P3(4), P4(4) REAL P1(4), P2(4), P3(4), P4(4) COSTHETA12 = (P1(1)*P2(1) + P1(2)*P2(2) + +  P1(3)*P2(3))/... COSTHETA13 = (P1(1)*P3(1) + P1(2)*P3(2) + +  P1(3)*P3(3))/... COSTHETA14 = (P1(1)*P4(1) + P1(2)*P4(2) + +  P1(3)*P4(3))/... FUNCTION COSTHETA(P1, P2) REAL P1(4), P2(4) COSTHETA = (P1(1)*P2(1) + P1(2)*P2(2) + +  P1(3)*P2(3))/... END COMMON /MYDATA/ P1(4), P2(4),  +  P3(4), P4(4) REAL P1(4), P2(4), P3(4), P4(4) COSTHETA12 = COSTHETA(P1, P2) COSTHETA13 = COSTHETA(P1, P3) COSTHETA14 = COSTHETA(P1, P4)   Idea:  perché non usare una function?
Evoluzione del codice ,[object Object],COMMON /MYDATA/ P1(4), P2(4), P3(4), P4(4) COMMON /MYDATA/ P(4), E(4), THETA(4), PHI(4) ,[object Object],COMMON /MYDATA/ P(4), E(4),  +  THETA(4), PHI(4) COSTHETA12 = COSTHETA1(THETA(1),THETA(2), +  PHI(1), PHI(2)) COSTHETA13 = COSTHETA1(THETA(1),THETA(3), +  PHI(1), PHI(3)) COSTHETA14 = COSTHETA1(THETA(1),THETA(4), +  PHI(1), PHI(4)) FUNCTION COSTHETA1(THETA1, THETA2,  +  PHI1,  PHI2) COSTHETA1 = SIN(THETA1)*SIN(THETA2) * +  COS(PHI1-PHI2) + COS(THETA1)*COS(THETA2) END ,[object Object]
Il concetto di dipendenza ,[object Object],COMMON /MYDATA/ P1(4), P2(4),  +  P3(4), P4(4) COSTHETA12 = COSTHETA(P1, P2) COSTHETA13 = COSTHETA(P1, P3) COSTHETA14 = COSTHETA(P1, P4 )   FUNCTION COSTHETA(P1, P2) REAL P1(4), P2(4) COSTHETA = (P1(1)*P2(1) + P1(2)*P2(2) + +  P1(3)*P2(3))/... END COSTHETA   dipende dalla struttura dei dati   P1   e  P2 Il codice di analisi dipende dalla struttura del common block   MYDATA
OO riduce le dipendenze! ,[object Object],[object Object]
Sintassi:  FORTRAN   vs   C / C++ ,[object Object],PROGRAM  TEST C esempio di programma ...   END int main() {   // esempio di programma ... return 0;  // fine } INTEGER I   INTEGER*4 J   REAL X   REAL*8 D int i; long j; float x; double d; In  C/C++  non è necessario un particolare formato il codice  spazi... Il   C/C++   è case sensitive  Istruzioni separate da “;”
Il main program ,[object Object],[object Object],int main() { //  il piu` semplice programma in C++ return 0; }
I/O: lettura e scrittura ,[object Object],[object Object],[object Object],#include <iostream> int main() {     return 0; } direttiva al  preprocessore end of line #include <iostream>   cout << “Hello, world !” << endl;
Commenti ,[object Object],[object Object],[object Object],[object Object],const int Ntries;  // questo e` un commento inline // il resto della linea e’ trattato come un commento const int Ntries;  /*  questo e` un commento multiline: tutto viene trattato come un commento fino a quando il commento stesso non  viene chiuso con uno */
Tipi predefiniti in  C++ ,[object Object],[object Object],[object Object],int intero in singola precisione long intero in doppia precisione float reale in singola precisione double reale in doppia precisione long double  reale in precisione estesa unsigned int intero senza segno unsigned double reale senza segno in doppia precisione char carattere singolo bool variabili logiche
Tipi predefiniti in  C++  (2) 123  123  0x123  interi costanti , decimale, ottale,  esadecimale 123l  123u interi, long,  unsigned ‘ A’  ‘1’  ‘’  caratteri, tab 3.14f  3.1415 3.1415L float, double,  long double 300e-2 .03e2 30e-1 double, notazione  esponenziale “ Nome” stringa costante true false boolean Esempi di costanti   ‘ ’ alert ‘ ’ backslash ‘ ’ backspace ‘ ’ carriage return ‘ ’ double quote ‘ ’ form feed ‘ ’ tab ‘ ’ newline ‘ ’ carattere nullo ‘ ’ single quote ‘ ’ vertical tab ‘ 01’ 101 ottale, ‘A’ ‘ 041’ esadecimale, ‘A’ Costanti carattere   “” stringa nulla (‘’) “ nome” ‘n’ ‘o’ ‘m’ ‘e’ ‘’ “ una stringa” stampa: una “stringa” “ una stringa un alla fine della linea su piu` linee” per continuare la stringa Stringhe costanti
Tipi predefiniti in  C++  (3) char [1] int [1] bool short [1] long [1] float double long double 8 16 16 16 32 32 64 64 8 32 32 16 32 32 64 128 8 32 32 16 64 32 64 128 OS 16 bit OS 32 bit OS 64 bit [1]  Può essere  unsigned
Identificatori ,[object Object],[object Object],[object Object],[object Object],[object Object],const int Ntries;  double _attempts; double 2A;  // errore!
Keywords ,[object Object],asm else operator throw auto enum private true bool explicit protected try break extern public typedef case false register typeid catch float reinterpret_cast typename char for return union class friend short unsigned const goto signed using const_cast if sizeof virtual continue inline static void default int static_cast volatile delete long struct wchar_t do  mutable switch while double namespace template dynamic_cast new this keyword
const ,[object Object],[object Object],[object Object],#define N 100 const int N=100; N non puo` essere cambiato double w[N]; N usato come per dimensionare un vettore const int vect[5]= le componenti di vect non   {10,20,30,40,50}; possono essere cambiate Esempi di const
Dichiarazione ,[object Object],[object Object],[object Object],const int i; // la variabile i double max(double r1,double r2); // la funzione max const double pi=3.1415926; // definizione double max(double r1, double r2) { // dichiarazione return (r1>r2) ? r1: r2;  // definizione di max }
typedef ,[object Object],[object Object],typedef int INTEGER; // per i nostalgici del fortran typedef int BOOLEAN; // usato prima che bool venisse // implementato typedef void (*ptr_f)();  // ptr_f e` un puntatore ad una // procedura (subroutine) typedef mela frutto; // compila soltanto se mela // e` gia` stata definita
Enumeratori ,[object Object],enum Color {   red, green, blue }; Color screenColor = blue; Color windorColor = red; int  n = blue;  // valido Color c = 1;   // errore enum Seme {   cuori, picche, quadri, fiori };
Scope ,[object Object],[object Object],int func() { … const int n=50; // function scope for (int i=0;i<100;i++) // i e` locale { double r; // r e` locale ... } cout<<“n “<< n <<endl; // OK cout<<“i “<< i <<endl; // errore! Ma... cout<<“r “<< r <<endl; // errore! … }
Scope (2) ,[object Object],int i; // file (global) scope int func() { int i=50; // function scope,  nasconde   // la i a file scope for (int i=0;i<100;i++) // block scope.  Nasconde // la i a function scope { int i; // questo e` un errore... ... } cout<<“i “<< i <<“ “<<  :: i <<endl; ... } Scope resolution operator
namespace ,[object Object],[object Object],namespace mynames { int i; // la mia dichiarazione di i float max(float, float); // la mia dichiarazione di max } float mynames::max(float a, float b) // implementazione della { // funzione max appartenente return (a>b) ? a : b; // al namespace mynames }
namespace (2) ,[object Object],[object Object],[object Object],[object Object],using namespace mynames; ... float r = max (2.1f, 5.3f); float r = mynames::max (2.1f, 5.3f); using mynames::max; ... float r = max (2.1f, 5.3f);
Operatori -i +w piu` e meno unari a*b a/b i%2 moltiplicazione, divisione, modulo a+b a-b addizione e  sottrazione binarie a=3; assegnazione Espressioni Aritmetiche Commento k = ++j;   j=j+1; k=j; k = j++;   k=j; j=j+1; k = --j;   j=j-1; k=j; k = j--;   k=j; j=j-1; Auto-incremento  Espressione e decremento ~i;  Complemento bit a bit i&j;  AND bit a bit i|j  OR bit a bit i^j  XOR bit a bit i<<n  shift a sinistra di n pos. i>>n  shift a destra di n pos. bit-wise  significato < minore di .LT. > maggiore di .GT. <= minore o uguale .LE. >= maggiore o uguale .GE. == uguale .EQ. != diverso .NE. ! Negazione unaria .NOT. && and logico .AND. || or logico .OR. Operatori relazionali Fortran
Espressioni di assegnazione ,[object Object],[object Object],[object Object],[object Object],a = j++; j viene incrementato ed il risultato assegnato ad a a = b = c = d = 100; a *= b; // equivale ad  a = a*b; a -= b; // equivale ad  a = a-b; a = b + ( c = 3 ); // equivale a c=3; a=b+c;
Statements vuoto ; espressione j=j+k; composto { . . . . } usato in funzioni, if.. Costituisce un blocco goto  goto label; da non usarsi if if (p==0)   cerr<<“error”; un solo branch if-else if (x==y)   cout<<“the same”; else   cout<<“different”; due branch for for (j=0;j<n;j++) le dichiarazioni sono a[j]=0; permesse while while (i != j) 0 o piu` iterazioni   i++; do-while do    y=y-1; 1 o piu` iterazioni while (y>0); break break; esce dal blocco continue continue; prossima iterazione Statement C++ commenti
Statements (2) switch switch (s) { case 1: si deve usare break per ++i; evitare di cadere nei  case 2: casi successivi e  --i; aggiungere un caso di default: default alla fine della ++j; lista }; dichiarazione int i=7; in un blocco, file o namespace try try {. . . .} usato per trattare le eccezioni label error:    cerr<<“Error!”; usato con goto return  return x*x*x; valore di ritorno di  una funzione Statement C++ commenti
Statement composti ,[object Object],[object Object],[object Object],[object Object],[object Object]
if ,[object Object],[object Object],[object Object],if (i = 1) // questo e` sempre vero!!! {. . . .}  if (i != 0) // possibile divisione per 0 a++; // mancano delle {}? a/=i;  if (i == 0) // possibile divisione per 0 if (a<0)  { cerr<<“a e` negativo!”; } else  b=a/i;
while  e  do-while ,[object Object],[object Object],[object Object],[object Object],while ( condizione ) statement; do statement; while (condizione);
break  e  continue ,[object Object],[object Object],int i,n=0; int a[100]; cin>>i; // leggo il valore di i while (1) // loop infinito { if (i<0) break; if (n>=100) continue; a[n]=i; n++; // continue salta qui } // break salta qui
switch ,[object Object],[object Object],switch (condizione) (statement);  switch (n) { case 0: cout<<“ n e` nullo”<<endl; break; case 1: case 3: case 5: case 7: case 9: cout<<“ n e` dispari”<<endl; break; case 2: case 4: case 6: case 8: case 10: cout<<“ n e` pari”<<endl; break; default: cout<<“ n non e` compreso tra 0 e 10”<<endl; }
switch  (2) ,[object Object],[object Object],switch (k) { case 0: int j=0; // Illegale! Errore! . . . case 1:  . . . } switch (k) { case 0: { int j=0; // OK, questo compila . . . } case 1:  . . . }
L’operatore  ? ,[object Object],[object Object],[object Object],expr1 ? expr2 : expr3; double max(double a, double b) { double max = (a>b) ? a : b; return max; } if(expr1) expr2; else expr3;
Sintassi:  FORTRAN   vs   C / C++ ,[object Object],DO I = 1, 10   . . .   ENDDO   IF (I.EQ.10 .AND. J.GT.4 .OR. X) THEN   . . .   ENDIF   DO WHILE(X .NE. 5)   . . .    ENDDO for (i = 1; i <= 10; i++)  {  . . . } if (i == 10 && j > 4 || x)  {   . . . } while( x != 5 ) {   . . . }
Funzioni matematiche ,[object Object],int main() {   return 0; } cmath.h   definisce  sin ,  cos , ... {   double r, theta, phi;   #include <iostream>   cin  >> r >> theta >> phi ;   #include <cmath>   double x = r *  sin ( theta ) *  sin ( phi );   double y = r *  sin ( theta ) *  cos ( phi );   double z = r *  cos ( theta );   cout  << x <<  “, “  << y <<  “, “  << z << endl;   ,[object Object]
Array ,[object Object],int main() {   int x [ 10 ] ;   for ( int i = 0; i < 10, i++ )   x [i]  = 0;   double m [5][5] ;   for ( int i = 0; i < 5; i++ )   for ( int j = 0; j < 5; j++ )   m [i][j]  = i * j;  return 0; } ,[object Object],int x[] = { 1, 2, 3, 4 }; char[] t =    {  ‘C’ ,  ‘i’ ,  ‘a’ ,  ‘o’ ,  ‘’  }; char[] s =  “Ciao” ; int m[2][3] =    { {11, 12, 13}, {21, 22, 23} }; ,[object Object]
Esempio con gli arrays ,[object Object],int main() { const int DIM=3; float m[DIM][DIM], m1[DIM][DIM], m2[DIM][DIM];    // Assumiamo che m1 ed m2 vengano riempiti qui... // Moltiplicazione: for (int i=0; i<DIM; i++) { for (int j=0; j<DIM; j++) { float sum=0; for (int k=0; k<DIM; k++) sum += m1[i][k] * m2[k][j]; m[i][j] = sum; } } return 0; }
Puntatori ,[object Object],12 24 0x7b03a928 int main() {   int j = 12; return 0; } int  * ptr =  & j;     #include <iostream>   cout <<  * ptr << endl;   j = 24;   cout <<  * ptr << endl; cout << ptr << endl; indirizzo di memoria j 12 ptr 24
Puntatori ,[object Object],#include <iostream> int main() {   int j = 12;   int *ptr = 0;   cout << *ptr << endl;  // crash !     return 0; } Segmentation violation (core dumped) j 12 ptr
Puntatori e  array ,[object Object],int main() {   float x[5];   int j;   for (j = 0; j < 5; j++)   x[j] = 0;   float *ptr = x;   *ptr  = 1.5;  // x[0] = 1.5   *(ptr+1) = 2.5;  // x[1] = 2.5   *(ptr+3) = 3.5;  // x[3] = 3.5 } x X[0] 1.5 X[1] X[2] X[3] X[4] 2.5 0.0 3.5 0.0 X+1 X+3
Puntatori: allocazione dinamica ,[object Object],#include <iostream> int main() {   int *ptr =  new  int; *ptr = 12;   cout << *ptr << endl;   delete  ptr;   return 0; } ,[object Object],[object Object],[object Object],12 ptr
Puntatori: allocazione dinamica ,[object Object],#include <iostream> int main() {   int *ptr =  new  int[3]; ptr[0] = 10;   ptr[1] = 11;   ptr[2] = 12   delete  [] ptr;   return 0; } 10 ptr 11 12
new  e  delete ,[object Object],[object Object],[object Object],int *i=new int; alloca un intero, returna il puntatore char *c=new char [ 100 ] ; alloca un array (stringa) di 100  caratteri int *i=new int ( 99 ) ; alloca  un  intero e lo inizializza a 99 char *c=new char ( ‘c’ ) ; alloca un carattere inizializzato a c int *j=new int[n][4]; alloca un array di puntatori ad intero operatore  new commenti
new  e  delete  (2) ,[object Object],[object Object],[object Object],delete ptr; distrugge un puntatore ad un oggetto delete p[i]; distrugge l’oggetto p[i] delete [] p;   distrugge ogni oggetto di tipo p operatore  delete commenti
new  e  delete  (3) ,[object Object],[object Object],[object Object],[object Object]
Regole di conversione e  cast ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Conversioni implicite
Regole di conversione e  cast  (2) ,[object Object],[object Object],[object Object],[object Object],char *ch; void *generic_p; . . . generic_p=ch; // OK, char* va in void* ch=generic_p; // OK in C, illegale in C++ ch=(char *)generic_p;  // OK, C e C++ arcaico
Casting in  ANSI C++ ,[object Object],[object Object],x=(float) i; cast in C++ - notazione C x=float(i); cast in C++, notazione funzionale x=static_cast<float>(i); ANSI C++ - raccomandato i=reinterpret_cast<int>(&x) ANSI C++, non portabile e system  dependent func(const_cast<int>(c_var)) dove C_var e` una variabile dichiarata  const. Usato per eliminare la  “ const-ness” per chiamare func Cast commenti
Funzioni ,[object Object],[object Object],[object Object],Valore di ritorno double max( double a, double b)  { return (a>b) ? a : b; } Tipo ritornato Parametri Corpo della funzione
Funzioni (2) funzione   double cube(double x)   parametri passati   {  return x*x*x; }   “by value” procedura   void pr_square(int i)   subroutine, non si   {  cout<<i*I<<endl; }   usa return senza argomenti  void hello ()   puo` anche essere   { cout<<“Hello”<<endl; }   void hello(void) argomenti passati  void swap(int& i,int& j)   i e j hanno i loro  per riferimento  { int t=i; i=j; j=t; }   valori scambiati variabile   int scanf(const char,  … )   chiamata con un    qualsiasi numero    di argomenti inline   inline double cube(int x)  codice inline argomenti di   int power(int i, int n=2)  il 2do argomento  default   puo` essere    tralasciato Tipo di dichiarazione C++   commenti
Prototipi delle funzioni ,[object Object],[object Object],Prototipo di max (normalmente in  max.h ) #include <iostream> double max(double, double); int main() { double m = max(1, 3); cout<<“Il massimo e` “<<m<<endl; return 0; } main.cc double max (double a, double b) { return (a>b) ? a : b; } max.cc
Call-by-Reference ,[object Object],[object Object],[object Object],bool greater(int& i, int& j) { // se i>j scambia i e j if (i>j) { int temp=i; i=j; j=temp; return true; } else return false; } Argomenti passati “by reference” possono essere modificati dalla funzione stessa
Funzioni  inline ,[object Object],[object Object],[object Object]
Argomenti di default ,[object Object],[object Object],Argomento di default int pow(int , int); int main() { int r=3; int a1=pow(3,3);  // a1=27 int a2=pow(3);   // a2=9 return 0; } main.cc int pow (int a, int k=2) { if (k==2) return a*a; else return a*pow(a, k-1); } pow.cc
Overloading ,[object Object],[object Object],double average_array(const  int  a[], int size) { int sum=0; for (int i=0;i<size;i++) sum+=a[i]; return  double( sum ) /size; }  double average_array(const  double  a[], int size) { double sum=0; for (int i=0;i<size;i++) sum+=a[i]; return sum/size; } average_array.cc
Overloading  (2) ,[object Object],[object Object],void print(int i=0) {. . .} // (1) void print(int i, double x) {. . .} // (2) void print(double y, int i) {. . .} // (3) . . . print(‘A’);  // ‘A’ e` convertito a int, chiama (1) print(str[]);  // errore! Non e` possibile una conversione print(15,9); // errore! Ambiguita` fra (2) e (3) print(15,9.); // OK, chiama (2) print(); // OK, chiama (1) con il default
L’algoritmo di selezione  ,[object Object],[object Object],Ricerca della corrispondenza esatta Promozioni standard degli argomenti Conversioni standard dei tipi Conversioni definite dall’utente Corrispondenza con l’ellipsi (…) int      long int      float traccia      int I tentativi del compilatore
Funzioni esterne ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Parametri del programma ,[object Object],[object Object],#include <iostream.h> int main(int argc, char *argv[]) { cout<<“ argc e`: “<<argc<<endl; cout<<“ il nome dell’eseguibile e` “<<*argv<<endl; for (int i=1; i<argc; i++) cout<<“Argomento #”<<i<<“ = “<<*(argv+i)<<endl; return 0; }
Parametri del programma (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Organizzazione dei files ,[object Object],[object Object],[object Object],[object Object],[object Object],#include <iostream.h> #ifndef MyHeader_H #define MyHeader_H // dichiarazioni … .. #endif
Organizzazione dei files (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
C++  e  Object Orientation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
… C++  e  Object Orientation ,[object Object],[object Object],[object Object]
Una classe  C++ Messaggio Messaggio Messaggio Metodo Metodo Metodo Attributo Attributo  Attributo
Classe  Vector2D ,[object Object],costruttore funzioni o metodi dati o attributi Punto e virgola! class Vector2D { public: Vector2D(double x, double y); double x(); double y(); double r(); double phi(); private: double x_; double y_ } ; Vector2D.h #include “Vector2D.h” Vector2D::Vector2D(double x, double y):  x_ (x),    y_ (y)  { } double Vector2D::x() { return  x_ ;   } double Vector2D::r() { return sqrt(   x_ * x_  +  y_ * y_ );   } ... Vector2D.cc
Interfaccia e implementazione ,[object Object],[object Object],#include “Vector.h” Vector2D::Vector2D(double x,    double y) :   x_(x), y_(y) {} double Vector2D::x() {  return x_;  } double Vector2D::r() {  return sqrt(x_*x_ + y_*y_);  } Vector2D.cc class Vector2D { public : Vector2D(double x, double y);   double x(); double y(); double r(); double phi(); private : double x_; double y_; }; Vector2D.h
Costruttori e distruttori ,[object Object],[object Object],[object Object],Vector2D::Vector2D() {. . . .}  // costruttore di default #include “Vector2D.h” . . . Vector2D v;  // oggetto costruito con il  // costruttore di default
Costruttori e distruttori (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Vector2D::Vector2D(const Vector2D& v) {. . . .} Vector2D v(v1);  // dove v1 e` di tipo Vector2D
Costruttori e distruttori (3) ,[object Object],[object Object],[object Object],Vector2D::Vector2D(double x, double y)  : x_(x), y_(y) { . . .  }
Costruttori e distruttori (4) ,[object Object],[object Object],[object Object],Vector2D::~Vector2D()  {} // vuoto, in questo caso
Costruttori e distruttori (5) ,[object Object],[object Object],Vector2D::Vector2D(int i) {. . .} // costruisce un vettore a partire da un intero, ma puo`  // essere usato per convertire un intero in vettore v=Vector2D(i); explicit Vector2D(int);  // solo costruttore
Classe  Vector2D ,[object Object],invoca il constructor #include <iostream.h> #include “Vector2D.h” int main() { Vector2D v(1, 1); cout << “ v = (“  << v.x() << “,” << v.y() << “)” << endl;  cout << “ r = “ << v.r(); cout << “ phi = “ << v.phi() << endl; return 0; } main.cc v = (1, 1) r = 1.4141 phi = 0.7854 Output:
Classe  Vector2D ,[object Object],Allocazione sullo heap Attenzione! #include <iostream.h> #include “Vector2D.h” int main() { Vector2D *v = new Vector2D(1, 1); cout << “ v = (“  << v -> x() << “,” << v -> y() << “)” << endl;  cout << “ r = “ << v -> r(); cout << “ phi = “ << v -> phi() << endl; delete v; return 0; } main.cc v = (1, 1) r = 1.4141 phi = 0.7854 Output:
Interfaccia e implementazione ,[object Object],[object Object],[object Object]
[object Object],[object Object],Classe  Vector2D #include <iostream> #include “Vector2D .h” int main() { Vector2D v(1, 1); cout << “ V = (“  <<  v.x_  << “,”  // <<  v.y_  << “,” << endl;  // non compila ! cout << “ r = “ << v.r(); cout << “ phi = “ << v.phi() << endl; } main.cc
[object Object],[object Object],Selettori e modificatori modificatore Selettori ( const ) #include “Vector2D.h” void Vector2D::scale(double s) {  x_ *= s; y_ *= s; } Vector2D.cc class Vector2D { public: Vector2D(double x, double y);   double x()  const ; double y()  const ; double r()  const ; double phi()  const ; void scale(double s); private : double x_, y_; }; Vector2D.h #include “Vector2D.h” int main() { const  Vector2D v(1, 0); double r = v.r()  // OK v.scale( 1.1 );  // errore! } main.cc
friend  ,[object Object],class A { . . . friend int aFunc(); friend void C::f(int); };  class B { … friend class C; }; class C { . . . };
friend (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],“ A programmer must confer with an architect before making friend declarations”
static ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Un contatore Class MyClass { private: static  int counter; static  void increment_counter() { counter++; } static  void decrement_counter() { counter--; } public: MyClass() { increment_counter(); } ~MyClass() { decrement_counter(); } static  int HowMany() { return counter; } }; #include <iostream.h> #include “MyClass.h” int MyClass::counter=0; int main() { MyClass a,b,c; MyClass *p=new MyClass; cout<<“ How many? “<<  MyClass::HowMany()  <<endl; delete p; cout<<“ and now? “<<  a.HowMany()  <<endl; return 0; } Un membro statico deve essere inizializzato una e una sola volta nel codice eseguibile Un metodo statico puo` essere  invocato cosi`... …  o cosi`...
Un singleton ,[object Object],class aSingleton { private: static  aSingleton *ptr; aSingleton () {} public: static  aSingleton *GetPointer(){ if (ptr==0)  ptr=new aSingleton;  return ptr;  } }; #include “aSingleton.h” aSingleton *aSingleton::ptr=0; int main() { aSingleton *mySing= aSingleton::GetPointer(); . . .  Return 0; } Pattern utile per  l’implementazione di  classi “manager” di cui  deve esistere una sola  istanza Attenzione a non farlo diventare l’equivalente  di un common block!
Operatori ,[object Object],class Vector2D { public: Vector2D(double x, double y);   double x() const; double y() const; double r() const; double phi() const; private: double x_; double y_; }; Vector2D operator+(const Vector2D& v1,   const Vector2D& v2); Vector2D operator-(const Vector2D& v1,   const Vector2D& v2);   Vector2D.h Vector2D operator+(const Vector2D& v1,   const Vector2D& v2) { return Vector2D(v1.x() + v2.x(),    v1.y() + v2.y()); } Vector2D operator-(const Vector2D& v1,   const Vector2D& v2) { return Vector2D(v1.x() - v2.x(),    v1.y() - v2.y()); } Vector2D.cc
Operatori (2) ,[object Object],ridefinizione di   << #include <iostream> #include “Vector2D.h” int main() { Vector2D v1(1, 0), v2(0, 1); Vector2D v; v = v1 + v2; cout << “ v = “ << v << endl;  cout << “ r = “ << v.r(); cout << “ phi = “ << v.phi() << endl; } main.cc v = (1, 1) r = 1.4141 theta = 0.7854 Output : v.operator=( operator+(v1, v2) );  Sintassi alternativa  (!#@!?)  :
Operatori (3) ,[object Object],   greco #include <iostream> #include <cmath> #include “Vector3D.h” #include “Matrix.h”  // matrice 3x3 int main() { Vector3D v1(1, 1, 0); double phi =  M_PI /3; double c = cos(phi), s = sin(phi); Matrix m(1,  0, 0, 0,  c, s, 0, -s, c); Vector3D u = m * v; } main.cc
this ,[object Object],[object Object],[object Object],class Vector2D { public: Vector2D& operator=(const Vector2D& ); // ... private: double x_, y_; }; Vector2D.h Vector2D& operator=(const Vector2D& v){ x_=v.x(); y_=v.y(); return *this; } Vector2D.cc #include “Vector2D.h” int main() { Vector2D null(0, 0); Vector2D a, b; a=b=null; } main.cc L’operatore = ritorna una  referenza a se stesso.  Permette assegnazioni multiple
Overloading  di operatori ,[object Object],[object Object],class Vector2D { public: // ... private: double x_, y_; }; Vector2D operator*(const Vector2D &,    double); double operator*(const Vector2D&,  const Vector2D&); Vector2D.h Vector2D operator*(const Vector2D&,  double s) { return Vector2D( v.x() * s,    v.y() * s);  } double  operator*(const Vector2D& v1, const Vector2D& v2) { return ( v1.x() * v2.x() +    v1.y() * v2.y() );  } Vector2D.cc
Overloading  di operatori  (2) ,[object Object],[object Object],[object Object],[object Object]
Programmazione generica ,[object Object],template<class T>  T max( T p1, T p2 ) {   if ( p1 < p2 ) return p2;   else return p1; } int main() {  Vector v1,v2;  cout << max<int>(10,20) << endl;  cout << max<float>(2.6,1.0) << endl;  cout << max<Vector>(v1,v2) << endl;} Main.cc Per il tipo T deve essere definito l’operatore <
Sintassi ,[object Object],[object Object],template < class  identifier  >  function definition template < class  identifier  >  class definition typename
[object Object],[object Object],Parametri templati template <typename T=int , int n=10> class array_n { ... private: T items[n];  // n istanziato esplicitamente };  array_n<complex, 1000> w; // w array di complessi
Templates di templates ,[object Object],[object Object],[object Object],template <class T1, template <class T2> class T3 >
Funzioni template e parametri ,[object Object],template <class T> void swap(T& x, T& y){ T temp; temp=x; x=y; y=temp; } template <class T, int n=10> T aFunc(){ T temp[n]; . . . } OK per ogni compilatore ANSI/C++, ma la maggior parte dei compilatori lo rifiuta
Membri statici ,[object Object],[object Object],template <class T> class MyClass { public: static int counter; ... }; MyClass<int> a,b; MyClass<double> c;
Un esempio: lo stack di interi ... Lo stack vuoto class Contenuto { ... private: Contenuto* next; int  val;  }; class Stack { ... private: Contenuto* top; }; val Contenuto next val Contenuto next val Contenuto next Stack top Stack top
Un esempio: lo stack di interi class Stack { public: Stack() {top = 0;} ~Stack() {} void push (  int  i ) { Contenuto* tmp = new   Contenuto(i,top ); top = tmp; } int  pop () { int ret = top->getVal(); Contenuto* tmp = top; top = top->getNext(); delete tmp; return ret; } private: Contenuto* top; }; class Contenuto { public: Contenuto ( int i, Contenuto* ptn ) {    val=i; next=ptn; } int  getVal (){ return val; } Contenuto* getNext() {return next;} private: Contenuto* next; int  val;  }; int main() { Stack s; s.push ( 10 ); s.push ( 20 ); cout << s.pop() << “ - “ << s.pop; return 0; }; User code >> 10 - 20 Output
Lo stack “templato” template <class  T > class Stack { public: Stack() {top = NULL;} ~Stack() {;} void push (  T  i ) { Contenuto<T>* tmp = new   Contenuto<T> (i,top ); top = tmp; } T  pop () { T ret = top->getVal(); Contenuto<T>* tmp = top; top = top->getNext(); delete tmp; return ret; } private: Contenuto<T>* top; }; template <class  T > class Contenuto { public: Contenuto (  T  i, Contenuto* ptn ) { val = i; next = ptn; } T  getVal (){ return val; } Contenuto* getNext() {return next;} private: Contenuto* next; T  val;  }; int main() { Stack<int> s; s.push ( 10 ); s.push ( 20 ); Stack<double> s1; Stack<Shape *> s2; cout << s.pop() << “ “ << s.pop; return 0;}; User code
La Standard Template Library ,[object Object],[object Object],vettori, liste, mappe, …. find, replace, reverse, sort, ….  Iteratori Contenitori puntatori  intelligenti Algoritmi
[object Object],[object Object],[object Object],[object Object],Iteratori (puntatori intelligenti)
[object Object],[object Object],[object Object],[object Object],Contenitori
Sequenze ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
vector ,[object Object],[object Object],1 2 ... 9 ++ begin() end() p p p p p 0 push_back() p
list ,[object Object],[object Object],[object Object],... list top bottom val nodo next prev val nodo next prev val nodo next prev
Contenitori associativi ,[object Object],[object Object],[object Object],[object Object]
Algoritmi ,[object Object],[object Object],find count copy fill sort min ,  max
Esempio uso sequenze #include <  > #include <algorithm> #include <iostream> int main() { <int> container; int val; for (int i=0; i<10; i++) { val = (int)((float)rand()/RAND_MAX*10); container.push_back(val);  } <int>::iterator it1; for ( it1= container.begin();  it1!= container.end();  it1++)  cout << &quot;vector : &quot; << *it1 << endl; return 0; } vector vector vector list list list
Esempio uso contenitori associativi #include <map> #include <algorithm> #include <iostream> #include <string> int main() { map<string,int> amap ; amap[&quot;Primo”]=1; amap[“Secondo”]=2; cout << &quot;Size : &quot; << amap.size() << endl; amap[&quot;Terzo&quot;]=3; amap[&quot;Quarto&quot;]=4; cout << &quot;Size : &quot; << amap.size() << endl; map<string,int>::iterator it; for ( it= amap.begin();  it!= amap.end();  it++)  cout << &quot;map : &quot; << it->first << &quot; &quot; << it->second << endl; cout <<  amap.find(&quot;Terzo&quot;)-> second << endl; return 0; }
Assegnazione di un metodo ad un messaggio ,[object Object],[object Object],[object Object],[object Object],[object Object]
Controllo dei  tipi ,[object Object],[object Object],[object Object],[object Object],[object Object]
Typing & Binding Typing Definizione dei messaggi e degli  argomenti Binding Assegnazione di un metodo ad un  messaggio Strong Consistenza dei tipi verificata dal compilatore Weak  Consistenza dei tipi verificata a run-time Early In fase di programmazione  INFLESSIBILE Late  A run-time POLIMORFISMO
Esempio: i soldati ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Polimorfismo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ereditarietà ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],class newclass: (public|protected|private) oldclass { dichiarazioni... };
Ereditarietà (2) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Ereditarietà (3) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Classi base astratte ,[object Object],[object Object],[object Object],[object Object],[object Object],virtual func_prototype  = 0 ;
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Erediarietà multipla ,[object Object],[object Object],class A { . . . . }; class B { . . . . }; class AplusB: public A, private B { . . . . };
dynamic_cast ,[object Object],class Base { . . . . // base implementation }; class Derived: public Base { . . . . void  new_method()  ; //  non e’ definito in Base! }; void func(Base *ptr) // ptr e’ un obbetto dell classe Base { ptr-> new_method (); //  Errore!!! Derived *p = dynamic_cast<Derived *> (ptr) if (p !=0) { p-> new_method (); } }
Ereditarietà (4) ,[object Object],DchTrack   è  una  Track  che ha degli attributi in più ( hits_ ) e nuovi metodi ( DchHit* hit(int n), int hits() ) class Track { public: LorentzVector momentum()  { return p_; } protected: LorentzVector p_; }; Track.h #include “Track.h”   class DchTrack : public Track { public: int hits()  { return hits_->size(); } DchHit* hit(int n)  { return hits_[n]; } protected: list<DchHit> hits_; }; DchTrack.h
Esempio: shape ,[object Object],[object Object],[object Object],[object Object],[object Object]
Cerchi e quadrati Quadrato Cerchio
Cerchio public: Circle (Point2d center, double radius); ~Circle (); void  moveAt (const Point2d & p); void  moveBy (const Point2d & p); void  scale (double s); void  rotate (double phi); void  draw () const; void  cancel () const; class  Circle   { }; private: Point2d center_; double radius_; Circle.h Costruttore Distruttore Nome della classe Punto e virgola ! Point2d : classe che rappresenta  un punto in 2 dimensioni. “ Dati” privati ( Attributi , membri) Interfaccia Pubblica Metodi : operazioni sugli oggetti
Cerchio (2) # include “Circle.h” void  Circle :: draw () const  { const int numberOfPoints = 100; float x[numberOfPoints], y[numberOfPoints]; float phi = 0, deltaPhi = 2*M_PI/100; for ( int i = 0; i < numberOfPoints; ++i )  { x[i] = center_.x() + radius_ * cos( phi ); y[i] = center_.y() + radius_ * sin( phi ); phi += dphi; } polyline_draw (x, y, numberOfPoints, color_, FILL); } void  Circle :: moveAt ( const Point2d& p ) {    cancel ();  center_ = p;  draw ();  } void  Circle :: scale ( double s )  {    cancel ();  radius_ *= s;  draw ();  } Circle :: Circle ( Point2d c, double r ) : center_( c ), radius_( r )  {  draw ();  }   Circle :: ~Circle ()  {  cancel ();  } Circle.cc #include “Circle.h” int main()  { Circle   c ( Point2d(10, 10), 5 ); c . draw (); c . moveAt (Point2d(20, 30)); return 0; } Main.cc
Quadrato  upperCorner loweCorner centerToUpperCorner _ class  Square   { public: Square (const Point2d&, const Point2d&,  Color color = TRASPARENT); ~Square ();  void  moveAt ( const Point2d& p ); void  moveBy ( const Point2d& p ); void  changeColor ( Color color ); void  scale ( double s ); void  rotate ( double phi ); void  draw () const; void  cancel () const; private: Point2d center_; Vector2d centerToUpperCorner_; Color color_; }; Square.h #include “Square.h” void  Square :: draw () const  { float x[4], y[4]; Vector2d delta( centerToUpperCorner_ ); for ( int i = 0; i < 4; i++ )  { Point2d corner = center_ + delta; x[i] = corner.x();  y[i] = corner.y(); delta.rotate( M_PI_2 ); } polyline_draw (x, y, 4, color_, FILL); } void  Square :: rotate ( double phi )  {  cancel ();    centerToUpperCorner_.rotate( phi );  draw ();  } Square :: Square (const Point2d& lowerCorner,    const Point2d& upperCorner,  Color color) : center_( median(lowerCorner, upperCorner) ),    centerToUpperCorner_( upperCorner - center_ ),  color_( color )  {  draw ();  } void  Square :: scale ( double s )  {  cancel ();  centerToUpperCorner_ *= s;  draw (); } Square.cc
Codice Applicativo (Client) Come gestire cerchi  e quadrati insieme? Costruisce un vettore di puntatori a cerchi, crea oggetti in memoria e salva i loro puntatori nel vettore.  Itera sul vettore e invoca  draw ()   per ogni elemento #include “Circle.h” #include “Square.h” int main()  { Circle  c1(  Point2d (2.,3.), 4.23 ); Square  r1(  Point2d (2.,1.),  Point2d (4.,3.) ); Circle  * circles[ 10 ]; for ( int i = 0; i < 10; ++i )  { circles[ i ] = new  Circle (  Point2d (i,i), 2. ); } for ( int i = 0; i < 10; ++i )  circles[ i ]-> draw (); return 0; } Main.cc
Polimorfismo Tutte le  Shape s hanno la stessa interfaccia: draw, pick, move, fillColor... , ma ogni  sottotipo  diverso può avere la usa personale implementazione
Interfaccia astratta Interfaccia di metodi  puramente virtuali class  Shape  { public: Shape () { } virtual   ~Shape () { } virtual  void  moveAt (const Point2d& where)  = 0 ; virtual  void  changeColor (Color newColor)  = 0 ; virtual  void  scale (double s)  = 0 ; virtual  void  rotate (double phi)  = 0 ; virtual  void  draw () const  = 0 ; virtual  void  cancel () const  = 0 ; }; Shape.h #include “Shape.h” class  Square   : public   Shape   { // …. Il resto tutto uguale a prima }; Square.h #include “Circle.h” #include “Square.h” int main()  { Shape  * shapes[ 20 ]; int index = 0; for ( int i = 0; i < 10; i++ )  { Shape  * s; s = new  Circle ( Point2d(i, i), 2.) ); shapes[ index ++ ] = s; s = new  Square ( Point2d(i, i),  Point2d(i+1, i+2)) ); shapes[ index ++ ] = s; } for ( int i = 0; i < 20; i++ ) shapes[ i ]-> draw (); return 0; } Main.cc
Ereditarietà e riuso del codice Non si possono chiamare metodi virtuali in costruttori e distruttori  (troppo presto, troppo tardi) Class  CenteredShape : public  Shape   { public: CenteredShape (Point2d c,  Color color = TRASPARENT)  : center_(c), color_(color) {  /*draw();*/  } ~Circle ()  {  /*cancel();*/  } void  moveAt ( const Point2d& ); void  moveBy ( const Vector2d& ); void  changeColor ( Color ); virtual  void  scale ( double )  = 0 ; virtual  void  rotate ( double )  = 0 ; virtual  void  draw () const  = 0 ; virtual  void  cancel () const  = 0 ; protected: Point2d center_; Color color_; }; CenteredShape.h #include “CenteredShape.hh” class  Square  : public  CenteredShape   { public: Square ( Point2d lowerCorner, Point2d upperCorner,  Color col = TRASPARENT) : CenteredShape ( median(lowerCorner, upperCorner), col),  touc_(upperCorner - center_) { draw(); } ~Square () { cancel(); } virtual  void  scale ( double s )  { cancel(); centerToUpperCorner_ *= s; draw(); } virtual  void  rotate ( double phi );  virtual  void  draw () const; virtual  void  cancel () const; private: Vector2d touc_; }; Square.h
Attenzione alle generalizzazioni... ,[object Object],[object Object],Avere  lx_  e  ly_  è ridondante per  Square Cosa succede se si invoca  scaleX  o  scaleY  ? class  Rectangle   { public: Rectangle (double x0, double y0,  double lx, double ly) : lx_(lx), ly_(ly), x0_(x0), y0_(y0) { } void  scaleX (double s); void  scaleY (double s); protected: double x0_, y0_; double lx_, ly_; }; Rectangle.h class  Square  : public  Rectangle { public: Square (double x0, double y0, double l) : Rectangle (x0, y0, l, l) { } }; Square.h
Ereditarietà multipla ,[object Object],class  DrawableObj { public: virtual  void  draw ()  = 0 ; }; DrawableObj.h class  Shape   { public: virtual  void  scale (double s)  = 0 ; virtual  void  moveAt ( Vector2d& )  = 0 ; }; Shape.h class  DrawableShape  :  public  DrawableObj , public  Shape { public: virtual  void  draw (); virtual  void  scale (double s); virtual  void  moveAt ( Vector2d& );  }; DrawableShape.h
Strategie di sviluppo di un progetto ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Modello  a cascata Analisi Disegno Produzione Testing Requisiti
Modello  evoluzionario Requisiti Analisi Disegno Produzione Testing
Confronto fra i modelli di sviluppo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Requisiti ,[object Object],[object Object],[object Object],[object Object],[object Object]
Analisi ,[object Object],[object Object],[object Object],[object Object],[object Object]
Disegno Definizione delle  interfacce Definizione di oggetti  e classi Definizione degli stati  e dell’implementazione Definizione delle  relazioni
Disegno (2) ,[object Object],[object Object],[object Object],[object Object]
Codifica ,[object Object],[object Object]
Testing ,[object Object],[object Object],[object Object]
Metodi di sviluppo del software ,[object Object],[object Object],[object Object],[object Object],[object Object]
Metodi Object Oriented ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Grady Booch Jim Rumbaugh Ivar Jacobson
UML per l’analisi e il disegno ,[object Object],[object Object],[object Object],[object Object]
Concetti delle classi rivisitati ,[object Object],[object Object],[object Object],[object Object],[object Object]
Rappresentazione delle classi operatori attibuti pubblico protetto privato Nome + metodo(arg) # metodo(arg) -  metodo(arg) - dato - dato
Rappresentazione di una classe C++ in UML class  Nome   { private: Tipo1   variabile1 ; Tipo2   variabile2 ; Tipo3   variabile3 ; public: Nome (); ~Nome ();  Tipo4   funzione1   ( arg ); protected: Tipo5   funzione2   ( arg ); private: Tipo6   funzione3   ( arg ); }; Nome.h Nome   -  variabile1 : Tipo1   -  variabile2 : Tipo2   -  variabile3 : Tipo3   +  funzione1 (arg): Tipo4 #  funzione2 (arg): Tipo5 -  funzione3 (arg): Tipo6
Attributi e metodi Notazione di  Rational Rose Publico ( + ) Privato ( - ) Protetto ( # )
Principali relazioni fra classi ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Aggregazione (contenimento) ,[object Object],[object Object],[object Object],[object Object]
Cardinalità e direzionalità ,[object Object],[object Object],[object Object],[object Object],Non navigabile
Dipendenza ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Generalizzazione (ereditarietà) Ereditariet à virtuale!
Class Diagram di “Shape”
Class Diagram
Class Diagram
Object Sequence Diagram
Object Collaboration Diagram
CRC Classi, Responsabilità, Collaborazioni C D E F B A x y z s f q p w
Assegnare Responsabilità ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Collaborazione tra classi ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Identificare Relazioni ,[object Object],[object Object],[object Object],[object Object]
Relazioni ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],{
Avere o essere? ,[object Object],[object Object],[object Object],[object Object],[object Object]
Principio di Liskov ,[object Object],[object Object],[object Object]
Composizione  by value  o  by refrence ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Approccio  Outside-in ,[object Object],[object Object],[object Object],[object Object]
CRC Workshop ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Regole per il CRC workshop ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Design Patterns ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Factory I client possono richiedere la creazione di un prodotto senza dipendervi La   Factory   dipende dai prodotti concreti, mentre i client dipendono solo da quelli astratti
Proxy Una richiesta da un client a un server, può  essere mediata dal   Proxy , che può compiere  anche altre operazioni (I/O, caching, etc.)
Composite Il client può trattare componenti e compositi usando la stessa interfaccia. La composizione può essere ricursiva. Esempio : programmi di grafica
Gruppo di Shapes Il gruppo di shapes è il  Composite La shape è  il  Component Le shapes concrete (Circle, Square, ecc...) sono le  Leaf Circle, Square, ... draw( ) Shape draw( ) GroupofShapes draw( ) 1..* 1..* Client _components
Codice del modello composite #include “ Shape .h” class  Circle : public  Shape  { public: Circle ( Point2D c, double r ):  Shape(), center_(c), radius_(r)  {} void draw () const {  ; // draw  circle  } // altri metodi definiti per Circle pr ivate : double radius_ ; Point2D center_; }; Circle .h class  Shape  { public: Shape () {} virtual  void draw () const = 0; // altri metodi virtuali ( = 0 ) }; Shape .h
Codice del modello composite #include “ Shape .h” class  GroupofShapes  : public  Shape  { public: typedef vector< Shape  *> Container; typedef Container::const_iterator Iterator;  GroupofShapes (){} void draw () const { Iterator p=components.begin(); Iterator pe=components.end(); while (p!=pe)  { (*p)-> draw (); p++; } return; } // gli altri metodi sono definiti operando // sui componenti protected: Container components; }; GroupofShapes .h
Strategy Il pattern  Strategy  permette di scegliere l’algoritmo da eseguire a run-time. Nuovi algoritmi possono essere introdotti senza modificare il codice utente.
Observer Lo stato dell’ Observer  dipende dallo stato del  Subject . Il  Subject  notifica a tutti gli  Observer  registrati che il suo stato è cambiato.
Appendice: strighe C-style ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Appendice: la classe  string ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Confronto stringhe C-style e  string ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Appendice:operazioni di I/O ,[object Object],[object Object],[object Object],[object Object],[object Object],include<iostream> include<string> int main(){ string nome; cout  << “Come ti chiami?” << endl; cin   >>  nome;  // Notare la direzione!!! if(nome.empty())  cerr  << “Stringa nulla!” << endl; else  cout  << “Ciao “ << nome << “!” << endl; return 0; }
Overloading degli operatori di I/O ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Appendice: I/O con files ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],#include < fstream > #include <string> int main(){ ifstream fin (“file1.dat”); // deve esistere! if(!fin){ cerr << “file1.dat non esiste” << endl; return -1; } ofstream fout (“file2.dat”); // se esiste viene sovrascritto int i=0; string parola; while ( inf >>  parola) fout <<  “La “ << ++i << “-esima parola e “ << parola << endl; fin.close(); fout.close(); return 0; }
Appendice: I/O in memoria ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Appendice: Manipolatori di I/O ,[object Object],boolalpha : true e false rappresentati come stringhe  noboolalpha : true e false rappresentati come 1 e 0 (default) showbase : interi stampati col prefisso che indica la base  noshowbase : interi stampati senza il prefisso (default)  showpoint : floating point stampati sempre col punto decimale noshowpoint : stampa i floating point come interi se non frazionari (default)  showpos : stampa + per numeri positivi  noshowpos : non stampa + per i numeri positivi (default)  skipws:  salta gli spazi bianchi in input (default)  noskipws : non salta gli spazi bianchi in input  uppercase : stampa  0X  in esadecimale,  E  in scientifica  lowercase : stampa  0x  oppure  e  (default)  dec : interi in base 10 (default)  hex : interi in base 16 oct:  interi in base 8
Appendice: Manipolatori di I/O (2) ,[object Object],[object Object],left : aggiunge caratteri di riempimento alla destra del val.  right : aggiunge caratteri di riempimento alla sinistra internal : aggiunge caratteri fra segno e valore fixed : floating point in notazione decimale (default)  scientific : floating point in notazione scientifica flush : svuota il buffer ends : aggiunge il carattere nullo (  ) e svuota il buf
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++
Riepilogo Java C/C++

More Related Content

What's hot

10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Introduzione a R
Introduzione a RIntroduzione a R
Introduzione a RMCalderisi
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatoriSTELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018Marco Parenzan
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi orestJump
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: AlgoritmiMajong DevJfu
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamicaguest60e9511
 
9 Altre Istruzioni Di I O
9   Altre Istruzioni Di I O9   Altre Istruzioni Di I O
9 Altre Istruzioni Di I Oguest60e9511
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2STELITANO
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioniMajong DevJfu
 

What's hot (20)

10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Introduzione a R
Introduzione a RIntroduzione a R
Introduzione a R
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamica
 
9 Altre Istruzioni Di I O
9   Altre Istruzioni Di I O9   Altre Istruzioni Di I O
9 Altre Istruzioni Di I O
 
Flow chart
Flow chartFlow chart
Flow chart
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2
 
R Vectors
R VectorsR Vectors
R Vectors
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
07 1 funzioni
07 1 funzioni07 1 funzioni
07 1 funzioni
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni07 - Programmazione: Tipi di base e conversioni
07 - Programmazione: Tipi di base e conversioni
 

Similar to Riepilogo Java C/C++

Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuerySandro Marcon
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewFrancesco Sciuti
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiSergio Porcu
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Alberto Pasca
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)STELITANO
 
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope VariabiliMajong DevJfu
 

Similar to Riepilogo Java C/C++ (20)

Le basi di Pytthon 3 - Fondamenti n.1
Le basi di Pytthon 3 - Fondamenti n.1Le basi di Pytthon 3 - Fondamenti n.1
Le basi di Pytthon 3 - Fondamenti n.1
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
Tutorial Matlab 2009
Tutorial Matlab 2009Tutorial Matlab 2009
Tutorial Matlab 2009
 
Js intro
Js introJs intro
Js intro
 
Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
DHow2 - L1
DHow2 - L1DHow2 - L1
DHow2 - L1
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuery
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
 
La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++La metodologia Top - Down - applicazione al C++
La metodologia Top - Down - applicazione al C++
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)
 
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili
 

Recently uploaded

IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataGianluigi Cogo
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxOrianaOcchino
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldivaleriodinoia35
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiorevaleriodinoia35
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 
Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxfedericodellacosta2
 

Recently uploaded (8)

IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open Data
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptx
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldi
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiore
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 
Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptx
 

Riepilogo Java C/C++

  • 3. Struttura di un programma C /* This is a comment */ // This is a one-line comment # include <stdio.h> /* includes header files */ main() /* Must have a main function. First function { printf (&quot;Hello World!&quot;); /* stdio functions */ }
  • 4.
  • 5.
  • 6.
  • 7.
  • 8. Funzioni e prototipi #include <stdio.h> int add1(int); void main() { int x; x=5; x=add1(x); printf(&quot;%d“,x); } int add1(int i) { int y; y=i+1; return (y); }
  • 9.
  • 12.
  • 13. Array int x[10]; double y[15]; x[10]=10; char c[15];
  • 14. Puntatori!!! int a, *b, c; // b is a pointer b = &a; // Store in b the address of a c = *b; // Store in c the value at // address b (i.e., a)
  • 15. Puntatori a caratteri e array char *y; char x[100]; y = &x[0]; y = x; // Does the same as the line above *(y+1) gives x[1] *(y+i) gives x[i]
  • 16. Ancora puntatori int x,y; int *p1,*p2; 1000 1004 1008 1012 x y p1 p2
  • 17. Ancora puntatori(2) x=-42; y=163 1000 1004 1008 1012 x y p1 p2 -42 163
  • 18. Ancora puntatori(3) p1=&x; p2=&y; 1000 1004 1008 1012 x y p1 p2 -42 163 1000 1004
  • 19. Ancora puntatori(4) *p1=17; 1000 1004 1008 1012 x y p1 p2 17 163 1000 1004
  • 20. Ancora puntatori(5) p1=p2; 1000 1004 1008 1012 x y p1 p2 17 163 1000 1004
  • 21.
  • 22. Strutture struct emprec { char name[25]; int age; int pay; }; struct emprec employee; employee.age=32;
  • 23.
  • 24. Introduzione al C++ e alla programmazione ad oggetti
  • 25.
  • 26. Il rapporto Dato-Algoritmo Linguaggio Bits Bits macchina Programmazione Dati Algoritmi Livello di astrazione Assemblers Symbolic Op-code Words Compilatori Variables & Statements Types Linguaggi Data Subroutines strutturati structures Ada (Modula) Abstract Packages Data Types (Modules) Object Oriented Objects Objects
  • 27.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46. Tipi predefiniti in C++ (2) 123 123 0x123 interi costanti , decimale, ottale, esadecimale 123l 123u interi, long, unsigned ‘ A’ ‘1’ ‘’ caratteri, tab 3.14f 3.1415 3.1415L float, double, long double 300e-2 .03e2 30e-1 double, notazione esponenziale “ Nome” stringa costante true false boolean Esempi di costanti ‘ ’ alert ‘ ’ backslash ‘ ’ backspace ‘ ’ carriage return ‘ ’ double quote ‘ ’ form feed ‘ ’ tab ‘ ’ newline ‘ ’ carattere nullo ‘ ’ single quote ‘ ’ vertical tab ‘ 01’ 101 ottale, ‘A’ ‘ 041’ esadecimale, ‘A’ Costanti carattere “” stringa nulla (‘’) “ nome” ‘n’ ‘o’ ‘m’ ‘e’ ‘’ “ una stringa” stampa: una “stringa” “ una stringa un alla fine della linea su piu` linee” per continuare la stringa Stringhe costanti
  • 47. Tipi predefiniti in C++ (3) char [1] int [1] bool short [1] long [1] float double long double 8 16 16 16 32 32 64 64 8 32 32 16 32 32 64 128 8 32 32 16 64 32 64 128 OS 16 bit OS 32 bit OS 64 bit [1] Può essere unsigned
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58. Operatori -i +w piu` e meno unari a*b a/b i%2 moltiplicazione, divisione, modulo a+b a-b addizione e sottrazione binarie a=3; assegnazione Espressioni Aritmetiche Commento k = ++j; j=j+1; k=j; k = j++; k=j; j=j+1; k = --j; j=j-1; k=j; k = j--; k=j; j=j-1; Auto-incremento Espressione e decremento ~i; Complemento bit a bit i&j; AND bit a bit i|j OR bit a bit i^j XOR bit a bit i<<n shift a sinistra di n pos. i>>n shift a destra di n pos. bit-wise significato < minore di .LT. > maggiore di .GT. <= minore o uguale .LE. >= maggiore o uguale .GE. == uguale .EQ. != diverso .NE. ! Negazione unaria .NOT. && and logico .AND. || or logico .OR. Operatori relazionali Fortran
  • 59.
  • 60. Statements vuoto ; espressione j=j+k; composto { . . . . } usato in funzioni, if.. Costituisce un blocco goto goto label; da non usarsi if if (p==0) cerr<<“error”; un solo branch if-else if (x==y) cout<<“the same”; else cout<<“different”; due branch for for (j=0;j<n;j++) le dichiarazioni sono a[j]=0; permesse while while (i != j) 0 o piu` iterazioni i++; do-while do y=y-1; 1 o piu` iterazioni while (y>0); break break; esce dal blocco continue continue; prossima iterazione Statement C++ commenti
  • 61. Statements (2) switch switch (s) { case 1: si deve usare break per ++i; evitare di cadere nei case 2: casi successivi e --i; aggiungere un caso di default: default alla fine della ++j; lista }; dichiarazione int i=7; in un blocco, file o namespace try try {. . . .} usato per trattare le eccezioni label error: cerr<<“Error!”; usato con goto return return x*x*x; valore di ritorno di una funzione Statement C++ commenti
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85. Funzioni (2) funzione double cube(double x) parametri passati { return x*x*x; } “by value” procedura void pr_square(int i) subroutine, non si { cout<<i*I<<endl; } usa return senza argomenti void hello () puo` anche essere { cout<<“Hello”<<endl; } void hello(void) argomenti passati void swap(int& i,int& j) i e j hanno i loro per riferimento { int t=i; i=j; j=t; } valori scambiati variabile int scanf(const char, … ) chiamata con un qualsiasi numero di argomenti inline inline double cube(int x) codice inline argomenti di int power(int i, int n=2) il 2do argomento default puo` essere tralasciato Tipo di dichiarazione C++ commenti
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100. Una classe C++ Messaggio Messaggio Messaggio Metodo Metodo Metodo Attributo Attributo Attributo
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116. Un contatore Class MyClass { private: static int counter; static void increment_counter() { counter++; } static void decrement_counter() { counter--; } public: MyClass() { increment_counter(); } ~MyClass() { decrement_counter(); } static int HowMany() { return counter; } }; #include <iostream.h> #include “MyClass.h” int MyClass::counter=0; int main() { MyClass a,b,c; MyClass *p=new MyClass; cout<<“ How many? “<< MyClass::HowMany() <<endl; delete p; cout<<“ and now? “<< a.HowMany() <<endl; return 0; } Un membro statico deve essere inizializzato una e una sola volta nel codice eseguibile Un metodo statico puo` essere invocato cosi`... … o cosi`...
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130. Un esempio: lo stack di interi ... Lo stack vuoto class Contenuto { ... private: Contenuto* next; int val; }; class Stack { ... private: Contenuto* top; }; val Contenuto next val Contenuto next val Contenuto next Stack top Stack top
  • 131. Un esempio: lo stack di interi class Stack { public: Stack() {top = 0;} ~Stack() {} void push ( int i ) { Contenuto* tmp = new Contenuto(i,top ); top = tmp; } int pop () { int ret = top->getVal(); Contenuto* tmp = top; top = top->getNext(); delete tmp; return ret; } private: Contenuto* top; }; class Contenuto { public: Contenuto ( int i, Contenuto* ptn ) { val=i; next=ptn; } int getVal (){ return val; } Contenuto* getNext() {return next;} private: Contenuto* next; int val; }; int main() { Stack s; s.push ( 10 ); s.push ( 20 ); cout << s.pop() << “ - “ << s.pop; return 0; }; User code >> 10 - 20 Output
  • 132. Lo stack “templato” template <class T > class Stack { public: Stack() {top = NULL;} ~Stack() {;} void push ( T i ) { Contenuto<T>* tmp = new Contenuto<T> (i,top ); top = tmp; } T pop () { T ret = top->getVal(); Contenuto<T>* tmp = top; top = top->getNext(); delete tmp; return ret; } private: Contenuto<T>* top; }; template <class T > class Contenuto { public: Contenuto ( T i, Contenuto* ptn ) { val = i; next = ptn; } T getVal (){ return val; } Contenuto* getNext() {return next;} private: Contenuto* next; T val; }; int main() { Stack<int> s; s.push ( 10 ); s.push ( 20 ); Stack<double> s1; Stack<Shape *> s2; cout << s.pop() << “ “ << s.pop; return 0;}; User code
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141. Esempio uso sequenze #include < > #include <algorithm> #include <iostream> int main() { <int> container; int val; for (int i=0; i<10; i++) { val = (int)((float)rand()/RAND_MAX*10); container.push_back(val); } <int>::iterator it1; for ( it1= container.begin(); it1!= container.end(); it1++) cout << &quot;vector : &quot; << *it1 << endl; return 0; } vector vector vector list list list
  • 142. Esempio uso contenitori associativi #include <map> #include <algorithm> #include <iostream> #include <string> int main() { map<string,int> amap ; amap[&quot;Primo”]=1; amap[“Secondo”]=2; cout << &quot;Size : &quot; << amap.size() << endl; amap[&quot;Terzo&quot;]=3; amap[&quot;Quarto&quot;]=4; cout << &quot;Size : &quot; << amap.size() << endl; map<string,int>::iterator it; for ( it= amap.begin(); it!= amap.end(); it++) cout << &quot;map : &quot; << it->first << &quot; &quot; << it->second << endl; cout << amap.find(&quot;Terzo&quot;)-> second << endl; return 0; }
  • 143.
  • 144.
  • 145. Typing & Binding Typing Definizione dei messaggi e degli argomenti Binding Assegnazione di un metodo ad un messaggio Strong Consistenza dei tipi verificata dal compilatore Weak Consistenza dei tipi verificata a run-time Early In fase di programmazione INFLESSIBILE Late A run-time POLIMORFISMO
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158. Cerchi e quadrati Quadrato Cerchio
  • 159. Cerchio public: Circle (Point2d center, double radius); ~Circle (); void moveAt (const Point2d & p); void moveBy (const Point2d & p); void scale (double s); void rotate (double phi); void draw () const; void cancel () const; class Circle { }; private: Point2d center_; double radius_; Circle.h Costruttore Distruttore Nome della classe Punto e virgola ! Point2d : classe che rappresenta un punto in 2 dimensioni. “ Dati” privati ( Attributi , membri) Interfaccia Pubblica Metodi : operazioni sugli oggetti
  • 160. Cerchio (2) # include “Circle.h” void Circle :: draw () const { const int numberOfPoints = 100; float x[numberOfPoints], y[numberOfPoints]; float phi = 0, deltaPhi = 2*M_PI/100; for ( int i = 0; i < numberOfPoints; ++i ) { x[i] = center_.x() + radius_ * cos( phi ); y[i] = center_.y() + radius_ * sin( phi ); phi += dphi; } polyline_draw (x, y, numberOfPoints, color_, FILL); } void Circle :: moveAt ( const Point2d& p ) { cancel (); center_ = p; draw (); } void Circle :: scale ( double s ) { cancel (); radius_ *= s; draw (); } Circle :: Circle ( Point2d c, double r ) : center_( c ), radius_( r ) { draw (); } Circle :: ~Circle () { cancel (); } Circle.cc #include “Circle.h” int main() { Circle c ( Point2d(10, 10), 5 ); c . draw (); c . moveAt (Point2d(20, 30)); return 0; } Main.cc
  • 161. Quadrato upperCorner loweCorner centerToUpperCorner _ class Square { public: Square (const Point2d&, const Point2d&, Color color = TRASPARENT); ~Square (); void moveAt ( const Point2d& p ); void moveBy ( const Point2d& p ); void changeColor ( Color color ); void scale ( double s ); void rotate ( double phi ); void draw () const; void cancel () const; private: Point2d center_; Vector2d centerToUpperCorner_; Color color_; }; Square.h #include “Square.h” void Square :: draw () const { float x[4], y[4]; Vector2d delta( centerToUpperCorner_ ); for ( int i = 0; i < 4; i++ ) { Point2d corner = center_ + delta; x[i] = corner.x(); y[i] = corner.y(); delta.rotate( M_PI_2 ); } polyline_draw (x, y, 4, color_, FILL); } void Square :: rotate ( double phi ) { cancel (); centerToUpperCorner_.rotate( phi ); draw (); } Square :: Square (const Point2d& lowerCorner, const Point2d& upperCorner, Color color) : center_( median(lowerCorner, upperCorner) ), centerToUpperCorner_( upperCorner - center_ ), color_( color ) { draw (); } void Square :: scale ( double s ) { cancel (); centerToUpperCorner_ *= s; draw (); } Square.cc
  • 162. Codice Applicativo (Client) Come gestire cerchi e quadrati insieme? Costruisce un vettore di puntatori a cerchi, crea oggetti in memoria e salva i loro puntatori nel vettore. Itera sul vettore e invoca draw () per ogni elemento #include “Circle.h” #include “Square.h” int main() { Circle c1( Point2d (2.,3.), 4.23 ); Square r1( Point2d (2.,1.), Point2d (4.,3.) ); Circle * circles[ 10 ]; for ( int i = 0; i < 10; ++i ) { circles[ i ] = new Circle ( Point2d (i,i), 2. ); } for ( int i = 0; i < 10; ++i ) circles[ i ]-> draw (); return 0; } Main.cc
  • 163. Polimorfismo Tutte le Shape s hanno la stessa interfaccia: draw, pick, move, fillColor... , ma ogni sottotipo diverso può avere la usa personale implementazione
  • 164. Interfaccia astratta Interfaccia di metodi puramente virtuali class Shape { public: Shape () { } virtual ~Shape () { } virtual void moveAt (const Point2d& where) = 0 ; virtual void changeColor (Color newColor) = 0 ; virtual void scale (double s) = 0 ; virtual void rotate (double phi) = 0 ; virtual void draw () const = 0 ; virtual void cancel () const = 0 ; }; Shape.h #include “Shape.h” class Square : public Shape { // …. Il resto tutto uguale a prima }; Square.h #include “Circle.h” #include “Square.h” int main() { Shape * shapes[ 20 ]; int index = 0; for ( int i = 0; i < 10; i++ ) { Shape * s; s = new Circle ( Point2d(i, i), 2.) ); shapes[ index ++ ] = s; s = new Square ( Point2d(i, i), Point2d(i+1, i+2)) ); shapes[ index ++ ] = s; } for ( int i = 0; i < 20; i++ ) shapes[ i ]-> draw (); return 0; } Main.cc
  • 165. Ereditarietà e riuso del codice Non si possono chiamare metodi virtuali in costruttori e distruttori (troppo presto, troppo tardi) Class CenteredShape : public Shape { public: CenteredShape (Point2d c, Color color = TRASPARENT) : center_(c), color_(color) { /*draw();*/ } ~Circle () { /*cancel();*/ } void moveAt ( const Point2d& ); void moveBy ( const Vector2d& ); void changeColor ( Color ); virtual void scale ( double ) = 0 ; virtual void rotate ( double ) = 0 ; virtual void draw () const = 0 ; virtual void cancel () const = 0 ; protected: Point2d center_; Color color_; }; CenteredShape.h #include “CenteredShape.hh” class Square : public CenteredShape { public: Square ( Point2d lowerCorner, Point2d upperCorner, Color col = TRASPARENT) : CenteredShape ( median(lowerCorner, upperCorner), col), touc_(upperCorner - center_) { draw(); } ~Square () { cancel(); } virtual void scale ( double s ) { cancel(); centerToUpperCorner_ *= s; draw(); } virtual void rotate ( double phi ); virtual void draw () const; virtual void cancel () const; private: Vector2d touc_; }; Square.h
  • 166.
  • 167.
  • 168.
  • 169. Modello a cascata Analisi Disegno Produzione Testing Requisiti
  • 170. Modello evoluzionario Requisiti Analisi Disegno Produzione Testing
  • 171.
  • 172.
  • 173.
  • 174. Disegno Definizione delle interfacce Definizione di oggetti e classi Definizione degli stati e dell’implementazione Definizione delle relazioni
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182. Rappresentazione delle classi operatori attibuti pubblico protetto privato Nome + metodo(arg) # metodo(arg) - metodo(arg) - dato - dato
  • 183. Rappresentazione di una classe C++ in UML class Nome { private: Tipo1 variabile1 ; Tipo2 variabile2 ; Tipo3 variabile3 ; public: Nome (); ~Nome (); Tipo4 funzione1 ( arg ); protected: Tipo5 funzione2 ( arg ); private: Tipo6 funzione3 ( arg ); }; Nome.h Nome - variabile1 : Tipo1 - variabile2 : Tipo2 - variabile3 : Tipo3 + funzione1 (arg): Tipo4 # funzione2 (arg): Tipo5 - funzione3 (arg): Tipo6
  • 184. Attributi e metodi Notazione di Rational Rose Publico ( + ) Privato ( - ) Protetto ( # )
  • 185.
  • 186.
  • 187.
  • 188.
  • 190. Class Diagram di “Shape”
  • 195. CRC Classi, Responsabilità, Collaborazioni C D E F B A x y z s f q p w
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207. Factory I client possono richiedere la creazione di un prodotto senza dipendervi La Factory dipende dai prodotti concreti, mentre i client dipendono solo da quelli astratti
  • 208. Proxy Una richiesta da un client a un server, può essere mediata dal Proxy , che può compiere anche altre operazioni (I/O, caching, etc.)
  • 209. Composite Il client può trattare componenti e compositi usando la stessa interfaccia. La composizione può essere ricursiva. Esempio : programmi di grafica
  • 210. Gruppo di Shapes Il gruppo di shapes è il Composite La shape è il Component Le shapes concrete (Circle, Square, ecc...) sono le Leaf Circle, Square, ... draw( ) Shape draw( ) GroupofShapes draw( ) 1..* 1..* Client _components
  • 211. Codice del modello composite #include “ Shape .h” class Circle : public Shape { public: Circle ( Point2D c, double r ): Shape(), center_(c), radius_(r) {} void draw () const { ; // draw circle } // altri metodi definiti per Circle pr ivate : double radius_ ; Point2D center_; }; Circle .h class Shape { public: Shape () {} virtual void draw () const = 0; // altri metodi virtuali ( = 0 ) }; Shape .h
  • 212. Codice del modello composite #include “ Shape .h” class GroupofShapes : public Shape { public: typedef vector< Shape *> Container; typedef Container::const_iterator Iterator; GroupofShapes (){} void draw () const { Iterator p=components.begin(); Iterator pe=components.end(); while (p!=pe) { (*p)-> draw (); p++; } return; } // gli altri metodi sono definiti operando // sui componenti protected: Container components; }; GroupofShapes .h
  • 213. Strategy Il pattern Strategy permette di scegliere l’algoritmo da eseguire a run-time. Nuovi algoritmi possono essere introdotti senza modificare il codice utente.
  • 214. Observer Lo stato dell’ Observer dipende dallo stato del Subject . Il Subject notifica a tutti gli Observer registrati che il suo stato è cambiato.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.

Editor's Notes

  1. Struttura di un programma C, paradigma procedurale, Case Sensitive
  2. Struttura
  3. A pointer in C is the address of something The unary operator `&amp;&apos; is used to produce the address of an object Pointers to pointers Pointers to functions
  4. Vediamo ora nel dettaglio come scrivere delle classi che risolvono un problema. Ad esempio il classico problema di visualizzare forme geometriche e di manipolarle con una GUI. Abbiamo bisogno di varie forme geometriche: cerchi, rettangoli, esagoni, che si possano creare, distruggere, disegnare, muovere, ruotare etc. Non pretendiamo qui di presentare un’implementazione completa, ma di dare solo un’idea di come si possa ottenere un certo tipo di comportamento utilizzando la programmazione ad oggetti. Nel nostro esempio assumiamo l’esistenza di una libreria grafica di base non OO e una libreria di classi di geometria con punti, vettori in due dimensioni..
  5. Qui vediamo la struttura essenziale di una classe e molti degli elementi sintattici di base: la dichiarazione di una classe con membri pubblici e privati costruttore, distruttore metodi inline metodi definiti in un’altra file attributi di tipo “built-in ” e di classe Color sarebbe un enumerator ma non si vede la dichiarazione.. come si istanzia un oggetto e come si invoca un suo metodo un loop “for” l’uso di operatori vari in un piccolo algoritmo l’uso di oggetti temporanei (che il compilatore può ottimizzare)
  6. Repetita juvant!?!
  7. Una semplice applicazione delle classi precedenti. Più dettagli sulla sintassi già vitsa in precedenza. Si vede l’allocazione sull’heap (ma non esplicitamente che new ritorna un puntatore) Viene anche introdotto un vettore STL e la sua sintassi di base (ripresa poi in dettaglio in seguito).
  8. Rullo di tamburi…..
  9. La chiave di volta della programmazione orientata ad oggetti: l&apos;ereditarietà di un’interfaccia astratta per ottenere una gestione polimorfica degli oggetti. In “puro” OO la classe di base deve contenere solo metodi puramente virtuali e nessun attributo. Questo e’ ovviamente sempre possibile farlo. Solo pigrizia e una tendenza a cercare un’ottimizzazione precoce ci fanno implementare classi di base che contengono anche parte dell’implementazione comune.
  10. Il punto più controverso dell’OO: l&apos;ereditarietà pubblica dell’implementazione. In questo caso i puristi richiederebbero: Class CCShape : public virtual Shape {..}; Class Rectangle : private CCShape, public Shape {…}; ma per un corso introduttivo mi sembra veramente troppo!!! Posiamo l’attenzione su una delle tante trappole del C++: l’invocazione di metodi virtuali nel costruttore e distruttore della classe base.
  11. The notation is the most apparent part of a method and in object orientation has been for a while the subject of almost religious wars. The process specifies the practices to be followed to develop a software product ensuring that it conforms to the specifications (user requirements) and it is free of defects. Processes can be very rigorous and formal (like for military applications) or almost not existing like in HEP. Here we will concentrate only on the technical aspects of a software process leaving the managerial aspects to some future discussion. A process for us will be a collection of suggested practices to succeed in the Analysis and Design of an Object Oriented Software System.
  12. Object Oriented Design makes use also of many well known techniques which have been used successfully for many years such as entity-relationship models, functional decomposition and, why not, structural programming
  13. The “Shape” example (used in the C++ course) in UML notation. We can see: Abstract classes (recognizable from the name in italics ), Arrows indicating inheritance, The notation used for aggregation with roles and cardinality, In some classes are shown the methods (lower part) and the attributes (higher part) with the symbols for private, protected and public. UML, compared with Booch, is less C++ oriented and thus many other properties, relevant to C++, can not be shown.
  14. Another UML diagram: this time for the Trajectory surface package. We can directly compare the diagram with the C++ to better understand the semantics of the various symbols.
  15. Class diagrams should not necessarily show all class and relationship in the software with all their details. They are intended to document particular aspects of the model architecture and design and therefore should contain only the details relevant to the part the designer wants to stress. This diagram is intended to describe the Plane class and onlly the details of the relationships among Plane and the classes which collaborate with it are shown
  16. Sequence Diagrams are a powerful tool to describe the dynamic behavior of the model. Usually a Sequence Diagram is associated to a “scenario” Each participating object is represented by a vertical line Horizontal arrows shows messages send from one object to another. The sequence of the messages, an therefore the development of the scenario, is easily seen reading the diagram from top to bottom.
  17. Object Collaboration Diagrams convey exactly the same information as Sequence Diagrams and there is indeed a one to one correspondence among the components of the two diagrams. The only difference is the focus: The Sequence diagram focuses on the temporal sequence of the messages while the OCD more on the collaboration among the various objects. My opinion is that using either one or the other is just a manner of personal taste although I find the sequence diagrams more clear and better matching the textual presentation of a scenario.
  18. Codice della componente e della foglia. Si noti la “forward declaration” necessaria per implementare il puntatore di ritorno al genitore. In DaqLeaf introduciamo anche “explicit” per evitare la conversione implicita da float a DaqLeaf. E chiaro che il modello non e’ completo e l’implementazione si presta a molte critiche, ma questo e’ solo un esempio...
  19. Qui vediamo dichiarazione e definizione del composito. Power() e’ inline per pura pigrizia. Tanto per cambiare faccio vedere il loop usando un while… si notino i typedef per “semplificare” la notazione seguente (in realtà sono utile per “esportare” pubblicamente begin() ed end(). Ma noi il visitor qui non lo facciamo e quindi non ne parliamo…)
  20. Tutti le variabili e i metodi di una classe sono utilizzabili dai membri della classe. Per controllare l’accesso esistono 4 modificatori: Private – accessibili solo alla classe Protected – accessibili alla classe, alle sottoclassi e alle classi del package Public – accessibili a chi accede alla classe, quindi alle sottoclassi Senza modificatori sono accessibili esclusivamente dalle classi dello stesso package Dentro ad un pacchetto protected e la mancanza di modificatori si equivalgono, al di fuori del pacchetto il modificatore protected indica che la visibilità e’ legatta alla struttura gerarchica delle classi
  21. Collections è una classe di metodi statici di modifica e adattamento dei vari oggetti collection. Le diverse implementazioni di map differiscono per l’ordinamento che restituiscono e per l’implementazione dalla quale dipende la complessità.
  22. Si esegue il blocco_1. Qualora si verifichi un’eccezione del tipo elencata nella clausola catch, il controllo viene passato al blocco_2. L’identificatore dell’eccezione che si è verificata può essere utilizzata nel blocco_2 per invocare alcuni metodi che descrivono l’eccezione; ad esempio: getMessage(), toString() o printStackTrace().