You are on page 1of 38

Il Linguaggio C

Un linguaggio ad alto livello

Parte Prima
Un semplice esempio
 Si vuole determinare lo spazio (in metri) necessario
ad arrestare un’automobile viaggiante ad una data
velocità (in Km/h), ipotizzando una decelerazione
costante di 7.8 m/s2.

Perché il calcolatore possa risolvere questo


problema è necessario che conosca la velocità
dell’auto e l’algoritmo risolutivo.
Un rudimentale algoritmo
{
Richiedi la velocità
Calcola lo spazio di frenata
Comunica il risultato in metri
}
Il modello matematico
 La formula che descrive il moto uniformemente
decelerato è:
s= vi2/2d
Dove:
s = spazio per l’arresto (in metri)
vi = velocità iniziale auto (in m/s)
d = decelerazione (7.8 m/s2)
Per poter passare da Km/h a m/s si ricorre alla formula:
vi = vKm/h/3.6
Il rigo “calcola lo spazio di
frenata”
Calcola lo spazio di frenata
{
Conversione della velocità da Km/h a m/s
Calcolo dello spazio
}
Ed inserendo le formule:
{
vi = vKm/h/3.6
s= vi /2d
}
2
Passiamo al…
C
La funzione main
 Gli enunciati del nostro algoritmo sono
racchiusi tra due parentesi graffe che ne
indicano l’inizio e la fine.
 Anche il C utilizza lo stesso formalismo.

main ()
{ Ogni programma C ha
sempre una funzione
… principale di nome main
… dalla quale inizia
} l’esecuzione del programma
Comunicazione con l’utente
 Il primo enunciato del nostro
algoritmo è:
Richiedi la velocità in Km/h
Tale frase in effetti si compone di due
frasi distinte:
1. Dammi la velocità in Km/h (messaggio esplicativo del
dato da inserire)

2. Inserimento del dato (ad es. dalla tastiera)


La funzione printf
 La frase 1. Prima vista può essere codificata
con la scrittura:
Fine
printf (“Dammi la velocità in Km/h”); dell’istruzione

La funzione printf, prelevata dalla libreria


standard del C ha la funzione di far apparire
sulla periferica di visualizzazione la stringa di
caratteri che è racchiusa tra le virgolette.
La variabile
 A questo punto il programma per poter
acquisire il dato dalla tastiera bisogna
che lo incameri in una variabile.
Zig_zag s S
s2bis velocità

variabile
Tipo di variabile
 Le variabili possono essere:
 char caratteri o numeri interi
 int interi
 float reali
 …

Nel caso del nostro esempio la velocità è


rappresentabile correttamente con un
numero reale e quindi di tipo float
Nomi proibiti per le variabili
 Auto  Double
 Break  Else
 Case  Enum
 Char  Extern
 Const  Float
 Continue  For
 Default  Goto
 Do  …
Dichiarazioni di variabili
 Le variabili vanno dichiarate in testa al
nostro programma…
float v;
main ()
{
printf (“Dammi la velocità in Km/h”);

}
Acquisizione dati
 La funzione scanf :
 Acquisisce i dati da tastiera,
 Li converte secondo il formato
specificato (%c char, %d int, %f float),
 Copia il risultato all’indirizzo di memoria
indicato
scanf (“%f”, &v)
Proseguendo…
float v;
main ()
{
printf (“Dammi la velocità in Km/h”);
scanf (“%f”, &v);

}
Una volta acquisita la velocità v si può passare alla fase
di calcolo della frenata con le espressioni viste in
precedenza…
Espressioni
 Espressione è una combinazione
qualsiasi di operandi ed operatori ca da
origine a un valore.
v / 3.6
v e 3.6 operandi
/ operatore
ATTENZIONE !!!
 L’operatore / (divisione) genera nella quasi totalità
dei casi un tipo float, inoltre:
 Se entrambi gli operandi sono positivi, il risultato sarà
troncato, cioè non verranno considerate le cifre
decimali
 Se sono entrambi negativi, l’approssimazione del
risultato (troncamento o arrotondamento) dipende
dal COMPILATORE.
 Per ovviare a spiacevoli inconvenienti è buona regola
trasformare uno o entrambi gli operandi della
divisione in un tipo reale. Nel caso della nostra
divisione ½ scriveremo 1 / 2.0
Uno strano operatore =
 L’operatore = non ha nei linguaggi di
programmazione il ben noto significato
matematico, infatti:
Corretto Errato
X=10 10=X
X=X+1 E’ diversa cosa
X=3*X X=Y e Y=X
X=X+X ecc.
Altri operatori
 Operatori Unari : coinvolgono 1 solo operando.
Operatore Nome
! NOT logico
˜ Complemento bit a bit
- Negazione aritmetica
++ Incremento di 1
-- Decremento di 1
* Contenuto puntato da
& Indirizzo di
+ Segno più
Sizeof x Dimensione in byte di x
Operatori binari e Ternari
OPERATORE NOME OPERATORE NOME
+ Addizione && AND logico
- Sottrazione OR logico
* Moltiplicazione , Valutazione seguente
/ Divisione ?: Condizionale
% Resto = Assegnazione semplice
<< Shift a sinistra += Assegnazione con addizione
>> Shift a destra -= Assegnazione con sottrazione
< Minore di *= Assegnazione con moltiplicazione
<= Minore o uguale di /= Assegnazione con divisione
> Maggiore di %= Assegnazione con resto
>= Maggiore o uguale di >>= Assegnazione con shift a destra
== Uguaglianza <<= Assegnazione con shift a sinistra
!= Non uguale o diverso &= Assegnazione con AND bit a bit
& AND bit a bit = Assegnazione con OR bit a bit
OR bit a bit ^= Assegnazione con OR esclusivo
^ OR Eslusivo bit a bit
Torniamo al nostro esempio…
 Calcoliamo l’espressione:
s= vi2/2d
 In C verrà scritta come:
s = ½.0*vi*vi/7.8
Si noti che in C non compare l’operatore
per l’elevazione al quadrato.
…per cui
float v, vi, s;
main ()
{
printf (“Dammi la velocità in Km/h”);
scanf (“%f”, &v);
vi =v/3.6;
s = ½.0*vi*vi/7.8;

}
Costanti numeriche
 Le costanti numeriche si rappresentano
in C con:
const int a=25
const float a = 25.56
Tipi int sono compresi tra –32768 e +32768
Tipi float sono <-32768 e >32768 e tutti i
numeri con virgola
…per cui
float v, vi, s;
const float unimis=3.6
const float d=7.8
main ()
{
printf (“Dammi la velocità in Km/h”);
scanf (“%f”, &v);
vi =v/unimis;
s = ½.0*vi*vi/d;

}
Comunicazione dei risultati
 E’ giunta l’ora di comunicare all’utente il
risultato della nostra elaborazione e lo
faremo ricorrendo di nuovo alla
funzione printf
printf (“Lo spazio di frenata è %f metri”,s);
sullo schermo si leggerebbe:
Lo spazio di frenata è 48.500000 metri.
%f è lo specificatore di formato float.
Lavoro terminato?
float v, vi, s;
const float unimis=3.6
const float d=7.8
main ()
{
printf (“Dammi la velocità in Km/h”);
scanf (“%f”, &v);
vi =v/unimis;
s = ½.0*vi*vi/d;
printf (“Lo spazio di frenata è %f metri”,s);
}
I commenti
 Per aumentare la leggibilità di un programma
è buona regola introdurre righe di commento
a quanto si va facendo. Tale operazione è
trasparente ai fini dell’elaborazione del
programma in quanto gli stessi non vengono
considerati in sede di COMPILAZIONE. Un
commento inizia con il carattere /* e termina
con */
Ad esempio: /*Questo è un commento*/
Programma commentato
/*Nome del programma: Frenata Autore: Data:
Tale programma calcola lo spazio di frenata di una autovettura
Viaggiante a una velocità v Km/h supponendo che deceleri con una decelerazione di 7.8 m/s2 */
float v, vi, s; /*v velocità in Km/h vi velocità in m/s s spazio frenata in m*/
const float unimis=3.6 /*unimis costante per passare da Km/h a m/s */
const float d=7.8 /*d costante di decelerazione*/
main ()
{
printf (“Dammi la velocità in Km/h”); /*richiede la velocità*/
scanf (“%f”, &v); /* la ottiene da tastiera*/
vi =v/unimis; /*esegue la conversione di unità di misura*/
s = ½.0*vi*vi/d; /*calcola lo spazio s*/
printf (“Lo spazio di frenata è %f metri”,s); /*presenta il risultato*/
}
E’ una sequenza
inizio

vi=v/3.6

s=1/2*vi*vi/7.8

end
Per renderlo eseguibile…
1. Con un EDITOR scrivo il programma prima visto e
lo salvo sull’HD come frenata.C
2. Con il COMPILATORE lo trasformo in un file oggetto
tipo frenata.OBJ
3. Con il LINKER vi collego le funzioni dalle librerie
ottenendo un file frenata.EXE che è direttamente
eseguibile su qualunque macchina.
Alcuni COMPILATORI sono allo stesso tempo anche
LINKER
Altre ISTRUZIONI

Parte Seconda
L’istruzione “se… altrimenti…”
 Tale istruzione in C si codifica con:
if (condizione)
sequenza; falso vero
a>0
else
a=a+1 a=a-1
Sequenza;
Esempio
If (a>o)
a=a-1;
c=a*b
else
a=a+1;
c=a*b;

Esempio
If (a>o)
{
falso vero
a=a-1; a>0
b=m*a; a=a-1
} a=a+1
else b=m*a
a=a+1;
c=a*b;
c=a*b
if nidificati
If (a>o)
{
If (b<o) falso vero
b=a-1; a>0
else falso
b<
vero

m=m*b; a=a+1 0
} m=m*b b=a-1
Else
a=a+1;
c=a*b; c=a*b/m
L’istruzione switch e break
Printf (“scrivi numero mese”);
 Sono tipo if pluriuscite Scanf(%d, &numero);
Giorni = 0;
Switch (numero)
condizione
case 1 : /*Gennaio*/
giorni +=31;
break ;
case 2 : /*Febbraio*/
giorni +=28;
break ;

case 12 : /*Dicembre*/
L’istruzione while
 Serve per le iterazioni: b=a*a
While (condizione)
a=a+1
sequenza
falso c>(a+b)/2
While (c>(a+b)/2) vero
{
a=a+1;
m=a*b
b=a*a;
}
m=a*b;
I dati strutturati
 Insieme ordinato di variabili dello stesso
tipo.
 Appartengono a questa categoria gli
ARRAY. Quelli più comuni sono
 Array monodimensionale
 Array multidimensionale
Array monodimensionale
 Una struttura di questo tipo si presenta
con un nome ed una dimensione
 Temperatura [10]
 Temperatura è il nome
 [10] è la dimensione Elemento “iesimo”

5 7 8 12 9 9 6 5 5 5 Temperatura [i]
0 1 2 3 4 5 6 7 8 9
Esempio di inserimento dati
nel vettore Temperatura[10]
#include <stdio.h> /*libreria che gestire i flussi in entrata e in uscita*/
int i;
float Temperatura [15];
main()
{
for (i=0; i<10; i++);
printf(“Scrivi il %2d° valore: “, i+1);
scanf(“%f”, &Temperatura[i]);
}

You might also like