I componenti di un programma C

I vari componenti del programma:

Abbiamo descritto i passaggi richiesti per la stesura di un programma in C nel precedente articolo.

Ora consideriamo il programma del listato  seguente:

1:  /*  Questo programma serve a calcolare un prodotto di due numeri. */ (commento)
2:  # include <stdio.h>
3:
4:  int x, y, z ;
5:
6: int prodotto (int a, int b);    /* funzione e suoi argomenti, definita sotto in altro blocco */
7:
8: main ()
9:  {
10:  /* input del primo numero*/
11:     printf ( “Immettere un numero compreso tra 1 e 100: “);
12:     scanf (“%d”, &x);
13:
14:    /* input del secondo numero*/
15:      printf ( “Inserire un altro numero compreso tra 1 e 100: “);
16:      scanf (“%d”, &y);
17:
18:   /* Fa il calcolo e visualizza il prodotto */
19:   z = prodotto ( x, y);
20:   printf ( “%d per  %d= %d \n”, x, y, z );
21:
22:   return 0;
23:  }
24:
25:
26:    int prodotto (int a, int b)       /*funzione che restituisce il prodotto dei suoi argomenti */
27:      {
28:   return (x*y);
29:       }

Programma:La funzione main() ( righe dalla 8 alla 23)

L’unico componente veramente indispensabile di qualsiasi programma C è la funzione main(). Nella sua forma più semplice è costituita dalla parola main seguita da due parentesi tonde e una coppia di parentesi graffe { } vuote in cui vanno inserite le istruzioni che costituiscono il corpo centrale del programma..

( { , si fa con SHIFT ALT GR  {  ).

L’esecuzione vera e propria del programma comincia con la prima istruzione del main() e finisce con l’ultima.

La direttiva #include (riga 2)

Per capire la direttiva bisogna fare un accenno al preprocessore , che fa parte del corredo di ogni compilatore C. E’ il primo elemento del compilatore che elabora un programma sottoposto a compilazione. Il preprocessore altera il codice sorgente secondo le direttive di preprocessore, contenute nello stesso sorgente . Il risultato è un codice sorgente modificato e serve alla successiva fase di compilazione, ma è un file che non si vede perche viene eliminato.

La direttiva #include ordina al compilatore C di inserire il contenuto di un file di inclusione nel programma in fase di compilazione. Un file di inclusione è un file che contiene le informazioni richieste dal programma o dal compilatore, sono chiamati anche file di intestazione ed hanno l’estensione .h (ad esempio stdio.h ). La direttiva nell’esempio significa “Aggiungi al programma il contenuto del file stdio.h” che serve per far funzionare l’input output. In tal caso il preprocessore cerca il file in una directory particolare che sarà detta standard. La maggior parte dei programmi contiene uno o più file di inclusione.

La definizione delle variabili (riga 4)

Una variabile è un nome simbolico che si assegna a una locazione di memoria utilizzata per la memorizzazione dei dati. I programmi usano le variabili per diversi tipi di dati impiegati nell’esecuzione. In C le variabili devono essere definite prima di essere utilizzate. La definizione di una variabile indica al compilatore il nome della variabile (definita dall’utente ) e il tipo di dati che conterrà. Ad esempio l’istruzione alla riga 4 : int x,y,z ; definisce tre variabili di nome x y z e che conterranno numeri interi.

I Prototipi delle funzioni (riga 6)

I prototipi delle funzioni forniscono al compilatore il nome e gli argomenti richiesti dalle funzioni che rappresentano, essi devono comparire prima dell’utilizzo effettivo della funzione a cui si riferiscono. Il prototipo è un’entità diversa dalla definizione della funzione, la quale contiene i comandi che ne determinano il comportamento.

PROGRAMMA-Le istruzioni (righe da 11, a, 28)

In un programma C il vero lavoro viene fatto dalle istruzioni. Queste si occupano di leggere l’input da tastiera, visualizzare le informazioni sullo schermo, eseguire operazioni matematiche, richiamare funzioni, leggere file su disco, eseguire tutte le operazioni necessarie al funzionamento dei programmi. Esse vengono scritte riga per riga e sono sempre seguite da un punto e virgola. Vediamo un pò le istruzioni del programma precedente.

printf()

L’istruzione printf() (righe 11,15,20) è una funzione di libreria che visualizza istruzioni sullo schermo. Può mostrare semplici messaggi testuali (righe 11 o 15) o messaggi al cui interno siano presenti una o più variabili (riga 20).

scanf()

Lìistruzione scanf() (righe 12 e 16) è un’altra funzione di libreria che legge dati da tastiera e li attribuisce a una o più variabili. Alla riga 19 richiama una funzione di nome prodotto() , cioè forza l’esecuzione dei comandi contenuti nella funzione prodotto() passando le variabili x e y come argomenti. Al termine dell’esecuzione di prodotto() la funzione restituisce un valore al programma chiamante, posto nella variabile z.

return

L’istruzione return della riga 28 fa parte della funzione prodotto(), calcola il prodotto delle variabili x e x e restituisce il risultato all’istruzione chiamante. L’istruzione return della riga 22 restituisce il valore 0 al sistema operativo appena prima della conclusione del programma.

Definizione della funzione (righe da 26 a 29)

La funzione è una parte del codice indipendente, scritta per eseguire un compito specifico. Si deve dare un nome ad ogni funzione. Il codice contenuto all’interno della funzione viene eseguito specificando il nome della funzione come se fosse una istruzione del linguaggio, questo si denomina, chiamata della funzione. Nel nostro caso specifico la funzione prodotto è una funzione definita dall’utente. quindi scritta dal programmatore. In tal caso la funzione è molto semplice, restituisce il risultato del prodotto al programma che l’ha chiamata, ma in genere è molto complessa , un vero e proprio programma a parte per realizzare un compito particolare o complicato. le funzioni di libreria svolgono i compiti più comuni, ma quelle più articolate sono create dal programmatore.

I commenti (Righe 1, 6, 10, 14, 18, 26)

Quando vediamo nel listato i segni  /*  */  questo è un commento.  I commenti vengono ignorati dal compilatore e non hanno effetto sulla funzionalità del programma . Naturalmente si può inserire qualsiasi cosa all’interno dei commenti. Il commento può occupare una riga intera, oppure estendersi su diverse righe e non è consentito usare commenti annidati, del tipo:

/*

/* commento annidato */

*/

In ogni caso è consigliabile evitarlo. I commenti possono sembrare una inutile perdita di tempo, e in fase di scrittura esso appare chiaro, ma quando si deve fare il debugging e i programmi sono complessi e lunghi e sopratutto quando ci rimettiamo mano dopo che è passato del tempo, i commenti diventano molto utili.

Parentesi graffe (righe 9, 23 3 27, 29)

Le parentesi graffe si usano per racchiudere quansiasi funzione C, compresa la main() . E un gruppo racchiuso tra esse si chiama blocco.