La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1,...

35
3 January 2004 1 La machina C++ Poiché è difficile interagire con le macchine direttamente nel loro linguaggio, per programmare si usano dei linguaggi di programmazione di alto livello e successivamente dei compilatori o degli interpreti su una determinata macchina. Occorre definire allora una macchina logica con la quale eseguire i nostri programmi. La nostra macchina virtuale, detta anche macchina C++ è composta da: un esecutore; una memoria delle istruzioni; una memoria dei dati; un ambiente; dei canali di Input/Output. L'esecutore nella macchina C++ ha il compito di prendere un’istruzione alla volta e di eseguirla. La memoria delle istruzioni è una memoria a sola lettura contenente le istruzioni. Ogni cella di questa memoria contiene esattamente un comando, che può al suo interno contenere altri comandi, disposti in altrettante sottocelle. In questo caso il comando è detto complesso.

Transcript of La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1,...

Page 1: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 1

La machina C++

Poiché è difficile interagire con le macchine direttamente nel loro linguaggio, per programmare si usano dei linguaggi di programmazione di alto livello e successivamente dei compilatori o degli interpreti su una determinata macchina.

Occorre definire allora una macchina logica con la quale eseguire i nostri programmi. La nostramacchina vir tuale, detta anche macchina C++ è composta da:

•un esecutore;•una memor ia delle istruzioni;•una memor ia dei dati;•un ambiente;•dei canali di Input/Output.

L 'esecutorenella macchinaC++ ha il compito di prendere un’ istruzione alla volta edi eseguirla.

La memor ia delle istruzioni èuna memoriaasola letturacontenente le istruzioni. Ogni cella di questa memoria contiene esattamenteun comando, che può al suo interno contenere altri comandi, disposti in altrettante sottocelle. In questo caso il comando èdetto complesso.

Page 2: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 2

La memor ia dei dati èuna memoria in letturaescrittura, suddivisa in celle(contenitor i, locazioni). Ogni cella contiene dati semplici ed èaccessibile direttamente tramite il suo indirizzo, dato in formanumerica.

Ad ogni cella inoltreèassociato il tipo di dato contenuto.

memor ia: insieme di contenitori di valori identificabili daun nome

L'ambienteèuna memoria contenente una lista di celle, che viene gestitaapila (le informazioni possono solo essere aggiunte o tolte, ma mai modificate).

L'ambiente contiene l’ informazioneper associare i nomi delle variabili con lalocazione nella memoria dei dati, ladefinizione dei tipi di dato complesso e ladefinizione delle funzioni. Per consumare meno spazio, useremo una notazione basata su parentesi.

I canali di Input/Output descrivono in modo logico sia i dispositivi di Input/Output delle macchine vere, sia le informazioni contenute nella memoria di archiviazione. Anchesequesta parte della macchinaC++ risulta indispensabile quando vogliamo comunicarecon l'utente, per i scopi del nostro corso non èmolto importante(tranneper testare i nostri programmi) everrà di conseguenza trattatasolomarginalmente.

Page 3: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 3

esempio di una particolare istanza in una macchina C++

Page 4: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 4

Memoria dei dati:

• insieme di contenitori (locazioni)

• ogni contenitore :

1) contiene la rappresentazione di un valore

2) è identificato daun nome

alcuni contenitori hanno nomi predefiniti :

INT_MAX

INT_MIN

DBL_MAX

DBL_MIN

Page 5: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 5

Altri nomi sono definiti dall’utente (identificatori):

• iniziano con una lettera alfabetica

• che può essere seguita da una qualsiasi

combinazione di lettere, cifre e carattere _

• maiuscole e minuscole sono differenti!

primonome � OK

primoNome � OK

1nome � errato

sconto_in_% � errato

Numero2 � OK

Max dim � errato

suggerimento: usare nomi significativi

Page 6: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 6

quali valori sono memorizzabili nelle locazioni?

• Z : interi relativi (INT_MIN ≤ n ≤ INT_MAX)

• R : reali (FLT_MIN ≤ |x| ≤ FLT_MAX)

• B : {vero, falso}

• Ch : {a, b, c,…, z, A, B, …, Z, !, ?, ;, % …}

rappresentati come?

• Z : rappresentazione decimale (-312 42 …)

• R : rappresentazione con punto o esponenziale

(-0.251 3001.23 1.23e-12 …)

