DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – [email protected] Ver. aggiornata al 3 Aprile 2014 Feedback Lezioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E' importante dare enfasi sull'aspetto più 'generale' delle funzioni, non 'fare solo pura sintassi del C". Secondo il mio onesto parere forse un po' però questa sintassi si sta trascurando. A lezione sembra tutto più o meno chiaro...poi quando arrivo a casa e devo applicare non so da dove iniziare a scrivere il codice, pur avendo magari l'algoritmo già fatto. 2 Feedback Lezioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 3 Feedback Lezioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 4 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Array n-dimensionali: le matrici • Dichiarazione di nuovi tipi di dato • Dato strutturati 5 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… 6 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… 7 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) 8 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. 9 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 10 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; } 11 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. 12 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 13 Le Matrici: moltiplicazione - esempio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 14 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 15 Pausa 15’ DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 16 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} 17 Tipi di dati strutturati: pixel DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE struct pixel{ char G; char R; char B; }; 18 Tipi di dati strutturati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE struct miastruttura { char campo1; float campo2; int campo3[2]; }; miastruttura ? campo1 ? ? ? campo2 campo3 19 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(). 20 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; 21 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. 22 Numeri complessi: completo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 23 Numeri complessi: dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 24 Numeri complessi: Input DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 25 Numeri complessi: calcolo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 26 Numeri complessi: Struct != Typedef DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 27 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 28 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 2010 • Quindi, visualizza queste giocate. 29 Schedine: dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 30 Schedine: inserimento dati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 31 Schedine: copia valori DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 32 Schedine: stampa dei risultati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 33 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 34 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 35