1 laboratorio di calcolo II AA 2003/04 terza settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza 159 - tel. (06 5517) 7281 www.fis.uniroma3.it/~orestano.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Puntatori e gestione dinamica della RAM
Esercitazioni If nidificati
Sottoprogrammi: funzioni e procedure
Preincremento e PostIncremento in C++
Puntatori in C e C++.
Struttura di un programma
Linguaggio C++ Operatori – numeri pseudocasuali - costanti.
Numeri casuali.
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
PUNTATORI Introduzione
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Le funzioni.
Un nuovo tipo di dati Gli array.
Puntatori e Heap in C Prof.Ing.S.Cavalieri.
Fondamenti di Informatica Prof. Cantone
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Il nostro esempio guida: La costruzione di uno stack.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Lab. Calc. AA 2004/051 laboratorio di calcolo AA 2004/054 a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Lab. Calc. AA 2005/061 laboratorio di calcolo AA 2005/06 a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Maria Antonietta Ricci Dipartimento di Fisica Edoardo Amaldi
1 laboratorio di calcolo II AA 2003/04 sesta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 ottava settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 nona settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quinta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 seconda settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
void binario(int n); …………………
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Puntatori e gestione dinamica della memoria
Unità Didattica 3 Linguaggio C
Passaggio di parametri per indirizzo
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Master in Lingue Straniere per il Turismo A.A. 2002/2004 INFORMATICA E LINGUAGGI MULTIMEDIALI.
Esercizi.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
Puntatori in C Un puntatore è una variabile che contiene un indirizzo di memoria. Quando una variabile contiene l’indirizzo di un’altra variabile, si dice.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi su stringhe e file 15 Stringhe e file.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Passaggio di parametri per indirizzo
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

1 laboratorio di calcolo II AA 2003/04 terza settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( ) UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA E. AMALDI

2 Loperatore & reference float x = 2.5; float& a = x; float &b = x ; a e b sono chiamati reference e sono due etichette equivalenti alletichetta x, che fanno riferimento allo stesso oggetto. Non confondere reference con puntatore: int i = 3;// oggetto i int &j = i;// reference a i int *p = &i;// puntatore a i i ha un indirizzo in memoria che contiene il valore 3 j ha lo stesso indirizzo p contiene lindirizzo di i

3 # include int main() { int i=5; int *p; int *q; p = &i; q = new int(i); cout << i << " " << *p << " " << *q << " " << &i << " " << p << " " << q << endl; i=8; cout << i << " " << *p << " " << *q << " " << &i << " " << p << " " << q << endl; return 0; } 5 550xbffffa34 0xbffffa340x8049a xbffffa34 0xbffffa340x8049a80 Uso di & reference (I)

4 # include int main() { int i=5; int &j=i; int *q; q = new int(i); cout << i << " " << j << " " << *q << " " << &i << " " << &j << " " << q << endl; i=8; cout << i << " " << j << " " << *q << " " << &i << " " << &j << " " << q << endl; return 0; } 5 550xbffffa34 0xbffffa340x8049a xbffffa34 0xbffffa340x8049a80 Uso di & reference (II)

5 Passaggio dei parametri ad una funzione (I) I parametri di una funzione possono essere trasmessi per valore: void swap_value(int i1, int i2); // prototipo di una funzione che riceve due parametri per valore o per reference: void swap_ref(int &i1, int &i2); // prototipo di una funzione che riceve due parametri per reference

