G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

LINGUAGGIO DI PROGRAMMAZIONE C
Introduzione al linguaggio C
Puntatori in C e C++.
Array multidimensionali
PUNTATORI Introduzione
Array di array Capitolo 20 febbraio 2004 Array di array.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Introduzione al linguaggio C
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
FUNZIONI DI BIBLIOTECA
Funzioni definite dall’utente
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
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.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
Array bidimensionali Paragrafo5.
APPUNTI SUL LINGUAGGIO C
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Algebra Lineare Esercizi assegnati.
Le funzioni.
Espressioni condizionali
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione VI Un primo programma Programmazione di Calcolatori: Un primo programma 1.
Programmazione di Calcolatori
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XII Le funzioni Programmazione di Calcolatori: le funzioni 1.
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione VIII Il modello di memoria Programmazione di Calcolatori: Il modello di memoria 1.
C. Gaibisso Programmazione di Calcolatori Lezione VIII Il modello di memoria Programmazione di Calcolatori: Il modello di memoria 1.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXII I tipi di dato astratto Programmazione di Calcolatori: i tipi di dato astratto 1.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Programmazione di Calcolatori
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XI Gli operatori Programmazione di Calcolatori: gli operatori 1.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione X Ingresso/Uscita di Interi Programmazione di Calcolatori: Ingresso/Uscita 1.
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
Programmazione di Calcolatori
Passaggio di parametri per indirizzo
C. Gaibisso Programmazione di Calcolatori Lezione XIV I vettori Programmazione di Calcolatori: i vettori 1.
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
Complessità di un algoritmo
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
- prof. V. Riboldi - SOTTOPROGRAMMI IN TPASCAL METODO TOP DOWN.
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.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
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.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
Il linguaggio C Un primo programma C : un primo programma (2) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define.
1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me ,
Copyright © Istituto Italiano Edizioni Atlas
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1

G. Amodeo, C. Gaibisso Matrici Programmazione di Calcolatori: le matrici2 Matrice (bidimensionale) di n x m elementi: definisce una corrispondenza biunivoca tra un insieme omogeneo di n x m elementi e linsieme di coppie di interi {(0,0), (0,1), …., (n-1, m-1)} Esempio: Matricedi 5 x 2 interi (0,0) (1,0) (2,0) (3,0) (4,0) (0,1) (1,1) (2,1) (3,1) (4,1)

G. Amodeo, C. Gaibisso Definizione di una matrice Programmazione di Calcolatori: le matrici3 tipo Mat **nome Mat Definizione: tipo Mat nome Mat [nro righe ] [nro col ] Modifiche allo stato della memoria: nro righe *sizeof(tipo Mat *) Espressioni costante intere nro col *sizeof(tipo Mat ) nro righe

G. Amodeo, C. Gaibisso Definizione di una matrice Programmazione di Calcolatori: le matrici4 Assumiamo: sizeof(int) = 4 sizeof (int *) = 2 Definizione della matrice: int MatInt[2][3]; Effetto: int **MatInt int ** 4 4 3* int int * 2 2

G. Amodeo, C. Gaibisso Definizione di una matrice Programmazione di Calcolatori: le matrici5 Assumiamo: sizeof(int) = 4 sizeof (int *) = 2 Definizione della matrice: int MatInt[2][3]; Effetto: int **MatInt int int

G. Amodeo, C. Gaibisso Accesso agli elementi di una matrice Programmazione di Calcolatori: le matrici6 Indirizzo: nome Mat nome Mat +1 *(nome Mat +1) *(nome Mat +1)+1 *(nome Mat +1)+nro col -1 *nome Mat *nome Mat +1 *nome Mat +nro col -1 *(nome Mat + nro righe -1) *(nome Mat + nro righe -1)+1 *(nome Mat + nro righe – 1)+nro col -1 tipo Mat **nome Mat nome Mat + nro righe – 1

G. Amodeo, C. Gaibisso Accesso agli elementi di una matrice Programmazione di Calcolatori: le matrici7 Contenuto: *(*(nome Mat +1) ) *(*(nome Mat +1)+1) *(*(nome Mat +1)+nro col -1) *(*nome Mat ) *(*nome Mat +1) *(*nome Mat +nro col -1) *(*(nome Mat + nro righe -1) ) *(*(nome Mat + nro righe -1)+1) *(*(nome Mat + nro righe – 1)+nro col -1) nome Mat nome Mat +1 tipo Mat **nome Mat nome Mat + nro righe – 1

