Laboratorio di Programmazione e Calcolo

Documenti analoghi
Laboratorio di Programmazione e Calcolo

Laboratorio di Programmazione e Calcolo

Le strutture di controllo in C++

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

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

Elementi di Informatica A. A. 2016/2017

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

La programmazione ad oggetti (OOP)

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

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

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

Lezione 6 Introduzione al C++ Mauro Piccolo

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

Strutture di iterazione

C: panoramica. Violetta Lonati

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Il C nel C++: Funzioni

Allocazione Dinamica della Memoria

Introduzione al C++ (continua)

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

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

Informatica! Appunti dal laboratorio 1!

Array multidimensionali e stringhe

INTRODUZIONE ALLA PROGRAMMAZIONE

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Introduzione ai puntatori in C Definizione

Introduzione al linguaggio C Puntatori

Le basi del linguaggio Java

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

L organizzazione dei programmi

Laboratorio di Informatica

Tipi di dato. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Corso di Fondamenti di Informatica

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

Programmazione Procedurale in Linguaggio C++

Appunti, esempi ed esercizi sui linguaggi C/C++

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

Istruzioni semplici e strutturate

Il paradigma OO e le Classi

Gli Array. Dichiarazione di un array

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

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

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

Verso i puntatori: Cosa è una variabile?

Programmazione modulare

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

Linguaggio C: PUNTATORI

Il linguaggio C funzioni e puntatori

Linguaggio C++ Linguaggi di terza generazione

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

Lezione 3 Tipi di Dato Derivati

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

Qualsiasi programma in C++ segue lo schema:

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

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

PROGRAMMAZIONE: Le strutture di controllo

Laboratorio di Informatica

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Elementi di C++ di base

Il linguaggio C. Puntatori e dintorni

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Array e puntatori in C

Introduzione alla programmazione in C++

direttive del preprocessore simboli speciali parole chiave identificatori costanti

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

INFORMATICA - I puntatori Roberta Gerboni

Introduzione alla programmazione in C(++)

Associazione Variabile-Indirizzo

Laboratorio di Algoritmi e Strutture Dati

Il linguaggio C Strutture

Laboratorio di Informatica

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

Il linguaggio C Puntatori

Costanti e Variabili

Programmazione Procedurale in Linguaggio C++

Introduzione ai puntatori

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

PROGRAMMAZIONE IN C E C++ Prof. Enrico Terrone A. S: 2014/15

L Allocazione Dinamica della Memoria

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

Programmazione Procedurale in Linguaggio C++

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Implementazione dell albero binario in linguaggio C++

Algoritmi e Strutture Dati

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

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

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Le basi del linguaggio Java

Lezione 11. Tipo derivato riferimento Passaggio per riferimento Parametri di ingresso e/o uscita

Informatica! Appunti dal laboratorio 1!

Istituto Tecnico Industriale M. M. Milano Polistena. Classe III D a.s. 2015/2016 C++ Guida Base

Indice. Prefazione. 3 Oggetti e Java 53

ALGORITMI E STRUTTURE DATI

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

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 8) Vettori (Array) 9) Vettori e Puntatori 10) Classe SistemaSolare (prima parte)

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 5

Queste grandezze sono note in forma analitica: - il tempo di caduta t = 2h g - la velocita' al momento dell'impatto con il suolo v = 2gh Confrontando il risultato del calcolo numerico con quello dato dalla formula analitica, possiamo avere indicazioni sulla correttezza del programma che abbiamo scritto 6

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 un oggetto della classe CorpoCeleste utilizziamo una istruzione while utilizziamo il metodo calcolaposizione (della classe CorpoCeleste) 7

t. = 0 t =. dt t =. 2 dt.... t = t + dt t...... v 8

7) Puntatori

IPuntatori Consideriamo la dichiarazione con inizializzazione: int i =10 ; Questa definisce una variabile (istanzia un oggetto) con le seguenti caratteristiche: identificatore: tipo: i int valore: 10 i int 10 e lo stesso potrei fare con altri oggetti (float, double, bool, CorpoCeleste ) 10

Se conoscessimo l'indirizzo di memoria nella quale e' memorizzato l'oggetto (l' int i in questo esempio), potremmo accedere direttamente all'oggetto stesso, ed in particolare al suo valore (10 nell'esempio) Questa operazione e' possibile in C/C++ attraverso l'uso del puntatore!!! i int 10 p int * 0x7fffbcdafafc 11

