PREPARAZIONE DI UN PROGRAMMA

 

 

Iniziamo a preparare un codice in C dal quale vengano effettuate le seguenti operazioni:

 

(a)   la dichiarazione di tre variabili di tipo int e di una variabile di tipo double;

(b)   l’inizializzazione delle variabili;

(c)   il calcolo del prodotto di due variabili di tipo int;

(d)   il calcolo del rapporto tra due variabili di tipo int;

(e)   il calcolo del rapporto tra una variabile di tipo int ed una di tipo double;

(f)    la stampa dei risultati ottenuti.

 

 

Iniziamo a sviluppare il programma passo per passo:

 

Organizzazione del codice:

(1)    l’esercizio richiede di dichiarare alcune variabili, quindi il codice dovrà iniziare con istruzioni che permettano di effettuare tali operazioni

(2)    dopo la dichiarazione, l’esercizio richiede l’inizializzazione delle variabili; tale operazione può essere svolta in concomitanza con la dichiarazione o con istruzioni separate. Fatto questo si può procedere con il calcolo delle quantità richieste

(3)    l’esercizio richiede di visualizzare sul monitor i risultati ottenuti. Sarà quindi necessario far riferimento alla libreria standard per poter richiamare la funzione necessaria alla visualizzazione delle variabili, ovvero printf(). Tale funzione si trova inserita nel file di intestazione stdio.h.

 

 

 

Preparazione della struttura del codice:

 

/* inizialmente si richiamano i file necessari al funzionamento del programma, in questo caso il file di intestazione della libreria standard stdio.h  (NOTA: i simboli che precedono e seguono queste righe servono per inserire un commento nel codice)*/

 

#include <stdio.h>

 

main()

{

   … istruzioni …

}

 

 

 

Avendo stabilito quali sono le operazioni da svolgere ed avendo preparato la struttura del codice, possiamo iniziare a scrivere le istruzioni necessarie a svolgere le operazioni richieste.

 

 

 

Argomenti - ripasso

 

 

Espressioni, assegnazioni ed istruzioni

 

Le espressioni e le assegnazioni sono gli elementi costitutivi delle istruzioni del linguaggio. Le espressioni sono composte da variabili ed operatori; le assegnazioni si utilizzano per modificare il valore di una variabile, in particolare per assegnarle il valore di un’espressione. Quando un’espressione e/o un’istruzione sono seguite dal simbolo ‘;’ esse diventano istruzioni.

 

IMPORTANTE: espressioni ed assegnazioni POSSIEDONO UN VALORE (come le variabili)

 

int var1,var2,var3,var4;

(var1 + var2) ; // la porzione di codice tra parentesi è un’espressione

var3 = var1 + var 2; // assegno il valore dell’espressione alla variabile var3

var4 = (var3 = var1 + var2) ; // assegno a var3 il valore dell’espressione “var1 + var2”

/* visto che l’assegnazione ha un valore (ovvero il valore che viene assegnato a var3), posso assegnare tale valore a var4. Dopo aver eseguito questa istruzione var3 e var4 avranno lo stesso valore */

 

var4 + var3 = var1 + var2;  // questo invece NON ha senso !

 

 

 

Le conversioni esplicite ed implicite (cast)

 

(1)   Nell’effettuare operazioni tra variabili dello stesso tipo, il risultato viene automaticamente rappresentato secondo il tipo delle variabili.

(2)   Quando vengono effettuate operazioni che coinvolgono variabili di diverso tipo, il risultato viene automaticamente rappresentato secondo il tipo della variabile che occupa più memoria (per evitare di perdere cifre significative).

 

Tali operazioni vengono effettuate automaticamente dal programma, e si indicano pertanto con il termine di conversioni implicite (cast implicito). Per non seguire tali regole e poter rappresentare i valori delle variabili in modo arbitrario si ricorre alla conversione esplicita del VALORE della variabile, si effettua quindi un cast esplicito.

 

