Laboratorio di Programmazione e Calcolo

Documenti analoghi
Laboratorio di Programmazione e Calcolo

Laboratorio di Programmazione e Calcolo

Il paradigma OO e le Classi

La programmazione ad oggetti (OOP)

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Il C nel C++: Funzioni

Corso di Fondamenti di Informatica

L'Allocazione Dinamica della Memoria nel linguaggio C

Programmazione modulare

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Introduzione ai puntatori

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

Allocazione Dinamica della Memoria

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

Laboratorio di Algoritmi e Strutture Dati

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

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

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Funzioni, Stack e Visibilità delle Variabili in C

Fondamenti di Informatica

Programmazione Procedurale in Linguaggio C++

Esercizio. Vogliamo scrivere delle funzioni che ci permettano di estrarre delle informazioni statistiche da un vettore (array) di dati:

C: panoramica. Violetta Lonati

Il linguaggio C. Puntatori e dintorni

Introduzione al linguaggio C Puntatori

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

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Passaggio parametri puntatore

Lezione 4. Costruttori

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

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

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

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

Corso di Programmazione ad Oggetti

Introduzione al C++ (continua)

Introduzione C++ Il compilatore. La compilazione in g++ Introduzione a C, C++ e Java. C++ C Java 1977 C 1986 C++ Compilatori Librerie Usare oggetti

Gestione dinamica della memoria

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

Elementi di C++ di base

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

Allocazione dinamica della memoria

Sommario. Le differenze fra C e C++ Funzioni. Varie. Memoria. commenti. parametri per funzioni funzioni inline overloading di funzione

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Le basi del linguaggio Java

Operatore di indirizzo

Laboratorio di Informatica

L organizzazione dei programmi

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 24 Ottobre 2014

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Laboratorio di programmazione

Le strutture di controllo in C++

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Corso di Fondamenti di Informatica Classi di istruzioni 2

Corso di Fondamenti di Informatica

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Programmazione ad oggetti

Esercizi di programmazione in linguaggio C English Dictionary

Elementi di C++. Marco Airoldi. E mail: Versione documento 1.1. c Marco Airoldi

Il linguaggio C. Notate che...

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

L Allocazione Dinamica della Memoria

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Ereditarietà e polimorfismo

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Allocazione dinamica della memoria

Istruzioni semplici e strutturate

Programmazione con Java

Lezione 11 programmazione in Java. Anteprima. Gestione della memoria

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

Informatica 3. LEZIONE 2: Sintassi e semantica

Introduzione al C++ Corso di C++ INFN LNS 13 Dicembre Corrado Santoro

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Laboratorio di Informatica

Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)

Informatica! Appunti dal laboratorio 1!

Primi passi col linguaggio C

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Informatica

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

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

Classi e oggetti Seconda parte. Oggetti dinamici

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Grammatica di base. Casting

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Struct, enum, Puntatori e Array dinamici

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

INPUT: 2 parametri. double atan2( double y, double x) OUTPUT: risultato del calcolo. Le funzioni. Implementazioni di funzioni dell utente

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Introduzione Programmazione Java

Introduzione ai puntatori in C Definizione

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Capitolo 5 - Funzioni

Linguaggio C++ Linguaggi di terza generazione

Transcript:

UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA E. AMALDI Laboratorio di Programmazione e Calcolo 6 crediti a cura di Severino Bussino Anno Accademico 2016-17

0) Struttura del Corso 1) Trattamento dell'informazione Elementi di Architettura di un Computer 2) Sistemi operativi 3) Introduzione alla Programmazione ad oggetti (OO) 4) Simulazione del Sistema Solare 2

5) Introduzione al linguaggio C/C++ 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. 7) Puntatori 3

8) Vettori (Array) 9) Classe SistemaSolare (prima parte) 10) Gestione dinamica della memoria 11) Classe SistemaSolare 12) Programma di Simulazione (main) 4

10) Gestione dinamica della memoria 5

Indice Come viene gestita la memoria in C++? 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 6

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 7

Programma ERRATO con l'uso di un vettore di puntatori ad oggetti (molto piu' elegante se fosse giusto) #include <iostream.h> #include <string.h> #include <iomanip.h> #include "CorpoCeleste.h" int main () { ============== 1 // 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; } 8

// Con un loop posso estrarre le informazioni. // Ad esempio la massa e la posizione 2 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; 9

Il punto della situazione: dove siamo arrivati? Classe SistemaSolare Abbiamo scritto il puntatore che ci permette di accedere alla lista dei (puntatori ai) pianeti nella forma CorpoCeleste ** pianeti ; Non sappiamo come scrivere il contenitore nel quale memorizzare la lista dei (puntatori ai) pianeti 10

SistemaSolare.h #ifndef SISTEMASOLARE_H #define SISTEMASOLARE_H #include "CorpoCeleste.h" #define G 6.673e-11 class SistemaSolare { protected: CorpoCeleste ** pianeti; int N; // lista dei pianeti // numero dei pianeti public: SistemaSolare(int n); ~SistemaSolare(); int aggiungipianeta CorpoCeleste *unpianeta); int npianeti() {return N;}; void evolvi(float T, float dt); }; #endif Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 11

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!!! }. 12

Che cosa vogliamo? il problema (1) Gestione dinamica della Memoria 1. Rilevanza per un Programmatore Scientifico Utilizziamo dati 2. Un esempio da una ipotetica classe CorsoLabCalc Variante a dimensione fissa class CorsoLabCalc { protected: string NomiStud[20] ; } ; Variante a dimensione variabile (???) class CorsoLabCalc { protected: int n; string NomiStud[n] } ; Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 13

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 2011-12 quando inizia l'anno 2012-13)? 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 14

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! 15

