Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Documenti analoghi
Linguaggio C: Array Valeria Cardellini

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Introduzione al C. Unità 7 Array. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Linguaggio C: Espressioni

C: panoramica. Violetta Lonati

Programmazione strutturata IV e Gli array. Dove siamo. Un esercizio. Oggi. Schema 1. Prima idea. 7. Programmazione strutturata 4 & Array

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

7. Programmazione strutturata 4 & Array. ! No lezione il marzo. ! Lab.? ! Esempio. ! Introduzione agli array

Il linguaggio C Puntatori

Concetti chiave. Gli Array o Vettori. Array Elementi dell array Indici e lunghezza dell array Inizializzazione di vettori Array multidimensionali

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

I tipi strutturati e i record in C++

Array. Aggragati di variabili omogenee...

Linguaggio C: Espressioni

Linguaggio C: Espressioni

Gli array. slides credit M. Poneti

Il linguaggio C Puntatori

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Il linguaggio C Strutture

Matrici. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Gli array. impone al programma, in fase di esecuzione, di riservare dello spazio in memoria per 10 variabili di tipo int

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Introduzione al C. Lez. 2. Funzioni e Puntatori

Tipi derivati. Strutture Matrici typedef enum

Laboratorio di Informatica I

Matrici (array bidimensionali)

Fondamenti di Informatica 12. Linguaggio C -4

Lezione 6: Array e puntatori

array: vettori, matrici e stringhe

Il linguaggio C Strutture

Linguaggio C: strutture di controllo

Dati due punti sul piano calcolare la loro distanza

Gli Array. Dichiarazione di un array

Struttura dei programmi e Variabili

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

I puntatori /2. Ad esempio. // inizio codice. #include <stdio.h> void mostra(int); int main() {int a = 10; mostra(a); return 0;}

Introduzione al C. Lez. 2 Funzioni e Puntatori

Introduzione al linguaggio C Funzioni

Array. Unità 7. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Dichiarazioni e tipi predefiniti nel linguaggio C

PROGRAMMAZIONE AVANZATA JAVA E C

Programmazione I - Laboratorio

Fondamenti di Informatica Ing. Biomedica

Puntatori e array. Violetta Lonati

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Introduzione al linguaggio C Puntatori

Elementi di Informatica A. A. 2016/2017

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

Funzioni. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Informatica (A-K) 14. Linguaggio C -4

Array multidimensionali e stringhe

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Array. Anno Accademico 2010/2011 Francesco Tortorella

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

I Vettori (Array) Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Laboratorio di informatica Ingegneria meccanica

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Costruiamo un'immagine o qualcosa di simile.

Corso di Informatica A.A

Corso di Fondamenti di Informatica

Capitolo 11. Puntatori

Introduzione al linguaggio C

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2007/2008

Puntatori : idea di base

Matrici. Unità 7. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

Puntatori : idea di base

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Università degli Studi di Ferrara

Esercizio 1: media di numeri reali (uso funzioni e struct)

I Dati Strutturati ed il Linguaggio C

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

Laboratorio di Matematica e Informatica 1

Il linguaggio C. Puntatori e dintorni

Passaggio dei parametri

Fondamenti di Informatica

Esercizio 1: calcolo insieme intersezione

Linguaggio C: strutture di controllo

Corso di Programmazione I

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Introduzione al C Lez. 4

Esercitazione di Reti degli elaboratori

Le strutture /2. Iniziamo ora a progettare il codice per la gestione del database. Quali sono le funzionalità da implementare?

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Array e puntatori in C

Array in C. Emilio Di Giacomo

Università degli Studi di Ferrara

Transcript:

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

Array 2

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

Scalare Gli array 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. x è una variabile scalare di tipo double il cui valore è 12.34 x 12.34 a 12.34 3.14 0.43 3E-12 0.98 a è un array di 6 elementi di tipo double, le cui posizioni Array sono etichettate 5 0.01 4 come 0, 1, 5 0 1 2 3 4

Esempio 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 temperature 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 5

#include <stdio.h> In C int main( void ) { 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; temperature 20.5 20.0 19.8 19.4 20.4 21.6 Array 6 0 1 2 3 4 5 6 7 8 9 22.0 21.9 21.0 21.1

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 7

Gestione uniforme Calcolare la media delle temperature 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); 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 Array 8

Variable-length arrays C99 consente di dichiarare array la cui dimensione è contenuta in una variabile La variabile deve essere dichiarata (quindi visibile) prima della dichiarazione dell'array Una volta creato l'array, la sua dimensione rimane fissa /* OK sia in C99 che in ANSI C: a e' un array di 20 int, b e' un array di 10 int; il contenuto iniziale degli array e' indefinito */ int a[20], b[10]; /* OK in C99 (non ammesso in ANSI C): c e' un array di 20 elementi; il suo contenuto iniziale e' indefinito */ int N = 20; int c[n]; /* OK in C99 (non ammesso in ANSI C): d e' un array di 30 elementi; il suo contenuto iniziale e' indefinito */ const int K = 30; int d[k]; Array 9

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 In certi casi si può usare l'idioma seguente: int giorni[] = {31,28,31,30,31,30,31,31,30,31,30,31; const int ngiorni = sizeof(giorni)/sizeof(giorni[0]); /* OK: ngiorni vale 12 */ Come soluzione migliore, può essere utile usare un simbolo per tenere traccia della dimensione dell'array Array 10

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

Esempio...Poi, un bel giorno, qualcuno vi chiede di modificare il programma per funzionare con un array di 20 elementi #include <stdio.h> int main( void ) { 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 12

Soluzione Memorizzo la lunghezza di un array in un simbolo N 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 Questa soluzione funziona sia con ANSI C che con C99 #include <stdio.h> #define N 10 int main( void ) { int v[n], i; for (i=0; i<n; i++) { v[i] = i*i; /* */ for (i=0; i<n; i++) { printf("v[%d]=%d\n", i, v[i]); return 0; Array 13

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

Inizializzazione /* OK: pero' il contenuto iniziale dell'array e' indefinito */ int giornimese[12]; /* 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; /* NON OK: warning: excess elements in array initializer */ int prova[3] = {10, 30, 20, 20; /* NON OK: errore: i variable-length arrays non possono essere inzializzati */ const int n = 3; int prova[n] = {10, 20, 30;.. Array 15

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 16

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

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

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

Attenzione... Attenzione alle soluzioni troppo "astute" for (i = 0; i < N; i = i+2) { a[i] = 2; a[i+1] = 1; SBAGLIATO for (i = 0; i < N-1; i = i+2) { a[i] = 2; a[i+1] = 1; SBAGLIATO for (i = 0; i < N; i = i+2) { a[i] = 2; if ( i+1<n ) { a[i+1] = 1; CORRETTO ma contorto... Array 20

Esercizi [Facile] Dato un array di interi di lunghezza N 2, determinare i due valori più piccoli Dato un array di interi di lunghezza N 1, determinare se esiste un valore che compare esattamente 3 volte. Dato un array di interi di lunghezza N 1, determinare se l'array è ordinato in senso crescente oppure no Array 21

Array bidimensionali (matrici) Dichiarazione usando 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 Primo indice (indice di riga) 0 1 2... 12 0 1 2... 31 Secondo indice (indice di colonna) t[12][2] Array 22

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 23

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 24

Array multidimensionali È possibile inizializzare gli array multidimensionali durante la dichiarazione int x[4]={11,12; /* OK, {11,12,0,0 */ int y[4]; /* OK, {?,?,?,? */ int z[] = {3, 5; /* OK, lunghezza 2 */ int m[3][2]={{11,12,{21,22,{31,32; /* OK */ int n[3][2]; /* OK, {{?,?,{?,?,{?,? */ int p[][] = {{1,2, {4,5; /* ERRORE */ int q[][2] = {{1,2, {4,5; /* OK */ Array 25

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

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

Esempi con matrici (3/3) Porre a 1 gli elementi della diagonale 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 28

Esempi con matrici (3/3) Porre a 1 gli elementi della diagonale 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 29

Esercizio Realizzare programmi per porre a 1 gli elementi evidenziati in giallo di matrici m[n][n], 0 tutti gli altri Array 30

Funzioni e parametri di tipo array In C si possono passare parametri di tipo array alle funzioni senza specificarne la dimensione Se si modifica il contenuto di un parametro di tipo array 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 31

Passaggio di parametri di tipo array void f1( int a[5] ); /* OK, dimensione prefissata */ void f2( int a[] ); /* OK, ma devo sapere per altre vie la dimensione di a */ void f3( int a[], int n ); #define C 40 void f4( int v[][c], int r ); void f5( int v[4][3] ); /* OK, dimensioni prefissate */ void f6( int n, int a[n] ); /* OK C99, non ammesso in ANSI C */ Array 32

/* iniz-stampa-array.c: inizializza e stampa il contenuto di un array */ #include <stdio.h> #define N 10 Esempio void inizializza(int a[], int n) { int i; for (i=0; i<n; i++) { a[i] = i; void stampa(int a[], int n) { int i; for (i=0; i<n; i++) { printf("%d ", a[i]); printf("\n"); int main( void ) { int v[n]; inizializza(v, N); stampa(v, N); return 0; Array 33

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 Il numero di righe può restare non specificato Se la funzione deve conoscere il numero di righe, è necessario passare tale informazione mediante un ulteriore parametro intero, o in qualche altro modo Array 34

/* 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; for (i = 0; i < r; i++) { for (j = 0; j < C; j++) { printf("%d ", m[i][j]); printf("\n"); int main( void ) { int matrice[r][c]; inizializza(matrice, R); stampa(matrice, R); return 0; Array 35

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 36