Affronteremo oggi il casting in C. Quando si lavora con tipi di dati diversi tra loro può essere necessario effettuare la conversione. Questa operazione si chiama casting. Con il termine cast si intende l’operazione di passaggio di una variabile da un tipo di dato ad un altro.
In C esistono due tipi di conversioni:
Casting implicito
Sono le conversioni automatiche o implicite, in C le operazioni in genere avvengono tra operandi dello stesso tipo.
Casting esplicito
Il vantaggio in questo caso è che il programmatore può indicare esplicitamente la conversione di tipo che intende realizzare.
Le istruzioni break e continue consentono un controllo maggiore sui cicli. Nessuna delle due accetta argomenti.
Break
L’istruzione break, già vista quando abbiamo parlato dello switch, può essere utilizzata anche all’interno di un ciclo, causandone la terminazione. L’istruzione break è stata introdotta per permettere di uscire dai cicli senza aspettare che l’ultimo valore sia stato raggiunto. Quando l’elaboratore la incontra, salta tute le istruzioni del ciclo rimanenti e prosegue con la prima istruzione successiva al ciclo stesso.
#include
//somma i numeri, zero per terminare, appena arriva a 100 termina comunque il ciclo
main(){
int i;
int somma=0;
do
{
if (somma>100)
break;
printf ("inserisci un numero: \t");
scanf("%d", &i);
somma+=i;
printf("somma progressiva:\t %d \n", somma);
}while(i!= 0);
}
Continue
L’istruzione continue può essere utilizzata solo all’interno di un ciclo e a differenza di break riporta il controllo all’inizio del ciclo.
Esempio:
#include
//somma i numeri positivi, zero per terminare, ignora i negativi
main(){
int i;
int somma=0;
do
{
printf ("inserisci un numero: \t");
scanf("%d", &i);
if (i<0)
continue; //appena trova questa istruzione si ritorna all'inizio del ciclo
somma+=i;
printf("somma progressiva:\t %d \n", somma);
}while(i!= 0);
}
Quelli proposti sono solo alcuni esempi di istruzioni break e continue realizzati in C.
Parliamo adesso delle strutture di controllo iterative, ovvero i cicli.
Quando si desidera ripetere un’operazione un determintato numero di volte si ricorre alle strutture di controllo iterative.
Tipi di strutture di controllo iterative.
Ci sono tre tipi di strutture iterative:
while
do…while
for
Inoltre, anche i costrutti iterativi, come quelli di selezione, possono essere annidati.
while
Il while è un costrutto pre-condizionale ovvero il controllo della condizione è precedente all’esecuzione delle istruzioni.
La sintassi è la seguente:
while (<Condizione>)
<Istruzione/i>;
dove istruzione/i rappresenta un’istruzione singola oppure un blocco di istruzioni, in quest’ultimo caso sono necessarie le parentesi graffe.
La semantica è la seguente:
si valuta la Condizione;
se la condizione è vera, viene eseguita l’Istruzione/i e si ritorna al punto 1;
se la condizione è falsa l’Istruzione/i non viene eseguita e il controllo passa all’istruzione successiva al while.
Esempio:
Programma che inserisce dieci numeri.
…
int i=0; //inizializzo il contatore a zero
while(i<10)
{
printf(“inserisci un numero: “);
scanf(“%d”, &numero);
i=i+1; //incremento il contatore di uno
}
Il ciclo si fermerà quando i sarà uguale a 9.
do while
Il do … while diversamente dal while, è post condizionale, ovvero valuta la condizione alla fine del ciclo.
Quindi i corpo del ciclo do … while viene eseguito almeno una volta.
La sintassi è la seguente:
do
<Istruzione/i>;
while (<Condizione>);
dove Istruzione/i rappresenta un’istruzione singola oppure un blocco di istruzioni, in quest’ultimo caso sono necessarie le parentesi graffe.
La semantica è la seguente:
Si esegue l’Istruzione/i;
Si valuta la Condizione;
Se la Condizione è vera si ritorna al punto 1;
Se la Condizione è falsa, il controllo passa all’istruzione successiva al do … while.
Esempio:
Programma che inserisce dei numeri minori di 10
do
{
printf(“inserisci un numero: “);
scanf(“%d”, &numero);
} while (numero<10);
for
Una struttura più potente delle precedenti è il for.
La sintassi è la seguente:
for ([<Espressione1>]; [<Espressione2>];[<Espressione3>])
<Istruzione/i>;
dove:
Espressione1 è il punto di partenza dell’iterazione, può anche essere un’espressione che inizializza le variabili del ciclo o una dichiarazione di variabili.
Espressione2 è la condizione che permetterà al ciclo di continuare.
Espressione3 è di solito un’istruzione di incremento o decremento del contatore.
Istruzione/i indica un’istruzione singola o un blocco di istruzioni racchiuse tra parentesi graffe ed è il corpo dell’iterazione.
Analizzeremo adesso i tipi di operatori in linguaggio C.
Operatore di assegnamento
L’operatore di assegnamento si indica con il simbolo = (segno di uguale).
Quindi la sintassi posso indicarla così:
<Evalue>=<Vvalue>
Dove Evalue rappresenta in generale un identificatore di variabile, mentre Vvaluerappresenta un’espressione qualunque.
Dunque Vvalue viene assegnata a Evalue.
Facciamo un esempio di utilizzo di operatore di assegnamento:
base=4 assegna alla variabile base il valore 4.
somma=7+5 assegna alla variabile somma il valore 12, cioè la somma di 7 e 5.
lettera=’c‘ assegna alla variabile lettera il valore c.
Quindi prima occorre valutare la parte destra Vvalue e poi assegnarla alla parte sinistra Evalue.
Dunque a sinistra dell’operatore deve sempre esserci una variabile, a destra può esserci: una costante, una variabile o un’espressione.
Il tipo di dato della variabile a sinistra dell’operatore deve essere identico (o almeno compatibile) con quanto indicato a destra, il compilatore controlla la compatibilità tra i tipi.
In alcune situazioni, si risolve comunque la non compatibilità tramite delle regole di conversione automatica tra i tipi.
Inoltre, la conversione del tipo è indolore se il tipo di dato a destra è inferiore al tipo della variabile a destra dell’operatore.
Pertanto, se la conversione non avviene non è esclusa la perdita di informazione. Ad esempio la conversione di un valore float in un valore int comporta la perdita della parte frazionaria.
Si segue dunque la seguente gerarchia: char < int < float.
Continuiamo la nostra lezione parlando di altri tipi di operatori in C.
Operatori aritmetici
Si possono distinguere in operatori unari e operatori binari.
Elenchiamo come prima gli operatori matematici binari:
+ (somma) – addiziona due operandi e concatena due stringhe
– (differenza) -sottrae il secondo operando dal primo
/ (divisione) – divide il primo operando per il secondo.
* (moltiplicazione) – moltiplica i due operandi.
% (resto – operatore modulo) – restituisce il resto della divisione tra due operandi.
Facciamo quindi degli esempi:
somma=a+b; //alla variabile somma assegno il risultato di a + b
resto=a%b; //alla variabile resto assegno il resto della divisione di a diviso b.
Gli operatori aritmetici unari si appicano invece ad un solo operando, modificandone il valore.
Ad esempio:
Posti dopo l’operando, quindi come postfissi:
i++; //equivale a scrivere i=i+1;
i–; //equivale a scrivere i=i-1;
Posti prima dell’operando, quindi come prefissi:
++i;
–i;
Facciamo dei semplici esempi:
x=50;
y=x++;
In questo caso si avrà: y=50 e x=51.
Quindi, prima si assegna il valore di x a y e poi si incrementa la x.
Invece se scrivo:
x=50;
y=++x;
Prima si incrementa il valore di x e poi si assenga ad y.
In questo caso si avrà: y=51 e x=51.
Più avanti parleremo anche di altri tipi di operatori: gli operatori di confronto, gli operatori logici, gli operatori sui bit e gli operatori speciali.
Il linguaggio C è un linguaggio di programmazione di alto livello, progettato e realizzato nel 1972 da Dennis Ritchie.
Il linguaggio C è un linguaggio di programmazione nato per lo sviluppo di sistemi operativi e talvolta viene definito come “il linguaggio di più basso livello tra i linguaggi ad alto livello“.
Lo studio di questo linguaggio ci permette di trovare applicazioni in tantissimi ambiti ma soprattutto nello sviluppo di sistemi operativi.
Le caratteristiche principali di questo linguaggio sono:
– innanzitutto è case sensitive, ovvero distingue tra lettere maiuscole e minuscole;
– poi è general purpose (multiuso) ovvero può essere impiegato per codificare progetti software di natura diversa;
– il linguaggio C è anche multi-piattaforma;
– è un linguaggio strutturato di tipo imperativo (o procedurale);
– inoltre produce programmi efficienti, infatti è nato per implementare sistemi operativi;
– produce anche codice di dimensioni ridotte, ha infatti una sintassi che si presta alla scrittura di codice compatto.
Struttura di un programma in linguaggio C
In un programma scritto in C vi è una funzione che deve essere sempre presente, che è la funzione main(). Il compilatore infatti inizia l’esecuzione proprio da questa funzione.
Tutto il codice contenuto tra le due parentesi graffe rappresenta il corpo del programma. All’interno del main si possono inserire chiaramente una o più istruzioni, terminanti da una carattere punto e virgola.
Facciamo dunque il primissimo esempio di programma in linguaggio C che dà semplicemente un messaggio di benvenuto all’utente:
#include <stdio.h>
main(){
printf("Benvenuti da Coding Creativo");
}
Quindi in questo semplicissimo programma abbiamo inserito un’istruzione printf che permette la stampa su video di tutto ciò che è racchiuso tra parentesi tonde e doppi apici.
Nelle prossime lezioni parleremo di variabili e costanti in linguaggio C e come utilizzarle per realizzare dei semplicissimi programmi.