anno accademico 2019-20 - dipartimento di matematica e...

66
UNIVERSITA’ DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA “E. AMALDI” Anno Accademico 2019-20 a cura di Severino Bussino Laboratorio di Programmazione e Calcolo 6 crediti

Upload: others

Post on 09-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

UNIVERSITA’

DEGLI STUDI ROMA TRE

DIPARTIMENTO DI FISICA “E. AMALDI”

Anno Accademico 2019-20

a

cura diSeverino Bussino

Laboratorio di Programmazione e Calcolo

6 crediti

Page 2: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

2

1) Trattamento dell'informazione Elementi di Architettura di un Computer

2) Sistemi operativi

0) Struttura del Corso

3) Introduzione alla Programmazione ad oggetti (OO)

4) Simulazione del Sistema Solare

Page 3: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

3

5) Introduzione al linguaggio C/C++

7) Puntatori

6)

Elementi di linguaggio C/C++

A 1 -

istruzioni e operatori booleani 2 - iterazioni (for, while, do

while

)

B -

istruzioni di selezione (if, switch, else )

C -

funzioni predefinite. La classe math.

Page 4: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

4

9) Classe SistemaSolare (prima parte)

11) Classe SistemaSolare

12) Programma di Simulazione (main)

10) Gestione dinamica della memoria

8) Vettori (Array)

Page 5: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

55

Valutazione del Corso

Venerdi' 15 novembre 2019 in aula M3

Un test di esonero a risposte multiple si svolgera'

Page 6: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

66

Premessa: Osservazione sulla Esercitazione di Laboratorio n. 3

Nel corso della esercitazione n. 3 abbiamo utilizzato un oggetto della classe CorpoCeleste per simulare il moto di caduta di un grave

Abbiamo calcolato:

-

il tempo di caduta

-

la velocita' al momento dell'impatto con il suolo

Page 7: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

7

Queste grandezze sono note in forma analitica:

-

il tempo di caduta

-

la velocita' al momento dell'impatto con il suolo

ght 2

=

hgv 2=

Confrontando il risultato del calcolo numerico con quello dato dalla formula analitica, possiamo avere indicazioni sulla correttezza del programma che abbiamo scritto

Page 8: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

8

Come effettuiamo la simulazione del moto di caduta del grave?

-

suddividiamo l'intervallo di tempo di caduta t in una serie di intervallini di tempo dt (dt << t)

-

nell'intervallino di tempo dt possiamo utilizzare una descrizione semplificata del moto del grave

utilizziamo una istruzione while

utilizziamo un oggetto della classe CorpoCeleste

utilizziamo il metodo calcolaPosizione (della classe CorpoCeleste)

Page 9: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

9

0=t dtt = dtt ⋅= 2

dttt += t

. . . .

. . . .v

. ..

..

Page 10: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

10

Il programma// questo programma calcola il tempo di caduta di un grave// e la velocita' con cui tocca terra -// permette anche di descrivere il moto di un proiettile

#include <iostream>

#include <iomanip>

#include "CorpoCeleste.h"

using namespace std ;

int

main() {

// posizione e velocita' iniziali e costante gdouble

xi, yi, vxi,

vyi

;const

double

g

= 9.8

;

// variabili per descrivere il moto e per la simulazionedouble

t

= 0.

;double

dt

= 1.e-4

;double

x, y, vx, vy

;double

fx, fy

;

continua...

Page 11: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

11

//

assegnazione delle condizioni inizialicout

<<

endl

<<

"Assegnare la posizione iniziale (x, y) in m:

"

;cin

>>

xi

>>

yi

;cout

<<

endl

<<

"Assegnare la velocita iniziale (vx, vy) in m/s:

"

;cin

>>

vxi

>>

vyi

;cout

<<

endl ;

//

creo l'oggetto CorpoCeleste con le condizioni iniziali indicate//

La massa e' in Kg (avreste potuto richiedere anche la massa, ...)CorpoCeleste grave("sasso", 5.

, xi, yi, vxi, vyi) ;

//

preferenze di output -

iomanip (questo si potrebbe tralasciare)cout.setf(ios::fixed) ;cout

<<

setprecision(5) << setw(8) ;

//

condizioni iniziali//

si utilizzano i metodi di CorpoCeleste//

y e vy saranno utilizzati nel controllo del loopy

