Presentazione di PowerPoint - uniroma1.itbloisi/didattica/ingegneria... · Laboratorio di...
Transcript of Presentazione di PowerPoint - uniroma1.itbloisi/didattica/ingegneria... · Laboratorio di...
Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Unità 7
Matrici
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhD
Ricercatore
Dipartimento di Ingegneria Informatica, Automatica
e Gestionale “Antonio Ruberti”
Via Ariosto 25
(adiacente Piazza Dante,
Manzoni
Tram 3 fermata via Labicana)
email: [email protected]
home page:
Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Pagina 2
http://www.dis.uniroma1.it/~bloisi
Ricevimento
In aula, subito dopo le lezioni
Su appuntamento (tramite invio di una email)
presso:
Dipartimento di Ingegneria Informatica,
Automatica e Gestionale “Antonio Ruberti”,
via Ariosto 25 - II piano, stanza A209
Si invitano gli studenti a controllare regolarmente la
bacheca degli avvisi
http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi
Pagina 3Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Orari
Lunedì 12.00 – 13.30
Aula 4, via del Castro Laurenziano 7A
Martedì 14.00 – 17.15
Aula 15, Laboratorio Didattico via Tiburtina 205
Mercoledì 12.00 – 13.30
Aula 4, via via del Castro Laurenziano 7A
Pagina 4Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Sommario – Unità 7
• Array come collezione di elementi
• Dichiarazione di variabili array
• Creazione di array
• Accesso agli elementi di un array
• Espressioni che rappresentano array
• Passaggio di parametri di tipo array
• Variabili array e puntatori
• Ordinamento degli elementi di un array
• Ricerca tra gli elementi di un array
• Matrici
Pagina 5Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Variabili array e puntatori
int A[4] = {1, 2, 3, 4};
int *B;
B = A;
int i;
for (i = 0; i < 4; i++)
printf("%d\n", B[i]);
B[0] = 10;
printf("A[0] = %d\n", A[0]);
La variabile array A può essere assegnata a una variabile
puntatore a int B.
Dopo l’assegnazione, B può essere usata come una
variabile array.
Pagina 6Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esecuzione
Se eseguito, il frammento di codice precedente produce il
seguente output
1
2
3
4
A[0] = 10
Nota: una variabile array non può essere assegnata a
un’altra variabile array.
Pagina 7Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Ricerca sequenziale di un elemento in un
arraySi scriva una funzione cercaArray che prenda come
parametri un array di interi a, un intero n (corrispondente alla
dimensione dell’array) e un intero e da ricercare nell’array.
La funzione deve restituire 1 se il valore e è presente
nell’array, 0 altrimenti:
int cercaArray(int a[], int n, int e) {
int i;
for (i = 0; i < n; i++) {
if (e == a[i])
return 1; //true
}
return 0; //false
}Pagina 8Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempio d’uso
int main() {
const int n = 3;
int x[n];
x[0] = 1; x[1] = 2; x[2] = 3;
printf("Array-x:\n");
int i;
for (i = 0; i < n; i++)
printf("%d\n", x[i]);
// cerca il valore 2 nell’array x
if ( cercaArray(x, n, 2) ) {
// l’elemento è stato trovato
printf("trovato\n");
}
else {
// l’elemento non è stato trovato
printf("non trovato\n");
}
}
Pagina 9Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esecuzione
Array-x:
1
2
3
trovato
Pagina 10Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Ricerca del valore massimo in un array
Si scriva una funzione massimoArray che prenda come
parametri un array di long a e la sua lunghezza n,
restituendo il massimo valore in a.
Si assuma che l’array contenga almeno un elemento.
long massimoArray(long a[], int n) {
long max = a[0];
int i;
for (i = 1; i < n; i++)
if (a[i] > max)
max = a[i];
return max;
}
Pagina 11Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempio d’uso
int main () {
// creazione array x di 5 long
long x[5] = { 5, 3, 9, 1, 2 };
int i;
for (i = 0; i < 5; i++) // stampa 5 3 9 1 2
printf("%ld ", x[i]);
printf("\nmassimo = %ld\n",
massimoArray(x,5));
}
Output5 3 9 1 2
massimo = 9
Pagina 12Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Rovesciare i valori di un array
Si scriva una funzione rovesciaArray che prenda come
parametri un array di interi a e la sua dimensione n.
La funzione deve modificare il contenuto di a posizionando gli
elementi in ordine inverso, dall’ultimo al primo.
void swap(int *i, int *j) {
int temp=*i; *i=*j; *j=temp;
}
void rovesciaArray(int a[], int n) {
int temp;
int i;
for (i=0; i < n/2; i++)
swap(&a[i],&a[n-i-1]);
return;
}Pagina 13Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempio d’uso
int main () {
const int n = 5;
// creazione array x di 5 int
int x[n];
// inizializzazione
x[0] = 5; x[1] = 3; x[2] = 9; x[3] = 5; x[4] = 12;
int i;
for (i = 0; i < n; i++) // stampa 5 3 9 5 12
printf("%d ", x[i]);
printf("\n");
rovesciaArray(x, n); // rovescia l’array x
for (i = 0; i < n; i++) // stampa 12 5 9 3 5
printf("%d ", x[i]);
printf("\n");
return EXIT_SUCCESS;
}
Pagina 14Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esecuzione
5 3 9 5 12
12 5 9 3 5
Il meccanismo di passaggio dei parametri fornisce come parametro attuale al metodo rovesciaArray
il riferimento all'array x e non una copia di x. Tale
riferimento viene poi copiato nel parametro formale a.
Quindi, a ed x si riferiscono al medesimo array.
Pagina 15Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Array come risultato di una funzione
int* copiaInversa(int a[], int n) {
int* temp = (int*)malloc(n * sizeof(int));
if(temp != NULL) {
int i;
for (i = 0; i < n; i++) {
temp[n-1-i] = a[i];
}
}
return temp;
}
La funzione copiaInversa prende come parametri un array
a e la sua dimensione n, restituendo un nuovo array con gli
elementi in ordine inverso rispetto ad a.
In questo esempio, poiché si vuole
restituire un array, tale array viene creato
dinamicamente all’interno della funzione copiaInversa.
cast (opzionale)
Pagina 16Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempio d’uso
int main () {
const int n = 5;
int x[n];
x[0] = 5; x[1] = 3; x[2] = 9; x[3] = 5; x[4] = 12;
int i;
for (i = 0; i < n; i++) // stampa 5 3 9 5 12
printf("%d ", x[i]);
printf("\n");
int * y = copiaInversa(x, n);
if(y == NULL) {
printf("ERRORE\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; i++) // stampa 12 5 9 3 5
printf("%d ", y[i]);
printf("\n");
return EXIT_SUCCESS;
}Pagina 17Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Nota
Il risultato di una funzione può essere un riferimento
a un array, ma occorre usare come tipo di ritorno un puntatore, cioè non si può scrivere int [] come
risultato della funzione, bensì si deve usare int *
In alternativa, si sarebbe potuto usare un parametro
di tipo array anche per il risultato, con la relativa
dichiarazione fatta (staticamente) nella funzione
invocante. Ad esempio:void copiaInversa(int a[], int n, int res[])
Pagina 18Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Nota
Array allocati nello stack non devono essere deallocati esplicitamente. L’array x nell’esempio precedente sarà
deallocato automaticamente al termine del bloccodi codice in cui è definito (cioè nel main).
Invece, quando si alloca dinamicamente (nello heap) un array,
al termine del suo uso è necessario deallocare la memoria occupata esplicitamente, tramite la funzione free.
Nell’esempio precedente si può aggiungere nellafunzione main la seguente istruzione per rilasciare la memoria
allocata nella funzione:
free(y);
Pagina 19Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Matrici
Una matrice è una collezione in forma tabellare di
elementi dello stesso tipo, ognuno dei quali è
indicizzato da una coppia di numeri che
rappresentano riga e colonna dell’elemento.
Una matrice può essere rappresentata in C
mediante un array multidimensionale.
Pagina 20Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempi
Dichiarazione di una matrice 3x5 accessibile mediante la variabile m:
int m[3][5];
Pagina 21
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Accesso agli elementi della matrice
// assegnazione dell’elemento della matrice m
// alla riga 1, colonna 2
m[1][2] = 39;
// assegnazione dell’elemento della matrice m
// alla riga 0, colonna 0
m[0][0] = 4;
printf("%d\n", m[1][2]); // stampa 39
Pagina 22
4 ? ? ? ?
? ? 39 ? ?
? ? ? ? ?
Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Rappresentazione grafica
Pagina 23
?? ? ?
? ? ??
? ? ?? ?
Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Espressioni che denotano oggetti matrice
Poiché una matrice è semplicemente un array i cui elementi
sono a loro volta array, nella definizione di matrici è possibile
utilizzare espressioni che denotano matrici come nel
seguente esempio:
int m[][2] = {
{ 3, 5 },
{ 9, 12 }
};
Si noti che solo la prima dimensione dell’array
può essere non specificata.
Pagina 24Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esempio
int main () {
int m[][2] = {
{ 3, 5 },
{ 9, 12 }
};
int i, j;
for(i = 0; i < 2; i++) {
for(j = 0; j < 2; j++) {
printf("%d ", m[i][j]);
}
printf("\n");
}
}
Cosa stampa questo
programma?
Pagina 25Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esecuzione
La definizione di matrice
int m[][2] = {
{ 3, 5 },
{ 9, 12 }
};
è equivalente a:
int m[2][2];
m[0][0] = 3;
m[0][1] = 5;
m[1][0] = 9;
m[1][1] = 12;
Pagina 26Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Numero di righe e colonne di una matrice
Usando la funzione sizeof è possibile risalire al numero di
elementi dell’array, anche nel caso multidimensionale.
int x[][2] = {{ 3, 5}, {9, 12}};
printf("dimensione array %d byte\n",
sizeof(x));
stampa il valore 16, che corrisponde al numero di byte per memorizzare 4 int (4 byte ciascuno)
Pagina 27Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Stampa di una matrice per righe
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++)
printf("%d ", m[i][j]);
printf("\n");
}
stampa di una matrice NxM per righe
Si noti che per accedere a tutti gli elementi della matrice m vengono usati
due cicli for annidati:
1) un for esterno che scandisce le righe (i)
2) un for interno che scandisce gli elementi di ogni riga (j).
Quando tutti gli elementi di una riga sono stati stampati, viene stampato
un ritorno a capo.
Pagina 28Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Stampa di una matrice per colonne
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++)
printf("%d ", m[j][i]);
printf("\n");
}
Esercizio 7.5
Scrivere un programma che stampi prima per righe e poi
per colonne la matrice1 2 3
4 5 6
Stampa di una matrice NxM per colonne
Pagina 29Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Somma di matrici
Si assuma che A e B abbiano le stesse dimensioni (stesso
numero di righe e stesso numero di colonne).Si vogliono definire i valori di una nuova matrice C ottenuta
sommando gli elementi corrispondenti di A e B.
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
C[i][j] = A[i][j] + B[i][j];
Per accedere a tutti gli elementi della matrice A (e a quelli di
B) usiamo due cicli for annidati:
1) for esterno che scandisce le righe (i),
2) for interno che scandisce gli elementi di ogni riga (j).
Pagina 30Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Prodotto di matrici (1/2)
Si scriva un frammento di codice che definisca i valori di una nuova matrice C ottenuta come
prodotto di A e B.
Si assuma che
1. Le matrici siano quadrate, cioè abbiano lo
stesso numero di righe e colonne
2. Le matrici abbiano le stesse dimensioni.
Pagina 31Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Prodotto di matrici (2/2)
Ogni elemento C[i][j] del prodotto di matrici A・B è ottenuto come prodotto scalare della riga i di A
con la colonna j di B,
cioè per ogni coppia di indici i,j, si ha:
Pagina 32Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esecuzione
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
C[i][j] = 0;
for (k = 0; k < N; k++)
C[i][j] += A[i][k] * B[k][j];
}
}
Si noti che per calcolare il prodotto delle matriciC = A x B si usano tre cicli for annidati:
1) for esterno che scandisce le righe (i) di C,
2) for intermedio che scandisce le colonne (j) di C,
3) for più interno che calcola il prodotto scalare della riga i
di A con la colonna j di B, che viene salvato in C[i][j].
Pagina 33Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Passaggio di parametri matrice
Nel passaggio dei parametri per per array multi-dimensionali è
necessario specificare nell’intestazione della funzione tutte le
dimensioni dell’array, eccetto la prima.
Per le matrici è, quindi, necessario specificare il numero delle
colonne, mentre il numero delle righe può essere omesso.
void stampaMatrice (int A[][3], int N) {
//corpo della funzione
...
}
Pagina 34Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Passaggio di parametri matrice
La funzione stampaMatrice stamperà solo matrici
con 3 colonne!
Dovendo esplicitare il numero di colonne non è
possibile scrivere una funzione che stampi matrici di dimensione NxN, ma solo Nx3
Per ovviare a questo inconveniente possono essere
utilizzate
1) opportune strutture di dati che consentano di
manipolare strutture bi-dimensionali2) apposite librerie matematiche (e.g., gsl).
Pagina 35Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esercizi
Esercizio 7.6
Scrivere una funzioneint arrayUguali(int[] A, int[] B, int n)
che restituisca
1 se gli array A e B sono uguali (cioè hanno tutti
gli elementi corrispondenti uguali)
0 altrimenti
Pagina 36Laboratorio di Informatica
2014/2015
Matrici
Unità 7
Esercizi
Esercizio 7.7Una matrice M si dice diagonale se tutti gli elementi
M[i][j] con i diverso da j (cioè non appartenenti
alla diagonale principale) valgono zero.
Scrivere una funzione che restituisca 1 se la matrice M è diagonale e 0 altrimenti.
Pagina 37Laboratorio di Informatica
2014/2015
Matrici
Unità 7