Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 5.C++ funzioni matematiche ed espressioni booleane


C++ funzioni matematiche


C++ funzioni matematiche


Esercizi


C++ operatori di incremento

Variabile = Variabile operazione Espressione;
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
Variabile operatore = espressione;
i++      i–     somma += i      p *= h

In particolare i primi due termini i = i + 1 ed i = i – 1, sono detti rispettivamente operatori di incremento e decremento.

Tali operatori hanno due forme:
una forma postfissa (i++, i–) e la forma prefissa (++i , –i).

C++ operatori di in(de)cremento

Gli operatori di incremento ++ o decremento – - aumentano o diminuiscono di un’unità il valore dell’operando (l-value di tipo standard)
var++; equivale a var = var + 1;
++var; equivale a var = var + 1;

la forma incremento (o decremento) conviene perché è più compatta e soprattutto perché consente di ridurre il numero di istruzioni

  • Nella forma prefisso l’incremento (o il decremento) viene eseguito prima che la variabile sia utilizzata nell’espressione;
  • Nella forma suffisso avviene il contrario.

Questa distinzione non è importante quando li utilizziamo singolarmente. La distinzione è particolarmente significativa quando gli operatori di incremento e decremento sono usati in espressioni che coinvolgono altri operatori.

C++ operatori di in(de)cremento

  • var++ si dice in notazione postfissa
    “usa il valore della variabile e poi incrementala di 1″
  • ++var si dice in notazione prefissa
    “incrementa di 1 la variabile e poi usa il valore”

Esempio a lato.


C++ operatori di in(de)cremento


Esercizio

a) k = 8 e   i = ++k
quanto valgono k ed i ?

b) k = 8 e   i = k++
quanto valgono k ed i ?

Si veda l’esercizio 5.1

C++ casting di tipo implicito

Il C++ esercita un forte controllo sui tipi e dà messaggio di errore quando si tenta di eseguire operazioni fra operandi di tipo non ammesso

Durante l’esecuzione di un programma ci sono situazioni in cui viene cambiato il tipo di dato (casting implicito):

  • quando un valore di un tipo viene assegnato alla variabile di un altro;
  • quando un’operazione contiene due elementi di tipo diverso (per esempio la somma di un intero con un reale);

Ciò può provocare degli errori difficilmente individuabili.

C++ casting di tipo implicito

I quattro operatori matematici si applicano a qualsiasi tipo standard, ma i tipi dei due operandi devono essere uguali.

Nel caso di due tipi diversi, il compilatore esegue una conversione di tipo implicita su uno dei due operandi

… seguendo la regola di promuovere il tipo più semplice (meno ampio in bytes) a quello più complesso (più ampio in bytes),

… secondo la seguente gerarchia (in ordine crescente di complessità):
bool →  char  →  unsigned char →    short  →    unsigned short  →    long  →    unsigned long  →  float  →   double  →   long double

Esempio: 3.4/2 il secondo operando è trasformato in 2.0 e il risultato è correttamente 1.7

C++ casting di tipo implicito

Nelle assegnazioni, il tipo dell’operando di destra viene sempre convertito implicitamente nel tipo dell’operando di sinistra.
Se il tipo dell’espressione ha una precisione minore del tipo della variabile, come in
Variabile-double = espressione-float
allora non c’è alcun problema; se, invece, accade il contrario, come in
Variabile-float = espressione-double
potrebbero nascere due tipi di problemi:

  1. il risultato dell’espressione-double contiene un numero di cifre che il tipo float non gestisce, con una grave perdita di precisione;
  2. il risultato dell’espressione-double supera il massimo valore rappresentabile come float: in tal caso non è prevedibile in generale il comportamento del programma.

Esempio:
int c;
double d;
c = d  (warning in fase di compilazione)

C++ casting di tipo implicito

Nelle operazioni fra tipi interi, se il valore ottenuto esce dal range (overflow), l’errore non viene segnalato.

Anche il casting implicito può generare un overflow che non viene segnalato come errore.

Es. short n = 32767;

n++; (l’errore non viene segnalato, ma in n si ritrova il numero -32768)

È bene non adoperare espressioni in cui sono presenti variabili di tipo diverso.

Esercizio

Se n1 ed n2 sono variabili di tipo int , r una variabile di tipo float e c una variabile di tipo char, dire cosa stampa il computer allorché esegue le seguenti istruzioni:

n1= 11;
n2=3 ;
cout<<n1*n2>>;
c=’H';
n2=n1%n2;
cout<<c<<endl<<n2;
r=n1/n2;
n1=n1/n2;
cout<<n1<<endl<<r;

Scrivere un programma completo che esegua questa sequenza di istruzioni.

C++ casting di tipo esplicito

L’operatore di casting (o di conversione esplicita), serve per forzare una conversione di tipo (ha due operandi)

in C++ equivale a:
(tipo) variabile
tipo (variabile)

static_cast <tipo> (variabile)

consiste nell’indicazione del nuovo tipo fra parentesi davanti al nome della variabile da trasformare.

Tutti i tipi standard consentono il casting

  • se la variabile da trasformare è operando di una certa operazione, il tipo risultante deve essere fra quelli ammissibili (altrimenti viene generato un errore in compilazione)

Esempio: float (n) % 3 é errato in quanto l’operatore % ammette solo operandi interi.

C++ casting di tipo esplicito

Esempio:

int i=32;

cout<< (char) i << ” ha codice “<< i<<endl;

l’intero i viene convertito in modo esplicito a carattere.

C++ operatori logici


C++ operatori logici


C++ operatori logici

Supponiamo che a e b siano due numeri interi; allora l’istruzione
if ((a==0) && (b==0))
cout<<” a e b sono entrambi nulli”;
scrive ‘a e b sono entrambi nulli’ soltanto se è vero che sia il valore contenuto in a che quello contenuto in b sono nulli; l’istruzione
if ((a==0) || (b==0))
cout<<”almeno uno dei due numeri a e b è nullo”;
dà la scritta ‘almeno uno dei due numeri a e b è nullo’ soltanto se almeno uno dei due numeri è uguale a 0.

È bene ricordare che le espressioni booleane semplici che compaiono in una espressione composta devono essere racchiuse tra parentesi tonde e che l’operatore di negazione ha la precedenza sugli altri due.

Due espressioni logiche si dicono equivalenti se esse assumono sempre lo stesso valore di verità, qualunque sia il valore di verità delle espressioni logiche semplici che la compongono.

C++ operatori logici


C++ operatori logici

Si noti che l’espressione booleana (A1) && (A2) && …&& (An) è valutata nel seguente modo:

  • appena si incontra una A che valuta a falso la computazione dell’espressione viene interrotta,
  • le A successive non sono valutate e si ritorna il valore falso per l’intera espressione.

Analogamente per l’espressione A1 || A2 || … || An

  • si ritorna il valore vero non appena si incontra una A che valuta a vero.
  • In questo modo non solo si velocizza la computazione ma l’espressività del linguaggio ne risulta potenziata.

Ad esempio si può scrivere: if((a!=0) && (b/a<c)) …
Bisogna però fare attenzione:
l’espressione ((b/a<c)&&(a!=0)) pur essendo logicamente equivalente alla prima darebbe un errore a runtime se a fosse nullo perché cerca di dividere un numero per 0.

I materiali di supporto della lezione

Esercizio 5-1

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion