• Non ci sono risultati.

Elementi di Base Parte 3

N/A
N/A
Protected

Academic year: 2021

Condividi "Elementi di Base Parte 3"

Copied!
24
0
0

Testo completo

(1)

G. Mecca – mecca@unibas.it – Università della Basilicata

Programmazione Procedurale in Linguaggio C++

Elementi di Base Parte 3

Istruzioni di Assegnazione

versione 2.1

Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Sommario

m

Introduzione

m

Istruzioni di Assegnazione in C++

m

Compatibilità tra i Tipi

m

Espressioni in C++

ðOperandi e Operatori ðFunzioni Predefinite

ðValutazione delle Espressioni

m

L’Operatore di Cast

Elementi di Base: Assegnazioni >> Sommario

(2)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 3

Introduzione

m

Assegnare un valore ad una variabile

ðprimo modo: istruzione di assegnazione ðsecondo modo: lettura del valore da un

dispositivo esterno (es: tastiera o file)

m

Istruzioni di assegnazione

ðfunzionalità essenziale di ogni linguaggio ðservono ad effettuare calcoli e a conservare i

risultati nelle variabili

Elementi di Base: Assegnazioni >> Introduzione

Istruzione di Assegnazione in C++

m

Due elementi principali

ðvariabile (parte sinistra) ðespressione (parte destra)

m

Esempio:

cerchio = raggio * raggio * pigreco;

m

Intuitivamente:

ðcalcola il valore dell’espressione e lo assegna alla variabile

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

(3)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 5

Istruzione di Assegnazione

m

Sintassi

<nomeVariabile> = <espressione>;

m

Dove

ð<nomeVariabile> è un identificatore ð= è l’operatore di assegnazione

ð<espressione> è una formula per il calcolo di un valore (>>)

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

Istruzione di Assegnazione

m

Semantica

ðattenzione: il simbolo di uguale non deve essere inteso come un simbolo di equazione ðl’istruzione ha una precisa semantica

m

Semantica “operazionale”

ðdescrive le operazioni effettuate dal processore per eseguire l’istruzione

ðper interpretare le istruzioni è necessario attenersi alla semantica operazionale

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

(4)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 7

Istruzione di Assegnazione

m

Semantica “operazionale” dell’assegnaz.

ðviene calcolato il valore dell’espressione a partire dai valori delle costanti e delle variabili ðse il valore risultante è compatibile con il tipo della variabile, viene assegnato alla variabile (ovvero: il valore viene scritto nello spazio di memoria associato alla variabile)

ðaltrimenti si genera un errore

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

Istruzioni di Assegnazione

m

Calcolo del valore dell’espressione

ðil processore applica gli operandi agli

operatori

ðprelevando gli opportuni valori dalla memoria (costanti simboliche, variabili)

m

Nota sul calcolo dell’espressione

ðil calcolo viene effettuato utilizzando registri di lavoro interni al processore

ðe non modifica il valore degli operandi

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

(5)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 9

Istruzione di Assegnazione

m

Esempi:

int a, b, c;

b = 1;

a = b * 3;

a = abs(-2) + 5;

a = a + 1;

b = c ; // *nb*

Elementi di Base: Assegnazioni >> Istruzioni di Assegnazione

...

#1004

#1003

#1002

#1001

#1000 ...

Memoria RAM

b a

c

129384 234 56321

3

ATTENZIONE: dopo aver cambiato il valore di b con l’ istruzione b = c il valore di a NON cambia

(NON si tratta di equazioni matematiche)

Processore

R1 R2 1

3 2 7 78

56321

8

Compatibilità tra i Tipi

m

Caso a

ðil tipo del risultato dell’espressione è lo stesso della variabile

ðes: int a, b;

b = 10;

a = b * 12 - 34;

ðes: float a, b;

b = 10.1;

a = b * 12.0 / 34;

Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi

(6)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 11

Compatibilità tra i Tipi

m

Caso b

ðil tipo del risultato dell’espressione è diverso dal tipo della variabile

ði due tipi sono tipi numerici (interi o reali)

m

In questo caso

ðavviene una conversione implicita del valore dell’espressione

ðl’assegnazione viene effettuata comunque

Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi

Compatibilità tra i Tipi

m

Il valore dell’espressione è convertito nel tipo della variabile

m

Due possibili tipi di conversione

ðAmpliamento: conversione da un tipo meno generale ad un tipo più generale

es: valore intero per variabile float

ðTroncamento: caso contrario al precedente es: valore float per variabile intera

Elementi di Base: Assegnazioni >> Compatibilità di Tipi

(7)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 13

Compatibilità tra i Tipi

m

Ampliamento

float c; double d;

c = 10; // il valore di c è 0.1E+2 d = 1; // il valore di d è 0.1E+1 m

Troncamento

int a;

a = .12e+4; // il valore di a è 1200 a = 2.32; // il valore di a è 2

Elementi di Base: Assegnazioni >> Compatibilità tra i Tipi

ATTENZIONE il troncamento produce una perdita

di valore

Espressioni

m

Formule per il calcolo di un valore

ðcomposte di operandi e operatori

m

Operandi

ðcostanti ðvariabili

m

Operatori

ðoperatori predefiniti ðfunzioni predefinite

Elementi di Base: Assegnazioni >> Espressioni

(8)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 15

Espressioni

m

Supponendo

int a, b;

const float pigreco = 3.14;

m

Esempi di espressioni

a + b * 34 + pigreco a + exp(b)/12

a 18

pigreco

Elementi di Base: Assegnazioni >> Espressioni

ATTENZIONE:

stiamo facendo esempi di espressioni, non di

istruzioni complete

Operatori Predefiniti

m

Operatori aritmetici

ðtipo intero

ðtipo reale

m

Operatori booleani

ðtipo bool

m

Operatori di confronto

ðper tutti i tipi

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

(9)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 17

Operatori aritmetici

m

Tipo Intero

ð operatori: +, - , *

ð operatore / (divisione intera), % (modulo)

m

Operandi e risultato di tipo intero

ð esempio:

int i,j;

j = i + 1;

i = 22 / 6; // NOTA: i è uguale a 3 j = 22 % 6 // j è uguale a 4

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

Operatori aritmetici

m

Tipo Reale

ð operatori: +, - , *, /

m

Operandi e risultato di tipo reale

ð esempio:

float x,y;

x = y * 3.14 + 0.33e+2;

y = 22.0 / 6.0; //NOTA: y vale 3.66667 y = 22.0 / 6; //NOTA: y vale 3.66667

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

(10)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 19

Operatori aritmetici

m

Due operatori particolari su interi e reali

ð ++ incremento; a++ coincide con a = a+1 ð -- decremento; a-- coincide con a = a-1;

m

Esempio:

float x; int y;

x = 1; y = 2;

x++; // equivalente a x = x + 1 y--; // equivalente a y = y - 1;

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

Operatori aritmetici

m

Altre forme di assegnazione compatta

ð+= a+=b coincide con a = a+b

ð-= a-=b coincide con a = a-b ð*= a*=b coincide con a = a*b ð/= a/=b coincide con a = a/b

m

Esempio:

float x; int y;

x = 1; y = 2;

x += y; // equivalente a x = x + y

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

(11)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 21

Operatori Booleani

m

Operatori su valori di tipo bool

ðservono a combinare valori vero/falso

m

Operatore AND: &&

ðvero se entrambi gli operandi sono veri

m

Operatore OR: ||

ðvero se almeno uno degli operandi è vero

m

Operatore NOT: !

ðvero se l’unico operando è falso

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

Operatori Booleani

m

Utilizzo

ðnella verifica di “condizioni”

ðstrutture di controllo (>>)

m

Semantica degli operatori booleani

ðsi descrive attraverso le tabelle di verità ðrisultato dell’operatore in corrispondenza di

tutti i possibili valori degli operandi

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

(12)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 23

Operatori Booleani

m

Tabella di verità dell’operatore && (AND)

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

false true

false

true true

true

false false

true

false false

false

op1 && op2 op2

op1

Operatori Booleani

m

Tabella di verità dell’operatore || (OR)

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

true true

false

true true

true

true false

true

false false

false

op1 || op2 op2

op1

(13)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 25

Operatori Booleani

m

Tabella di verità dell’operatore ! (NOT)

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

false true

true false

!op1 op1

ATTENZIONE:

gli operatori booleani non cambiano il valore degli operandi a cui si applicano

Esempio:

bool a, b;

a = true;

b = !a; // a continua ad // essere true

Operatori di confronto

m

Operatori: ==, !=, >, >=, <, <=

ðconfrontano due operandi di tipo compatibile ðrestituiscono un valore booleano

m

Supponendo

int a, b; float p1, p2;

a = 1; b = 2; p1 = 3.41; p2 = 5.0;

Le seguenti sono espressioni valide:

a == b // restituisce false a != b // restituisce true p1 >= p2 // restituisce false

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

(14)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 27

Operatori di confronto

m

L’ordinamento tra i valori alfanumerici è

ðbasato sui codici ASCII

ðlessicografico (cifre, maiuscole, minuscole)

m

Supponendo:

char let1, let2, let3;

let1 = ‘c’; let2 = ‘V’; let3 = ‘A’;

Le seguenti sono espressioni valide:

let1 < let2 // restituisce false let3 < let2 // restituisce true let1 < ‘2’ // restituisce false

Elementi di Base: Assegnazioni >> Espressioni >> Operatori

Funzioni Predefinite

m

Funzioni ad argomenti interi e risultato intero

ðvalore assoluto di x: abs(x)

m

Esempio

int num = - 3;

int x;

x = abs(num); // x vale 3

Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite

(15)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 29

Funzioni Predefinite

m

Funzioni ad arg. numerici e risultato reale

ðradice quadrata di x: sqrt(x)

ðvalore assoluto di x: fabs(x)

ðelevamento a potenza xy : pow(x,y) ðesponenziale ex: exp(x)

ðseno di x: sin(x) ðcoseno di x: cos(x)

ðarcotangente di x: atan(x)

Elementi di Base: Assegnazioni >> Espressioni >> Funzioni Predefinite

Valutazione delle Espressioni

m

Determinare il valore di una espressione

ðregole complesse

m

Bisogna tenere in conto

ðprecedenza degli operatori ðassociatività degli operatori ðutilizzo delle parentesi ðconversione implicita di tipo

Elementi di Base: Assegnazioni >> Espressioni >> Valutazione

(16)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 31

Precedenza degli Operatori

m Funzioni predefinite, NOT booleano !, ++, --

m Operatori moltiplicativi: *, /, %

m Operatori additivi: +, -

m Operatori di relazione: <, >, <=, >=

m Operatori di uguaglianza-disuguaglianza: ==, !=

m AND booleano: &&

m OR booleano: ||

m Assegnazione: =

Elementi di Base: Assegnazioni >> Espressioni >> Valutazione

m

Associatività

ðgli operatori con lo stesso livello di

precedenza vengono valutati normalmente da sinistra verso destra

ðesistono operatori associativi a destra

m

Utilizzo delle parentesi

ðle parentesi alterano l’ordine di valutazione ðattenzione: solo parentesi tonde

ðes: a + b + c rispetto ad a + (b + c)

Elementi di Base: Assegnazioni >> Espressioni

Valutazione delle Espressioni

(17)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 33

m

In concreto

ðle regole sono difficili da ricordare

m

Regola pragmatica

ðutilizzare sempre le parentesi per essere sicuri dell’ordine di valutazione

m

Esempio

annoCorso == 1 && matricola > 15687 (annoCorso == 1) && (matricola > 15687) ((annoCorso == 1) && (matricola > 15687))

Elementi di Base: Assegnazioni >> Espressioni

Valutazione delle Espressioni

ATTENZIONE:

solo parentesi tonde

Espressioni: Esempi

int i, j, k;

bool b;

float f;

i = 3; j = 7;

k = (i * 17) – ((193 % 19) * exp(0));

k = ((4 / i) * 127) / cos(0);

b = (i + j) < 10;

b = ((i < j) || (i == 7)) && (j != 10);

b = (i = 7) && (i > 2);

b = (i == 7) && (i > 2);

f = (i + j) / 3;

f = (i + j) / 3.0;

Elementi di Base: Assegnazioni >> Espressioni

k vale 48 k vale 127 b vale false b vale true

f vale 3 f vale 3.3333 b vale true ATTENZIONE

errore frequente Il compilatore stampa un avviso Warning W8060 H:\tmp\expr.cpp 16:

Possibly incorrect assignment in function main()

b vale false

(18)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 35

Operatore di Cast

m

Una postilla sulla valutazione delle espr.

ðogni dato trattato dal processore ha un tipo ðalcuni valori possono essere considerati di

tipi diversi

m

Esempio: il numero 1

ðvalore di tipo bool ðvalore di tipo int ðvalore di tipo float ðvalore di tipo double

Elementi di Base: Assegnazioni >> Operatore di Cast

ATTENZIONE al concetto di cast

Operatore di Cast

m

In questi casi

ðil valore può essere soggetto a conversioni di tipo

m

Conversioni di tipo

ðconsistono nella trasformare la

rappresentazione in memoria del valore ðche da quel momento è considerato di tipo

diverso rispetto al suo tipo originale

Elementi di Base: Assegnazioni >> Operatore di Cast

(19)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 37

Operatore di Cast

m

Normalmente

ðle conversioni di tipo vengono effettuate automaticamente dal processore

ðtroncamenti e ampliamenti

m

Ma

ðè indispensabile fare attenzione a queste trasformazioni automatiche

Elementi di Base: Assegnazioni >> Operatore di Cast

Operatore di Cast

m

Un esempio

ðil calcolo della media aritmetica dei valori di un insieme di numeri interi

ðsupponiamo che sia data la somma ed il numero di valori dell’insieme

ðvogliamo calcolarne la media aritmetica ðesempio: se la somma è 22 e i valori sono

3, la media vale 7.33333

Elementi di Base: Assegnazioni >> Operatore di Cast

(20)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 39

Operatore di Cast

m

Un esempio

int sommaValori = 22;

int numeroValori = 3;

float media;

media = sommaValori / numeroValori;

