Sei sulla pagina 1di 13

Corso IFTS Emanuele Lattanzi

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 */

Corso IFTS Emanuele Lattanzi


4
Operatori di confronto

Gli oper at ori di confront o permet t ono di ver ificare det erminat e condizioni, come ad esempio
l' uguaglianza, la disuguaglianza, o semplicement e se un element o maggior e di un' alt ro; la
seguent e t abella most ra nel det t aglio gli operat or i di conf r ont o e la lor o funzione:

Simbolo Significato Utilizzo
= = uguale a a = = b
! = diverso da a ! = b
< minore a < b
> maggior e a > b
< = minore o uguale a < = b
> maggior e o uguale a > = b

Quest i operat or i vengono normalment e ut ilizzat i nelle ist r uzioni condizionali e in quelle
it erat ive dove rappresent ano la condizione di cont rollo.
Gli operat ori di confr ont o hanno sempre due argoment i e s occupano sempr e posizione
infissa ( cio t ra i due argoment i) .



Operatori logici

Anche gli operat or i logici vengono ut ilizzat i con le ist ruzioni condizionali ed it erat ive, e
permet t endo di compor r e pi espr essioni secondo le r egole della logica booleana.


6LPEROR 6LJQLILFDWR 8WLOL]]R
&& AND logico a && b
|| OR logico a || b


Quest e operazioni rest it uiscono necessar iament e 1 quando sono ver e e 0 quando sono
false, quindi facendo "a || b" quest a assume valor e uno se e solo se "a" o "b" valgono uno,
ment re vale zero se ent rambi gli operandi valgono zer o; analogament e quando si ha "a && b",
quest a assume valor e zer o se "a" o "b" valgono zer o, uno nel caso ent rambi valgano uno.


Propriet degli operatori

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

La funzione pr int f, gi ut ilizzat a in qualche esempio, ci permet t e di st ampare a video


lout put in maniera t est uale.
La st rut t ura di pr int f la seguent e:

int printf(char *formato, lista argomenti ...)

quest a st ampa sullo st dout ( st andard out put : il video in quest o caso) la list a di argoment i
conf ormement e alla st ringa di format o specificat a. La funzione r it orna il numero di carat t er i
st ampant i.
La st ringa di format o ha due t ipi di argoment i:
caratteri ordinari: quest i vengono copiat i nell' out put ;
specificazioni di conversione: cont raddist int e dal carat t er e percent uale " %" e da un
carat t ere che specifica il format o con il quale st ampare le var iabili pr esent i nella list a di
argoment i.

La t abella seguent e most ra alcuni possibili specificat or i di conversione che possono esser e
usat i per f ormat t are le var iabili.

Stringa di controllo Cosa viene stampato
%d I nt ero ( int )
%c Un carat t er e ( char)
%s
Una st r inga di carat t er i
( * char)
%x Numer o esadecimale
%f
Numer o reale ( f loat o
double)
%e
Format o scient ifico valore in
virgola mobile ( float )
%g
Valor e in virgola fissa o
mobile ( double)

Quindi facciamo degli esempi per far capir e meglio l' uso del pr int f:

int x = 10;
printf("Il numero %d", x); /* l'output "Il numero 10" */

print("%2.3f \n", 24.392734); /* l'output 24.393 */

All' int ero di quello che ver r st ampat o not iamo spesso il simbolo "\n" che serve per andar e
a capo. Tale simbolo viene chiamat o sequenza di escape. Le sequenze di escape servono per
rappr esent ar e quei carat t er i "speciali" present i nella codifica ASCI I e che non st ampano nulla a
video, ma permet t o di int r odur re all' int erno di ci che verr st ampat o event uali spaziat ur e. Le
sequenze di escape iniziano con il carat t ere backslash ( \ ) e sono int er pret at e come un singolo
carat t ere.
7LSRGLRS]LRQH 'HVFUL]LRQH
\n Ritorno a capo
\t Tabulazione orizzontale
\b Tabulazione verticale
\a Torna indietro di uno spazio
\f Salto pagina
Corso IFTS Emanuele Lattanzi
7

La f unzione scanf serve per leggere dallo st din ( st andard input che generalment e la
t ast iera) una sequenza di carat t eri ( let t ere o cifre) che verranno memor izzat e all' int er no di
opport une var iabili. scanf , quindi, definit a come segue:

int scanf(char *formato, lista argomenti ...)

Da far not ar e che la scanf, olt r e a pot er leggere st ringhe di t est o per met t e di leggere pi
var iabili cont emporaneament e, se quest e sono specificat e nella list a degli argoment i. A
differenza della printf, per la variabile deve essere precedut a dal simbolo &, perch in realt
la scanf non vuole come argoment o il nome della variabile ma il suo indir izzo di memor ia cosa
che pu essere ot t enut a ut ilizzando il simbolo &.

#include <stdio.h>

int main(void)
{
int i;
scanf("%d \n", &i);
printf("%d \n", i);
return(0);
}
I l programma raffigurat o sopra serve solament e per legger e un numer o da t ast iera e
rist ampar lo a video; avret e not at o che possibile usare gli specif icat or i di conversione anche
per la scanf, che, quindi, si comport a in modo molt o simile a print f. La t abella sot t ost ant e
riport a alcuni degli specificat ori di conversione ut ilizzabili con la funzione scanf.



Stringa di controllo Cosa viene letto
%d I nt ero ( int )
%c Un carat t er e ( char)
%s
Una st r inga di carat t er i
( * char)
%lf
Numer o reale virgola fissa
( double)
%le
Numer o reale virgola mobile
( double)
%lg
Valor e in virgola fissa o
mobile ( double)