• B : {true, false}

• Ch : {'a', 'b',…, 'z', 'A', 'B', …, 'Z', '!', '?', ';', '%'…}

nota: 2 2.0 '2‘ rappresentano cose diverse !!!!

(tipi di dato primitivi in C++):

int double bool char

Page 7: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 7

Cominciamo oraavedere come è fatto un programmaC++

#include …….

dichiarazione1;

...

dichiarazioneN1;

int main()

{ dichiarazione1;

...

dichiarazioneN2;

comando1;

...

comandoN3;

}

Le dichiarazioni e i comandi sono separati da (;) esono su righediverse solo per una buona leggibilità (quindi il programma potrebbe essere scritto solo su una riga).

Definizione ambiente

Definizione algoritmo

Page 8: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 8

Oltre alle informazioni utili, il programma può contenere anche dei commenti.Questi vengono ignorati dal compilatore/interprete. Essi servono solo al programmatoreper ricordarsi lecose cheha in mente di fare in modo che le successivemodifiche risultino più facili. I commenti cominciano con // e finiscono alla finedella riga.

#include …….

dichiarazione1; // dichiarazioni iniziali

...

dichiarazioneN1;

int main() // la funzione main

{dichiarazione1; // altre dichiarazioni

...

dichiarazioneN2;

comando1; // qui cominciano i comandi

...

comandoN3;

}

Page 9: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 9

La primacosa che vediamo èche ogni programmaC++ hauna funzione di nome main.

Vedremo in dettaglio le funzioni nelle lezioni future, per il momento ci basta sapere che ogni programmaC++ deve avere una funzione main che viene eseguita quando parte il programma.

Il programmaC++ più corto che possiamo scrivereè il seguente:

int main() { }

Page 10: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 10

Nella machina C++ ogni informazioneha associata unao più celle nella memoria dei dati enell'ambiente un identificatore (o nome) e un tipo.

Con la dichiarazione instauriamo appunto questo legame, riservando se serve le locazioni di memoriae chiamando queste locazioni create “variabili” .

La sintassi di una dichiarazione è laseguente:

tipo identificatore

con lasemantica di associare il tipo tipo all’ identificatore identificatore, inserendo nell'ambienteun elemento di questo genere:

(identificatore,tipo)

riservando lecelle di memorie necessarieacontenereun informazione di questo genere.L’ identificatore (nome) può essere una qualunque sequenza di simboli

allfanumerici (0..9, a..z, A..Z) o dal carattere sottolineato (_) e non deve iniziarecon unnumero.

Per quanto riguarda i tipi, vediamo per cominciare i tipi semplici (cheoccupano una locazione di memoria):

• int• float• bool• char

Page 11: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 11

Vediamo adesso un esempio di un programma che comprende anche delle dichiarazioni:

int x;int main(){float y;

}

Questo programma alloca due celle di memoria, una di tipo int e una di tipo float, ma comunque non fa niente altro, dato che non contiene nessun comando.

Page 12: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 12

Cominciamo quindi adefinire i comandi.

Il comando più semplice consiste nell’assegnazione di un valoread una variabile; la sintassi e’ la seguente:

identificatore = valore

con il significato di inserire nella cella identificata da identificatore il valore valore(dimenticandosi del contenuto precedente nella stessa cella!)

Vediamo un esempio:

int x;int main(){

float y;x = 10;y = 1.0;x = 5;

}

Alla finedell’esecuzionedel programma, x conterrà 5e y conterrà 1.0, e non ci sarà alcuna traccia di eventuali valori intermedi.Aggiungiamo adesso, che valore può essere sia un numero, sia un espressione aritmetica, tipo:

o

Page 13: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 13

Le constanti dei tipi semplici

Per scrivere le costanti degli interi si usa lasolita rappresentazione posizionalecon segno in base 10.esempio: 5

0-3245

Per quanto riguarda i numeri in virgolamobile, anchequi la rappresentazione puòessere quella posizionale in base 10, con il punto (.) che separa laparte intera da quella frazionaria.

Ad esempio: -1.4 2345.12 0.0000234

Ma esiste anche lapossibilitàdi usare lanotazione scientifica: aggiungendo al numero in formato posizionale una e (o E) seguita dall'esponente.

Ad esempio: 1.2e23 = 1.2*1023 : 1324.1E-4 = 1324.1*10-4

