04: Assegnamento di valori alle variabili, inizializzazione, scanf, operazioni aritmetiche

Bentornati nella rubrica dedicata al C!
Abbiamo visto come dichiarare le variabili, ed è arrivato il momento di capire come usarle nei nostri programmi.
Per cominciare chiariamo la differenza tra dichiarazione, inizializzazione e assegnamento.
Per il momento andremo a dichiarare tutte le nostre variabili come variabili globali, inserendo quindi la parte di dichiarazione prima della funzione main.
Al momento della dichiarazione il sistema operativo alloca uno spazio di memoria dedicato a ciascuna variabile, tuttavia non conosciamo il contenuto di quell’area di memoria a priori ! È necessario infatti inizializzare le nostre variabili ad un valore arbitrario (ma noto !) che ci consente di conoscere il loro valore nel momento in cui andremo ad usarle nei nostri calcoli.
Si prenda il seguente codice come esempio:

#include<stdio.h>

int a , c;
int b=5;
char lettera='d';

int main(){

 a= a + 2;
 printf("a = %d\n", a);
 printf("Inserisci il valore iniziale di c: \n");
 scanf("%d", &c);

 printf("inserisci il valore iniziale di lettera:\n");
 scanf(" %c", &lettera);
 /*Attenzione! quando volete prendere un carattere dalla tastiera è 
 meglio lasciare uno spazio tra " e %NomeVariabile di tipo char*/

 b=b+4;
 c=c-16;
 a=2*c;

 lettera=lettera+1;

 printf("questa riga stampa i valori finali di a, b, c e lettera:\n a=%d , b=%d , c=%d, lettera=%c \n", a, b, c, lettera);


 return 0;
}

Nella parte di dichiarazione delle variabili globali abbiamo dichiarato 3 interi e un carattere; l’intero b e il carattere lettera sono anche inizializzati , ovvero è stato assegnato loro un valore di partenza (b=5 e lettera=‘a’), mentre gli interi a e c non sono inizializzati.
Analizziamo ora la funzione main: la prima istruzione a=a+2 è un assegnamento: assegno alla variabile a il valore che aveva in precedenza incrementato di 2. Le istruzioni di assegnamento sono indicate dall’operatore =, in particolare a sinistra del simbolo = deve esserci il nome di una variabile, mentre a destra un’espressione matematica, in questo caso una somma (di una costante a una variabile).
Altre istruzioni di assegnamento inserite nella funzione main sono b=b+4; c=c-16, a=2*c; e lettera=lettera+1; . Le espressioni matematiche che possiamo usare in un programma C sono tantissime:

  • la somma è indicata col simbolo +
  • la differenza col simbolo
  • il prodotto col simbolo *
  • il rapporto col simbolo /
  • il resto della divisione intera tra due numeri con il simbolo %
  • a++ e’ equivalente a scrivere a=a+1.
  • a– e’ equivalente a scrivere a=a-1.

Altre operazioni più complesse possono essere applicate derivandole da quelle semplici, per esempio il calcolo della potenza ennesima di un numero può essere fatto moltiplicando il numero per se stesso n volte.
Si noti che le operazioni di somma e differenza possono essere applicate anche a variabili di tipo carattere, in quanto sussiste una corrispondenza biunivoca tra i caratteri ASCII e i numeri naturali: se proviamo per esempio a sommare 3 al carattere a otterremo il carattere d! .
Si noti anche che il risultato di una divisione tra interi non è per forza un intero! Ciò implica che se provassimo ad assegnare ad una variabile di tipo intero il risultato di una divisione (per esempio 3/4=0.75) il risultato prima di essere memorizzato verrà privato di tutte le cifre dopo la virgola, che non sono supportate dai numeri interi per definizione (in questo caso 3/4 farebbe 0!).
Per evitare problemi di questo genere possiamo usare il tipo float nel caso in cui ci servisse lavorare con numeri con la virgola.

Il prossimo passo è raffinare la funzione printf, che abbiamo detto serve a stampare una stringa sullo schermo.

E se volessimo stampare a video il valore delle nostre variabili? Ecco, è semplice: si usa il carattere speciale %, all’interno della stringa racchiusa dalle doppie virgolette, seguito dal NomeVariabile che dobbiamo stampare (per esempio %d indica che stiamo stampando il valore di una variabile intera, %c per i caratteri, %f per i float, ecc.); a video i caratteri %_ non verranno visualizzati, e al loro posto comparirà il valore della variabile che vogliamo stampare: dobbiamo però inserire anche il nome delle variabili da stampare nell’istruzione printf, precisamente dopo aver chiuso le doppie virgolette che contengono la stringa da visualizzare , dopo aver messo una virgola e prima di chiudere la parentesi tonda che delimita gli argomenti di printf.

printf(“ a = %d ”, a);

Se dobbiamo stampare più di una variabile in una sola istruzione printf possiamo farlo mettendo un simbolo %_ per ognuna di esse nella stringa esattamente nel posto in cui vogliamo che compaia il valore della rispettiva variabile ed elencando il nome di tutte le variabili separate da una virgola, nell’ordine in cui vogliamo che compaiano nella sezione apposita descritta sopra. Un esempio di printf che stampa il valore di più variabili è la penultima istruzione del main:

printf(“questa riga stampa i valori di a, b, c e lettera: a=%d , b=%d , c=%d,  lettera=%c \n”, a, b, c, lettera);

Dobbiamo occuparci ancora di un paio di cose prima di chiudere con questo articolo. Per prima cosa introduciamo la funzione scanf(), che serve ad inserire dei dati da tastiera per il programma: il programma ha bisogno di dati su cui lavorare, e nella maggior parte dei casi sarà l’utente a dover inserire questi dati, su cui il calcolatore andrà a compiere le sue operazioni. Per esempio supponiamo che vogliamo chiedere all’utente 2 valori da associare alle variabili c e lettera; questa operazione è fatta dalle istruzioni:

printf(“inserisci il valore di c\n”);
scanf(“%d”, &c);


printf(“inserisci il valore di lettera”);
scanf(“ %c”, &lettera);

(Attenzione! quando volete prendere un carattere dalla tastiera è 
 meglio lasciare uno spazio tra " e %NomeVariabile di tipo char)


La prima printf stampa sullo schermo la frase “inserisci il valore di c”. A questo punto il processore incontra la funzione scanf(), e si metterà in attesa dell’inserimento di un valore (in questo caso un intero) da tastiera. Una volta che abbiamo scritto il nostro numero e abbiamo premuto invio, il valore che abbiamo inserito sarà letto e assegnato  alla variabile c.  Stessa cosa vale per il carattere lettera, che avevamo inizializzato con il valore ‘a’ e che quindi verrà sovrascritto con il nuovo valore inserito dall’utente.
La scanf(); contiene all’interno delle parentesi tonde una stringa racchiusa dalle doppie virgolette che consta soltanto del carattere speciale % seguito da una lettera che indica il tipo di variabile che si sta leggendo (analogo alla funzione printf). Dopo di che incontriamo una virgola che serve a separare gli argomenti della funzione scanf, e dopo la virgola va messo il nome della variabile sulla quale vogliamo salvare il valore letto, preceduto dal simbolo &. Torneremo su questo importante quanto problematico simbolo quando parleremo di puntatori,  in sostanza dovete sapere che serve ad indicare l’indirizzo della parola di memoria associata alla variabile di cui vogliamo modificare il valore. Al processore serve l’indirizzo per capire su quale cella di memoria è situato lo spazio dedicato alla variabile che stiamo modificando.


Abbiamo analizzato a questo punto tutto ciò che c’è di nuovo nel programma iniziale.
Domanda: cosa stampa il programma?
In particolare, la prima printf stampa il valore di a dopo che a è stato incrementato di 2. Il problema è che non sappiamo quale sia il valore di a perché non l’abbiamo inizializzato! La dichiarazione alloca uno spazio in memoria per la variabile a, ma questo spazio di memoria potrebbe contenere qualsiasi valore al momento della dichiarazione: il valore di a non è determinato, sia prima che dopo l’istruzione a=a+2. Se provate ad eseguire il codice 10 volte potenzialmente ogni volta potreste ottenere un valore diverso per a! .
Dopo aver stampato il valore di a (qualunque esso sia) il programma chiede all’utente il valore di c e di lettera, incrementa di 4 il valore di b (b è stato inizializzato a 5, quindi ora vale 5+4=9), decrementa di 16 il valore di c (inserito dall’utente), incrementa di 1 il valore di lettera (in pratica assegna a lettera il carattere successivo rispetto a quello inserito dall’utente, secondo l’alfabeto), e assegna ad a (il cui valore non era determinato finora) il doppio del valore di c (dopo che è stato decremento di 16).
L’ultima printf infine si occupa di scrivere a video il valore finale di tutte le variabili in gioco.

Screenshot 2015-11-05 19.01.27

Nonostante finora abbiamo visto soltanto istruzioni estremamente semplici, è chiaro già da ora che le potenzialità del C e dei linguaggi di programmazione in generale sono davvero consistenti.
Ricordatevi sempre che le istruzioni del main sono eseguite nell’ordine in cui sono scritte nella funzione main; con questo in mente potrete avventurarvi nella lettura dei nostri prossimi articoli, con i quali andremo nel vivo della programmazione introducendo costrutti come if, switch e cicli che servono a modificare il flusso delle istruzioni in base al verificarsi di certe condizioni logiche.

Please follow and like us: