1
Linguaggio C (parte seconda)
Variabili
Tut t e le var iabili, prima di esser e ut ilizzat e, devono essere dichiarat e, cio deve esser e
det t o al compilat or e il t ipo della variabile ed il suo nome ( es. int x) , quest o per permet t ergli
di allocare la memoria necessaria alla var iabile st essa.
Successivament e la var iabile deve esser e inizializzat a, cio le deve essere assegnat o un
valor e, operazione che pu anche essere fat t a cont emporaneament e alla dichiarazione. Es:
/* solo dichiarazione */
int x;
/* inizializzazione */
x = 10;
/* dichiarazione ed inizializzazione allo stesso tempo */
int y = 15;
I n C esist ono vari t ipi di var iabili, quest o per venir e incont r o sia all' esigenze di
rappr esent abilit di gr ossi numer i sia al maggior risparmio di memoria possibile, ut ilizzando di
volt a in volt a il t ipo pi adeguat o ad una specifica sit uazione. Nella t abella seguent e sono
most rat i i var i t ipi.
Tipi di
dichiarazione
Rappresentazione N. di byt e
char
Carat t ere 1 ( 8 bit )
int Numer o int ero 2 ( 16 bit )
short
Numer o int ero
"cort o"
2 ( 16 bit )
long
Numer o int ero
"lungo"
4 ( 32 bit )
float Numer o reale 4 ( 32 bit )
double
Numer o reale
"lungo"
8 ( 64 bit )
Il tipo char
I l t ipo char adibit o a cont enere uno ed un solo carat t ere; esso pu cont ener e un qualsiasi
carat t ere def init o secondo lo st andard ASCI I e quindi pot r cont enere qualsiasi let t era
( maiuscola o minuscola) , cif ra ( da 0 a 9) e simbolo previst o dalla codifica. Per dichiarar e ed
inizializzar e una var iabile char, ad esempio inizializzandola con la let t era ' r ' , bast a scrivere:
char a = r;
Corso IFTS Emanuele Lattanzi
2
Il tipo int
I l t ipo int , invece, quello che permet t e di cont enere dei numer i int eri. I l t ipo int ha le
sue due var iant i che sono short e long, anche se in r ealt un t ipo int gi di per s un t ipo
short, ment r e il long permet t e di est endere ( ut ilizzando due byt e in pi) il range dei valor i
che il t ipo int pu assumer e, quest o per venire incont r o all' esigenza di lavorare con grandi
numer i. I l t ipo int cont iene numer i, appunt o, int eri, quelli che in mat emat ica vengono
chiamat i numer i nat urali, e cio senza la virgola e part i frazionat e. Qui di seguit o present iamo
un pezzo di codice in cui vengono dichiarat e ed inizializzat e var iabili di t ipo int.
int z;
int x = 7;
int y = 3;
I tipi float e double
I t ipi float e double rappresent ano i numer i reali e quindi possono esser e usat i per
cont ener e t ut t i quei numer i che hanno part i fr azionar ie. La diff erenza t ra i due st a solament e
nei bit che sono r iservat i per la lor o rappresent azione, che si va a riflet t er e, non solo nel range
di rappr esent azione, ma anche nel numero di cifre dopo la virgola che possono esser e
rappr esent at e, in quest o caso r isult a, quindi, pi accurat a la rappresent azione ut ilizzando i
double. Qui di seguit o present iamo la dichiarazione e inizializzazione di var iabili di t ipo float e
double.
double z;
float x = 7.0;
double y = 2.0;
Da not ar e che la not azione usat a per rappr esent ar e la virgola quella inglese, cio quella
in cui si usa un punt o ( e non una virgola) per divider e la part e int er a da quelle frazionar ia.
Gli Operatori
Gli operat ori in pr ogrammazione permet t ono di est rapolare un det erminat o valore dal frut t o
dell' operazione che si compie su una o pi var iabili all' int erno del programma; cos come
l' operat or e "+ " ser ve per sommare due numer i in mat emat ica, analogament e ser ve per
compier e la st essa operazione in un pr ogramma scrit t o in C.
Ovviament e ci sono delle dovut e differenze, innanzit ut t o le operazioni del C sono quelle
basilar i ( per funzioni pi avanzat e dobbiamo usare delle librer ie apposit e) , hanno un r isult at o
"finit o", cont rar iament e a quelle mat emat iche che possono aver e un r isult at o simbolico o
infinit o.
Gli operat ori che andremo ad analizzar e si suddividono in:
Operatori aritmetici: comprendono somma, sot t razione, molt iplicazione, divisione int era
e divisione con modulo.
Loperatore di assegnamento: ut ilizzat o nellinizializzazione delle var iabili = .
Operatori di confronto: operat or i che permet t ono di ver if icar e det er minat e condizioni,
come ad esempio l' uguaglianza o la disuguaglianza.
Operatori logici: da ut ilizzare con le ist ruzioni condizionali ed it erat ive.
Corso IFTS Emanuele Lattanzi
3
Operatori aritmetici
Nella t abella seguent e vengono riport at i gli oper at or i ar it met ici.
Operazioni Simbolo
Addizione +
Sot t razione -
Molt iplicazione *
Divisione /
Divisione con modulo
( solo numer i int er i)
%
increment o unit ar io + +
decrement o unit ar io - -
Esist ono poi degli operat ori ai quali bisogna por re part icolar e at t enzione, quest i sono
loperat or e di increment o ( + + ) e quello di decrement o ( - - ) .
Come det t o quest i oper at ori incr ement ano o decrement ano il valor e di una variabile, quindi
le due ist r uzioni seguent i port ano allo st esso r isult at o:
x++; /* equivale a scrivere x = x + 1; */
x = x +1;
Quest i operat or i possono esser e prepost i ( + + x; ) o pospost i ( x+ + ; ) alla var iabile. Se sono
prepost i il valore calcolat o pr ima che l' espr essione sia valut at a, alt riment i viene calcolat o
dopo; l' increment o ed il decrement o avvengono sempre nel valor e di una unit sul valore della
var iabile. Un po' di codice servir a far capire meglio come funzionano t ali operat or i:
int x = 2; /* dichiarazione ed inizializzazione */
printf("%d \n", x++); /* in questo caso verr stampato il valore 2
in quanto ++ postposto a x e quindi la
variabile viene prima stampata e poi
incrementata */
printf("%d \n", ++x); /* in questo caso verr stampato il valore 3
in quanto ++ preposto a x e quindi la
variabile viene prima incrementata
stampata e poi stampata */
Esist e, inolt r e, una forma cont r at t a per lut ilizzo degli operat or i ar it met ici del t ipo:
espressione1 = espressione1 <operatore> espressione2
/* questa risulta equivalente alla sottostante */
espressione1 <operatore> = espressione2
Quindi, un esempio prat ico r isult erebbe:
x = x + 3; /* entrambe le espressioni incrementano
x += 3; la variabile x di tre unit */
y = y * 5; /* entrambe le espressioni moltiplicano
y *= 5; la variabile y per 5 */
Gli operat or i hanno diverse pr opr iet che per met t ono a noi di scriverli cor r et t ament e, e al
compilat ore di capire come ut ilizzar li. Esse sono:
Posizione: un qualsiasi operat ore ha una det erminat a posizione r ispet t o ad i suoi
operandi. Si dice che un operat ore prefisso se compare pr ima degli oper andi,
postfisso se compare dopo e infisso se compar e t ra gli operandi;
Ariet: quest a rappr esent a il numero di argoment i che un operat or e pu accet t are. Ad
esempio l' operat or e + + ha ar iet uguale a uno ( A+ + ) , il simbolo + ha ariet uguale a
due ( A + B) .
Precedenza (o priorit): la precedenza un valor e che ident if ica gli operat or i pi
import ant i e quelli meno import ant i; maggiore la pr iorit minor e il valor e che la
ident ifica: quest i valori risult ano ut ili, ad esempio, quando si eseguono delle operazioni
mat emat iche, per st abilire quali operazioni debbano essere eseguit e per pr ime, quest o,
Corso IFTS Emanuele Lattanzi
5
ovviament e, in mancanza di par ent esi t onde che pot rebber o modificar e lordine con cui
si eseguono le operazioni sulle var iabili.
Associativit: l' associat ivit st abilisce, a par it di prior it , quale sia l' ordine con cui
bisogna eseguir e i var i operat or i. Se l' operat or e associat ivo a sinist ra, si scor rer da
sinist ra verso dest ra, ment re se associat ivo a dest ra, si far l' esat t o cont rar io.
Esempi t ipici in cui int er vengono le propr iet degli operat or i, si hanno nell' int erpr et azione di
for mule mat emat iche, come nell' esempio seguent e:
a + b * c /* che viene interpretato come
a + (b * c), e non (a + b) * c
perch la moltiplicazione ha
precedenza maggiore */
a - b c /* che viene interpretato come
(a - b) - c , perch l'associativit
della sottrazione a sinistra */
Corso IFTS Emanuele Lattanzi
6
Operazioni di Input/Output: printf e scanf
Per deviare il flusso di esecuzione di un pr ogr amma, come abbiamo gi vist o, possibile
ut ilizzar e delle scelt e condizionat e ( ad esempio per scegliere t ra l' opzione A e l' opzione B) .
I n linguaggio C esist ono due t ipi di st rut t ur e di cont rollo condizionale, l' if- else e lo swit ch.
L' if- else e lo swit ch hanno, sost anzialment e, comport ament i simili, ed anche se il pr imo
largament e il pi usat o, hanno delle differenze per quant o riguarda il t ipo di operazione che
vogliamo svolgere.
if-else
L' ist ruzione if permet t e di verificare det erminat e condizioni ed ha la seguent e sint assi:
if (espressione)
{
istruzione1
istruzione2
}
I n quest o caso se l' espr essione r isult a vera, si eseguono le ist ruzioni racchiuse t ra par ent esi
alt r iment i ( se la condizione falsa) si salt a il blocco di ist r uzioni facent i part i dell' if e si pr ocede
nell' esecuzione delle ist r uzioni successive.
List ruzione if pu inolt r e essere seguit a da un ist r uzione else che st a ad indicar e
lalt er nat iva da eseguir e nel caso in cui lespressione r isult i falsa.
if (espressione)
{
istruzione1
}
else
{
istruzione2
}
oppure possibile inser ire unist ruzione else if che permet t e di ver ificar e una o pi
condizioni in ser ie:
if (espressione)
{
istruzione1
}
else if (espressione)
{
istruzione2
}
else
{
istruzione3
}
Corso IFTS Emanuele Lattanzi
9
Facciamo un esempio prat ico nel codice sot t ost ant e, assumendo che sia st at o definit o, in
unalt ra part e di codice, il valore della var iabile int era " r isult at o_esame" , che pu assumere un
valor e compr eso t ra 0 e 30:
if (risultato_esame >=18)
{
printf ("Complimenti hai superato lesame");
}
else if (risultato_esame >=15)
{
printf ("Devi sostenere lorale per questo esame");
}
else
{
printf ("Non hai superato lesame");
}
Controlli condizionali: Switch
Come annunciat o, l' ist r uzione switch ha delle differ enze dall' if-else, infat t i pu esser e
usat a solo in alcuni casi dove:
Viene valut at a solament e una var iabile; t ut t e le scelt e dipenderanno, infat t i, da quest a
var iabile. La var iabile deve essere un t ipo int, short, long o char;
Ogni singolo valor e della variabile pu cont rollare solo una scelt a. Una scelt a finale,
chiamat a default incaricat a di cat t urar e t ut t i i valor i dei casi non specificat i;
L' ist ruzione switch ha la seguent e st r ut t ura:
switch (espressione) {
case elem_1:
istruzione_1;
break;
case elem_2:
istruzione_2;
break;
...
case elem_n:
istruzione_n;
break;
default:
istruzione;
break;
}
vediamo l' esempio prat ico, assumendo di aver e la variabile int era "numer o" che pu
assumer e valor i maggiori od uguali a zero:
switch (numero) {
case 0:
printf("Nessuno");
break;
case 1:
printf("Uno");
break;
case 2:
printf("Due");
break;
default:
printf("Valore diverso da 0, 1 o 2\n");
break;
}
Corso IFTS Emanuele Lattanzi
10
Strutture iterative: while e for
Un array, come sappiamo, una st rut t ura dat i cont igua che pu esser e vist a come una
"collezione organizzat a di ogget t i".
I n linguaggio C, ad esempio, possiamo dichiarare un arr ay di numeri int er i in quest o modo:
int myarray[10];
Come si pu not ar e un array viene dichiarat o met t endo il nome della var iabile ( myarray) e,
t ra par ent esi quadr e, la cifra che ident if ica il numer o di element i dello st esso t ipo ( int ) e quindi
la dimensione dell' array.
Nell' esempio, ognuno dei dieci numer i int eri che cost it uiscono lar ray viene chiamat o
elemento dell' ar ray e dieci la dimensione dell' array. Not ar e che list ruzione appena vist a
una semplice dichiarazione dellar ray ma non inizializzazione. I nfat t i in quest o modo, ai 10
element i dellarray non st at o assegnat o nessun valor e.
Una volt a dichiarat o un array possibile assegnar e il valore alla posizione cor r ispondent e,
richiamandola t ramit e l' indice, ad esempio se volessi inser ire il valore 87.43 nell' ar ray di f loat
alla quint a posizione, bast a scriver e:
float float_array[10];
float_array[4] = 87.43;
Se volessimo inizializzare t ut t i gli element i dellar ray con un part icolar e valore, pot r emmo
ut ilizzar e un ciclo for per scorr e t ut t i gli element i ed assegnare a ciascuno di loro il valore come
nellesempio sot t ost ant e.
#include <stdio.h>
int main(void)
{
int myarray[100];
int i;
for(i = 0; i < 100; i++)
{
myarray[i] = 1;
}
return(0);
}
Nat uralment e un array pu esser e inizializzat o anche definendone diret t ament e i valor i
come nell esempio seguent e:
int numeri[] { 7, 23, 4, 94, 120 };
I n quest o esempio si cr ea un arr ay di 5 element i e, come si pu not are la dimensione t ra
parent esi quadre viene omessa in quant o r icavat a dal numero di element i compr esi t ra le
parent esi gr affe.