-0.001e3 = -0.001*10-3

Page 14: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 14

Per quanto riguarda i valori logici, i valori possibili sono solo due e hanno una sintassi precisa:

• true indica il valore vero;• false indica il valore falso;

Per i caratteri, le costanti hanno la seguente sintassi:un apice singolo (') seguito dalla lettera e ancora un altro apice singolo (').

'a' 'Z' '1' ' 'Questa sintassi va bene per rappresentare quasi tutti i caratteri stampabili, escluso l'apice singolo stesso, inoltre ci sono anche dei caratteri non stampabili che dovremo usare. Per questo motivo esistono delle combinazioni di caratteri speciali perrappresentare questi simboli:'\'' - apice singolo (')'\"' - apice doppio (")'\t' - tabulatore'\n' - "nuova linea"'\0' - il carattere nullo (non '0')'\\' - il carattere \

Page 15: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 15

Se nel nostro programma ci sono molte variabili:

int a;

int b;

int c;

int d;

int e;

invece di definirle separatamenteusiamo la notazioneC++ :

tipo idf1,…,idfn;

che nel nostro caso diventa:

int a,b,c,d,e;

con risparmio di spazio e miglioramento della leggibilità del programma.

Page 16: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 16

Un possibile potenziale problema delle dichiarazioni, come leavevamo introdotte inizialmente, èche levariabili così createcontengono un valorenon definito.

Potrebbe quindi succedere che il nostro programma legge il contenuto di alcune di queste variabili, primacheun qualsiasi valorevi sia stato scritto;

ad esempio:

Questo programmasebbene lecito ha un comportamento indefinito. Alla fine del programma il valore di a sarà ugualea 3, mentre b potrebbe contenereun valore qualsiasi.

Page 17: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 17

Per evitare questi incidenti, si possono usare ledichiarazioni con inizializzazione:tipo idf = valoretipo idf = espressione

Ad esempio:int a = 10;float b = 2.2;

Ovviamente le dueestensioni che abbiamo introdotto si possono combinare,ottenendo:

tipo idf1 = val1, ..., idfn = valndove tutte le inizializzazioni sono facoltative, quindi anche qualcosadel genere:

tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valnèperfettamente lecito.Vediamo un esempio:

int a,b=12,c,d,e=1;

Page 18: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 18

Un ultima considerazione riguarda le variabili chenon cambiano mai valore ovvero le costanti.

Ovviamente ci si può domandareacosaserveuna variabile costante.L'uso più comuneèquello di dare un nomeadelle informazioni note a priori,

come ad esempio 3.1415926, senza doverlo ogni volta scriverecon lasua rappresentazione .

Dato che il valore di una costantenon deve cambiare nel tempo, sarebbeutile se fossevietato cambiare talevalore, magari ancheper sbaglio.Vediamo un esempio:

int main(){ float pi = 3.14159, r = 10.0, r2=23.0;

float area, circonferenza, circonferenza2;area = pi*r*r;pi = 2*pi;circonferenza = pi * r;circonferenza2 = pi * r2;

}Qui abbiamo ridefinito pi per risparmiarci un operazione nel calcolo della

circonferenza. Così come èscritto lacosa funziona, macosa succederebbe, sedecidessimo di calcolare ora anche lasecondaarea?

Page 19: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 19

Uno probabilmente scriverebbe qualcosadel genere:

int main()

{ float pi = 3.14159, r = 10.0, r2 = 23.0;

float area, circonferenza, circonferenza2, area2;

area = pi * r * r;

pi = 2 * pi;

circonferenza = pi * r;

circonferenza2 = pi * r2;

area2 = pi * r2 * r2;

}

il cheovviamenteèsbagliato, perché pi non rappresenta r più ma 2*r!

In un esempio così l'errore salta subito all'occhio (perchéc’è lo dicono!) ma in unprogramma di qualche migliaio di righe lacosa può non essere tanto ovvia.

Page 20: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 20

Per evitare problemi di questo genere, si dichiarano lecostanti con laseguente sintassi:const tipo idf = valore

ovviamente lacosa si può estenderecomevisto sopraconst tipo idf1 = valore1, ..., idfn=valoren

nel qual caso tutte gli identificatori rappresentano delle costanti equindi tentare di assegnareun valorea tali identificatori risulterà in un errore.

Notate che nel caso delle costanti èobbligatorio l'uso dell'inizializzazione. Dato chead una costantenon èpossibile assegnare alcun valore, se non fosse

inizializzata, sarebbe una costante dal valore indefinito, il che naturalmente non avrebbe alcun senso.

Page 21: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 21

Nella dichiarazione semplicesi allocacano lecelle necessarie nella memoria dei dati esi inserisceun elemento del tipo (idf,tipo) nell'ambiente.

Quando si dichiaria più di una variabile nella stessa dichiarazione, si vàadallocare lecelle necessarieper tutte levariabili e si inserisce nell'ambiente n elementicomenel caso delle dichiarazioni semplici.

L'ordinecon cui gli elementi vengono messi nell'ambientenon èdefinito a priori epuò quindi essere uno qualunque, anchese useremo l'ordine che avremo dato allocando levariabili unaad una da sinistra adestra.

Nel caso di dichiarazioni con inizializzazione, lasemanticaè lastessa con inpiù l'inserimento del valore all'interno della/ecella/eallocata/e. Nel caso di inizializzazioni multiple, anchequi l'ordine può essere uno qualunque, pertanto levariabili non dovrebbero inizializzarsi in cascatacomenell'esempio:

int a=1,b=a+1,c=b+1dato che il risultato è indefinito.

Come ultima cosa, vediamo qual'è lasemantica delle dichiarazioni di costanti.Anche qui le cosenon cambiano molto; in realtà, dal punto di vistasemantico, ladichiarazione di una (o più) costanteedi una(o più) variabile sono lastessa cosa, cambia solo il tipo associato all'identificatore, che nel caso delle costanti è const tipo, equindi l'elemento inserito è (idf, const tipo)! Tutti i successivi controlli si basano quindi semplicemente sul tipo.

Page 22: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 22

int: insieme di valori Z = { … , -2, -1, 0, 1, 2, …} ; B = {true, false}

operatori + : Z → Z (unario)

- : Z → Z (unario)

* : Zx Z → Z (prodotto)

/ : Z x Z → Z (divisione intera)

% : Z x Z → Z (resto)

+ : Zx Z → Z (somma)

- : Zx Z → Z (sottrazione)

< : Zx Z → B (minore)

<= : Zx Z → B (minore uguale)

> : Zx Z → B (maggiore)

>= : Zx Z → B (maggiore uguale)

== : Zx Z → B (uguale)

!= : Zx Z → B (diverso)

Page 23: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 23

++ : Z → Z (incremento di 1)

-- : Z → Z (decremento di 1)

5/-2 → -2 10/3 → 3 -5/2 → -2

5%-2 → 1 12%5 → 2 -5%2 → -1

esempio: quante ore e minuti in 375 minuti? 375/60 → 6 (ore)

375%60 → 15 (minuti)

++ e -- si applicano solo a variabili : (++5 → errore)

int i, j;

i -7 ++i → i – 6

j 6 --j → j 5

Page 24: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 24

Gli operatori sono qui raggruppati in ordine di precedenza;cioè, gli operatori delle classi più alte vengono eseguiti primadi quelli delle classi più basse (ameno di parentesi); in caso di parità, viene eseguito prima l'operatore più asinistra.

Vediamo un esempio:-5 + 2 * -6 equivalea (-5) + (2 * (-6))

5+7-4 equivalea (5+7)-4In caso di numeri negativi per definizione si ha:

Page 25: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 25

double (oppure float ) : insieme di valori R; B = {true, false}

operatori + : R → R (unario)

- : R → R (unario)

* : R x R → R (prodotto)

/ : R x R → R (divisione)

+ : R x R → R (somma)

- : R x R → R (sottrazione)

< : R x R → B (minore)

<= : R x R → B (minore uguale)

> : R x R → B (maggiore)

>= : R x R → B (maggiore uguale)

== : R x R → B (uguale)

!= : R x R → B (diverso)

Page 26: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 26

5.0/2.0 � 2.5

5.0/3.0 � 1.66...67

(approssimazione! quante cifre? dipende dalla macchina …)

Page 27: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 27

bool : insieme di valori B = {true, false}

operatori ! : B → B (NOT negazione logica )

== : B x B → B (uguaglianza)

!= : B x B → B (diverso)

&& : B x B → R (AND congiunzione logica)

!! : B x B → R (OR disgiunzione logica)

Page 28: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 28

char :insieme di valori Ch = { ' a' , ' b' , ' c ' , …}

operatori == : Ch x Ch → B (uguale)

! = : Ch x Ch → B (diverso)

Page 29: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 29

E’ da notare che gli operatori && e || valutano la parte a destra solo se serve.

Infatti sappiamo se la laparte sinistra di un AND è falsa, anche l'intera espressione sarà falsa indipendentemente dal valore della parte destra. Discorso analogo si può farequando laparte sinistra di un OR èvera.

Questo comportamento si può sfruttareper valutare espressioni che in alcuni casi non hanno senso (ad esempio ladivisioneper 0), comenell'esempio:

Infatti seavessimo scritto:

o

in alcuni casi avremmo avuto un errore durante l'esecuzionedel nostro programma!

Page 30: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 30

espressione → combinazione di :

operatori operandi chiamate di funzione

↓ ↓ ↓

di relazione valori espliciti non ancora viste

associati a nomi di variabili

tipi di dato nomi di costanti

una espressione ha:

• un valore

• un tipo (int, double, char, bool)

Page 31: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 31

esempio:

double x, y ;

int i, j ;

char c ;

x 5.34

y 2.0

i 2

j 12

c 'A'

valore tipo

↓ ↓

x/y+3.0 5.67 double

i+j*(i+j) 170 int

i+j*i+j 38 int

Page 32: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 32

nota: il tipo di una espressione viene convertito nel tipo della variabile destinazione prima di fare l’assegnamento

double x, y ;

int i, j ;

char c ;

i = 25; nessuna conversione

x = 0.5; " "

c = 'b'; " "

x = 4; conversione in 4.0

i = 3.2; conversione in 3 (perdita di informazione)

x = 11/5;?

x = 11.0/5; ?

Page 33: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 33

#i ncl ude <i ost r eam. h>

mai n( )

{ i nt i ;

char c;

doubl e x;

cout <<" scr i vi un i nt er o, un

car at t er e, un r eal e \ n" ;

c i n >> i >> c >> x;

cout <<" i val or i l et t i sono: "

<<i <<' ' <<c<<' ' <<x<<' \ n' ;

}

Page 34: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 34

Sintassi esemantica dei linguaggi formali

Un linguaggio non è una semplice nomenclatura, fatta di simboli isolati (singole parole).

Specificato un alfabeto di simboli e un lessico (le parolecostruite con il dato alfabeto), un

linguaggio (in seguito: L) èciò che risulta seguendo le istruzioni di una macchina chiamata

“grammatica”, laquale genera frasi (enunciati, proposizioni) apartire da espressioni

(opportune sequenze finitedi parole).

La sintassi di un L è l’ insieme delle regole “grammaticali” che specificano in quali modi le

parole si possono combinare tra loro per generare frasi, e in quali modi le frasi semplici si

possono combinare per generare frasi complesse. Invertendo la procedura, la sintassi

permette di analizzare una qualsiasi sequenza finita di parole edi deciderese la sequenza

appartiene o no all’ insieme delle frasi.

La semantica è l’ insieme di regole che governano l’ interpretazione delle parole e delle frasi,

stabilendo quale ne sia il significato.

La formulazione rigorosa di un problema e ladefinizione di un automa per risolverlo hanno

bisogno di un L più preciso di quello parlato nellavitadi tutti i giorni.

Il L naturale (come l’ italiano) consente di formare frasi complesse la cui struttura sintattica non

è univocamente definita; ammette espressioni vaghe (dal significato incerto) ed espressioni

ambigue (con più significati); èusato per parlare delle cose più diverse, soggette amolti tipi di

influenze esterne; esprime conoscenze mutevoli su stati di cose e istruzioni ellitticheper

eseguire i più vari tipi di azioni.

Page 35: La machina C++ Poiché è difficile interagire con le ... · tipo idf1 = val1, idf2, idf3=espr1, ..., idfn = valn è perfettamente lecito. Vediamo un esempio: int a,b=12,c,d,e=1;

3 January 2004 35

b) imparare a interagire con la macchina C++

usare il linguaggio C++

i suoi elementi linguistici sono:

(corrispettivo nel ling. naturale)

• identificatori (nomi)

• operatori (verbi, predicati)

• espressioni (elementi di frasi)

• comandi (frasi)

• blocchi (paragrafi)