l’obiettivo di oggi è quello di introdurre gli elementi...

22
1 Linguaggio C Linguaggio C Linguaggio C Linguaggio C Fondamenti 2 L’obiettivo di oggi è quello di introdurre gli elementi di base che caratterizzano i programmi scritti in linguaggio C: Le Variabili Le Costanti Elementi di Base Elementi di Base Elementi di Base Elementi di Base 3 Con il Termine Variabile intendiamo un’area circoscritta della Memoria Centrale RAM del calcolatore in grado di conservare un valore per un determinato tempo il quale però può essere cambiato durante l’esecuzione del programma. Le Variabili Le Variabili Le Variabili Le Variabili 4 Per poter fare riferimento alla Varibile dobbiamo associarvi un nome (identificatore), tale nome non può essere composto da caratteri qualsiasi ma deve soddisfare determinati requisiti. Le Variabili Le Variabili Le Variabili Le Variabili

Upload: doanliem

Post on 15-Feb-2019

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

1

Linguaggio C Linguaggio C Linguaggio C Linguaggio C

Fondamenti

2

L’obiettivo di oggi è quello di introdurre gli elementi di base che caratterizzano i programmi scritti in linguaggio C:

Le Variabili

Le Costanti

Elementi di BaseElementi di BaseElementi di BaseElementi di Base

3

Con il Termine Variabile intendiamo un’area circoscritta della Memoria Centrale RAM del calcolatore in grado di conservare un valore per un determinato tempo il quale però può essere cambiato durante l’esecuzione del programma.

Le VariabiliLe VariabiliLe VariabiliLe Variabili

4

Per poter fare riferimento alla Varibile dobbiamo associarvi un nome (identificatore), tale nome non può essere composto da caratteri qualsiasi ma deve soddisfare determinati requisiti.

Le VariabiliLe VariabiliLe VariabiliLe Variabili

Page 2: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

5

Un Identificatore è una sequenza di una o più lettere (maiuscole o minuscole), cifre o caratteri di sottolineatura (underscore “_”).

N.B. Un Identificatore può iniziare con una lettera o con un Underscore ma non con una cifra.

IdentificatoriIdentificatoriIdentificatoriIdentificatori

6

Esempi:

Corretti: Errati:

calcola somma/numeri

somma_numeri somma numeri

Area3 3Area

IdentificatoriIdentificatoriIdentificatoriIdentificatori

7

Il compilatore C è “Case Sensitive” cioè considera le lettere minuscole diverse da quelle maiuscole permettendo così di creare Identificatori con lo stesso nome ma distinti poiché differiscono fra loro per il formato di una o più lettere.

IdentificatoriIdentificatoriIdentificatoriIdentificatori

8

Non è sufficiente attribuire un nome (Identificatore) ad una variabile per potervi memorizzare un valore, è necessario indicarne anche il tipo.

Le VariabiliLe VariabiliLe VariabiliLe Variabili

Page 3: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

9

Per Tipo di Dato si intende un insieme di valori e un insieme di operazioni ch possono essere applicati ad essi.

Ciascun Tipo di Dato ha una sua propria rappresentazione in memoria, ossia sfrutta un certo numero di celle di memoria.

Tipi di DatoTipi di DatoTipi di DatoTipi di Dato

10

I Tipi di Dato si dividono in :

-Tipi Semplici

-Tipi Strutturati

Classificazione dei Tipi di DatoClassificazione dei Tipi di DatoClassificazione dei Tipi di DatoClassificazione dei Tipi di Dato

11

Si dicono Tipi Semplici quei dati di cui è conosciuta a priori dal programmatore l’occupazione in byte in memoria.

Tipi SempliciTipi SempliciTipi SempliciTipi Semplici

12

Si dicono Tipi Strutturati quei dati di cui non è conosciuta a priori dal programmatore l’occupazione in byte in memoria.

Tipi StrutturatiTipi StrutturatiTipi StrutturatiTipi Strutturati