6 Per valore: void swap_value(int i1,int i2) { // quando viene chiamata questa funzione con una // istruzione del tipo // swap(a,b); // tutto va come se il compilatore eseguisse le istruzioni // int i1=a; // int i2=b; int temp = i1; i1 = i2; i2 = temp; } Passaggio dei parametri ad una funzione (II)

7 Per reference: void swap_ref(int &i1,int &i2) { // quando viene chiamata questa funzione con una // istruzione del tipo // swap(a,b); // tutto va come se il compilatore eseguisse le istruzioni // int &i1=a; // int &i2=b; int temp = i1; i1 = i2; i2 = temp; } Passaggio dei parametri ad una funzione (III)

8 con i puntatori (alla maniera del C): void swap_point(int *i1,int *i2) { // quando viene chiamata questa funzione con una // istruzione del tipo // swap(&a,&b); // tutto va come se il compilatore eseguisse le istruzioni // int *i1=&a; // int *i2=&b; int temp = *i1; *i1 = *i2; *i2 = temp; } Passaggio dei parametri ad una funzione (IV)

9 int main() { int a = 2; int b = 3; cout << endl; cout << endl << " a = " << a << "; b = " << b << endl ; swap_value(a,b); cout << endl << " a = " << a << "; b = " << b << endl ; swap_ref(a,b); cout << endl << " a = " << a << "; b = " << b << endl ; swap_point(&a,&b); cout << endl << " a = " << a << "; b = " << b << endl ; return 0; } a = 2; b = 3 a = 3; b = 2 a = 2; b = 3 Passaggio dei parametri ad una funzione (V)

10 Passaggio dei parametri ad una funzione (VI) Funzioni che hanno come parametro un vettore: void modulo2(double * vect, int dim) { double mod = 0; for(int I=0; I<dim; I++){ mod += vect[I]*vect[I]; // uso vect[I] vect[I] = 0; // modifico vect[I] } return mod; } Un vettore viene identificato mediante il puntatore al suo primo elemento, quindi la funzione riceve sempre un puntatore e potrebbe andare ad alterare il contenuto del vettore... Come si realizza in questo caso il passaggio per valore? Cambiando il prototipo della funzione in: void modulo2(const double * vect, int dim);

11 Stato della simulazione del sistema solare Abbiamo creato la classe Corpo Celeste Abbiamo scritto diverse versioni del programma main che instanzia direttamente degli oggetti di questa classe Prima di proseguire sarà bene soffermarsi a verificare la correttezza del codice prodotto: nel corso dellesercitazione effetturete un esercizio di debug del metodo CorpoCeleste::CalcolaPosizione Ora torniamo al diagramma UML delle classi previste e effettuiamo la dichiarazione della classe SistemaSolare e la sua implementazione Infine scriviamo il programma principale, simula.cc

12 relazione di aggregazione

13 La classe SistemaSolare SistemaSolare ????????? pianeti int N SistemaSolare(int n) ~SistemaSolare() int aggiungiPianeta(CorpoCeleste * unPianeta) void evolvi(float T, float dt) int nPianeti()

14 #include "CorpoCeleste.h" #define G 6.673e-11 class SistemaSolare { protected: ?????????? 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); }; SistemaSolare.h

15

16

17 #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); }; SistemaSolare.h

18 #include "SistemaSolare.h" #include 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; } int SistemaSolare::aggiungiPianeta(CorpoCeleste *unPianeta) { pianeti[N++] = unPianeta; // si aggiunge unPianeta //alla lista dei pianeti e si incrementa N di uno. return N; } SistemaSolare.cc Prima parte

19 void SistemaSolare::evolvi(float T, float dt) { float t = 0 ; //tempo dallinizio della simulazione // ripeti fino a che t<=T while (t <= T) { // loop sui pianeti for (int i=0; i<N; i++) { double fx = 0.; double fy = 0.; // calcola la forza esercitata sul pianeta // i-esimo da parte di tutti gli altri // pianeti j-esimi 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()) ); SistemaSolare.cc Seconda parte

20 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 lif su d!=0 } // termina il loop sul j-esimo pianeta // ora conosco la forza che agisce sul- // li-esimo pianeta e posso invocare // calcolaPosizione sulli-esimo pianeta pianeti[i]->calcolaPosizione((float)fx, (float)fy, dt); pianeti[i]->stampaPosizione(); } // termina il loop sulliesimo pianeta cout << endl; t += dt; // viene incrementato il tempo } // while ripeti fino a che t<=T } // limplementazione del metodo evolvi e conclusa SistemaSolare.cc Terza parte

21 Interaction Diagram (semplificato)

22 #include SistemaSolare.h int main() { //NB si usano unita MKS // instanzio un oggetto SistemaSolare ss con 2 corpi SistemaSolare ss(2); // instanzio due oggetti CoproCeleste, sole e terra CorpoCeleste sole(Il Sole, 1.98e30, 0., 0., 0., 0.); CorpoCeleste terra(La Terra, 5.98e24, 1.52e11, 0., 0., ); // li aggiungo al Sistemasolare ss ss.aggiungiPianeta(&sole); ss.aggiungiPianeta(&terra); // faccio evolvere il sistema per 1 anno in passi di un giorno ss.evolvi(86400*365, 86400); return 0; } simula.cc