Corso IFTS Emanuele Lattanzi


8

Controlli condizionali: If-Else

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

Le st r ut t ur e it erat ive in linguaggio C sono t re:


il while, che cont inua il suo ciclo fino a quando lespr essione associat a non r isult a falsa
il do- while, che agisce come il while, ma assicura lesecuzione delle ist ruzioni associat e
almeno una volt a
il for , che il cost r ut t o pi usat o, versat ile e pot ent e t ra i t r e.

While
La st rut t ura del while la seguent e:

while (condizione)
{
istruzione1;
istruzione2;
}

Generalment e l' ist r uzione o le ist ruzioni all' int erno del while agiscono sulla condizione che il
while aspet t a essere falsa per pot er uscire dal ciclo, quest o perch alt riment i il ciclo non
t erminer ebbe. Ad esempio per st ampare a video una successione di cifre da 0 a 99,
proponiamo il codice seguent e:

int i = 0; /* dichiarazione ed inizializzazione
della variabile di controllo */
while (i != 100)
{
printf("%d \n", i);
i++;
}

Do - While
Molt o simile al while il do- while che ha la seguent e st r ut t ura:

do
{
istruzione1;
istruzione2;
}
while (condizione)

Tenendo valide t ut t e le considerazioni fat t e per il while, va not at o che in quest o modo si
esegue l' ist ruzione all' int er no del do- while almeno una volt a, indipendent ement e dal fat t o che
la condizione associat a al while r isult i vera o f alsa ( la prima volat a list ruzione viene sempr e
eseguit a) .

For
Pr ima di spiegare le car at t er ist iche del for , ne proponiamo la st r ut t ura generale:

for (inizializzazione ; condizione ; incremento)
{
istruzione1;
istruzione2;
}







Corso IFTS Emanuele Lattanzi
11
che equivale alla rappresent azione con un while con la seguent e st r ut t ura:

inizializzazione;
while (condizione)
{
istruzione1;
istruzione2;
incremento;
}

I l for, quindi, pot rebbe t ranquillament e esser e sost it uit o da un while, se non fosse che pi
conciso ed concet t ualment e usat o quando sappiamo a pr ior i il numer o di it erazioni che
vogliamo fare. Le espressioni all' int er no del for hanno diversi compit i, e sono separat e da un
punt o e virgola:
La prima viene eseguit a una sola volt a pr ima di ent rar e nel ciclo, ed inizializza una
var iabile, generalment e la var iabile usat a come var iabile di cont rollo del ciclo.
La seconda la condizione ( che coinvolge anche la var iabile di cont rollo) , che se risult a
falsa int err ompe l' esecuzione del ciclo.
La t erza cost it uisce l' ist ruzione di incr ement o, che viene eseguit a dopo ogni ciclo del for .
Quest a ist ruzione agisce generalment e sulla variabile di cont r ollo increment andone ( o
decrement andone) il valor e.

Per chiar ire meglio l' uso del for pr esent iamo un semplice codice che cont a da zero a cent o,
st ampando a video la variabile di cont r ollo:

int i;

for (i=0; i<=100; i++)
{
printf("%d \n", i);
}

Ognuna delle t re ist r uzioni all' int erno del f or pu esser e omessa, con il risult at o di
condizionar e il ciclo, o non modificando la variabile, o facendo essere sempre vera la
"condizione" di cont r ollo. I n quest o ambit o bisogna cit are un uso part icolar e del ciclo for, che
quello del cosiddet t o "ciclo for infinito". Un ciclo che non t ermina, abbiamo det t o
precedent ement e, da considerarsi er rore, ma esist e una sit uazione in cui vogliamo, invece,
ciclar e all' infinit o fino a quando l' ut ent e non decide di int err omper e volont ar iament e il
programma, ad esempio avendo un menu generale che ogni volt a deve pr esent arsi sullo
schermo. I l f or ut ilizzat o in quest o caso ha una st rut t ura part icolarissima, ovver o non ha
nessuno dei t re paramet ri sopra espost i, ma cont iene solament e due carat t eri punt o e virgola:

int main (void)
{
for ( ; ; )
{
printf ("premi CTRL+Z per interrompere");
}
return(0);
}











Corso IFTS Emanuele Lattanzi
12
Gli array

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.

Corso IFTS Emanuele Lattanzi


13
Array Multidimensionali

Una carat t er ist ica degli arr ay che li rende molt o pot ent i la possibilit di definir e degli
array mult idimensionali. I n prat ica un arr ay bi- dimensionale cost it uit o da un ar ray dove ogni
suo element o anchesso, a sua volt a, un ar ray.
I n quest o modo si possono rappresent are facilment e t abelle e mat r ici ( ar ray bi-
dimensionale) , o qualunque alt ra cosa che richieda un rappr esent azione dimensionale anche
super ior e a due, si pensi a pr ogrammi di graf ica t ri- dimensionale, dove un ar ray cubico pu
essere usat o per disegnare i punt i all' int erno dello spazio t ridimensionale creat o, o ad un array
a quat t r o dimensioni, che pu servir e per regist r are anche la variabile t empo.
L' esempio sot t o propost o usa un ar ray bidimensionale per definir e una mat r ice di N r ighe
ed M colonne:

#include <stdio.h>

int main(void)
{
int n = 10;
int m = 12;
int matrix[n][m];
int i;
int j;

for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
matrix[i][j] = 1;
printf("%d", matrix[i][j]);
}
printf("\n");
}
return(0);
}

5HI: http://programmazione.html.it/c/