Programmare in C – Array

Guida C

In questa sezione, creeremo un piccolo programma in C che genera 10 numeri random e li ordina. Per fare ciò, useremo uno strumento chiamato array.

Un array (vettore) ci permette di dichiarare e lavorare con una collezione di valori dellos tesso tipo. Per esempio, si potrebbe creare una collezione di cinque interi. Un modo per ottenere una collezione di 5 interi è di utilizzare 5 variabili intere:

int a, b, c, d, e;

Questa modalità andrebbe bene, ma se dovessimo ottenere una collezione di 100 interi dovremmo usare 100 variabili. Un modo più semplice per ottenere una collezione di 5 interi è usare gli array e dichiarare pertanto:

int a[5];

I cinque interi separati all’interno di questo array vengono “raggiunti” attraverso un indice. Tutti gli array partono dall’indice zero, mentre l’ultima posizione è la posizione n-1, dove n è il numero di valori che l’array contiene. Quindi, int a[5] contiene 5 elementi. Ad esempio:

int a[5];

a[0] = 12;
a[1] = 9;
a[2] = 14;
a[3] = 5;
a[4] = 1;

La potenza degli array risiede nell’indice: attraverso l’indice si possono sviluppare iterazioni per manipolare gli array. Per esempio, il codice seguente inizializza tutti i valori dell’array a 0:

int a[5];
int i;

for (i=0; i<5; i++)
    a[i] = 0;

Il codice seguente inizializza il valore nell'array sequenzialmente e poi provvede a stamparli.

#include <stdio.h>

int main()
{
    int a[5];
    int i;

    for (i=0; i<5; i++)
        a[i] = i;
    for (i=0; i<5; i++)
        printf("a[%d] = %d\n", i, a[i]);
}

Gli array sono largamenti utilizzati in C. Per capirne il funzionamento, utilizzate un editor di testo per digitare questo codice.

#include <stdio.h>

#define MAX 10

int a[MAX];
int rand_seed=10;

/* from K&R
   - restituisce un numero  random number compreso fra 0 e 32767.*/
int rand()
{
    rand_seed = rand_seed * 1103515245 +12345;
    return (unsigned int)(rand_seed / 65536) % 32768;
}

int main()
{
    int i,t,x,y;

    /* si riempe l'array */
    for (i=0; i < MAX; i++)
    {
        a[i]=rand();
        printf("%d\n",a[i]);
    }

	/* aggiungi il codice qui*/    

    return 0;
}

Questo codice contiene diversi concetti nuovi. La linea #define dichiara una costante chiamata MAX e la imposta a 10. I nomi delle costanti sono tipicamente scritti in maiuscolo per renderle più leggibili e riconoscibili all'interno del codice. La linea int a[MAX] mostra come si dichiara un array di interi in C. Da notare che, vista la posizione in cui l'array viene dichiarato, questo non è globale.

La linea int rand_seed=10 dichiara una variabile globale chiamata rand_seed che viene inizializzata a 10 ogni volta che il programma inizia. Questo valore è il seme di partenza per la generazione del numero random che segue nel codice. In un generatore di numeri random reale, il seme dovrebbe consentire di inizializzare ad un valore casuale, come ad esempio il tempo di sistema. Qui la funzione rand produrrà lo stesso valore ogni volta che si esegue il programma.

La linea int rand() è la dichiarazione di una funzione. La funzione rand accetta 0 parametri in input e restituisce un valore intero. Impareremo molto ma molto di più sulle funzioni in C nelle lezioni successive. Le quattro linee che seguono implementano quindi la funzione rand. Per ora trascureremo di illustrare il loro significato.

La funzione main non presenta “stranezze”. Sono dichiarati 4 variabili intere locali e l'array è riempito con 10 valori random attraverso un ciclo di iterazione. Da notare che l'array a contiene 10 singoli interi. Ci si riferisce ad un intero specifico all'interno dell'array grazie all'utilizzo di parentesi quadre. Quindi a[0] si riferisce al primo intero dell'array, a[1] si riferisce al secondo e così via.
La linea che inizia con /* e che poi termina con */ è una linea di commento. Il compilatore ignora la linea, che non è funzionale al codice ma è utile come promemoria/annotazione per il programmatore.

Ora, aggiungere questa porzione di codice dove si trova il commento /* aggiungi il codice qui*/

/* ordinamento con metodo bubble sort */
for (x=0; x < MAX-1; x++)
    for (y=0; y < MAX-x-1; y++)
        if (a[y] > a[y+1])
        {
            t=a[y];
            a[y]=a[y+1];
            a[y+1]=t;
        }
/* stampa l'array ordinato */
printf("--------------------\n");
for (i=0; i < MAX; i++)
printf("%d\n",a[i]);

Questo codice ordina i valori random e li stampa in ordine. Ogni volta che lo si esegue, si otterranno sempre gli stessi valori. Se si vuole cambiare i valori da ordinare, si deve cambiare il valore di rand_seed ogni volta che si esegue il programma.

Il solo modo di capire a fondo che cosa fa questa porzione di codice è quello di eseguirlo “a mano”. Ossia, assumete che MAX valga 4 – per far sì che il tutto sia fattibile in tempi brevi – prendete poi un foglio di carta e fate finta di essere voi il computer. Disegnate l'array su carta e mettetevi all'interno 4 numeri a caso e fate in modo che i valori siano non ordinati. Eseguite ogni linea della porzione di codice che esegue l'ordinamento e guardate che cosa succede. Scoprirete che, ogni volta che viene eseguito il ciclo interno, il valore più grande dell'array viene letteralmente “spinto” verso il basso nell'array e i valori più piccoli verso l'alto.

Approfondimenti ed esercizi

    • nella prima parte di codice, provate a cambiare il ciclo for che riempe l'array in una sola linea di codice. Assicuratevi che il risultato sia lo stesso del codice originale
    • Prendete il codice dell'algoritmo bubble sort e create una sua funzione. L'intestazione della funzione sarà void bubble_sort(). Poi, trasformate le variabili usate dalla funzione bubble sort in funzioni esse stesse e rendetele locali. Poiché l'array è globale, non ci sarà bisogno di passare dei parametri alla funzione.
    • Inizializzate il seme per la generazione dei numeri random a valori diversi fra un'esecuzione all'altra.

Errori da evitare in C

    • Il C non effettua controlli su quando si raggiungere il termine dell'array. Pertanto, se non lo controllate voi il sistema andrà in crash oppure vi restituirà dati strani.
    • Una funzione deve avere le parentesi tonde aperte e chiuse anche se non vengono passati parametri. Per esempio, C accetterà x=rand ma la chiamata alla funzione non avverrà. L'indirizzo di memoria indirizzato dalla funzione rand sarà messo all'interno di x. Bisogna per evitare questo problema, scrivere x=rand().
STAMPA     Tags:,

3 Comments

  1. peppers 29 gennaio 2010
  2. Yoi.Yoru 7 maggio 2014
  3. Emanuele 30 gennaio 2012

Leave a Reply