Programmazione e Laboratorio di Programmazione

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C
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.
Programmazione di Calcolatori
Programmazione di Calcolatori
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
Unità Didattica 3 Linguaggio C
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
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 XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
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.
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.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Introduzione al linguaggio C
Gli array Moreno Marzolla
Struct, enum, Puntatori e Array dinamici
PRINCIPALI STRUTTURE DEI DATI
Matrici come array di puntatori a righe
Vettori dinamici Definiremo la classe vector.
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
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
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
Programmazione e Laboratorio di Programmazione
Passaggio di parametri per indirizzo
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
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:

Programmazione e Laboratorio di Programmazione Lezione XIII Le matrici Programmazione e Laboratorio di Programmazione – Le matrici

Matrici Matrice (bidimensionale) di n x m elementi: definisce una corrispondenza biunivoca tra un insieme omogeneo di n x m elementi e l’insieme 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) 4 -1 12 -9 8 15 7 Programmazione e Laboratorio di Programmazione – Le matrici

Definizione statica di una matrice tipoMat nomeMat [nrorighe] [nrocol] Modifiche allo stato della memoria: nrocol*sizeof(tipoMat) nrorighe nrorighe*sizeof(tipoMat *) tipoMat **nomeMat Programmazione e Laboratorio di Programmazione – Le matrici

Definizione statica di una matrice Definizione: int MatInt[2][3] Assumiamo: sizeof(int) = 4 e sizeof (int *) = 2 Modifiche allo stato della memoria: 4 3*4 int int * 2 int **MatInt int ** Programmazione e Laboratorio di Programmazione – Le matrici

Definizione statica di una matrice Modifiche allo stato della memoria: 4 int 8010 8014 8018 2 2840 2842 4 int 3476 3480 3484 int **MatInt 1468 Programmazione e Laboratorio di Programmazione – Le matrici

Accesso agli elementi di una matrice Indirizzo: tipoMat **nomeMat *nomeMat *nomeMat+1 nomeMat *nomeMat+nrocol-1 nomeMat+1 *(nomeMat+1) *(nomeMat+1)+1 nomeMat+ nrorighe – 1 *(nomeMat+1)+nrocol-1 *(nomeMat+ nrorighe-1) *(nomeMat + nrorighe-1)+1 *(nomeMat+ nrorighe – 1)+nrocol-1 Programmazione e Laboratorio di Programmazione – Le matrici

Accesso agli elementi di una matrice Contenuto: nomeMat nomeMat+1 tipoMat **nomeMat nomeMat+ nrorighe – 1 *(*nomeMat) *(*nomeMat+1) *(*nomeMat+nrocol-1) *(*(nomeMat+1) ) *(*(nomeMat+1)+1) *(*(nomeMat+1)+nrocol-1) *(*(nomeMat+ nrorighe-1) ) *(*(nomeMat + nrorighe-1)+1) *(*(nomeMat+ nrorighe – 1)+nrocol-1) Programmazione e Laboratorio di Programmazione – Le matrici

Accesso agli elementi di una matrice Nome: 0  espressione a valore intero  nrocol-1 nomeMat [indiceriga][indicecol] 0  espressione a valore intero  nrorighe-1 Indirizzo: 0  espressione a valore intero  nrocol-1 *(*(nomeMat + indiceriga)+indicecol) 0  espressione a valore intero  nrorighe-1 Programmazione e Laboratorio di Programmazione – Le matrici

Allocazione a run-time di una matrice Modifiche allo stato della memoria: // definisce la // variabile di // accesso alla // matrice tipoMat **nomeMat; // inizializza ogni elemento del vettore con // l'indirizzo di accesso ad un vettore di variabili // di tipo tipoMat di dimensione pari al numero delle // colonne for(riga=0; riga < nrorighe; riga++) nomeMat[riga] = (tipoMat *) malloc(nrocol*sizeof(tipoMat)); tipoMat **nomeMat nrorighe*sizeof(tipoMat*) nrocol*sizeof(tipoMat) nrorighe // inizializza tale variabile con l'indirizzo // di un vettore di indirizzi di variabili di tipo tipoMat // di dimensione pari al numero delle righe nomeMat = (tipoMat **) malloc(nrorighe*sizeof(tipoMat *)) Programmazione e Laboratorio di Programmazione – Le matrici

