Array n-dimensionali e tipi di dati strutturati Process synchronization Operating System Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 8 Aprile 2016 © 2005 William Fornaciari
Logistica Laboratori Lunedì (3.30pm – 6pm) Giovedì (2pm – 4pm) EG7 (No portatili e basta) L26.1.3 (portatili) Giovedì (2pm – 4pm) EG7 (i 40 del progetto + 1)
Ma prima…
Frase… insieme di caratteri Che cosa è una frase? Un insieme di caratteri Come la rappresento? Un insieme, di tante variabili carattere? Una variabile, insieme di caratteri? supercali fragili stiche spiralidoso
Le stringhe Array di caratteri: spesso chiamati stringhe Quando rappresentano “caratteri da leggersi in fila” Dichiarazione+inizializzazione di una stringa: char stringa[] "word"; Il carattere nullo '\0' termina le stringhe Perciò l’array stringa ha 5 elementi (non 4): Dichiarazione equivalente: char stringa[] {'w', 'o', 'r', 'd', '\0'}; d r o w \0
Problema: inserisci nome
Stringhe e caratteri Qual è la differenza tra 'x' e "x"? 'x' è una costante di tipo char, rappresentata in memoria da un intero "x" è una stringa costante, rappresentata in memoria da un array che contiene i caratteri: 'x' e '\0' ATTENZIONE Le stringhe non sono propriamente un tipo di dato (non sono un tipo base!) Non hanno operatori nativi, ma una serie di funzioni nella libreria standard che permettono di manipolarle
scanf: stringhe Vs char
Tornando ad oggi…
Obiettivi Array n-dimensionali: le matrici Dichiarazione di nuovi tipi di dato Dato strutturati
Immagini 17 11 07 Come si rappresenta? 28 09 12 Creiamo una griglia (aka matrice) 100 Ma cosa contiene la matrice? I punti rappresentati, ad esempio, come int 100 100 Osservazioni Come aumento la risoluzione? Come rappresento i colori? Lo vedremo dopo la pausa… 57
Array a più dimensioni 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…
Excursus Matematico – Le Matrici 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 j-esima I vettori si possono considerare matrici con una sola riga o una sola colonna (detti più precisamente vettore riga e vettore colonna)
Le Matrici: gli elementi 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.
Le Matrici: somma (A + B)i,j: = Ai,j + Bi,j 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
Somma di matrici c[i][j] = a[i][j] + b[i][j] #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 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; c[i][j] = a[i][j] + b[i][j] 1 2 3 3 7 10 1 11 2 5 8 9 24 1 2 + 2 1 5 7 9 6 4 1 2 = 5 8 10 12 17 4 9 11 28 1 2 16
Le Matrici: moltiplicazione per uno scalare È 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.
Le Matrici: moltiplicazione tra matrici 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
Le Matrici: moltiplicazione - esempio
Prodotto di matrici 1 2 3 4 #define N 3 #define M 4 #define L 5 ..... 1 2 3 4 1 2 3 2 1 4 3 7 9 6 5 11 8 3 7 10 1 11 2 5 8 9 24 c[1][2] =∑(a[1][k]*b[k][2]), con k = 0, ..., 3 1 1 * 2 2 3 1 2 3 4 #define N 3 #define M 4 #define L 5 ..... for (i=0; i<N; i++){ 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”); 18+ 22+6 1 2 20
Come rappresento un pixel? Il pixel è Il colore Come ottengo il verde? Con il formato RGB R: 91 G: 191 B: 33 PIXEL = {R, G, B}
Tipi di dati strutturati: pixel struct pixel{ char G; char R; char B; };
Tipi di dati strutturati struct miastruttura { char campo1; float campo2; int campo3[2]; }; ? miastruttura campo1 campo2 campo3
Definire un nuovo tipo 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().
Definire un nuovo tipo Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; Record ilMioRecord; 24.56 23 A ilMioRecord 45 ? ilMioRecord campo1 campo2 campo3 ilMioRecord.campo1 = 'A'; ilMioRecord.campo2 = 24.56; ilMioRecord.campo3[0] = 23; ilMioRecord.campo3[1] = 45;
Numeri complessi: problema 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.
Numeri complessi: completo
Numeri complessi: dati
Numeri complessi: Input
Numeri complessi: calcolo
Numeri complessi: Struct != Typedef
Numeri complessi: note "%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
Schedine: problema 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.
Schedine: dati
Schedine: inserimento dati
Schedine: copia valori
Schedine: stampa dei risultati
Problemi di fine giornata… Si scriva un programma che visualizzi gli istogrammi verticalmente: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 19 3 15 7 11 9 13 5 17 1 0 1 2 3 4 5 6 7 8 9
Fonti per lo studio + Credits Informatica arte e mestiere, S. Ceri, D. Mandrioli, L. Sbattella, McGrawHill Credits Vito Perrone, Daniele Braga