CAPITOLO 2 - Tipi di dati e operatori in C++.

2.5 - L’enunciato di assegnazione

La forma sintattica di questo enunciato è la seguente:

variabile = espressione

In esecuzione il computer valuta l’espressione ed il suo valore è assegnato alla variabile (detta variabile di assegnazione). Il simbolo speciale = è detto operatore di assegnazione. Poiché l’espressione deve essere valutata occorre che tutte le variabili che vi compaiono siano già state inizializzate in precedenza per non incorrere in errori logici. Ciò non è necessario per la variabile che compare a sinistra dell’operatore =, tuttavia se essa possedeva già un valore questo sarà sostituito dal valore dell’espressione a sinistra dell’operatore =. In ogni caso l’area di memoria a disposizione del programma ha subito un cambiamento: la sequenza di bit contenuta all’indirizzo associato alla variabile di assegnazione è mutata dopo l’esecuzione di un enunciato di assegnazione: è cambiato lo stato del programma.

stato del programma: l’insieme dei valori delle variabili del programma

Si consideri la sequenza di istruzioni: n = 4; n = n+1; con la seconda istruzione il valore di n cambia da 4 a 5. Si osservi come l’occorrenza di n a sinistra di = si riferisce al suo indirizzo o left value mentre quella a destra di = si riferisce al suo contenuto o right value. Poiché un’assegnazione restituisce il risultato di un’espressione ( il valore del calcolo eseguito a destra viene assegnato alla variabile che appare a sinistra ) è necessario che il tipo della espressione sia compatibile con il tipo della variabile di assegnazione.

REGOLA 5: La variabile di assegnazione deve essere dello stesso tipo del valore dell’espressione

Gli algoritmi presentati fino ad ora sono molto semplici e seguono tutti il seguente schema:

Algoritmo leggi, elabora e stampa

Leggi uno o più valori
Elabora i valori letti
Stampa i risultati

Si consideri il seguente algoritmo per il calcolo del costo di un prodotto con lo sconto:

leggi(prezzo_singolo, quantità, % sconto)

stampa(prezzo_singolo*quantità - prezzo_singolo*quantità*sconto/100)

Algoritmi di questo tipo seguono il seguente schema:

Algoritmo leggi e stampa

Leggi uno o più valori
Stampa i risultati usando questi valori in opportune espressioni

Nel seguito introdurremo diversi schemi di algoritmi, il lettore li legga con attenzione. Se infatti nel risolvere un problema specifico riesce ad individuare l’opportuno schema da seguire non gli resterà altro che seguirlo adattandolo al caso particolare in esame.

Nel calcolo di un’espressione di tipo matematico è, a volte, necessario servirsi di funzioni particolari, come funzione potenze, radici, seno, coseno, logaritmo, e così via. Includendo il file <cmath>, cioè inserendo nel programma la direttiva #include <cmath> abbiamo a disposizione le seguenti funzioni matematiche:

FUNZIONE MATEMATICA FUNZIONE C++ OSSERVAZIONI
√x con x≥0 e restituisce un valore ancora x≥0 double sqrt(double x) radice quadrata di x
sen x con x numero reale double sin(double x) seno di x
cos x con x numero reale double cos(double x) coseno di x
tg x con x numero reale double tan(double x) tangente di x
arcsen x con x nell'intervallo [-1;1] double asin(double x) arcoseno di x
arccos x con x nell'intervallo [-1;1] double acos(double x) arcocoseno di x
arctg x con x numero reale double atan(double x) arcotangente di x
ex con x numero reale double exp(double x) e elevato ad x
10x con x numero reale double pow10(double x) 10 elevato ad x
ln x con x numero reale positivo double log(double x) logaritmo naturale di x
Log x con x numero reale positivo double log10(double x) logaritmo in base 10 di x
|x| con x numero reale double fabs(double x) valore assoluto di x
calcolo ipotenusa di un triangolo rettangolo double hypot(double x,double y) calcolo ipotenusa con cateti di lunghezza x ed y
arctg y/x double atan2(double y,double x)

arcotangente di y/x; il valore restituito è compreso
nell'intervallo [-pigreco; pigreco]

xy con x,y numeri reali double pow(double x, double y) x elevato ad y
calcola mantissa ed esponente double frexp(double x,int *esp) Scompone il numero x in mantissa ed esponente

Tutte le funzioni in C++ restituiscono dei valori double invece che float. A titolo esemplificativo, traduciamo in C++ le due espressioni matematiche seguenti:

funzioni
Le due espressioni si scrivono rispettivamente con le due istruzioni di assegnazione seguenti:

y = (a* pow(x,3) - 3*pow(x,5)) /(2*a*b) oppure y = (a* pow(x,3) - 3*pow(x,5)) /2/a/b

z = sqrt(pow(x,4) – 3) /fabs(x-1)

ESERCIZIO SULLO SCAMBIO.
Vogliamo scambiare i valori di due interi K e H, vale a dire, se inizialmente K=7 e H=9, vogliamo che il programma restituisca i dati invertiti: K=9 e H=7.
Sembra facile, no! Poniamo K=H e .......... abbiamo perso il valore di K! Infatti, abbiamo K=7 e H=7. E allora!!!
Utilizziamo una variabile di aiuto, K2, dove teniamo il valore di K, ponendo K2=K (quindi, K2=9, K=9, H=7); poi, poniamo K=H (quindi, K=7, H=7, K2=9) ed infine H=K2 (K=7, H=9, K2=9).

Come scambiare tre elementi?

sullo scambio di 3 elementi.

2.6 - Operatori di incremento e decremento

Tra gli operatori aritmetici forniti dal C++ ve ne sono alcuni che consentono di scrivere l’operazione in modo molto compatto. Consideriamo lo schema seguente

Variabile = Variabile operazioneEspressione

che traduce esempi come

i = i + 1; i = i – 1; somma = somma + i; p = p * h

questi possono essere scritti in modo compatto, rispettivamente, come da tabella

i = i + 1 i = i - 1 somma = somma + i p = p * h
i ++ i - - somma += i p *= h

In particolare ++ e -- sono detti rispettivamente operatori di incremento e decremento.

Tali operatori hanno due forme: una forma postfissa ( i++, i-- ) ed una prefissa ( ++i , --i).

Ebbene le due forme non sono equivalenti!

Il significato di i++ all’interno di una espressione è dato da:

“per valutare l’espressione adoperare il valore corrente di i , successivamente incrementare di uno la variabile i”.

mentre il significato di ++i all’interno di una espressione è:

“incrementare i di uno e successivamente adoperare questo valore nella valutazione della espressione“.

Consideriamo l’espressione:

somma += i++

poiché la forma è postfissa, i passi che vengono eseguiti sono i seguenti:

1) si prende il valore di i e si calcola somma +=i, cioè somma = somma + i;

2) si incrementa il valore di i.

L’espressione

somma += ++i

scritta nella forma prefissa diventa

1. si incrementa il valore di i;

2. si prende il valore di i così ottenuto e si calcola somma +=i, cioè somma = somma + i;

Le stesse considerazioni valgono per l’operatore di decremento.

Teniamo presente che gli operatori di incremento e decremento hanno la precedenza sugli altri operatori.

Per esempio, se scriviamo

a) k = 1 e i = ++k
b) k = 1 e i = k++

dopo ogni gruppo di due istruzioni quanto valgono k ed i ?

su ++ -- *= +=