Home
Accesso / Registrazione
 di 

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().

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Anonimo

Scusate... ma pensate che ci

Scusate... ma pensate che ci sia almeno "una" persona che segue questo stillicidio di post introduttivi al linguaggio C?? con meno di 10 euro in libreria si comprano dei micro-manuali ampiamente più esaustivi di questi articoletti!!

ritratto di Giovambattista Fazioli

Stillicidio?

Prima di tutto questo è ancora un mondo libero e se qualcuno ha voglia di scrivere su qualcosa è liberissimo di farlo! Poi se vuoi spendere 10 euro sei libero di farlo tuttavia prova scrivere e chiedere chiarimenti al libro ... Poi vediamo se ti risponde... Inoltre chi ti dice che il testo spieghi meglio di questi articoletti?
In fine... Non sprecare tempo ed energia per dei commenti così inutili...

ritratto di peppers

A me è piaciuto molto...

..e per fortuna che sul web c'è ancora gente che si impegna senza nulla pretendere
dal prossimo...

Pier

ritratto di primo commento sul web

primo commento sul web... a

primo commento sul web... a distanza di anni dalla pubblicazione, questo post è quanto di più utile ho trovato per le mie esigenze. Grazie ;)

ritratto di Emanuele

Guida programmazione C

Bene,
se vuoi approfondire altri argomenti della programmazione in C puoi seguire la relativa tag
http://it.emcelettronica.com/tag/guida-c

ritratto di Yoi.Yoru

Non riesco a trovare quello che cercavo :(

Sono al liceo e studio programmazione da due anni, prima in Pascal e ora in C. Siccome sto trovando qualche difficoltà ho provato a cercare sul web ma ogni codice che trovo è scritto in modo diverso dall'altro, con elementi nuovi che io non ho mai usato. Ora sto appunto studiando l'ordinamento per selezione e il bubble sort, ma non riesco a capire bene neanche da questo articolo. Sono davvero confusa :(

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 6 utenti e 63 visitatori collegati.