p e' un (altro) oggetto di tipo int* (puntatore ad un intero Si puo' scrivere (in maniera equivalente) int* p ; int *p ; Queste due scritture ci ricordano che: p e' un puntatore ad un intero - di tipo int* *p e' l'intero a cui p si riferisce - di tipo int 12

L'oggetto a cui si riferisce il puntatore si ottiene (deferencing) tramite l'asterisco *. Nell'esempio: utilizzare *p e' come utilizzare i Lo stesso si puo' fare con tutti gli (altri) oggetti!!! Ad esempio: double * q ; // puntatore ad un double (tipo double*) CorpoCeleste * c ; // puntatore ad un CorpoCeleste (tipo CorpoCeleste*) bool * b ; // puntatore ad un oggetto booleano (tipo bool*) 13

Per ottenere l'indirizzo di un oggetto, si usa l'operatore & (reference). Nell'esempio: int i ; int * p = & i ; I metodi di un oggetto si applicano al corrispondente puntatore tramite la freccetta (digitare "meno" e poi "maggiore" -> ). Ad esempio: CorpoCeleste Marte("marte", 1., 1., 2., 3., 4.) ; CorpoCeleste * pm = & Marte ; pm -> calcolaposizione(); 14

Attenzione alle ambiguita' nella scrittura: CorpoCeleste Marte("marte", 1., 1., 2., 3., 4.) ; CorpoCeleste * pm = & Marte ; pm -> calcolaposizione(); //OK pm ->X(); //OK (*pm).x() ; //OK. Equivale al precedente *pm.x(); //NO. Ambiguo! //Potrebbe essere anche *(pm.x()) e il compilatore non sa scegliere; 15

Un esempio #include <iostream> using namespace std; int main() { int i = 10 ; int *p = & i ; cout << endl ; cout << " i = " << i << endl ; cout << " p = " << p << endl ; cout << " *p = " << *p << endl ; cout << endl ; } return 1; nbseve(~/labc_l5)>./provap1 i = 10 p = 0x7fff2ef5df44 *p = 10 16

Un altro esempio #include <iostream> using namespace std; int main() { int i = 5 ; int j ; int *p ; p = &i ; j = i ; cout << i << *p << j << endl ; } i = 8 ; cout << i << *p << j << endl ; return 1; nbseve(~/labc_l5)>./provap2 5 5 5 8 8 5 17

Vantaggi nell'uso dei puntatori (2) Vantaggi per il C/C++: velocizzano l'accesso ai dati in memoria (ad esempio la gestione di matrici di grandi dimensioni) permettono di allocare e liberare memoria durante la fase di esecuzione del programma (vedi prossima lezione) Permettono di condividere informazioni tra diversi blocchi di un programma senza duplicare in memoria strutture dati di grandi dimensioni. 18

Vantaggi nell'uso dei puntatori (1) Vantaggi specifici del C++ Straordinariamente potente se unito ad Ereditarieta' e Polimorfismo (dovete attendere qualche lezione!) Rende molto flessibile la gestione di oggetti diversi, ma tra loro simili (ad esempio Sonda e CorpoCeleste, oppure Cerchio, Quadrato e Triangolo, ecc.) 19

int numero ; numero = 82485; int *puntatore; puntatore = &numero; 20

numero = 0 ; oppure *puntatore = 0 ; 21

#include <iostream> using namespace std; int main() { int numero = 82485 ; int *puntatore = & numero ; cout << " numero = " << numero << " puntatore = " << puntatore << endl ; numero = 0 ; cout << " numero = " << numero << " puntatore = " << puntatore << endl ; } cout << endl ; return 1; nbseve(~/labc_l5)>./provap3 numero = 82485 puntatore = 0x7fff9dbc6ed4 numero = 0 puntatore = 0x7fff9dbc6ed4 22

7) Puntatori 8) Vettori (Array)

Vettori/Array float 10. float 12.9. float -8.4 Un vettore (array) è una sequenza di variabili tutte dello stesso tipo che occupano locazioni di memoria contigue. Dichiarazione di un vettore di oggetti del tipo Tipo: Tipo identificatore[dimensione]; Uso di un elemento del vettore: identificatore[elemento] Dove dimensione e elemento sono degli oggetti di tipo int 24

NB Contrariamente ad altri linguaggi in C e C++ il primo elemento di un vettore ha indice 0 e l'ultimo, se n è la dimensione del vettore, ha indice n-1. Come in tutti i linguaggi la dichiarazione del vettore ed il suo dimensionamento comportano l allocazione della memoria necessaria per la dimensione dichiarata: se si prova ad usare un elemento con indice superiore a n-1 si ha uno sfondamento della memoria, errore che comporta problemi in punti imprevedibili del programma! 25

Esempi di dichiarazioni int V[25] ; // dichiarazione di un vettore V // con 25 elementi integer: V[0], V[1] V[24] double vdb[3] ; // dichiarazione di un vettore // vdb con 3 elementi double: // vdb[0], vdb[1], vdb[2] string word[50] ; //dichiarazione di un vettore word //con 50 elementi string: word[0],,word[49] 26

Inizializzazione int V[25] = {3, 5, 6, 1} ; double vdb[3] = {-1.2, 4.7, 5.9} ; string student[4] = {"Chris Berkley", "Kevin Chao", "Missy Mesfin", "Joel Triemstra"}; int M[ ] = {1, 4, 15, 2}; string Name[ ] = "Michael Bird" ; 27

Esempio di inizializzazione e uso #include <iostream> using namespace std; int main() { string studenti[4] ; studenti[0] = "Chris Berkley" ; studenti[1] = "Kevin Chao" ; studenti[2] = "Missy Mesfin" ; studenti[3] = "Joel Triemstra" ; cout << " Elenco studenti del corso di Laboratorio di Calcolo (A)" << endl ; for(int i=0 ; i<4 ; i++ ) { } cout << " " << i+1 << " " << studenti[i] << endl ; return 1; } 28

nbseve(~/labc_l5)>./provlstu Elenco studenti del corso di Laboratorio di Calcolo (A) 1 Chris Berkley 2 Kevin Chao 3 Missy Mesfin 4 Joel Triemstra 29

Vettori/Array multidimensionali (matrici) Dichiarazione di una matrice con rdim righe e cdim colonne tipo identificatore[rdim][cdim] ; Esempio: double tabella[3] [4] ; 30

Dichiarazione ed inizializzazione Per l'inizializzazione si elencano gli elementi della prima riga, poi della seconda etc int M[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}} ; oppure int M[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12} ; 31

Esempio: prodotto scalare #include <iostream> using namespace std; int main( ) { double A[3],B[3]; double pscal=0.; cout <<"inserisci gli elementi del vettore A"<< endl; cin >> A[0] >> A[1] >> A[2]; cout <<"inserisci gli elementi del vettore B"<< endl; cin >> B[0] >> B[1] >> B[2]; for(int j=0; j<3; j++) { pscal += A[j]*B[j] ; } cout << " A scalare B vale " << pscal << endl; return 1; } 32

Esempio: prodotto di matrici #include <iostream> using namespace std ; int main() { int M1[3][2] = { {1,0}, {2,1}, {0,2} }; int M2[2][3] = { {0,1,2}, {1,2,1} } ; int M3[3][3] ; for(int j=0; j<3; j++) { //loop sulle righe di M3 for(int k=0; k<3; k++) { //loop sulle colonne di M3 M3[j][k] = 0 ; for(int l=0; l<2; l++) { //loop su colonne M1 e righe M2 M3[j][k] += M1[j][l]*M2[l][k] ; } } } return 1; } 33

Osservazione C++! Ma non si potrebbe definire una classe di tipo Matrix (almeno per le matrici quadrate) e su di essa implementare una operazione di moltiplicazione (o un metodo ) E poi scrivere Matrix M1( ) ; Matrix M2(.) ; Matrix M3 = M1*M2 ;??? 34

7) Puntatori 8) Vettori (Array) 9) Vettori e Puntatori

Puntatore ad un vettore float 10. float 12.9. float -8.4 p float * 0x7fffbcdafafc Quanto vale p? 36

v[0] v[1] v[2] v[3] float float float float 10. 12.9-1.5-8.4 p float * 0x7fffbcdafafc float v[4] ; float * p ; p = & v[0] ; Oppure, piu' semplicemente float v[4] ; float * p ; p = v ; 37

float v[4] ; float * p ; p = v ; *p??? v[0] v[1] v[2] v[3] float float float float 10. 12.9-1.5-8.4 float * p 0x7fffbcdafafc Come posso scorrere il vettore utilizzando i puntatori? 38

Aritmetica dei Puntatori *p *(p+1) *(p+2) *(p+3) v[0] v[1] v[2] v[3] float float float float 10. 12.9-1.5-8.4 float * Se aggiungo "1" al valore di un puntatore, il compilatore scorre alla locazione di memoria successiva! p 0x7fffbcdafafc 39

Esempi (1) #include <iostream> using namespace std; int main() { string studenti[4] ; studenti[0] = "Chris Berkley" ; studenti[1] = "Kevin Chao" ; studenti[2] = "Missy Mesfin" ; studenti[3] = "Joel Triemstra" ; cout << " Elenco studenti del corso di Laboratorio di Calcolo (A)" << endl ; string * p = studenti; for(int i=0 ; i<4 ; i++ ) { } return 1; } cout << " " << i+1 << " " << *(p++) << endl ; 40

nbseve(~/labc_l5)>./provlstp Elenco studenti del corso di Laboratorio di Calcolo (A) 1 Chris Berkley 2 Kevin Chao 3 Missy Mesfin 4 Joel Triemstra Avreste anche potuto scrivere: cout << " " << i+1 << " " << *(studenti+i) << endl ; Pero' studenti non e' un puntatore, ma la label del vettore! Si comporta (in parte) come un puntatore 41

Posso anche sottrarre ad un puntatore un numero intero per scorrere il vettore all'indietro: v[0] v[1] v[2] v[3] float float float float 10. 12.9-1.5-8.4 p float * 0x7fffbcdafafc float v[4] ; float * p ; p = &v[2] ; cout << *(p-2) << endl ; // stampa 10 42

#include <iostream> using namespace std; Esempi (2) int main() { int i[3] ; int * p = i ; double f[3] ; double * q = f ; i[0] = 0 ; i[1] = 1 ; i[2] = 2 ; f[0] = 10. ; f[1] = 11. ; f[2] = 12. ; cout << endl << p << " " << q << " " << *p << " " << *q << endl ; cout << p+1 << " " << q+1 << " " << *(p+1) << " " << *(q+1) << endl ; cout << p+2 << " " << q+2 << " " << *(p+2) << " " << *(q+2) << endl << endl ; return 1; } 43

nbseve(~/labc_l5)>./provpa 0x7fffa645fe80 0x7fffa645fe60 0 10 0x7fffa645fe84 0x7fffa645fe68 1 11 0x7fffa645fe88 0x7fffa645fe70 2 12 I puntatori sono numeri interi, pero': p e' di tipo int* q e' di tipo double * Cambia l'algebra! Se proviamo a stampare i valori dei puntatori p, p+1, p+2 troviamo due indirizzi che distano tra loro 4 byte. Se proviamo a stampare i valori dei puntatori q, q+1, q+2 troviamo due indirizzi che distano tra loro 8 byte. In un vettore di int gli indirizzi distano 4 byte, in un vettore di double distano 8 byte 44

7) Puntatori 8) Vettori (Array) 9) Vettori e Puntatori 10) Classe SistemaSolare (prima parte)

10) Classe SistemaSolare (prima parte)

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

Ricordando la Struttura 48

e l Interaction-diagram della simulazione 49

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

La Struttura Dati di Sistema Solare (I) Puntatori e Vettori int myvec[5]; int * p; p = myvec; p myvec[0] myvec[1] myvec[2] myvec[3] myvec[4] 51

int vec1[4],vec2[3],vec3[5],vec4[2]; int * p[4]; p[0] = vec1; p[1] = vec2; p[2] = vec3; p[3] = vec4; int????? ** q; q = p; p[0] p[1] p[2] p[3] q int * int ** vec4[0] vec4[1] int vec3[0] vec3[1] vec3[2] vec3[3] vec3[4] vec2[0] vec2[1] vec2[2] vec1[0] vec1[1] vec1[2] vec1[3] 52

p[0] p[1] p[2] p[3] q CorpoCeleste * CorpoCeleste ** sole CorpoCeleste terra marte venere 53

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: #endif SistemaSolare(int n); ~SistemaSolare(); int aggiungipianeta CorpoCeleste *unpianeta); int npianeti() {return N;}; void evolvi(float T, float dt); 54

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!!! }. Affronteremo questo problema nella prossima lezione! 55

56