int num = 4;

double test = 0.;

test = 4.35 + (double) num;  // conversione esplicita del valore della variabile num

 

 

 

La funzione printf(“ stringa di formato “,variabile1,variabile2,… )

La stringa di formato contiene le informazioni che permettono al programma di stabilire come la stringa stessa e le variabili inserite dopo la stringa debbano essere visualizzate.

 

printf(“prova di stampa \n”);     // solo stringa di formato

 

Tale istruzione produce il seguente output:

prova di stampa

 

 

 

int num=1;

printf(“ stampo un numero: %d \n”,num);     // stringa di formato contenente uno

                                                            // specificatore di formato

 

Tale istruzione produce il seguente output:

stampo un numero: 1

 

 

Nota: Ad ogni specificatore di formato DEVE corrispondere una variabile. I caratteri contenuti nella stringa di formato vengono visualizzati direttamente sul monitor; gli specificatori di formato vengono sostituiti con il valore della variabile corrispondente.

 

 

 

 

 

---------------------------     Versione 1     ---------------------------

 

#include <stdio.h>

 

main()

{int var1,var2,var3,var4;

 

 double dec1;

 var1 = 5;

 var2 = 23;

 var3 = 0;

 dec1 = 3.1415;

 var3 = var1 * var2 ;

 

 

 printf(“Il prodotto vale : %d \n”,var3);

 printf(“%d \n”,var1 * var2);

 printf(“%d \n”,var3 = var1 * var2);

 

 var3 = 4 + (var4 = var1 + var2);

 

 var3 = var1 / var2 ;

 

 printf(“%d \n”,var3);

 printf(“%d \n”,var1 / var2);

 printf(“%f \n”, ((double) var1)/var2);

 printf(“%e \n”, ((double) var1)/var2);

 

 dec1 = ((double) var1)/var2;

 var3 = ((double) var1)/var2;

 dec1 = var2 / dec1 ;

 

 }

 

Inserimento del file di intestazione

 

Scrittura del codice

Dichiaro quattro variabili di tipo intero ed una di tipo double; utilizzo degli identificatori per richiamare tali variabili.

 

 

 

 

Calcolo il prodotto di due int ed assegno il valore del risultato (ovvero dell’espressione var1 * var2) alla variabile avente l’identificatore var3

Stampo il valore della variabile var3

Stampo il valore dell’espressione

Stampo il valore dell’assegnazione

 

Assegnazione del valore dell’assegnazione

 

Calcolo il rapporto tra i valori delle due variabili di tipo intero

Quale sarà il risultato ?

Ancora lo stesso risultato.

Ora no ! (grazie al cast esplicito)

Uso la notazione esponenziale

 

Ora memorizzo la rappresentazione decimale

Ora no

Grazie al cast implicito non perdo cifre significative

 

---------------------------     Fine versione 1     ---------------------------

 

 

L’output del programma è:

 

 

 

 

---------------------------     Versione 2     ---------------------------

 

 

#include <stdio.h>

 

main()

{int var1=5,var2=23,var3=0,var4=0;

 double dec1=3.1415;

 

 var3 = var1 * var2 ;

 printf(“il prodotto vale : %d \n”,var3);

 printf(“%d \n”,var1 * var2);

 printf(“%d \n”,var3 = var1 * var2);

 var3 = 4 + (var4 = var1 + var2);

 var3 = var1 / var2 ;

 printf(“%d \n”,var3);

 printf(“%d \n”,var1 / var2);

 printf(“%f \n”, ((double) var1)/var2);

 printf(“%e \n”, ((double) var1)/var2);

 dec1 = ((double) var1)/var2;

 var3 = ((double) var1)/var2;

 dec1 = var2 / dec1 ;

 }

 

Le dichiarazioni e le inizializzazioni delle variabili DELLO STESSO TIPO si possono riunire all’interno della medesima istruzione.

 

 

