Gli array Moreno Marzolla

Slides:



Advertisements
Presentazioni simili
Array multidimensionali
Advertisements

Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 7 - Tabelle hash Alberto Montresor Università di Trento This work is licensed under the Creative.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Riconfigurare il diritto dautore. Lipertesto, una necessità di riconfigurazione. Secondo G. P. Landow, lavvento dellipertesto implica la necessità di.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
1 Simulazione Numerica dei Fenomeni di Trasporto Necessità di introduzione dei tensori  11  12  13  23  21  22 Vogliamo descrivere in un modo che.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Tipi e Valori Moreno Marzolla
Process synchronization
Process synchronization
Gestione della memoria
Algoritmi su Array Moreno Marzolla
Java World Matrici.
Funzioni Moreno Marzolla
Linguaggio C: strutture di controllo
Introduzione al linguaggio C
Linguaggio C: Espressioni
Process synchronization
Il linguaggio C Puntatori Moreno Marzolla
Il linguaggio C Strutture Moreno Marzolla
Logica binaria Moreno Marzolla
Array n-dimensionali e tipi di dati strutturati
Process synchronization
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Matrici come array di puntatori a righe
Lezione 9 – A.A. 2016/2017 Prof. Giovanni Acampora
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Secondo Programma in C.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Corso Java Matrici.
Programmazione e Laboratorio di Programmazione
Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Java Matrici.
Fondamenti di Informatica
La struttura dei primi programma in C
Lucidi della Pof.ssa Pazienza
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Array n-dimensionali e tipi di dati strutturati
Programmazione e Laboratorio di Programmazione
Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
monodimensionali: Vettori bidimensionali: Matrici
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Passaggio di parametri per indirizzo
Array e Stringhe Linguaggio C.
Programmazione e Laboratorio di Programmazione
Corso di Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Script su vettori Realizza uno script che chiede in input una dimensione d e crea un vettore di d numeri interi casuali. Poi calcola la somma dei due numeri.
Corso di Fondamenti di Informatica
Programmazione Procedurale
Programmazione Procedurale
Transcript della presentazione:

Gli array Moreno Marzolla Dipartimento di Informatica—Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/

Copyright © 2008, Stefano Mizzaro http://users.dimi.uniud.it/~stefano.mizzaro/dida/Prog0708/ Copyright © 2016, 2017, Moreno Marzolla http://www.moreno.marzolla.name/teaching/FINFA/ This work is licensed under the Creative Commons Attribution-Non Commercial 2.0 (CC BY-NC 2.0) License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/2.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. Array

Ringraziamenti prof. Stefano Mizzaro, Università di Udine http://users.dimi.uniud.it/~stefano.mizzaro/ Array

x è una variabile scalare di tipo double il cui valore è 12.34 Gli array x è una variabile scalare di tipo double il cui valore è 12.34 x Scalare Un “nome” a cui è associato un singolo valore di un determinato tipo Array Un “nome” a cui sono associati più valori dello stesso tipo Ogni valore ha una sua posizione all'interno dell'array Un array di N elementi ha posizioni etichettate come 0, 1, … N - 1 Il primo elemento dell'array si trova in posizione 0. 12.34 a 12.34 1 3.14 2 0.43 3 3E-12 4 0.98 a è un array di 6 elementi di tipo double, le cui posizioni sono etichettate come 0, 1, … 5 5 0.01 Array

Esempio temperature 20.5 Programma che deve memorizzare 10 valori di temperatura Uso 10 variabili double temperatura1, temperatura2, ..., temperatura10?? No, uso un array temperature di 10 elementi di tipo double Posso accedere ad ogni singolo valore tramite la posizione 1 20.0 2 19.8 3 19.4 4 20.4 5 21.6 6 22.0 7 21.9 8 21.0 9 21.1 Array

In C temperature /* es-array.c */ #include <stdio.h> int main( ) { double temperature[10]; temperature[0] = 20.5; temperature[1] = 20.0; temperature[2] = 19.8; temperature[3] = 19.4; temperature[4] = 20.4; /* … */ printf(“%f\n”, temperature[4]); temperature[5] = temperature[1]; temperature[6] = temperature[5]+1; temperature[7] = temperature[5+1]; return 0; } 20.5 1 20.0 2 19.8 3 19.4 4 20.4 5 21.6 6 22.0 7 21.9 8 21.0 9 21.1 Array

