DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – [email protected] Ver. aggiornata al 5 Novembre 2013 Info di servizio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Demo 1mo compitino In LM5 @ 12pm - venerdì 8 Nov In L06 @ 6.30pm – martedì 12 Nov • Correzione demo In LM5 @ 12pm – venerdì 15 Nov 2 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Array n-dimensionali: le matrici • Dichiarazione di nuovi tipi di dato • Dato strutturati 3 Immagini DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 17 11 28 07 09 12 Come si rappresenta? Creiamo una griglia (aka matrice) 100 Ma cosa contiene la matrice? I punti rappresentati, ad esempio, come int 100 100 Osservazioni 57 Come aumento la risoluzione? Come rappresento i colori? Lo vedremo dopo la pausa… 4 Array a più dimensioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Gli array a 1D realizzano i vettori, quelli a 2D realizzano le matrici, …e così via • Dichiarazione: int A[20][30]; A è una matrice di 20 30 elementi interi (600 variabili distinte) float F[20][20][30]; F è una matrice 3D di 202030 variabili di tipo float (12.000!) • Oppure a quattro dimensioni, ecc… 5 Excursus Matematico – Le Matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • In matematica, una matrice è uno schieramento rettangolare di oggetti (di solito numeri), organizzati in righe (orizzontali) e colonne (verticali) • In generale, una matrice ha m righe e n colonne, con m e n interi positivi fissati. Spesso una matrice è descritta indicando con aij il generico elemento posizionato alla riga i-esima e alla colonna jesima • I vettori si possono considerare matrici con una sola riga o una sola colonna (detti più precisamente vettore riga e vettore colonna) 6 Le Matrici: gli elementi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Se la matrice si chiama A, l'elemento ai,j può essere indicato anche come A[i,j]. La notazione A = (ai,j) indica che A è una matrice e che i suoi elementi sono denotati con ai,j • Gli elementi con i due indici di riga e di colonna uguali, cioè gli elementi della forma aii costituiscono la diagonale principale della matrice. 7 Le Matrici: somma DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Due matrici A e B si possono sommare se hanno le stesse dimensioni • La loro somma A + B è definita come la matrice i cui elementi sono ottenuti sommando i corrispettivi elementi di A e B. Formalmente: (A + B)i,j: = Ai,j + Bi,j 8 Somma di matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE c[i][j] = a[i][j] + b[i][j] 0 1 2 3 0 3 7 10 0 1 1 3 11 2 2 5 8 9 24 + 0 2 1 0 5 1 7 9 6 2 2 5 1 2 4 = 0 5 8 10 5 1 8 12 17 4 2 10 9 11 28 #include <stdio.h> #define N 3 #define M 4 int main() { int a[N][M], b[N][M], c[N][M]; int i, j; //leggo la prima matrice for (i=0; i<N; i++) for (j=0; j<M; j++) scanf(“%d”, &a[i][j]); //leggo la seconda matrice for (i=0; i<N; i++) for (j=0; j<M; j++) scanf(“%d”, &b[i][j]); //calcolo e stampo la somma for (i=0; i<N; i++){ for (j=0; j<M; j++){ c[i][j]=a[i][j]+b[i][j]; printf(“%d “, c[i][j]); } printf(“\n”); } return 0; } 9 Le Matrici: moltiplicazione per uno scalare DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • È un'operazione che, data una matrice A ed un numero c (detto scalare), costruisce una nuova matrice cA, il cui elemento è ottenuto moltiplicando l'elemento corrispondente di A per c (cA)ij: = cAi,j. 10 Le Matrici: moltiplicazione tra matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Prodotto riga per colonna • La moltiplicazione tra due matrici A e B è un'operazione più complicata delle precedenti. A differenza della somma, non è definita sommando semplicemente gli elementi aventi lo stesso posto La definizione di moltiplicazione che segue è motivata dal fatto che una matrice modellizza una applicazione lineare, e in questo modo il prodotto di matrici corrisponde alla composizione di applicazioni lineari • La moltiplicazione è definita soltanto se il numero di righe di B coincide con il numero n di colonne di A. Il risultato è una matrice con lo stesso numero di righe di A e lo stesso numero di colonne di B • L’elemento di posizione (i,j) è dato dalla somma 11 Le Matrici: moltiplicazione - esempio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 12 Prodotto di matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 0 1 2 3 0 3 7 10 0 1 1 3 11 2 2 5 8 9 24 0 1 2 3 4 2 1 0 4 3 7 9 6 1 2 5 1 2 5 0 11 0 3 8 7 * 0 1 2 c[1][2] =∑(a[1][k]*b[k][2]), con k = 0, ..., 3 3 0 1 2 3 #define N 3 #define M 4 0 #define L 5 18+ 1 22+6 ..... for (i=0; i<N; i++){ 2 for (j=0; j<L; j++){ c[i][j] = 0; for (k=0; k<M; k++) c[i][j] = c[i][j]+(a[i][k]*b[k][j]); printf(“%d”, c[i][j]); } printf(“\n”); } 4 13 Pausa 15’ DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 14 Come rappresento un pixel? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Il pixel è Il colore Come ottengo il verde? Con il formato RGB R: 91 G: 191 B: 33 PIXEL = {R, G, B} 15 Tipi di dati strutturati: pixel DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE struct pixel{ char G; char R; char B; }; 16 Tipi di dati strutturati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE struct miastruttura { char campo1; float campo2; int campo3[2]; }; miastruttura ? campo1 ? ? ? campo2 campo3 17 Definire un nuovo tipo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sinonimi: typedef int Intero; Intero a; int b; typedef char Stringa[10]; Stringa c; char d[10]; Tipi enumerativi: typedef enum {lun,mar,mer,gio,ven,sab,dom} Settimana; Settimana giorno; giorno = lun; giorno = 3; /* 3 equivale a gio */ Non funziona con scanf() e printf(). 18 Definire un nuovo tipo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; ilMioRecord ? A campo1 ? 24.56 ? 23 ? 45 campo2 campo3 Record ilMioRecord; ilMioRecord.campo1 = 'A'; ilMioRecord.campo2 = 24.56; ilMioRecord.campo3[0] = 23; ilMioRecord.campo3[1] = 45; 19 Numeri complessi: problema DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • L’utente inserisce due numeri complessi (parte reale e parte immaginaria) e l’elaboratore esegue l’operazione di somma Es: 3+4i + 5-6i = 8-2i • Il programma chiede all’utente se vuole calcolare un’altra somma. Se l’utente inserisce il carattere ‘q’ il programma termina, altrimenti ricomincia daccapo. 20 Numeri complessi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 21 Numeri complessi: note DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE "%f" stampa un numero float con il segno “-” se è negativo, senza segno se è positivo "%+f" stampa un numero float con il segno “-” se è negativo, con il segno “+” se è positivo "i" non fa parte degli specificatori di formato 22 Schedine: problema DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il programma, partendo da un array di dimensione prefissata che contiene in ogni cella: data della giocata colonna con i tredici segni • Copia in un altro vettore solo le giocate dell’anno 2012 • Quindi, visualizza queste giocate. 23 Schedine: dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 24 Schedine: inserimento dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 25 Schedine: copia valori DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 26 Schedine: stampa dei risultati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 27 Problemi di fine giornata… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Si scriva un programma che visualizzi gli istogrammi verticalmente: * * * * * * * * * * * * * * * * * * * 19 0 * * * 3 1 * * * * * * * * * * * * * * * 15 2 * * * * * * * 7 3 * * * * * * * * * * * 11 4 * * * * * * * * * 9 5 * * * * * * * * * * * * * 13 6 * * * * * 5 7 * * * * * * * * * * * * * * * * * 17 8 * 1 9 28 Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Informatica arte e mestiere, S. Ceri, D. Mandrioli, L. Sbattella, McGrawHill • Credits Vito Perrone, Daniele Braga 29