= grave.Y()

;vy

= grave.Vy()

;

//

valore della forzafx

= 0.

;fy

= (-1)*g*grave.M()

;

...segue

continua...

Page 12: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

12

//

inizia il loop sull'altezzawhile(

y

> 0.

||

vy

> 0. ) {

grave.calcolaPosizione(fx, fy, dt) ;

//

aggiorno le variabili che descrivono il motox

= grave.X()

;

y

= grave.Y()

;vx

= grave.Vx()

; vy

= grave.Vy()

;t

= t

+

dt

;

//

output dell'i-esimo step //(oppure con i metodi stampaVelocita() e stampaPosizione()cout

<<

" t = "

<<

t

<<

"

s x = " <<

x

<<

" m y = "

<<

y<<

" m vx = "

<<

vx

<<

" m/s vy = "

<<

vy

<<

" m/s "<<

"\r"

; //

oppure <<

endl

;

} ;

// fine del loop

//

output finalecout

<<

endl

<< endl

<<

" Tempo di caduta : "

<<

t<<

" s Velocita finale : vx = "

<<

vx

<<

" m/s vy = "<<

vy

<<

" m/s "

<<

endl

<<

endl

;

return

1; }

...segue

Page 13: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

nbacer(/tmp)>./grave

Assegnare la posizione iniziale (x, y) in m: 0 100

Assegnare la velocita iniziale (vx, vy) in m/s: 0 0

t = 4.51750 s x = 0.00000 m y = -0.00046 m vx = 0.00000 m/s vy = -44.27150 m/s

Tempo di caduta : 4.51750 s Velocita finale : vx = 0.00000 m/s vy = -44.27150 m/s

nbacer(/tmp)>

Esempio di output

Page 14: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

1414

Premessa: Osservazione sulla Esercitazione di Laboratorio n. 4

Nel corso della esercitazione n. 4 abbiamo utilizzato un oggetto della classe CorpoCeleste per simulare il moto di caduta di un grave in un fluido viscoso

La differenza principale tra la situazione dell'esercitazione 3 e quella dell'esercitazione 4 consiste nel fatto che la forza a cui e' soggetto il corpo dipende dalla velocita' del corpo nel fluido...

...e quindi deve essere calcolata all'interno del ciclo while, utilizzando il valore "istantaneo" della velocita'

Page 15: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

1515

Premessa: Osservazione sulle Esercitazioni di Laboratorio n. 3 e n. 4

Nel corso della esercitazione n. 3 abbiamo utilizzato un oggetto della classe CorpoCeleste per calcolare una quantita' (ad esempio la velcoita' finale o il tempo di caduta) il cui valore e' determinabile per via analitica.

In questo modo abbiamo controllato il buon funzionamento della Classe CorpoCeleste (debug)

Nell'esercitazione n. 4 abbiamo utilizzato un oggetto della classe CorpoCeleste per calcolare una quantita'

(ad esempio la velcita' finale o il tempo di caduta) il cui valore e' (molto) piu' difficile da determinare

per via analitica.

Page 16: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

16

10) Gestione dinamica della memoria

Page 17: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

17

Come viene gestita la memoria in C++ ?

“Indice”

1.

Che cosa vogliamo ? il problema•

Gestione dinamica della Memoria

Allocazione della memoria ( compilation time

e run time )

Out of scope•

Puntatori ed Oggetti puntati

2.

Come risolverlo ? la soluzione

Page 18: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

18

Premessa: Osservazione sulla Esercitazione di Laboratorio

Nel corso delle esercitazioni in laboratorio verificherete che se create un oggetto all'interno di uno scope, ne memorizzate il puntatore in un vettore, al di fuori dello scope l'oggetto viene distrutto ed il risultato e' imprevedibile

ad esempio…

Page 19: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

19

#include <iostream.h>#include <string.h>#include <iomanip.h>#include "CorpoCeleste.h"

int main () {

//

uso un vettore di puntatori ad oggetti // di

tipo

Corpoceleste

const int np = 6;CorpoCeleste * Pianeti[np];

// Con un loop scrivo gli elementi del vettore

for (int i=0; i<np; i++) {CorpoCeleste Ausiliario("",i,i,i,i,i);Pianeti[i] = &Ausiliario;

}

Programma ERRATO

con l'uso di un vettore di puntatori ad oggetti (molto piu' elegante

… se

fosse giusto)