G. Amodeo, C. Gaibisso Accesso agli elementi di una matrice Programmazione di Calcolatori: le matrici8 Nome: nome Mat [indice riga ][indice col ] 0 espressione a valore intero nro righe -1 0 espressione a valore intero nro col -1 *(*(nome Mat + indice riga )+indice col ) 0 espressione a valore intero nro righe -1 0 espressione a valore intero nro col -1 Indirizzo:

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici9 // sorgente: Lezione_XVIII\StatMatIOInd.c // illustra le modalità di acquisizione e restituzione di una matrice // definita staticamente tramite lindirizzo dei suoi elementi // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // di interesse generale #include // chiamante int main () { // definisce una matrice di interi di dimensione 2x3 int Mat[2][3]; // definisce due variabili per l'indice di riga e l'indice di colonna size_t riga, col; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici10 Continua … // acquisisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) { // acquisisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: ", riga, col); scanf("%d", *(Mat + riga)+col); }; // restituisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) // restituisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: %d", riga, col, *(*(Mat + riga)+col)); return(0); }

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici11 Compilazione: Esecuzione:

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici12 // sorgente: Lezione_XVIII\StatMatIONome.c // illustra le modalità di acquisizione e restituzione di una matrice // definita staticamente tramite il nome dei suoi elementi // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // di interesse generale #include <stdlib.h // chiamante int main () { // definisce una matrice di interi di dimensione 2x3 int Mat[2][3]; // definisce due variabili per l'indice di riga e l'indice di colonna size_t riga, col; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici13 Continua … // acquisisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) { // acquisisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: ", riga, col); scanf("%d", &Mat[riga][col]); }; // restituisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) // restituisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: %d", riga, col, Mat[riga][col]); return(0); }

G. Amodeo, C. Gaibisso I/O di matrici definite staticamente Programmazione di Calcolatori: le matrici14 Compilazione: Esecuzione:

G. Amodeo, C. Gaibisso Allocazione statica di matrici Programmazione di Calcolatori: le matrici15 Problemi: -non riesco a gestire situazioni nelle quali la dimensione della matrice è nota a run-time -non riesco a gestire situazioni nelle quali la dimensione della matrice varia a run-time Soluzione: riprodurre le modifiche allo stato della memoria innescate dalla definizione statica di una matrice attraverso le funzioni di allocazione dinamica rese disponibili dal C

G. Amodeo, C. Gaibisso Allocazione dinamica di una matrice Programmazione di Calcolatori: le matrici16 tipo Mat **nome Mat Modifiche allo stato della memoria: nro righe *sizeof(tipo Mat *) nro col *sizeof(tipo Mat ) nro righe // definisce la // variabile di // accesso alla // matrice tipo Mat **nome Mat ; // inizializza tale variabile con l'indirizzo // di un vettore di indirizzi di variabili intere // di dimensione pari al numero delle righe nome Mat = (tipo Mat **) malloc(nro righe *sizeof(tipo Mat *)) // inizializza ogni elemento del vettore con // l'indirizzo di accesso ad un vettore di variabili // intere di dimensione pari al numero delle // colonne for(riga=0; riga < nro righe ; riga++) nome Mat [riga] = (tipo Mat *) malloc(nro col *sizeof(tipo Mat ));

G. Amodeo, C. Gaibisso Rilascio della memoria Programmazione di Calcolatori: le matrici17 Modifiche allo stato della memoria: tipo Mat **nome Mat nro righe *sizeof(*tipo Mat ) nro col *sizeof(tipo Mat ) nro righe // rilascia la memoria allocata per // le variabili di accesso alle righe della matrice free(nome Mat ); // rilascia la memoria allocata per le righe della // matrice for(riga=0; riga < nro righe ; riga++) free(nome Mat [riga]);