Page 4: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

13

Tipi FondamentaliTipi FondamentaliTipi FondamentaliTipi FondamentaliCiascun Tipo Fondamentale di variabili consente di memorizzare dati appartenenti a insiemi diversi (interi, reali, caratteri, ecc.). Ad esempio alcuni tipi sono:

char -128 +127 1 byte

int -32768 + 32767 2 byte

float 1.175494351E-3815 3.402823466E+38 4 byte 14

Il C consente al programmatore di definire dei nuovi Tipi di Dato detti tipi definiti dall’utente (user defined) da affiancare a quelli già preesistenti (built in). Ciò permette quindi di poter definire un nuovo tipo di dato per ogni categoria di informazione (ad es. date, fatture, stipendi, ecc.)

Tipi di DatoTipi di DatoTipi di DatoTipi di Dato

15

Le CostantiLe CostantiLe CostantiLe Costanti

Una Costante è un qualsiasi numero, carattere o stringa di caratteri che può essere utilizzata come valore in un programma.

N.B. Una Costante non può

essere modificata.

16

Le CostantiLe CostantiLe CostantiLe Costanti

Il linguaggio C possiede quattro tipi di costanti:

Costanti Intere

Costanti in virgola mobile

Costanti costituite da stringhe di caratteri

Page 5: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

17

Le Parole Chiave sono degli Identificatori Predefiniti poiché sono associati a priori a qualche elemento del linguaggio, ossia hanno un particolare significato per il compilatore C.

Ad esmpio:Printf, scanf, if, char, int,…..

Parole ChiaveParole ChiaveParole ChiaveParole Chiave

18

Un programma C deve contenere nell’ordine:

- Una parte contenente direttive per il compilatore

- La parte dichiarativa- La parte esecutiva, racchiusa tra { }

Struttura di un programma CStruttura di un programma CStruttura di un programma CStruttura di un programma C

19

Le istruzioni che utilizziamo all’interno di un programma C sono delle funzioni il cui codice si trova in librerie esterne al software che stiamo scrivendo, quindi è nostro compito notificare al compilatore quali sono le librerie che dovranno essere incluse per poter codificare correttamente le istruzioni utilizzate.

Direttive per il CompilatoreDirettive per il CompilatoreDirettive per il CompilatoreDirettive per il Compilatore

20

Il modo più semplice per notificare al compilatore quali sono le librerie che dovranno essere incluse è il seguente:

#include <nomelibreria.h>

Questa istruzione inserisce il codice contenuto nella libreria “nomelibreria.h” all’interno del nostro programma eseguibile.

Direttive per il CompilatoreDirettive per il CompilatoreDirettive per il CompilatoreDirettive per il Compilatore

Page 6: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

21

La parte dichiarativa di un programma elenca tutti gli elementi che fanno parte di quest’ultima e ha la seguente forma:

Tipo identificatore

DichiarazioneDichiarazioneDichiarazioneDichiarazione

22

Vi troviamo quindi :- la dichiarazione delle costanti Ad esempio:

const float pigreco = 3,14;- la dichiarazione delle variabiliAd esempio:

float pigreco;Oppure

float pigreco = 3,14;

DichiarazioneDichiarazioneDichiarazioneDichiarazione

23

In un programma le dichiarazioni delle variabili e delle costanti devono precedere le istruzioni eseguibili poiché altrimenti i compilatore nell’utilizzare tali dati non sarebbe in grado di determinare quale tipo di dato stia trattando.

DichiarazioneDichiarazioneDichiarazioneDichiarazione

24

Gli Operatori sono simboli (sia singoli caratteri che loro combinazioni) che specificano come devono essere manipolati gli operandi dell’espressione.

Gli OperatoriGli OperatoriGli OperatoriGli Operatori

Page 7: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

25

Nell’operazione di assegnamento il valore a destra delll’operatore “ = “ è memorizzato (assegnato) nella variabile specificata dall’operando di sinistra .