==============1

Page 20: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

20

// Con un loop posso estrarre le informazioni. // Ad esempio la massa

e la posizione

cout << endl << "Pianeta n. Massa Posizione " << endl<< " x y " << endl << endl;

for ( int i=0; i<np; i++ ) {cout << " " << i+1 << " "

<< Pianeti[i]->M() << " " << Pianeti[i]->X() << " " <<

Pianeti[i]->Y() << endl;}

cout << endl ;

// Errato:

ottengo qualcosa che puo’

essere

// --

errore (a run time

o compilation time)

// --

numeri a caso

// --

valori dell’ultimo pianeta

return 1;}

2

Page 21: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

21

Il punto della situazione: dove siamo arrivati?

Abbiamo scritto il puntatore che ci permette di accedere alla lista dei (puntatori ai) pianeti nella forma

Non sappiamo come scrivere il contenitore nel quale memorizzare la lista dei (puntatori ai) pianeti

Classe SistemaSolare

CorpoCeleste

**

pianeti ;

Page 22: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

22Laboratorio di Calcolo -

2014-15 lezione 6

22

SistemaSolare.h

#ifndef SISTEMASOLARE_H#define SISTEMASOLARE_H

#include "CorpoCeleste.h"#define G 6.673e-11

class SistemaSolare {

protected:

CorpoCeleste

**

pianeti; // lista dei pianeti

int N; // numero dei pianeti

public:

SistemaSolare(int n);

~SistemaSolare();

int aggiungiPianeta CorpoCeleste *unPianeta);

int nPianeti() {return N;};

void evolvi(float T, float dt);};

#endif

Page 23: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

23

SistemaSolare.cc (1)

#include "SistemaSolare.h" #include <cstdlib>#include <cmath>#include <iostream>

SistemaSolare::SistemaSolare(int n) {

N = 0; //

si pone il numero iniziale di

// pianeti pari a 0

??????????? // non sappiamo come costruire il

// contenitore per i pianeti!!!

}………………………………………….

Page 24: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

24Laboratorio di Calcolo -

2014-15 lezione 6

24

Che cosa vogliamo ? il problema (1)

Gestione dinamica della Memoria

1.

Rilevanza per un Programmatore ScientificoUtilizziamo dati

2.

Un esempio da una ipotetica classe

CorsoLabCalc•

Variante a dimensione fissaclass CorsoLabCalc {protected:

string NomiStud[20] ;……………

} ;

Variante a dimensione variabile

(???) class CorsoLabCalc {

protected:int n;string NomiStud[n]……………

} ;

Page 25: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

25

Che cosa vogliamo ? il problema (2)

3.

Osservazioni sulle proposte precedenti•

Variante a dimensione fissa—

Riserva sempre lo spazio per i nomi di 20 studenti

Enorme spreco di memoria se gli studenti sono molto pochi—

Spazio insufficiente se gli studenti sono piu'di 20

Come si libera spazio (come posso cancellare la lista degli studenti dell'anno 2019-20 quando inizia l'anno 2020-21)?

Variante a dimensione variabile

(???) —

Non funziona (errata)

E' quello che vorremmo fare (se funzionasse) per avere flessibilita' nel numero di studenti iscritti

Non risolverebbe (anche se funzionasse) il problema della riassegnazione della memoria

Page 26: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

26

Che cosa vogliamo ? il problema (3)

4.

Applicazione a casi di fisica —

In fisica si acquisiscono dati, ad esempio da una serie successiva di eventi dello stesso tipo

Dello "stesso tipo" significa che vengono gestiti dallo stesso software ma non che hanno tutti le stesse dimensioni (fluttuazioni statistiche)

Un evento deve essere cancellato quando si passa all'esame dell'evento successivo

Proviamo ad affrontare il problema con gli strumenti che conosciamo!

Page 27: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

27

.. tentativi di soluzione “artigianale’

(I)

========Dimensione Variabile in Una Classe==========

==========="Compilation Time"================

// Cosi' compila

class prova_mem {

protected :

int n ;

double myvect[10] ; //dimensione fissa

} ;

Niente di nuovo.

Dimensione prefissata.

Page 28: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

28

// Cosi' NON

compila

class prova_mem {

protected :

int n ;

double myvect[n] ; //dimensione variabile

} ;