---------------------------     Fine versione 2     ---------------------------

 

 

Attenzione: il carattere ‘;’ indica il termine di un’istruzione, quindi in linea di principio anche il codice che segue è scritto in modo corretto:

 

#include <stdio.h>

main() {int var1=5,var2=23,var3=0; double dec1=3.1415; var3 = var1 * var2 ; printf(“il prodotto vale : %d \n”,var3); printf(“%d \n”,var1 * var2); printf(“%d \n”,var3 = var1 * var2); var3 = var1 / var2 ;  printf(“%d \n”,var3); printf(“%d \n”,var1 / var2); printf(“%f \n”, ((double) var1)/var2); printf(“%e \n”, ((double) var1)/var2); dec1 = ((double) var1)/var2; var3 = ((double) var1)/var2; dec1 = var2 / dec1 ; }

 

 

Tale codice, però, risulta illeggibile ...

 

 

 

 

 

La scelta degli identificatori:

 

Gli identificatori servono ad identificare una data variabile e devono essere scelti, se possibile, in modo da far capire quale sia la funzione della medesima variabile all’interno del codice (non è buona norma, quindi, chiamare le variabili a, b, c, ...

 

Un identificatore:

(1)   NON può iniziare con un numero  (var_1 è lecito, 1_var no !)

(2)   NON può contenere caratteri speciali (come #, &, ., *, !, ?, (, ), ...)

(3)   È buona norma (ma non è una pratica illegale) che non inizi con il carattere ‘_’ in quanto in questo modo potrebbe interferire con variabili utilizzate dalla libreria standard

 

 

 

Il programma appena scritto utilizza delle variabili di tipo int e di tipo double; esso necessita quindi di un certo quantitativo di memoria per poter conservare il valore di tali variabili. Lo spazio occupato aumenta man mano che le variabili vengono dichiarate ed ogni variabile occupa lo spazio che compete al tipo della variabile stessa. La dimensione che una variabile occupa in memoria si calcola mediante l’operatore sizeof().

 

 

Esempio: calcolo della quantità di memoria occupata da una variabile

 

#include <stdio.h>

 

main()

{int numero = 234;

  printf("\n lo spazio occupato in memoria dal tipo int e\’ pari a %d Byte \n",sizeof(int));

  printf("\n la variabile \’ numero\’ occupa uno spazio pari a %d Byte \n",sizeof(numero));

  printf("\n i due valori coincidono \n") ;

}

 

L’operatore sizeof() quindi si può applicare sia ai tipi che agli identificatori.

 

 

 

Tornando all’esercizio di prima, cerchiamo di stabilire quanta memoria venga utilizzata dal programma in fase di esecuzione e quando essa venga resa accessibile.

 

 

 

#include <stdio.h>

 

main()

{int var1=5,var2=23,var3=0,var4=0;

 

 

 

 

 double dec1=3.1415;

 

 

 

 var3 = var1 * var2 ;

 printf(“il prodotto vale : %d \n”,var3);

 printf(“%d \n”,var1 * var2);

 printf(“%d \n”,var3 = var1 * var2);

 var3 = var1 / var2 ;

 printf(“%d \n”,var3);

 printf(“%d \n”,var1 / var2);

 printf(“%f \n”, ((double) var1)/var2);

 printf(“%e \n”, ((double) var1)/var2);

 dec1 = ((double) var1)/var2;

 var3 = ((double) var1)/var2;

 dec1 = var2 / dec1 ;

 }

 

 

 

 

Il programma richiede memoria per 4 variabili di tipo int, quindi servono

4 * sizeof(int) Byte

 

Il programma richiede memoria per una variabile di tipo double, quindi servono

sizeof(double) Byte

 

 

 

 

 

 

 

4 * 4 Byte

 

 

 

 

8 Byte

 

 

 

____________

 

24 Byte in totale per le variabili