Vantaggio degli array Gestione uniforme Ad es., per azzerare tutte le temperature… temperature[0] = 0.0; temperature[1] = 0.0; temperature[2] = 0.0; ... temperature[9] = 0.0; Anziché fare questo... int i; for (i=0; i<10; i++) { temperature[i] = 0.0; } ...possiamo fare questo Array

Gestione uniforme Calcolare la media delle temperature Fatelo con le 10 variabili… … e poi fatelo per 100… NB: la dimensione dell'array compare più volte (il letterale 10...); vedremo più avanti come migliorare double temperature[10]; double somma = 0.0; int i; ... for (i = 0; i < 10; i++) { somma = somma + temperature[i]; } printf(“media=%f\n”, somma/10); Array

Dichiarazione A differenza di altri linguaggi (es., Java), la lunghezza di un array in C non è associata all'array Non c'è un modo generale per ricavare la lunghezza di un array sapendo il suo nome Per tale motivo può essere utile usare un simbolo per tenere traccia della dimensione dell'array Array

Esempio Avete scritto un programma per gestire un array di 10 elementi /* array-len.c */ #include <stdio.h> int main( ) { int v[10], i; for (i=0; i<10; i++) { v[i] = i*i; } /* … */ printf(“v[%d]=%d\n”, i, v[i]); return 0; Array

Esempio ...Poi, un bel giorno, qualcuno vi chiede di modificare il programma per funzionare con un array di 20 elementi /* array-len.c */ #include <stdio.h> int main( ) { int v[20], i; for (i=0; i<20; i++) { v[i] = i*i; } /* … */ for (i=0; i<10; i++) { printf(“v[%d]=%d\n”, i, v[i]); return 0; ...così dovete andare a caccia di tutti i punti nel codice in cui usate il vecchio valore, per sostituirlo con il nuovo (che succede se ve ne dimenticate qualcuna?) Array

Soluzione Memorizzo la lunghezza di un array in un simbolo /* array-len.c */ #include <stdio.h> #define N 10 int main( ) { int v[N], i; for (i=0; i<N; i++) { v[i] = i*i; } /* … */ printf("v[%d]=%d\n", i, v[i]); return 0; Memorizzo la lunghezza di un array in un simbolo N non è né una costante né una variabile Il compilatore vero e proprio non vede N: il simbolo viene sostituito prima della compilazione con la sua definizione Array

Fasi di compilazione GCC Preprocessore Compilatore Linker #define N 10 int main( void ) { int a = N - 1; int v[N]; return 0; } GCC Preprocessore int main( void ) { int a = 10 - 1; int v[10]; return 0; } Compilatore Linker Array