L’Operatore di AssegnamentoL’Operatore di AssegnamentoL’Operatore di AssegnamentoL’Operatore di Assegnamento

26

L’Operatore di Divisione “ / “ effettua la divisione tra il primo operando e il secondo, il risultato è indipendente dal tipo di dati che stiamo considerando e viene approssimato in base alle seguenti regole:

Gli Operatori Aritmetici :Gli Operatori Aritmetici :Gli Operatori Aritmetici :Gli Operatori Aritmetici :L’Operatore di Divisione /.L’Operatore di Divisione /.L’Operatore di Divisione /.L’Operatore di Divisione /.

27

- se entrambi gli operandi sono positivi, il risultato sarà troncato:Esempio: ½ vale 0,5 ma per quanto detto il valore finale sarà : 0.- se entrambi gli operandi sono negativi l’approssimazione del risultato dipende dal Compilatore.

Gli Operatori Aritmetici :Gli Operatori Aritmetici :Gli Operatori Aritmetici :Gli Operatori Aritmetici :L’Operatore di Divisione /.L’Operatore di Divisione /.L’Operatore di Divisione /.L’Operatore di Divisione /.

28

Altri tipi di operatori aritmetici sono:-addizione “ + “-moltiplicazione “ * “-sottrazione “ – “

Gli operandi di questi operatori possono essere di qualunque tipo fondamentale, anche diverso uno dall’altro.

Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.

Page 8: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

29

L’operatore resto ( o modulo ) (%) permette di calcolare il resto di una divisione fra i suoi due operandi .

Esempio :Quoto = Dividendo / Divisore ;Resto = Dividendo % Divisore ;

Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.

30

L’operatore incremento ( ++ ) somma 1 al suo operando, l’operatore decremento ( -- ) sottrae 1 al suo operando.Esempio:

y = ++x ; y = x++ ;Equivale a :

x = x+1 ; y = x ;y = x; x = x+1 ;

Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.Gli Operatori Aritmetici.

31

Gli operatori logici sono :-&& ( And )-|| ( Or )-! ( Not )-> ( Maggiore )->= ( Maggiore o Uguale )-< ( Minore )-<= ( Minore o Uguale )-== ( Uguale )-!= ( Diverso )

Gli Operatori Logici.Gli Operatori Logici.Gli Operatori Logici.Gli Operatori Logici.

32

Linguaggio C Linguaggio C Linguaggio C Linguaggio C

Un primo semplice esempio:Calcolo dello spazio di frenata di

un’automobile

Page 9: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

33

Vogliamo determinare lo spazio (in metri) necessario ad arrestare un’automobile che viaggia ad una data velocità (in km/h), ipotizzando la decelerazione costante ed uguale a 7,8 m/s2

1. Analisi del problema1. Analisi del problema1. Analisi del problema1. Analisi del problema

34

Una prima rappresentazione in pseudocodice potrebbe essere la seguente:

Richiedi la velocità iniziale in km/h

Calcola lo spazio di frenata

Comunica il risultato in metri

{

}

2. Scrittura dell’algoritmo2. Scrittura dell’algoritmo2. Scrittura dell’algoritmo2. Scrittura dell’algoritmo

35

Secondo l’analisi TOP-DOWN, ogni fase può essere considerata un sottoproblema e pertanto elaborata ulteriormente. Mentre la prima e l’ultima fase sono in una forma sufficientemente semplice, per scomporre la fase Calcola lo spazio di frenata è necessario conoscere le leggi

della cinematica relativa ai moti uniformemente decelerati

Il Metodo TOPIl Metodo TOPIl Metodo TOPIl Metodo TOP----DOWNDOWNDOWNDOWN

36

Il modello matematico (formula) che descrive il fenomeno del moto decelerato è il seguente:

dVs i

2

21=

dove:s è lo spazio necessario all’arresto (in metri)Vi è la velocità iniziale (in m/s)d è la decelerazione (7,8 m/s2)

Page 10: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

37

Nel nostro caso, per poter applicare la formula precedente è necessario convertire la velocità iniziale da km/h a m/s. Chiamando ViKmh la velocità in km/h e con Vi quella in m/s si ha:

6,3iKmh

iVV =

38

In conclusione, la fase Calcola lo spazio di frenata può essere vista come:

Conversione della velocità da km/h a m/s

Calcola lo spazio di frenata

Calcolo dello spazio

{

}

39

e, in ulteriore dettaglio:

8,72

1

6,32i

iKmhi

Vs

VV

Calcola lo spazio di frenata{

}

40

L’algoritmo complessivo rimane comunque

molto semplice, la sola struttura di controllo

utilizzata è la SEQUENZA. Si vedrà adesso

come si passa dall’algoritmo (in questo caso in

pseudocodice) al programma in linguaggio C

Page 11: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

41

Ogni programma C deve sempre avere una (ed una sola) funzione main dalla quale inizia l’esecuzione del programma:

3. Scrittura del programma3. Scrittura del programma3. Scrittura del programma3. Scrittura del programma

void main()

...

...

{

}

42

Per funzione si intende un insieme di dati ed

istruzioni, delimitato da una parentesi graffa

aperta ({) e da una parentesi graffa chiusa (}),

a cui è associato un nome. La parola void che

precede il nome della funzione sta ad indicare

che questa non ha un valore

43

La traduzione del primo enunciato del nostro algoritmo:

Richiedi la velocità iniziale in km/h

sottintende, implicitamente due fasi distinte:

1. deve essere presentato sullo schermo un messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui necessitail programma e dell’istante in cuiimmetterlo. Ad esempio:

Dammi la velocità iniziale [km/h]:

44

2. Il dato deve essere effettivamente acquisito e memorizzato al fine di poterloutilizzare in un momento successivo

I linguaggi C non possiedono alcuna istruzione per la comunicazione e l’acquisizione dei dati ma, insieme al compilatore, vengono solitamente fornite un insieme di funzioni che consentono di supplire a questa mancanza. Questo insieme prende il nome di libreria standard

Page 12: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

45

Una di queste, la funzione printf, può essere utilizzata per visualizzare messaggi e dati sullo schermo.Scrivendo il seguente programma:

void main()

printf("Dammi la velocità iniziale [km/h]: ");

{

}

al momento della sua esecuzione sullo schermo comparirà il messaggio scritto tra virgolette

#include <stdio.h>

46

Il carattere punto e virgola (;) ha lo scopo

di indicare al compilatore la fine

dell’istruzione. Se viene omesso, il

compilatore interpreterà tutti i caratteri che

seguono come appartenenti ad un’unica

istruzione, con risultati spesso imprevedibili

47

#include <stdio.h>, non è

un'istruzione C ma una direttiva,

un'indicazione diretta al compilatore,

necessaria in questo caso per la corretta

utilizzazione della funzione della libreria

standard, printf

48

A questo punto è necessario che il

programma possa acquisire e memorizzare il

valore della velocità dell’automobile.

In generale, per acquisizione si intende

l’operazione mediante la quale un dato

proveniente da un’unità d’ingresso (in questo

caso la tastiera) viene ricopiato in una

variabile

Page 13: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

49

In questo caso, ad esempio, la variabile che

contiene la velocità iniziale dell'automobile,

espressa in km/h, potrebbe essere chiamata arbitrariamente ViKmh. Nulla vieterebbe di

chiamarla con un altro nome, ad esempio x,

ma è consigliato l'uso di un nome mnemonico

poiché permette di ricordare più facilmente il

dato che rappresenta50

Chiamiamo la velocità iniziale dell’automobile ViKmh e, supponendo sia un

valore appartenente all’insieme dei numeri reali, associarle il tipo float:

float ViKmh;

51

In un programma, le dichiarazioni devono precedere le istruzioni eseguibili. La dichiarazione della variabile ViKmh si scriverà quindi prima della funzione main:

#include <stdio.h>