.. 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. 16

// 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 17

.. tentativi di soluzione artigianale (II) ===========Esempio di "Out of Scope ============= 1) Cosi' Funziona #include <iostream> #include <string> using namespace std; int main() { =====L'output e': Dopo il loop a = 4 int a ; for(int i=0; i<5; i++) { a = i; }; cout << endl << " Dopo il loop " << endl << " a = " << a << endl << endl ; return 1; } Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 18

2) Cosi' NON Compila: #include <iostream> #include <string> using namespace std; int main() { int a ; ========L'errore e': nbacer(~/labcalca_6)>g++ -c out_of_scope.cpp out_of_scope.cpp: In function âint main(): out_of_scope.cpp:16: error: b was not declared in this scope 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; } 19

.. tentativi di soluzione artigianale (III) ===ESEMPIO DI PUNTATORE A VARIABILE OUT OF SCOPE=== #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 20

}; 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 -- === Risultato giusto, ma casualmente!!!!!!! p = 0xbffff4f4 q = 0xbffff4e4 Valori Puntati *p = 4 *q = 4 Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 21

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 22

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 23

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; 24

Allocaz. memoria a run time e compilation time (IV) ============= 0 1 2 3 4 5 6 7 8 9 ============= ============= 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ============= Assegnare ne : 19 ============= 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ============= 25

Puntatore a Variabile locale (I) =====ESEMPIO DI PUNTATORE A VARIABILE LOCALE===== ===File prova_fp.h class prova_fp { protected: //... public : prova_fp() { } ; // costruttore ~prova_fp() { } ; // distruttore int * int_fp() { // un metodo int a = 5 ; return &a ; }; } ; 26

Puntatore a Variabile locale (II) ===Main #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; }; 27

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) 28

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 29

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] ; 30

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 ; 31

Puntatore a Variabile locale (I) ===File prova_fp_n.h class prova_fp { protected: //... public : prova_fp() { } ; ~prova_fp() { } ; int * int_fp() { int * q = new int(5) ; return q ; }; } ; =====CON L'USO DI new===== 32

Puntatore a Variabile locale (II) ===Main (praticamente identico al precedente) #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; }; 33

Puntatore a Variabile locale (III) ====nessun WARNING in compilazione ===L'output: ===Eseguo float_class_n ed ottengo Puntatore : 0x8049bc0 Valore : 5 int * q = new int(5) ; si potrebbe anche scrivere nella forma int * q = new int() ; * q = 5 ; 34

Utilizzo di new nella allocazione di memoria a Run Time (I) ========"Dimensione Variabile in Una Classe"========== ==========="Run Time"================ prova_mem_n.h class prova_mem { protected : double * myvect ; public : prova_mem() ; ~prova_mem() ; } ; prova_mem_n.cc #include "prova_mem_n.h" prova_mem::prova_mem() { myvect = new double[10] ; // dimensione fissata } ; prova_mem::~prova_mem() { delete [] myvect ; } ; Simile al caso a dimensione fissata La memoria e' allocata a Run Time e va cancellata esplicitamente 35

prova_mem_nv.h class prova_mem { protected : int n ; double * myvect ; public : prova_mem(int n_now) ; ~prova_mem() ; } ; prova_mem_n.vcc #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 ; } ; La dimensione di myvect e' definita dinamicamente La memoria e' allocata a Run Time e va cancellata esplicitamente 36

Allocazione dinamica della memoria (C/C++) - (testo 10.2.2) 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 37

11) Classe SistemaSolare (seconda parte) 38

La Classe SistemaSolare: Attributi e Metodi SistemaSolare CorpoCeleste ** pianeti int N SistemaSolare(int n) ~SistemaSolare() int aggiungipianeta(corpoceleste * unpianeta) void evolvi(float T, float dt) int npianeti() SistemaSolare.h SistemaSolare.cc 39

Ricordando la Struttura 40

e l Interaction-diagram della simulazione 41

SistemaSolare.h #ifndef SISTEMASOLARE_H #define SISTEMASOLARE_H #include "CorpoCeleste.h" #define G 6.673e-11 class SistemaSolare { protected: CorpoCeleste ** pianeti; int N; // lista dei pianeti // numero dei pianeti public: SistemaSolare(int n); ~SistemaSolare(); int aggiungipianeta(corpoceleste *unpianeta); int npianeti() {return N;}; void evolvi(float T, float dt); }; #endif Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 42

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; } Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 43

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) { 44

SistemaSolare.cc (III) // loop sui pianeti for (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()) ); 45

SistemaSolare.cc (IV) // controllo che la distanza tra // i pianeti non sia nulla if (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 46

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 47

12) Il programma di simulazione (simula.cpp) 48

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; } Laboratorio di Calcolo Programmazione - 2014-15 e Calcolo - A.A. lezione 2016-17 6 lezione 6 49

Qualche osservazione 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 Come si puo' rendere piu' chiaro e semplice il metodo evolvi( ) 50

Una proposta 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) ; 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'? 51

Uno schema dei metodi (traccia preliminare) (1)???? 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 52

Uno schema dei metodi (traccia preliminare) (2) 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?????? Ora abbiamo l'idea! L'integrazione in SistemaSolare::evolvi(.) e' immediata Ci resta da capire come gestire la forza! 53

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 54

55