anno accademico 2019-20 - dipartimento di matematica e...
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/1.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/2.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/3.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/4.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/6.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/7.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/10.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/11.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/12.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/13.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/14.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/15.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/18.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/19.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/20.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/23.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/24.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/25.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/26.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/27.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/28.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/29.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/30.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/31.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/32.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/33.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/34.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/35.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/36.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/37.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/38.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/39.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/40.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/41.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/42.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/43.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/44.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/45.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/46.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/47.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/48.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/49.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/50.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/51.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/52.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/53.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/54.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/55.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/56.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/57.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/58.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/59.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/60.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/61.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/62.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/63.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/64.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/65.jpg)
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](https://reader030.vdocuments.mx/reader030/viewer/2022040415/5f30a739d8a8e83b7f56ed90/html5/thumbnails/66.jpg)
Laboratorio di Programmazione e Calcolo - A.A. 2019-20 lezione 6
66