cout << media;

Elementi di Base: Assegnazioni >> Operatore di Cast

in questo caso:

- viene calcolata la divisione intera (es: 22 / 3 = 7) - il risultato intero viene ampliato a float (da 7 a 7.0) - il valore ampliato viene assegnato a media (7.0) di conseguenza il risultato stampato non è quello atteso

7

Operatore di Cast

m

Per risolvere il problema

ðI soluzione: dichiaro sommaValori come variabile di tipo float (inappropriato) ðII soluzione: costringo il processore a

trasformare sommaValori in un float prima della divisione >> operazione di cast

m

Operazione di “Cast”

ðchiede esplicitamente di trasformare la rappresentazione e il tipo di un valore

Elementi di Base: Assegnazioni >> Operatore di Cast

(21)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 41

Operatore di Cast

m

Operatori di Cast

ðl’operazione viene realizzata attraverso opportuni operatori unari

ðun operatore per ciascun tipo

m

Esempio

ðes: float x; bool b;

x = (float) 1;

b = (bool) x;

Elementi di Base: Assegnazioni >> Operatore di Cast

dato di tipo int, valore 1 dato di tipo float, valore 1.0 dato di tipo bool, valore true

Operatore di Cast

m

Sintassi

ð(<tipo>)<valore>

m

Semantica

ðil processore trasforma la rappresentazione in memoria del <valore> nella

corrispondente rappresentazione del <tipo>

specificato

ðil risultato dell’applicazione dell’operatore di cast è un valore del <tipo> specificato

Elementi di Base: Assegnazioni >> Operatore di Cast

(22)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 43

Operatore di Cast

m

Nel nostro esempio

int sommaValori = 22;

int numeroValori = 3;

float media;

media = ((float)sommaValori) / numeroValori;

cout << media;

Elementi di Base: Assegnazioni >> Operatore di Cast

7.3334

in questo caso:

- il valore di sommaValori viene ampliato a float (da 22 a 22.0) - viene calcolata la divisione decimale (7.3334)

in questo caso il risultato è corretto

Operatore di Cast

m

Attenzione

ðl’operatore ha priorità molto alta ðattenzione all’ordine di applicazione

Elementi di Base: Assegnazioni >> Operatore di Cast

media = ((float)sommaValori)/numeroValori;

cout << media;

media = (float)sommaValori/numeroValori;

cout << media;

7.3334 7.3334

media = (float)(sommaValori/numeroValori);

cout << media; 7

media = (float)sommaValori/(float)numeroValori;

cout << media; 7.3334

(23)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 45

Riassumendo

m

Istruzioni di assegnazione

ð<variabile> = <espressione>

ðsemantica “operazionale” (ATTENZIONE) ðcompatibilità tra tipi (ATTENZIONE)

m

Espressioni

ðoperandi, operatori, funzioni predefinite

m

Cast

Elementi di Base: Assegnazioni >> Sommario

Elementi di Base: Assegnazioni >> Un Semplice Programma

// Calcolo della superficie del cerchio

#include <iostream.h>

void main() { // Dichiarazioni

const float pigreco = 3.14;

int raggio;

float cerchio, circonf;

// Operazioni

cout << “Immetti la lungh. del raggio” << endl;

cout << “(deve essere un numero intero)” << endl;

cin >> raggio;

cerchio = raggio * raggio * pigreco;

circonf = 2 * pigreco * raggio;

cout << “La circonferenza misura: “ << circonf << endl;

cout << “Il cerchio ha superficie: “ << cerchio << endl;

}

Un Semplice Programma

(24)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 47

Ringraziamenti

m Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela

(mariasamela@tiscali.it), a cui va il mio ringraziamento.

Ringraziamenti

Termini della Licenza

m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit

http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Termini della Licenza

m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare

http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Riferimenti

Documenti correlati

Il contributo allo sviluppo delle risorse umane da parte di Novartis avviene anche attraverso l’erogazione di attività formative e di crescita professionale: nel 2017, sono

In aggiunta al valore creato dalla presenza e attività di Lilly in tutte le dimensioni sopra analizzate, le parole evidenziate nella figura seguente rappresentano una chiave

Corso di STATISTICA MATEMATICA Prova scritta del

Mecca - Programmazione Procedurale in Linguaggio C++ 5 Elementi di Base: Introduzione &gt;&gt; Panoramica. // Calcolo della superficie

ðviene calcolato il valore dell’espressione ðse il valore risultante è compatibile con il tipo della variabile, viene assegnato alla variabile (ovvero: il valore viene scritto nello

[r]

E’ facile vedere che la soluzione trovata è definita in tutto il dominio assegnato.. L’integrale è improprio perché la funzione diventa infinita ai

Una particella con spin, in cui sia possibile trascurare il termine cinetico ´ e immersa in un campo magnetico diretto