prof. Nunzio Brugaletta Programmazione e linguaggio C

EnneBi - Programmazione
Avanti Indietro Inizio


3.3 Array a una dimensione

L'array ad una dimensione (conosciuto anche come vettore), è la prima struttura di dati trattata in Informatica. È quella più comunemente usata ed è quella che sta a fondamento di quasi tutte le altre.

Un vettore è un insieme di variabili dello stesso tipo cui è possibile accedere tramite un nome comune e referenziare uno specifico elemento tramite un indice. Si può pensare al vettore come ad un insieme di cassetti numerati: per poter accedere al contenuto di un cassetto deve essere specificato il numero ad esso associato (l’indice).

Nelle variabili semplici per accedere al valore contenuto in esse è necessario specificare il nome ed, inoltre, una variabile con un valore diverso avrà un nome diverso. Nel vettore esiste un nome che però stavolta identifica il vettore come struttura (il nome farà riferimento all’insieme dei cassetti dell’esempio precedente: questo concetto sarà chiarito meglio più avanti). I singoli elementi del vettore verranno referenziati specificando la loro posizione relativa all’interno della struttura (l’indice): l’elemento a cui ci si riferisce dipende dal valore assunto dall’indice.

Gli elementi del vettore vengono allocati in posizioni di memoria adiacenti e, per tale motivo, è necessario dichiarare un vettore prima del suo uso in modo che il compilatore possa riservare in memoria lo spazio necessario per conservarlo.

Il formato generale della dichiarazione di un array a una dimensione è:

tipo nome_variabile[dimensione];

dove tipo è il tipo base del vettore, ovvero il tipo di ogni elemento del vettore stesso; e il numero di elementi del vettore è definito da dimensione.

Il seguente esempio dichiara un vettore chiamato numero contenente un massimo di 10 elementi interi:

int numero[10];

Poiché il C assegna gli indici agli elementi di un array a partire da 0, gli elementi del vettore di interi appena dichiarato vanno da numero[0] a numero[9]. Quindi, per quanto osservato precedentemente: numero è il nome della struttura, identifica l’insieme degli elementi cioè 10 numeri interi, numero[0], numero[5] individuano il primo ed il sesto numero della struttura. Se si utilizza numero[i], l’elemento a cui ci si riferisce dipende dal valore assunto dalla variabile i che deve essere di tipo int.

Questo tipo di array vengono detti ad una dimensione perché per individuare un elemento all'interno della struttura, basta specificare un solo indice.

Il linguaggio C non esegue una verifica sui limiti dell'array, pertanto esiste la possibilità di superarli. Se ciò si verifica, per esempio in un assegnamento, si corre il rischio di alterare un'altra variabile o un pezzo di codice del programma. In altri termini si può utilizzare un array di dimensione n oltre i suoi limiti senza che vengano segnalati errori di compilazione o di esecuzione, ma con il risultato che probabilmente sarà il programma a mostrare dei malfunzionamenti.

Come caso di applicazione di un vettore numerico consideriamo il seguente esempio: le temperature rilevate nel corso della giornata in una determinata località sono conservate in un vettore, si richiede di scrivere un programma che, acquisita una determinata temperatura, determini se nella località considerata si è avuta nel corso della giornata tale temperatura e, in caso positivo, in quale rilevazione è registrata tale temperatura.

In termini informatici si tratta di effettuare una scansione sequenziale di un vettore per verificare se tale vettore contiene un determinato valore e, in caso positivo, se ne vuole conoscere la posizione.

Nelle righe più interessanti è presente un commento numerico per le osservazioni successive.

/* Ricerca un elemento in vettore e
   restituisce la posizione 
*/

#include <stdio.h>
main(){
  int temp[8],temprif;               	/*1*/
  int i,posiz;

  /* Acquisizione delle temperature rilevate */

  for (i=0;i<8;i++) {
    printf("\nRilevazione temperatura n° %d ",i);
    scanf("%d",&temp[i]);
  }
  printf("\nTemperatura da ricercare ");
  scanf("%d",&temprif);

  /* Scansione del vettore delle temperature */

  posiz = -1;                 	/*2*/
  for (i=0;i<8 && posiz==-1;i++) {    	/*3*/
    if (temprif==temp[i])
      posiz = i;              	/*4*/
  }

  /* Risultati della ricerca */

  if (posiz == -1)          	/*5*/
    printf("\nTemperatura non rilevata");
  else
    printf("\nTemperatura acquisita nella rilevazione %d",posiz);
}

Nella riga 1 si dichiara un vettore di 8 interi per conservare le rilevazioni delle temperature e una variabile per conservare la temperatura da cercare.

Nella riga 2 si inizializza una variabile che conterrà la posizione nella quale si troverà la temperatura cercata. Il valore –1 dipende dal fatto che le posizioni ammesse vanno dal valore 0 in su e, quindi, per indicare un valore che non corrisponda ad una posizione valida occorrerà utilizzare per esempio un numero negativo.

Nella riga 3 inizia il ciclo di scansione del vettore alla ricerca della temperatura di riferimento. Il controllo di fine ciclo si basa su due eventi che devono verificarsi contemporaneamente: elementi non finiti (i<8) e temperatura non trovata (posiz==-1). Se infatti la temperatura cercata viene ritrovata è inutile continuare ancora ad esaminare gli altri elementi del vettore. Più avanti si esaminerà un modo diverso di uscita anticipata da un ciclo a contatore.

Se la temperatura ricercata è presente nel vettore allora, nella riga 4, se ne conserva la posizione nella variabile posiz.

La riga 5 seleziona il caso temperatura non trovata (volere di posiz non modificato) dalla rilevazione ritrovata.

L’algoritmo sviluppato si basa sull’ipotesi che, se c’è, la temperatura ricercata si presenta una sola volta. Per togliere tale limitazione è necessario predisporre un vettore per contenere le posizioni delle varie ricorrenze. Le modifiche da apportare al programma saranno:



Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org