Inizializzazione È possibile assegnare valori iniziali a un array /* OK: calcola la lunghezza automaticamente */ int giorniMese[] = {31,28,31,30,31,30,31,31,30,31,30,31}; /* OK: lunghezza data esplicitamente */ int giorniMese[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /* OK: pero' giorniMese[2], … giorniMese[11] sono inizializzati a 0 */ int giorniMese[12] = {31,28}; /* OK: pero' il contenuto iniziale dell'array e' indefinito */ int giorniMese[12]; Array

Uso Per accedere all'elemento si usano le [] e l'indice (posizione) dell'elemento L'indice deve essere una espressione di tipo int Ricordare che l’indice del primo elemento è 0 (zero) /* Cosa fa questo frammento di codice? */ int a[] = {3, 1, 7, 2, 2}; int i; for (i=1; i<5; i++) { a[i] = a[i-1] + a[i]; } Array

Gli esseri umani contano partendo da uno I computer contano partendo da zero Array

Esempi Dato un array a[N] di int: Azzerare a (ossia, assegnare zero a tutti gli elementi di a) Assegnare 0, 1, 2, … agli elementi di a Incrementare di 1 ogni elemento dell’array a for (i = 0; i < N; i++) { a[i] = 0; } for (i = 0; i < N; i++) { a[i] = i; } for (i = 0; i < N; i++) { a[i] = a[i] + 1; } Array

Esempi Assegnare 1 agli elementi di a di indice dispari e 2 a quelli di indice pari ...oppure... for (i = 0; i < N; i++) [ if (i % 2 != 0) { a[i] = 1; } else { a[i] = 2; } for (i = 0; i < N; i++) { a[i] = ( (i % 2 != 0) ? 1 : 2 ); } Array

Array bidimensionali (matrici) Doppie parentesi quadre double t[13][32] Il primo è il numero di righe, il secondo il numero di colonne Doppio indice t[12][2] Il primo è indice di riga, il secondo di colonna 1 2 ... 31 Secondo indice (indice di colonna) 1 Primo indice (indice di riga) t[12][2] 2 ... 12 Array

Lavorare su matrici Data una matrice m[10][30] di int, assegnare 1 a tutti gli elementi int m[10][30]; int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 30; j++) { m[i][j] = 1; } Array

Array multidimensionali Array di array di array di … Si usa una coppia di [] per ogni dimensione Es.: double a[10][100][1000]; a[0][0][0] … a[9][99][999] Utilità Temperature di tutte le ore double t[13][32][24]; ... t[12][25][0] ... Array

Esempi con matrici Azzerare la riga k-esima di una matrice m[R][C] k #define R 20 #define C 30 int main( void ) { int m[R][C]; int j; for (j = 0; j < C; j++) { m[k][j] = 0; } return 0; k Array

Esempi con matrici Azzerare la colonna k-esima di una matrice m[R][C] #define R 20 #define C 30 int main( void ) { int m[R][C]; int i; for (i = 0; i < R; i++) { m[i][k] = 0; } return 0; k Array

Esempi con matrici (3/3) Porre a 1 gli elementi della diagonale principale di una matrice m[N][N], e 0 tutti gli altri #define N 30 int main( void ) { int m[N][N]; int i, j; for (i=0; i<N; i++) { for (j=0; j<N; j++) { if (i==j) { m[i][j] = 1; } else { m[i][j] = 0; } return 0; Array

Esempi con matrici (3/3) Porre a 1 gli elementi della diagonale principale di una matrice m[N][N], e 0 tutti gli altri /* soluzione alternativa, usando l'operatore ternario ? (forse meno chiara, ma comunque corretta) */ #define N 30 int main( void ) { int m[N][N]; int i, j; for (i=0; i<N; i++) { for (j=0; j<N; j++) { m[i][j] = (i==j ? 1 : 0); } return 0; Array

Funzioni e parametri di tipo array In ANSI C si è soliti passare i parametri di tipo array senza specificarne la dimensione Se si modifica il contenuto di un array passato come parametro ad una funzione, viene modificato anche il parametro attuale! Vedremo il motivo nelle successive lezioni In C non è consentito che una funzione restituisca un risultato di tipo array Soluzione: si passa alla funzione un ulteriore parametro di tipo array, che viene “riempito” con il risultato Array

Esempio /* iniz-stampa-array.c: inizializza e stampa il contenuto di un array */ #include <stdio.h> #define N 10 void inizializza(int a[], int n) { int i; for (i=0; i<n; i++) { a[i] = i; } void stampa(int a[], int n) printf("%d ", a[i]); printf("\n"); int main( void ) int v[N]; inizializza(v, N); stampa(v, N); return 0; Risultato: > gcc iniz-stampa-array.c -o iniz-stampa-array > ./iniz-stampa-array 0 1 2 3 4 5 6 7 8 9 Array

E i parametri di tipo matrice? Passare parametri di tipo matrice è un po' più complicato Nell'intestazione della funzione occorre tassativamente indicare il numero di colonne del parametro di tipo matrice Il numero di righe può restare non specificato nella dichiarazione del parametro, e va passato mediante una variabile Array

Cosa stampa questo programma? /* parametro-matrice.c: dimostrazione dell'uso di una matrice come parametro di una funzione */ #include <stdio.h> #define R 3 #define C 4 void inizializza(int m[][C], int r) { int i, j, k = 0; for (i = 0; i < r; i++) { for (j = 0; j < C; j++) { m[i][j] = k++; } void stampa(int m[][C], int r) { int i, j; printf("%d ", m[i][j]); printf("\n"); int main( ) { int matrice[R][C]; inizializza(matrice, R); stampa(matrice, R); return 0; Notare anche l’inizializzazione Cosa stampa questo programma? Array

Quindi, riassumendo I parametri di tipo predefinito (int, float, double, char) vengono passati per valore Le modifiche non si riflettono sul parametro attuale I parametri di tipo array e matrice sono passati “per riferimento” Modifiche su parametro formale si riflettono sul parametro attuale Array