La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.

Presentazioni simili


Presentazione sul tema: "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013."— Transcript della presentazione:

1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013

2 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Gli array, questi sconosciuti Gli array in C Array n-dimensionali Array particolari: le stringhe 2

3 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 3 Gruppi di celle consecutive Rappresentano gruppi di variabili con lo stesso nome e lo stesso tipo Per riferirsi a un elemento, si specificano: Il nome dellarray La posizione dellelemento (indice) Sintassi: [ ] Il primo elemento ha indice 0 Ln° elemento dellarray v è v[n-1] v[6] dichiarazione v[0] v[1] v[2] v[3] v[11] v[10] v[9] v[8] v[7] v[5] v[4] posizione elemento int v[12]; nome array Gli array

4 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 4 Array vettori di elementi indicizzati, omogenei, memorizzati in celle di memoria consecutive Dichiarazione di un array: char parola[12]; È un array di 12 elementi di tipo char, vale a dire un vettore di 12 caratteri La lunghezza dell array è comunque decisa durante la compilazione del programma Nella dichiarazione, non si usano variabili per specificare la dimensione degli array Gli array

5 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 5 Gli elementi di un array sono normali variabili: vett[0] 3; printf("%d", vett[0]); > 3 scanf("%d", &vett[1]); > 17vett[1] assume valore 17 Si possono usare espressioni come indici: se x 3 vett[5 2] è equivalente a vett[3] ed è equivalente a vett[x] Gli array

6 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 6 int v[100]; alloca memoria per 100 elementi interi, a partire da un certo indirizzo di memoria la dimensione deve essere nota al compilatore deve essere una espressione costante Per accedere all' i-esimo elemento di v calcola l'indice i i può essere un'espressione allindirizzo della prima cella di v somma il numero di celle pari allo spazio occupato da i elementi Come opera il calcolatore?

7 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La gara di nuoto: con salvataggio Problema Si hanno10 giudici 1 giudice = 1 voto Si vogliono memorizzare i 10 voti, per poterli rileggere Ogni voto è nellitervallo 0-10 Dato un tuffo, calcolare La media dei voti Il voto massimo ed il voto minimo 7

8 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come salvare i voti... 8

9 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Un primo incontro con gli array Array: collezione di dati omogenei Dichiare il tipo dei suoi dati Dichiarare la sua dimensione Come si accede ai dati di un array? Come a normali variabili Esempio di scrittura Esempio di lettura 9

10 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 10 Sintassi compatta: int n[5] {1, 2, 3, 4, 5}; Inizializzazione parziale: gli elementi più a destra sono posti a 0 int n[5] {13}; tutti gli altri elementi sono posti a 0 Specificare troppi elementi tra le graffe è un errore di sintassi Se la lunghezza dellarray è omessa, gli inizializzatori la determinano: int n[] {5, 47, 2, 0, 24}; è equivalente a: int n[5] {5, 47, 2, 0, 24}; In tal caso la dimensione è inferita automaticamente, e si avranno 5 elementi nellarray Inizializzazione di un array

11 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 11 Si opera sui singoli elementi, uno per volta Non è possibile operare sullintero array, agendo su tutti gli elementi simultaneamente / come ricopiare array1 in array2 / int array1[10], array2[10]; int i;... array2 array1;/ ERRATO /... for( i 0; i 10; i ) array2[i] array1[i];/ CORRETTO / Operazioni sugli array