float ViKmh;

void main(){

printf("Dammi la velocità iniziale [km/h]: ");...

} 52

A questo punto si può acquisire il valore della velocità fornito dall’utente mediante la tastiera e memorizzarlo nella variabile ViKmh. Per farlo è necessario fare ricorso ad

una delle funzioni della libreria standard, la funzione scanf. Questa funzione legge i

caratteri battuti sulla tastiera, li converte secondo il formato specificato e ne ricopia il risultato all’indirizzo di memoria indicato

Page 14: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

53

Nel nostro esempio:

scanf("%f", &ViKmh);

%f viene detto specificatore di formato e determina in che modo dovranno essere convertiti i caratteri acquisiti (in questo caso in un float)

&ViKmh rappresenta l’indirizzo di memoria in cui andrà ricopiato il dato. Il carattere &(ampersand) che precede l’identificatore ViKmh sta a significare: indirizzo di 54

Specificatore Formato

%c Carattere singolo(char)%d Intero decimale (int)%f Valore reale (float)

La tabella che segue elenca gli specificatori di

formato per i tipi fondamentali:

55

L’enunciato Richiedi la velocità iniziale in km/h dell’algoritmo di partenza potrà adesso essere completamente tradotto nel seguente programma:

#include <stdio.h>

float ViKmh;

void main(){

printf("Dammi la velocità iniziale [km/h]: ");scanf("%f", &ViKmh);

}

56

Si può adesso passare alla fase Calcola lo spazio di frenata di cui riportiamo per comodità qui sotto l'algoritmo:

8,72

1

6,32i

iKmhi

Vs

VV

Calcola lo spazio di frenata{

}

Page 15: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

57

La prima espressione:

6,3iKmh

i

VV ←

In C può essere tradotta in nel seguente modo:

Vi = ViKmh / 3.6

58

Il formalismo è molto simile a quello delle

normali espressioni aritmetiche. Nel

linguaggio C anche la modalità di scrittura,

così come i criteri adottati nella valutazione

delle espressioni, hanno origine dall'aritmetica

tradizionale

59

L'importanza delle espressioni nel linguaggio

C è rappresentata dal fatto che una qualsiasi

espressione terminata dal carattere punto e

virgola ; costituisce un’istruzione. L'azione

che ne deriva consiste semplicemente nella

valutazione dell'espressione

60

In generale, un'espressione è una

combinazione qualsiasi di operandi e

operatori che dà origine a un valore. Un

operando è uno dei valori (costante o variabile)

che viene manipolato nell'espressione.

Poiché un'operando ha un valore, ne segue

che anche gli operandi sono espressioni

Page 16: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

61

Quindi:

Sono tutte espressioni in quanto ognuna

di esse rappresenta un valore

ViKmh

ViKmh / 3.6

3.6

62

Gli operatori sono simboli (sia singoli

caratteri che loro combinazioni) che

specificano come devono essere manipolati

gli operandi dell'espressione. Ad esempio,

nel rapporto:

ViKmh e 3.6 sono gli operandi ed il carattere

/ (slash) costituisce l'operatore di divisione

ViKmh / 3.6

63

La valutazione di un'espressione avviene eseguendo le operazioni indicate dagli operatori sui loro operandi secondo le regole di precedenza degli operatori, di norma uguali a quelle dell'aritmetica tradizionale. Ad esempio, nell'espressione:

4 + 10 / 2

come consueto, sarà prima eseguita la divisione e poi l'addizione

64

Il segno = usato nell'espressione:

invece, ha lo stesso significato del segno ←←←←solitamente impiegato negli algoritmi per rappresentare l'operazione di assegnamento.Mediante questo operatore il valore a destra dell'operatore = (rvalue) è memorizzato (assegnato) nell'operando di sinistra (lvalue); quest'ultimo, pertanto deve riferirsi a una locazione di memoria modificabile

Vi = ViKmh / 3.6

Page 17: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

65

È quindi lecito scrivere:

se x è il nome di una variabile, mentre sicuramente non avrebbe nessun senso il contrario:

x = 10

10 = x

perché 10 è un valore costante e non può essere modificato

66

E` bene osservare che l'operatore di assegnamento non ha lo stesso significato del segno uguale usato in aritmetica. Pertanto, espressioni del tipo:

x = y e y = x

con x diverso da y, non sono assolutamente equivalenti: nella prima il valore di y è memorizzato nella variabile x; nella seconda, invece, sarà il valore di x ad essere assegnato a y

67

Analogamente, mentre in aritmetica non è

corretto scrivere:

x = x + 5

in C è perfettamente lecito e assume il

significato di: somma alla variabile x il

numero 5 e memorizzane il risultato (ancora)

nella variabile x68

Nell’espressione:

Vi = ViKmh / 3.6

compaiono quindi tre operandi e due operatori,

quello di assegnamento e quello di divisione.

Poiché quest'ultimo ha priorità maggiore del

primo verrà subito effettuata la divisione tra ViKmh e 3.6 e, successivamente, il risultato

sarà memorizzato nella variabile Vi

Page 18: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

69

8,72

1 2iVs ←

s = 1 / 2 * Vi * Vi / 7.8

Si vedrà, adesso, come tradurre la seconda espressione dell'algoritmo Calcola lo spazio di frenata:

In C l'operatore di moltiplicazione si indica con l'asterisco *. Non esiste, invece, nessun operatore per l'elevazione al quadrato. Pertanto, la suddetta espressione si scriverà:

70

1 / 2

Nonostante sembri corretta, il valore di questa espressione sarà, tuttavia, sempre zero. Il perché di questa singolarità sta nell'espressione:

Per valutare correttamente un'espressione, il compilatore deve conoscere il tipo di ogni operando coinvolto:

71

nel caso di variabili, il tipo è quello attribuitogli al momento della loro dichiarazione; nel caso di operandi costanti, invece, il tipo viene automaticamente assegnato in base al loro valore e di come questo è stato specificato. Ad esempio le costanti:

10234-56789

vengono automaticamente assimilate a tipi int; 72

vengono considerate dei numeri reali: la prima eccede il massimo valore per una variabile di tipo int, la seconda è chiaramente un valore reale mentre la terza, benché possa essere correttamente rappresentata da una variabile di tipo int, essendo stata specificata con una cifra decimale (anche se zero), viene considerata un valore reale

mentre le costanti:4567898586-567.489.0

Page 19: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

73

In base a queste considerazioni, nell'espressione 1/2 le costanti 1 e 2 sono quindi interpretate come operandi di tipo int.

L'operatore binario / effettua la divisione del

primo operando per il secondo.

74

viene considerato come una divisione tra interi positivi ed il risultato, ottenuto da quello reale (0,5) per troncamento è,

pertanto, zero

Quindi, per le considerazioni precedentemente fatte, il rapporto:

1 / 2

75

Il modo più semplice per ovviare a questo inconveniente è quello di trasformare una o entrambe le costanti coinvolte in costanti reali, ad esempio:

1 / 2.0

Se gli operandi coinvolti in un'espressione sono differenti, molti operatori effettuano automaticamente delle conversioni per portarli ad un tipo comune

76

Solitamente, durante questa operazione, l'operando di tipo inferiore viene convertito in quello di tipo superiore (che può rappresentare dei valori più alti).Ad esempio nel rapporto precedente sono coinvolti un operando di tipo intero (1) ed uno reale (2.0). Essendo di tipo differente, prima della divisione, il primo (di tipo inferiore) verrà automaticamente convertito nello stesso tipo dell'altro, (di tipo superiore). Il risultato della divisione sarà ancora del tipo comune, in questo caso un reale

Page 20: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

77

È possibile adesso aggiornare il programma che assume una forma quasi definitiva:

#include <stdio.h>

float ViKmh;

float Vi;

float s;

void main()

{

printf("Dammi la velocità iniziale [km/h]: ");

scanf("%f", &ViKmh);

Vi = ViKmh / 3.6;

s = (1 / 2.0) * (Vi * Vi) / 7.8;

...

}78

A questo punto, manca solo la traduzione dell'algoritmo Comunica il risultato in metri che consentirà di far conoscere

all'utente il risultato dell'elaborazione (memorizzato nella variabile s). Ciò può

avvenire utilizzando ancora la funzione printf che, grazie alla sua versatilità,

consente di presentare sullo schermo anche dati e messaggi combinati assieme

79

Ad esempio, se il valore memorizzato nella variabile s fosse 48,5, scrivendo:

printf("Lo spazio per il suo arresto e di %f metri", s);

sullo schermo apparirebbe:

Lo spazio per il suo arresto e di 48.500000 metri

Come si nota, al posto della combinazione di caratteri %f è stato stampato il valore della variabile s (di tipo float), elencato dopo la

virgola80

Come nel caso della funzione scanf, %f è

uno specificatore di formato ed ha lo scopo di

indicare il tipo di dato ed il modo nel quale

dovrà essere presentato sullo schermo.

La printf consente di presentare i dati in

uscita anche con differente precisione e

formato. Ad esempio se ne può stabilire

l'allineamento, il numero di decimali,...

Page 21: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

81

Infine, ecco il listato completo del programma:#include <stdio.h>

float ViKmh;

float Vi;

float s;

void main()

{

printf("Dammi la velocità iniziale [km/h]: ");

scanf("%f", &ViKmh);

Vi = ViKmh / 3.6;

s = (1 / 2.0) * (Vi * Vi) / 7.8;

printf("Lo spazio per il suo arresto e di %f metri", s);

}82

Benché questo programma risulti

sostanzialmente corretto, al fine di

aumentarne la leggibilità da parte di altri

programmatori (ed anche di noi stessi, dopo

un certo periodo di tempo), è bene dotarlo di

appositi commenti che lo documentino in

modo appropriato

83

Nel linguaggio C un commento inizia con la

sequenza di caratteri /* e termina con la

sequenza */:

All'interno di un commento è ammesso qualunque carattere con l'esclusione della combinazione */ che determina la fine del

commento stesso

/* Questo è un commento */

84

I commenti possono occupare anche più di

una linea di programma.

Ecco alcuni esempi di commenti:

/* I commenti possono documentare un programma*/

/*

I commenti di questo tipo, in C,

possono occupare diverse righe

*/

Page 22: L’obiettivo di oggi è quello di introdurre gli elementi ...zeus.ing.unibs.it/FI-GES/C-intro-4p.pdf · messaggio esplicativo affinché l’utente sia a conoscenza del dato di cui

85

I commenti non influenzano né la dimensione

né la velocità del programma eseguibile. E`

bene quindi, utilizzarli frequentemente al fine

di rendere più leggibile un programma. Spesso

in un programma ben scritto, i caratteri

utilizzati per i commenti sono addirittura

maggiori di quelli utilizzati per le istruzioni86

Affinché il programma appena scritto possa

essere eseguito, è necessario prima tradurlo in

una forma comprensibile al calcolatore.

Questo compito può essere svolto da appositi

programmi che fanno parte del cosiddetto

software di base. I passi da seguire possono

essere schematizzati dal diagramma di flusso

che segue:

87

Programmasorgente

Editor

Compilatore

LinkerLibrerie

Programmaeseguibile

Esempio: programma per ilcalcolo dello spazio di frenata

File sorgenteEsempio: frenata.c

.obj

.lib

File eseguibileEsempio: frenata.exe

88

I programmi descritti possono differire a

seconda delle implementazioni.

Esistono anche delle versioni che racchiudono,

nello stesso ambiente di sviluppo, le

funzionalità di tutti questi strumenti. Esempi

tipici sono gli ambienti IDE (Integrated

Development Enviroment) Microsoft Visual

C++ e Borland C++