Rilascio della memoria Modifiche allo stato della memoria: // rilascia la memoria allocata per le righe della // matrice for(riga=0; riga < nrorighe; riga++) free(nomeMat[riga]); tipoMat **nomeMat nrorighe*sizeof(*tipoMat) nrocol*sizeof(tipoMat) nrorighe // rilascia la memoria allocata per // le variabili di accesso alle righe della matrice free(nomeMat); Programmazione e Laboratorio di Programmazione – Le matrici

Le Matrici e le funzioni Le matrici come parametri formali: tipofun nomefun ( …, tipoMat ** nomeMat, int nrorighe, int nrocolonne, … ) { … }; Le matrici come parametri attuali: nomefun (…, nomeMat, nrorighe, nrocolonne, …) Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite a run-time // sorgente: DinMatIO.c // illustra le modalità di allocazione a run-time, di acquisizione, 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 <stdio.h> // di funzioni di interesse generale #include <stdlib.h> Continua … Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // definizione della funzione per il recupero della memoria allocata // per una matrice di un qualsiasi numero di colonne void FreeMatInt ( int **Mat, unsigned int righe ) { // definizione di una variabile per l'indice di riga unsigned int riga; // rilascio della memoria allocata per ognuna delle righe della // matrice for(riga=0; riga< righe; riga++) free(Mat[riga]); // rilascio della memoria allocata per le variabili di accesso alle // righe della matrice free(Mat); }; Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // definizione della funzione per l'allocazione a run-time della memoria // per una matrice di interi int **AllMatInt ( unsigned int nro_righe, unsigned int nro_colonne ) { // definizione di una variabile per l'indirizzo di accesso alla matrice // e di una per l’indice di riga int** Mat; unsigned int riga; // inizializzazione della 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(nro_righe*sizeof(int *)); // verifica dell'esito di tale inizializzazione, se negativo termina con // NULL if (Mat == NULL) return(NULL); Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // inizializzazione di ogni elemento del vettore con l'indirizzo di un // vettore di variabili intere di dimensione pari al numero delle // colonne for(riga=0; riga< nro_righe; riga++) { Mat[riga] = (int *) malloc(colonne*sizeof(int)); // verifica dell'esito della inizializzazione, se negativo rilascio di tutta // la memoria allocata fino a quel momento e terminazione con // NULL if (Mat[riga] == NULL) FreeMatInt(Mat, riga-1); return(NULL); }; // restituzione dell'indirizzo di accesso alla matrice return(Mat); Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // funzione per l'acquisizione del contenuto di una matrice di interi void AcqMatInt ( int **Mat, unsigned int dim_righe, unsigned int dim_col ) { // definizione delle variabili per l'indice di riga e quello di colonna unsigned int riga, col; // scansione delle righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scansione delle colonne della matrice for (col = 0; col < dim_col; col = col+1) // acquisizione dell'elemento corrente della matrice printf("\nMat[%d][%d]: ", riga, col); scanf("%d", &(Mat[riga][col])); }; Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // funzione per la restituzione del contenuto di una matrice di interi void ResMatInt ( int **Mat, unsigned int nro_righe, unsigned int nro_col ) { // definizione delle variabili per l'indice di riga e quello di colonna unsigned int riga, col; // scansione delle righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scansione delle colonne della matrice for (col = 0; col < dim_col; col = col+1) // visualizzazione dell'elemento corrente printf("\nMat[%d][%d]: %d", riga, col, Mat[riga][col]); }; Programmazione e Laboratorio di Programmazione – Le matrici

I/O di matrici definite dinamicamente Continua … // Testing di tutte le funzioni definite in precedenza int main () { // definizione della variabile per l'indirizzo di accesso alla matrice // e per il numero di righe e di colonne int** Matrice; unsigned int nro_righe, nro_col; // acquisizione del numero delle righe e delle colonne della matrice printf("Nro righe? "); scanf("%d", &nro_righe); printf("Nro colonne? "); scanf("%d", &nro_col); // allocazione della memoria per la matrice e assegnazione // dell'indirizzo di accesso alla variabile preposta Matrice = AllMatInt(nro_righe, nro_col); // verifica l'esito dell'allocazione, se negativo terminazione con NULL if (Matrice == NULL) printf("\nAllocazione di memoria fallita"); return(0); }; // acquisizione e restituzione del contenuto della matrice AcqMatInt(Matrice, nro_righe, nro_col); ResMatInt(Matrice, nro_righe, nro_col); // recupero della memoria allocata per la matrice FreeMatInt(Matrice, nro_righe); return(1); Programmazione e Laboratorio di Programmazione – Le matrici