12 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 12 Dichiarazione del vettore: int dati[10]; Inizializzazione del vettore (omogenea): for( i = 0; i < 10; i++ ) dati[i] = 0; Inizializzazione "da terminale": for( i = 0; i < 10; i++ ) { printf(Inserire un intero: "); scanf("%d", &dati[i]); } Esempi sugli array - 1

13 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 13 Ricerca del massimo: max = dati[0]; for( i = 0; i < 10; i++ ) if( dati[i] > max ) max = dati[i]; Calcolo della media: media = dati[0]; for( i = 0; i < 10; i++ ) media = media + dati[i]; media = media / 10; Esempi sugli array - 2

14 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 14 Calcolo di massimo, minimo e media di un vettore Esempi sugli array - 3

15 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 15 Problema: sequenza di interi Mostrare una sequenza di 10 interi nell'ordine inverso rispetto a quello con cui è stata introdotta dallutente (stdin) Con un array? Senza array?

16 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sequenza: possibile soluzione 16

17 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 17 In testa al programma: #defineLUNG_SEQ 100 Così possiamo adattare la lunghezza del vettore alle eventuali mutate esigenze senza riscrivere la costante 100 in molti i punti del programma Il preprocessore sostituisce nel codice LUNG_SEQ con 100 prima della compilazione La lunghezza dellarray, quindi, anche in questo caso è decisa al momento della compilazione del programma Nella dichiarazione degli array non si usano mai variabili per specificarne la dimensione "Generalizziamo" con la direttiva #define

18 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sequenza con define 18

19 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 19 /* Output Strutturato: Stampa di un istogramma */ #include #define SIZE 10 int main () { int n[SIZE] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 }; int i, j; printf("%s%13s%17s\n\n","Element","Value","Histogram"); for( i = 0 ; i < SIZE ; i++ ) { printf("%7d%13d ", i, n[i]); for( j = 1 ; j <= n[i] ; j++ ) /* una riga di '*' */ printf("*"); printf("\n"); } return 0; } Problema: stampa istogramma

20 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Element Value Histogram 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 * Output del programma

21 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE /* Frammento di programma che verifica la presenza di un elemento in un vettore. Se è presente, stampa l'indice della prima occorrenza; se non è presente, stampa -1 */ int dato; int risultato = -1; int array[size]; for ( n=0; n <= size-1; n++ ) if ( array[n] == dato ) { risultato = n; break; } printf("risultato = %d\n", risultato); Ricerca sequenziale... Biblioteca... Ricerca di un elemento in un array (con uso del costrutto break) Se ne scriva una versione (più elegante…) che non usi il break, ma una condizione di uscita dal ciclo più raffinata

22 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE int dato, risultato = -1; int array[size]; int low=0, high=size-1, mid; while ( low <= high ) { mid = (low+high)/2; if ( dato == array[mid] ) { risultato = mid; break; } else if ( dato < array[mid] ) high = mid – 1; else low = mid + 1; } Termina? Perché? È corretto? Ricerca binaria su array (con break)

23 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 23 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 elementi interi (600 variabili distinte) float F[20][20][30]; F è una matrice 3D di variabili di tipo float (12.000!) Oppure a quattro dimensioni, ecc… Array a più dimensioni

24 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 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 a ij 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) Se la matrice si chiama A, l'elemento a i,j può essere indicato anche come A[i,j]. La notazione A = (a i,j ) indica che A è una matrice e che i suoi elementi sono denotati con a i,j Gli elementi con i due indici di riga e di colonna uguali, cioè gli elementi della forma a ii costituiscono la diagonale principale della matrice. 24

25 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Excursus Matematico – Le Matrici Somma 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 : = A i,j + B i,j Per esempio 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 : = cA i,j. Esempio:

26 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Excursus Matematico – Le 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 Lelemento di posizione (i,j) è dato dalla somma

27 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Excursus Matematico – Le Matrici

28 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Somma di matrici = c[i][j] = a[i][j] + b[i][j] #i nclude #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

29 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Prodotto di matrici #define N 3 #define M 4 #define L for (i=0; i

30 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 30 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ò larray stringa ha 5 elementi (non 4): Dichiarazione equivalente: char stringa[] {'w', 'o', 'r', 'd', '\0'}; drow \0 Le stringhe

31 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: inserisci nome 31

32 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 32 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

33 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 33 char str1[32]; / str1 ha spazio per 32 char. / char str2[64]; / str2 ha spazio per 64 char. / / inizializza str1 con la stringa "alfa" / strcpy(str1, "alfa"); / str1 contiene "alfa" / / copia str1 in str2 / strcpy(str2, str1); / str2 contiene "alfa" / / lunghezza di str1 / x = strlen(str1); / x assume valore 4 / / scrivi str1 su standard output / printf("%s", str1); / scrive str1 su stdout / / leggi str1 da standard input / scanf("%s", str1); / str1 riceve da stdin / Operazioni su stringhe

34 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 34 char str1[32]; char str2[64]; scanf("%s", str1); > ciao / ora str1 contiene "ciao" / strcpy(str2, str1);/ str2 riceve "ciao" / val = strlen(str2); / val = 4 / printf("%s\n", str2); > ciao/ stampa "ciao" / Attenzione: strlen("") vale 0 ! Operazioni su stringhe

35 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 35

36 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 36 Il nome dellarray rappresenta lindirizzo del suo primo elemento, perciò quando ci si vuole riferire allintero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere blank (lo spazio), o linvio Perciò se nel buffer si trova una stringa troppo lunga, essa è memorizzata oltre la fine dell array !!! Ed è un errore grave !!! Particolarità delle stringhe

37 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: non esiste strcpy! 37

38 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 38 E se non ci fosse la funzione strcpy() ? Assegneremmo sempre un carattere alla volta! char s1[N], s2[M]; /* assegnamento di s2, omesso */ int i = 0; while( i <= strlen(s2) && i < N ) { s1[i] = s2[i]; ++i; } N.B. funziona correttamente se s2 è una stringa ben formata (cioè terminata da '\0') e se s1 è sufficientemente grande da contenere i caratteri di s2 (N >= strlen(s2)) strcpy(s1, s2)

39 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 39 Una funzione apposita: strcmp(s1,s2) restituisce un intero confronta le due stringhe fino al \0 char str1[32], str2[64]; int diverse; /*... acquisizione di valori per le stringhe... (codice omesso)*/ diverse = strcmp(str1, str2); if( diverse == 0 ) printf("UGUALI\n"); else if( diverse < 0 ) printf("%s PRECEDE %s\n", str1, str2); else printf("%s SEGUE %s\n", str1, str2); Confrontare due stringhe

40 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 40 Problemi di fine giornata… Si scriva un programma che visualizzi gli istogrammi verticalmente: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

41 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio Informatica arte e mestiere, S. Ceri, D. Mandrioli, L. Sbattella, McGrawHill Capitolo 5 Credits Daniele Braga -


Scaricare ppt "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013."

Presentazioni simili


Annunci Google