L'errore e':nbseve(~/LabCalcA_6)>g++ -c prova_mem.cc

In file included from prova_mem.cc:1:

prova_mem.h:7: error: invalid use of non-static data member prova_mem::n

prova_mem.h:8: error: from this location

prova_mem.h:8: error: array bound is not an integer constant before ] token

Page 29: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

29Laboratorio di Calcolo -

2014-15 lezione 6

29

.. tentativi di soluzione “artigianale’

(II)

===========Esempio di "Out of

Scope“=============

1) Cosi' Funziona

#include <iostream>#include <string>using namespace std;

int main() {

int a ;for(int i=0; i<5; i++) {

a = i;};

cout << endl << " Dopo il loop " <<endl << " a = " << a << endl << endl ;

return 1;

}

=====L'output e':

Dopo il loopa = 4

Page 30: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

30

2) Cosi' NON

Compila:

#include <iostream>#include <string>

using namespace std;

int main() {

int a ;

for(int i=0; i<5; i++) {a = i;int b = i;

};

cout << endl << " Dopo il loop " <<endl << " a = " << a <<

" b = " << b << endl << endl ;

return 1;

}

========L'errore e':

nbacer(~/LabCalcA_6)>g++ -c out_of_scope.cppout_of_scope.cpp: In function âint main():out_of_scope.cpp:16: error: b was not declared in this scope

Page 31: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

31

.. tentativi di soluzione “artigianale’

(III)

#include <iostream>#include <string>

using namespace std;

int main() {

int a ;

int *p ;int *q ;

for(int i=0; i<5; i++) {

a = i;int b = i;

p = &a ;q = &b ;

}; // …

continua …

===ESEMPIO DI PUNTATORE A VARIABILE OUT OF

SCOPE===

Page 32: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

32Laboratorio di Calcolo -

2014-15 lezione 6

cout << endl << " Dopo il loop : " << endl ;cout << endl

<< " Puntatori --

" << endl << " p = " << p <<

" q = " << q << endl ;

cout << endl << " Valori Puntati " << endl << " *p = " << *p <<

" *q = " << *q << endl ;

return 1;

};

========L'output e':Dopo il loop :

Puntatori --

p = 0xbffff4f4 q = 0xbffff4e4

Valori Puntati

*p = 4 *q = 4

=== Risultato giusto, ma casualmente!!!!!!!

Page 33: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

33

Allocaz. memoria a run time e compilation time (I)

#include <iostream>

#include <string>

using namespace std;

int main() {

//*****VETTORE DI DIMENSIONI FISSATE*************

int myvect1[10] ;

for(int i=0; i<10; i++) {

myvect1[i] = i;

};

cout << endl << " ============ " << endl;

for(int *p=myvect1; p!= & myvect1[10]; p++) {

cout << *p << endl;

} ;

cout << endl << " ============= " << endl ;

// …

continua …

Page 34: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

34

Allocaz. memoria a run time e compilation time (II)

//***VETTORE DI DIMENSIONI VARIABILI*************

int nv = 15 ;

int myvect2[nv] ;

for(int i=0; i<nv; i++) {

myvect2[i] = i;

};

cout << endl << " =========== " << endl ;

for(int *p=myvect2; p!=& myvect2[nv]; p++) {

cout << *p << endl;

} ;

cout << endl << " ============= " << endl ;

// …

continua …

Page 35: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

35

Allocaz. memoria a run time e compilation time (III)//*****VETTORE DI DIMENSIONI VARIABILI FISSATE IN ESECUZIONE******

int ne ;

cout << " Assegnare ne : " ;cin >> ne ; cout << endl ;

int myvect3[ne] ;

for(int i=0; i<ne; i++) {myvect3[i] = i;

};

cout << endl << " ============= " << endl;

for(int *p=myvect3; p!=& myvect3[ne]; p++) {cout << *p << endl;

} ;

cout << endl << " ============= " << endl ;

return 0;

};

Page 36: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

3636

Allocaz. memoria a run time e compilation time (IV)

=============

0123456789

=============

Assegnare ne : 19 =============

0123456789101112131415161718

=============

=============

01234567891011121314=============

Page 37: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

37

Puntatore a Variabile locale (I)