G. Amodeo, C. Gaibisso Le Matrici e le funzioni Programmazione di Calcolatori: le matrici18 Le matrici come parametri formali: tipo fun nome fun (…, tipo Mat ** nome Mat, …) { … }; Le matrici come parametri attuali: nome fun (…, nome Mat, …)

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici19 // sorgente: Lezione_XVIII\DinMatIONome.c // illustra le modalità di allocazione dinamica, di acquisizione e di // restituzione, e di rilascio della memoria per una matrice di interi // inclusione del file di intestazione della libreria standard // che contiene definizioni di macro, costanti e dichiarazioni // di funzioni e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard // che contiene definizioni di macro, costanti e dichiarazioni // di funzioni di interesse generale #include Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici20 Continua … // funzione per il recupero della memoria allocata per una matrice di // righe x colonne interi void FreeMatInt(int **Mat, size_t righe) { // definisce una variabile per l'indice di riga size_t riga; // rilascia la memoria allocata per ognuna delle righe della matrice for(riga=0; riga< righe; riga++) free(Mat[riga]); // rilascia la memoria allocata per le variabili di accesso alle righe // della matrice free(Mat); }; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici21 Continua … // funzione per l'allocazione di una matrice di righe x colonne interi int **AllMatInt(size_t righe, size_t colonne) { // definisce una variabile per l'indirizzo di accesso alla matrice e una // per lindice di riga int** Mat; size_t riga; // inizializza la variabile di accesso alla matrice con l'indirizzo di // un vettore di riferimenti a variabili intere di dimensione pari al // numero delle righe Mat = (int **)malloc(righe*sizeof(int *)); // verifica l'esito della inizializzazione, e se negativo termina if (Mat == NULL) return(NULL); Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici22 Continua … // inizializza ogni elemento del vettore con l'indirizzo di un vettore // di variabili intere di dimensione pari al numero delle colonne for(riga=0; riga< righe; riga++) { Mat[riga] = (int *)malloc(colonne*sizeof(int)); // verifica l'esito della inizializzazione, e se negativo rilascia tutta la // memoria allocata fino a quel momento e termina if (Mat[riga] == NULL) { FreeMatInt(Mat, riga-1); return(NULL); }; // restituisce l'indirizzo di accesso alla matrice return(Mat); }; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici23 Continua … // funzione per l'acquisizione del contenuto di una matrice void AcqMatInt(int **Mat, size_t dim_righe, size_t dim_col) { // definizione delle variabili per l'indice di riga e quello di colonna size_t riga, col; // scandisce le righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < dim_col; col = col+1) { // acquisisce l'elemento della matrice printf("\nMat[%d][%d]: ", riga, col); scanf("%d", &(Mat[riga][col])); }; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici24 Continua … // funzione per la restituzione del contenuto di una matrice void ResMatInt(int **Mat, size_t dim_righe, size_t dim_col) { // definizione delle variabili per l'indice di riga e quello di colonna size_t riga, col; // scandisce le righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scandisce le righe della matrice for (col = 0; col < dim_col; col = col+1) // visualizza l'elemento printf("\nMat[%d][%d]: %d", riga, col, Mat[riga][col]); }; Continua …

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici25 Continua … // chiamante int main () { // definisce le variabile per l'indirizzo di accesso alla matrice // e per il numero di righe e di colonne int** Matrice; size_t nro_righe, nro_col; // acquisisce il numero delle righe e delle colonne della matrice printf("Nro righe? "); scanf("%d", &nro_righe); printf("Nro colonne? "); scanf("%d", &nro_col); // alloca memoria per la matrice e ne assegna l'indirizzo alla variabile // preposta Matrice = AllMatInt(nro_righe, nro_col); // verifica l'esito dell'allocazione, se negativo termina if (Matrice == NULL) { printf("\nAllocazione di memoria fallita"); return(0); }; // acquisisce, e successivamente restituisce, il contenuto della matrice AcqMatInt(Matrice, nro_righe, nro_col); ResMatInt(Matrice, nro_righe, nro_col); // rilascia la memoria allocata per la matrice FreeMatInt(Matrice, nro_righe); return(1); };

G. Amodeo, C. Gaibisso I/O di matrici definite dinamicamente Programmazione di Calcolatori: le matrici26 Compilazione: Esecuzione: