Gli Array. Dichiarazione di un array

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

Elementi di Informatica A. A. 2016/2017

Strutture dati e loro organizzazione. Gabriella Trucco

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

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

Array multidimensionali e stringhe

Introduzione a Matlab

Array e puntatori in C

Corso di Fondamenti di Informatica

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

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

Puntatori. Fondamenti di Programmazione

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Ripasso R1. Dati strutturati. Esempi. Array. Dichiarazione di un array. Dichiarazione di un array in C

I puntatori. Il C ci permette di conoscere tale indirizzo, ovvero di determinare dove la variabile sia stata effettivamente memorizzata.

Associazione Variabile-Indirizzo

4 GLI ARRAY E LE STRINGHE

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

Cicli annidati ed Array multidimensionali

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Array k-dimensionali

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

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

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

Programmazione Procedurale in Linguaggio C++

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Capitolo 10 - Strutture

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

C: panoramica. Violetta Lonati

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Procedurale in Linguaggio C++

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

Funzioni di libreria. Richiedono tutte. #include <math.h> fabs(x) sqrt(x) pow(x,a) exp(x) log(x)

Dati aggregati. Violetta Lonati

Alla variabile pi verrà assegnato come valore l'indirizzo di una variabile di tipo int:

Aritmetica dei puntatori

Esercitazione 11. Liste semplici

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Concetto di Funzione e Procedura METODI in Java

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Vettori e Matrici (array)

Introduzione ai puntatori

Le basi del linguaggio Java

Problema. Vettori e matrici. Vettori. Vettori

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

Multidimensionali. Array Multidimensionali. Tipi di array. Matrice: array bidimensionale. Array multidimensionale. Dichiarazione di una matrice

Informatica! Appunti dal laboratorio 1!

Elementi di C++ di base

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

L'Allocazione Dinamica della Memoria nel linguaggio C

INTRODUZIONE ALLA PROGRAMMAZIONE

Strategie di programmazione

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Quadrato Magico. Fondamenti di Programmazione

Il C nel C++: Funzioni

Introduzione al C++ (continua)

Vettori e Matrici (array)

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Informatica 1. Prova di recupero 21 Settembre 2001

Linguaggio C: PUNTATORI

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Costruiamo un programma per crittografare del testo

Esercizi. La funzione swapint() primo tentativo

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Cicli annidati e matrici di variabili

Costanti e Variabili

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Introduzione al C. Tipi derivati

Il linguaggio C funzioni e puntatori

Modulo 2: Strutture fondamentali della programmazione Java

Lezione 6 programmazione in Java

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

Esercizio 1. Tavola ordinata in memoria centrale

8 Introduzione MATLAB

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Caratteri e stringhe

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Fondamenti di C++ Input/Output di base

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Fondamenti di Informatica 1 Ing.Gestionale (A.A ) - docente Sandro Moriggi RECUPERO. cognome nome

Introduzione ai puntatori in C Definizione

L Allocazione Dinamica della Memoria

Introduzione al linguaggio C Puntatori

Programmazione in Java (I modulo)

Esercizi Programmazione I

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Esercitazione 4. Comandi iterativi for, while, do-while

Matricola Nome Cognome Aula Fila (dalla cattedra) Posto (dalla porta)

Esercizi C su array e matrici

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

Fortran per Ingegneri

LE STRUTTURE DATI PARTE 2: RECORD. Prof. G. Ciaschetti

Laboratorio di Algoritmi e Strutture Dati

Transcript:

Gli Array Un array rappresenta una variabile indicizzata (ovvero contenente un indice) che viene utilizzata per contenere più elementi dello stesso tipo. Ogni array ha un nome al quale viene associato un indice che individua i singoli elementi dell'aray. In C++ è possibile creare array di qualunque tipo: caratteri, interi, float, double, puntatori e anche array (ovvero array di array, detti array multidimensionali). Le proprietà fondamentali di un array Possiamo dire che un array ha quattro proprietà fondamentali: Gli oggetti che compongono l'array sono denominati elementi; Tutti gli elementi di un array devono essere dello stesso tipo; Tutti gli elementi di un array vengono memorizzati uno di seguito all'altro nella memoria del calcolatore; Il nome dell'array è un valore costante che rappresenta l'indirizzo di memoria del primo elemento dell'array stesso. L array ad una dimensione viene comunemente chiamato vattore e viene rappresentato nel modo seguente: VET Per individuare un elemento del vettore si indicherà il nome della struttura e la posizione in cui si trova l elemento. Ad esempio, per indicare il contenuto dell elemento della posizione 4 si scriverà VET[4]. Dichiarazione di un array Per dichiarare un array, come per ogni altra dichiarazione in C++, si deve scrivere il tipo, seguito da un nome valido e da una coppia di parentesi quadre che racchiudono un'espressione costante. Tale espressione costante definisce le dimensioni dell'array. Ad esempio: int array_uno[10]; // Un array di 10 interi char array_due[20]; // Un array di 20 caratteri string array_tre[20];// Una array di 20 stringhe Si noti che all'interno delle parentesi quadre non è possibile, in fase di dichiarazione dell'array, utilizzare nomi di variabili. E' possibile, per specificare le dimensioni di un array, usare delle costanti definite, come ad esempio: #define MAX_1 10 //viene creata una costante alla quale viene assegnato il valore 10 #define MAX_2 20 //viene creata una costante alla quale viene assegnato il valore 20 int array_uno[max_1];// è l equivalente di int array_uno[10]; char array_due[max_2]; 1

L'utilizzo di costanti per definire le dimensioni di un array è una pratica altamente consigliata. Infatti, uno degli errori che spesso accadono nella manipolazione degli elementi di un array è quello di far riferimento ad elementi che vanno oltre il limite della dimensione dell'array precedentemente definita. Il C++ (e lo stesso C), come magari si sarebbe portati a pensare, non effettua nessun controllo sugli indici che si utilizzano quando si eseguono operazioni sugli array. Per cui, ad esempio, se eseguiamo il seguente codice: int array_tre[10];...... // L'array viene inizializzato for(i=1; i < 14; i++) cout << array_tre[i] << endl; il risultato sarà corretto fino a quando la variabile i sarà minore o uguale a 9 (infatti la dimensione dell'array è stata definita essere uguale a 10). Quello che avverrà, quando il programma cercherà di andare a leggere i valori array_tre[11], array_tre[12] e array_tre[13] è assolutamente casuale. Infatti, il programma andrà a leggere delle aree di memoria che non sono state inizializzate o, addirittura, che contengono dei valori relativi ad altre variabili, stampando quindi sullo schermo risultati inaspettati. Se si fosse usata una costante per definire la dimensione dell'array questo errore sarebbe stato facilmente evitato. Infatti: #define MAX_3 10 int array_tre[max_3];...... // L'array viene inizializzato for (i=0; i < MAX_3; i++) cout << array_tre[i] << endl; Come si può notare facilmente in questo modo il programmatore non deve preoccuparsi di ricordarsi la dimensione dell'array array_tre poichè la costante ARRAY_trE_MAX viene utilizzata proprio per tale scopo, evitando i cosiddetti errori di "array out of bounds". Inizializzazione di un array Un array può essere inizializzato in due modi: Esplicitamente, al momento della creazione, fornendo le costanti di inizializzazione dei dati. Durante l'esecuzione del programma, assegnando o copiando dati nell'array. Vediamo un esempio di inizializzazione esplicita al momento della creazione: 2

int array_quattro[3] = 12, 0, 4; char vocali[5] = 'a','e','i','o','u'; float decimali[2] = 1.329, 3.34; Per inizializzare un array durante l'esecuzione del programma occorre accedere, generalmente con un ciclo, ad ogni elemento dell'array stesso ed assegnargli un valore. L'accesso ad un elemento di un array avviene indicando il nome dell'array e, tra parentesi quadre, l'indice corrispondente all'elemento voluto. Così, VET[3] indicherà il terzo elemento dell'array VET. Vediamo ora un esempio di inizializzazione eseguita durante l'esecuzione del programma: int numeri_pari[10]; for(i =1; i < 10; i++) numeri_pari[i] = i * 2 ; Il programma precedente non fa altro che assegnare all'array i numeri pari da 2 ad 18. Esempio: Inserire N numeri positivi in un vettore: K=1; do cout<< Inserisci il <<K<< ^ elemento ; cin>>num; vet[k=num; K=K+1; while (K<=N); Il programma non è corretto. Infatti nella iterazione viene richiesto l inserimento di un valore numerico e lo si inserisce comunque nel vettore. La versione corretta potrebbe essere la seguente: K=0; do cout<< Inserisci il <<K<< ^ elemento ; cin>>num; if (NUM>0) K=K+1; Vet[K] = NUM; while(k<=n); 3

Vettori e sottoprogrammi L utilizzo di un vettore in un sottoprogramma pone un vincolo: non possono essere passati per valore. Infatti C++ per ottimizzare l uso della RAM non consente il passaggio di parametri per valore se si tratta di strutture dati. Sarebbe quindi errato scrivere: void CARICA(int &vetx[], int N); si deve invece scrivere: void CARICA(int vetx[], int N) In questo caso la varibile N viene passata per valore, l array per riferimento. Array bidimensionali (Matrici) Un array bidimensionale, detta anche matrice, ha le stesse caratteristiche di un array ad una dimensione. L unica differenza è che occorrono due indici per identificare un elemento della struttura, il primo indice si chiama indice di riga, il secondo indice di colonna. Si può pensare ad una tabella a due entrate (tipo battaglia navale) dove per individuare un punto nella griglia si devono fornire la riga e la colonna all incrocio delle quali si viene a trovare. Avendo compreso l utilizzo dei vettori, una matrice può essere vista come un vettore di vettori, in cui ogni elemento è un vettore di un certo numero di elementi. Esempio: 3 vettori di 10 elementi ciascuno: VET1 VET2 VET3 Se fossero separati, per ogni vettore dovremmo specificare il nome, mantenendo invariata la dimensione (10 elementi). Risulterebbe complicato specificare quale vettore considerare per poter individuare l elemento interessato. Inoltre il programma che utilizzasse questa modalità di lavoro non risponderebbe ai requisiti di propri di una applicazione; infatti la soluzione proposta non deve essere utilizzabile solo per risolvere il problema ma una classe di problemi. La soluzione è quella di unire i vettori in un unica struttura (appunto la matrice), in cui con un indice indichiamo il vettore da dove prelevare il dato, con un altro invece indichiamo la posizione all interno del vettore dove si trova l elemento interessato. In questo modo all avvio dell applicazione, sarà sufficiente indicare quanti vettori (numero di righe) e quanti elementi in ciascun vettore (numero di colonne). Il programma creerà in memoria la struttura ad hoc per quella sessione di lavoro. 4

Nel nostro caso: 1 2 12 3 MAT La sua dichiarazione potrebbe essere: int MAT[3][10]; //matrice con 3 righe e 10 colonne : ogni elemento è un numero intero char MATX[3][10] ; // matrice con 3 righe e 10 colonne : ogni elemento è un carattere. Ad esempio l istruzione MAT[2][4] = 12 assegna all elemento che si trova nella seconda riga e quarta colonna il valore 12. Matrici e sottoprogrammi Per poter inviare come parametro una matrice ad un sottoprogramma, è necessario definire un tipo di dato ad hoc in modo che possa essere considerato come una variabile anche se particolare. Per fare questo si utilizza il comando TYPEDEF. Esempio: definire una matrice 10x10 di numeri interi. typedef int MATRICE[10][10]: MATRICE numeri; in questo modo è come se si fosse definita la matrice: int numeri[10][10]; E necessario farlo perché nella chiamata alla procedura INSERISCI si passa come parametri la matrice e le dimensioni logiche M (righe) ed N(colonne): INSERISCI(numeri, M,N) Il sottoprogramma invece dovrà essere definito nel modo seguente: void INSERISCI(MATRICE numx, int MX, int NX) Ovviamente vale anche per le matrici il vincolo di non poter passare la struttura per valore. Viene infatti sempre passata per riferimento. 5