class prova_fp {

protected:

// .......

public :

prova_fp() { } ; // costruttore

~prova_fp() { } ; // distruttore

int * int_fp() { // un metodo

int a = 5 ;

return &a ;

};

} ;

=====ESEMPIO DI PUNTATORE A VARIABILE LOCALE=====

===File prova_fp.h

Page 38: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

38

Puntatore a Variabile locale (II)

#include "prova_fp.h"

#include <iostream>

#include <string>

using namespace std;

int main() {

int * p;

prova_fp myprova;

p = myprova.int_fp();

cout << endl << endl;

cout << " Puntatore : " << p << endl ;

cout << " Valore : " << *p << endl ;

return 1;

};

===Main

Page 39: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

39

Puntatore a Variabile locale (III)

=======WARNING DI COMPILAZIONE:===========

g++ float_class.cpp -o float_class.exe

prova_fp.h: In method `int * prova_fp::int_fp()':

In file included from float_class.cpp:3:

prova_fp.h:13: warning: address of local variable 'a' returned

====OUTPUT ==========

eseguo float_class ed ottengo

Puntatore : 0xbffff4e0

Valore : -1073744648 (dipende dal compilatore)

Page 40: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

40

Come risolverlo ? la soluzione

1.

E’

necessario qualcosa di nuovo!

2.

L’operatore new•

Uso

Sintassi•

L’operatore new con i vettori

3.

L’operatore delete•

Uso

Sintassi•

L’operatore delete con i vettori

4.

Esempi

Page 41: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

41

L’operatore

new

Uso–

permette di istanziare un oggetto a Run Time

Gli oggetti creati in maniera dinamica con new non vanno out of scope–

Gli oggetti creati con new

devono

essere distrutti esplicitamente

con

delete–

Rende l'esecuzione del programma piu' lenta

Sintassi

nomeclasse

* myobj

= new

nomeclasse(…) ;

L’operatore new con i vettori

nomeclasse

* myvec

= new

nomeclasse[10] ;

Page 42: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

42

L’operatore

delete

Uso–

Gli oggetti creati con new

devono

essere distrutti esplicitamente

con

delete

Rende nuovamente disponibile la memoria che resterebbe inutilizzata –

Va utilizzato in corrispondenza dell'operatore new

Ricordarsi di inserirlo nel distruttore per gli oggetti delle classi che utilizzano variabili allocate dinamicamente

Sintassi

delete

myobj

;

L’operatore new con i vettori

delete []

myvec

;

Page 43: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

43

Puntatore a Variabile locale (I)

class prova_fp {

protected:

// .......

public :

prova_fp() { } ;

~prova_fp() { } ;

int * int_fp() {

int * q = new int(5) ;

return q ;

};

} ;

=====CON L'USO DI new=====

===File prova_fp_n.h

Page 44: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

44

Puntatore a Variabile locale (II)

#include "prova_fp_n.h"

#include <iostream>

#include <string>

using namespace std;

int main() {

int * p;

prova_fp myprova;

p = myprova.int_fp();

cout << endl << endl;

cout << " Puntatore : " << p << endl ;

cout << " Valore : " << *p << endl ;

return 1;

};

===Main (praticamente identico

al precedente)

Page 45: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

45

si potrebbe anche scrivere nella forma

Puntatore a Variabile locale (III)

====nessun WARNING in compilazione

===L'output:===Eseguo float_class_n ed ottengo

Puntatore : 0x8049bc0Valore : 5

int

* q = new

int(5) ;

int

* q = new

int() ;

* q = 5

;

Page 46: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

46

Utilizzo di new nella allocazione di memoria a Run Time (I)

========"Dimensione Variabile in Una Classe"==========

==========="Run Time"================

class prova_mem {

protected :double * myvect ;

public :

prova_mem() ;

~prova_mem() ;

} ;

Simile al caso a dimensione fissata

La memoria e' allocata a Run Time e va cancellata esplicitamente

prova_mem_n.h#include "prova_mem_n.h"

prova_mem::prova_mem() {

myvect = new double[10] ;// dimensione fissata

} ;

prova_mem::~prova_mem() {

delete [] myvect ;

} ;

prova_mem_n.cc

Page 47: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

47

class prova_mem {

protected :

int n ;double * myvect ;

public :

prova_mem(int n_now) ;

~prova_mem() ;

} ;

La dimensione di myvect e' definita dinamicamente

La memoria e' allocata a Run Time e va cancellata esplicitamente

prova_mem_nv.h

#include "prova_mem_nv.h"

prova_mem::prova_mem(int n_now) {

n = n_now ;

myvect = new double[n] ;

} ;

prova_mem::~prova_mem() {

delete [] myvect ;

} ;

prova_mem_n.vcc

Page 48: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

48

La memoria puo' essere riservata–

staticamente: in fase di compilazione

dinamicamente: in fase di esecuzione del programma

Vantaggi dell'allocazione dinamica–

scelta della dimensione degli array in fase di esecuzione

lo spazio riservato non si libera automaticamente (no out of scope)

• Svantaggi– lentezza–

responsabilita' del programmatore

nel verificare che la memoria richiesta sia effettivamente disponibile (solo in C, dove la sintassi e' diversa)

nel liberare la memoria non piu' necessaria

Allocazione dinamica della memoria (C/C++) -

(testo §

10.2.2)

Page 49: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

49

11) Classe SistemaSolare (seconda parte)

Page 50: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

50

La Classe SistemaSolare: Attributi e Metodi

SistemaSolare.h

SistemaSolare.cc

SistemaSolare

CorpoCeleste ** pianetiint N

SistemaSolare(int n)~SistemaSolare()int aggiungiPianeta(CorpoCeleste * unPianeta)void evolvi(float T, float dt)int nPianeti()

Page 51: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

51

Ricordando la Struttura ……………

Page 52: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

52

e l’Interaction-diagram della simulazione

Page 53: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

53Laboratorio di Calcolo -

2014-15 lezione 6

SistemaSolare.h#ifndef SISTEMASOLARE_H#define SISTEMASOLARE_H

#include "CorpoCeleste.h"#define G 6.673e-11

class SistemaSolare

{

protected:

CorpoCeleste

**

pianeti; // lista dei pianeti

int N; // numero dei pianeti

public:

SistemaSolare(int n);

~SistemaSolare();

int aggiungiPianeta(CorpoCeleste *unPianeta);

int nPianeti() {return N;};

void evolvi(float T, float dt);};

#endif

Page 54: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

54Laboratorio di Calcolo -

2014-15 lezione 6

54

SistemaSolare.cc (I)#include "SistemaSolare.h" #include <cstdlib>#include <cmath>#include <iostream>using namespace std ;

SistemaSolare::SistemaSolare(int n) {

pianeti = new CorpoCeleste*[n]; //

si

alloca

un vettore di puntatori // a oggetti di tipo CorpoCeleste// n puntatori a CorpoCeleste

N = 0; //

si pone il numero iniziale di

// pianeti pari a 0

}

SistemaSolare::~SistemaSolare() { delete [] pianeti;

}

Page 55: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

55

SistemaSolare.cc (II)

int

SistemaSolare::aggiungiPianeta

(CorpoCeleste *unPianeta) {

pianeti[N++] = unPianeta; // si aggiunge unPianeta alla lista dei

// pianeti e si incrementa N di uno.

return N;}

void SistemaSolare::evolvi(float T, float dt) {

float t = 0

;

//tempo dall’inizio della simulazione

// ripeti fino a che t<=T

while (t <= T) {

Page 56: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

56

SistemaSolare.cc (III)

// loop sui pianetifor (int i=0; i<N; i++) {

double fx = 0.;double fy = 0.;

// calcola la forza agente sul pianeta // i-esimo

da parte di

tutti gli altri

//

pianeti j-esimi, j=0-N

for (int j=0; j<N; j++) {

// calcola la distanza tra i e j

double d = sqrt(

(pianeti[i]->X()-pianeti[j]->X())*(pianeti[i]->X()-pianeti[j]->X())+(pianeti[i]->Y()-pianeti[j]->Y())*(pianeti[i]->Y()-pianeti[j]->Y()));

Page 57: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

57

SistemaSolare.cc (IV)

// controllo che la distanza tra // i pianeti non sia nullaif (d!=0) {

// Somma a fx e fy agenti sull i-esimo // corpo la

forza

dovuta al corpo

j-esimo

fx +=

-G*pianeti[i]->M()*pianeti[j]->M()*(

pianeti[i]->X()

-

pianeti[j]->X()

)

/

(d*d*d)

;

fy +=

-G*pianeti[i]->M()*pianeti[j]->M()*(

pianeti[i]->Y()

-pianeti[j]->Y())

/

(d*d*d)

;

}

// termina l’if su d!=0

}

// termina il loop sul j-esimo pianeta

Page 58: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

58

SistemaSolare.cc (V)

// ora conosco la forza che agisce sul-// l’i-esimo pianeta e posso invocare// calcolaPosizione sull’i-esimo pianeta

pianeti[i]->calcolaPosizione

((float)fx, (float)fy, dt);pianeti[i]->stampaPosizione();

}

// termina il loop sull’iesimo pianeta

cout << endl;

t += dt;

// viene incrementato il tempo

}

// conclusione del while -

ripeti fino a che t<=T

}

// l’implementazione del metodo evolvi e’

conclusa

Page 59: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

59

12) Il programma di simulazione (simula.cpp)

Page 60: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

60Laboratorio di Calcolo -

2014-15 lezione 6

60

simula.cpp

#include “SistemaSolare.h”#include <string>

using namespace std;

int main() {

SistemaSolare ss(2);

CorpoCeleste sole(“Il Sole”,1.98e30, 0., 0., 0., 0.) ;

CorpoCeleste terra(“La Terra”, 5.98e24, 1.52e11, 0., 0., 29476.35) ;

ss.aggiungiPianeta(&sole);

ss.aggiungiPianeta(&terra);

ss.evolvi(86400*365, 86400);

return 0;

}

Page 61: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

61

• Semplicita' del programma

main()

(simula.cpp)

• Linguaggio "naturale" nell'uso del programma

main()

• Il ruolo delle Classi• Le responsabilita' sono ben condivise ed equilibrate

• I metodi sono concettualmente semplici ed immediati

• Il metodo

evolvi(…)

di SistemaSolare e' troppo lungo

Qualche osservazione

Come si puo' rendere piu' chiaro e semplice il metodo evolvi(…)

Page 62: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

62

Potremmo introdurre un metodo della classe SistemaSolare che calcoli la forza tra due pianeti

???? SistemaSolare::forza2Pianeti(int pian_i, int pian_j) ;

???? SistemaSolare::forza2Pianeti

(CorpoCeleste * p1, CorpoCeleste*p2) ;

Una proposta

Sappiamo scrivere rapidamente il metodo

forza2Pianeti(…) utilizzando il codice gia' scritto nel metodo

evolvi(…)

• Le due forme del metodo si ottengono rapidamente una dall'altra

• Ma la forza e' un vettore? Come la gestiamo? Che "tipo" e'?

Page 63: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

63

???? SistemaSolare::forza2Pianeti(int pian_i, int pian_j) {

return this->forza2Pianeti(pianeti[pian_i], pianeti[pian_j]);

}

???? SistemaSolare::forza2Pianeti

(CorpoCeleste * p1, CorpoCeleste*p2) {

double d = sqrt(

(p1->X()-p2->X())*(p1->X()-p2->X())+(p1->Y()-p2->Y())*(p1->Y()-p2->Y()));

double fx = 0; double fy = 0;

// continua

Uno schema dei metodi (traccia preliminare) (1)

Page 64: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

64

fx = -G*p1->M()*p2->M()*(

p1->X()

-

p2->X()

)

/

(d*d*d)

;

fy = -G*p1->M()*p2->M()*(

p1->Y()

-

p2->Y())

/

(d*d*d)

;

return ??????

}

Uno schema dei metodi (traccia preliminare) (2)

• Ora abbiamo l'idea!

• L'integrazione in SistemaSolare::evolvi(….)

e' immediata

• Ci resta da capire come gestire la forza!

Page 65: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

65

Tre possibilita'

Ricercare nelle librerie del C++ qualcosa che possa rispondere alle nostre necessita.

Ricercare in librerie esterne qualcosa che soddisfi le nostre richieste

• Scrivere una Classe che

• ci fornisca quanto richiesto

non abbia tutte le features che potrebbero essere logicamente attribuite alla classe (e che troveremmo nei

prodotti professionali) ma che noi non usiamo

Page 66: Anno Accademico 2019-20 - Dipartimento di Matematica e Fisicawebusers.fis.uniroma3.it/~bussino/Lez_Prog_Calc/lez_06.pdf · Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione

Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6

66