Next: Funzioni matematiche
Up: Funzioni
Previous: Ancora sulle funzioni
  Indice
  Indice analitico
Nei primi paragrafi di questo capitolo abbiamo parlato di conversioni
implicite, effettuate in maniera del tutto automatica dal compilatore,
ove possibile. Esiste un modo in C++ di controllare tali conversioni, dette
esplicite perché messe in atto dal programmatore. Il significato
profondo delle conversioni esplicite diverrà chiaro solo molto più in là
nello studio del linguaggio; ci si accontenti in questa sede di familiarizzare
con le loro sintassi. Esistono in C++ due tipi di conversioni esplicite, che
indicheremo con i nomi di stile-C e stile-C++. Le conversioni esplicitice
stile-C, dette cast, hanno la seguente sintassi:
(tipo_in_uscita)variabile
|
mentre per le conversioni esplicite stile-C++ abbiamo:
tipo_in_uscita(variabile)
|
Le due sintassi risultano molto simili tra loro formalmente, tuttavia
presentano profonde differenze concettuali, che esamineremo in altra sede. Per
ora è possibile utilizzare indifferentemente l'una o l'altra sintassi.
Comunque, si tenga in considerazione che i casi nei quali una conversione
esplicita è necessaria sono davvero pochi; quindi prima di adoperare con
scioltezza tale costrutto, si faccia un esame di coscienza chiedendosi se per
caso non si poteva procedere in maniera da evitare la conversione. Ecco alcuni
esempi:
// ex4_6_1.cpp
#include <iostream.h>
double cubo (double x) {
return x * x * x;
}
void main () {
double x;
cout << "x = "; cin >> x;
int n = (int)x;
int m = (int)cubo(x);
cout << "n = " << n << "\n";
cout << "m = " << m << "\n";
}
esempio di output:
x = 2.5
n = 2
m = 15
Si noti che le conversioni esplicite possono essere applicate, oltre che a
variabili, anche direttamente al ritorno di una funzione, come nell'esempio
precendente.
// ex4_6_2
// stampa numeri pseudocasuali compresi tra 0 e 1
#include <iostream.h>
#include <time.h> // time(0)
#include <stdlib.h> // rand() e srand
bool primaVolta = true;
double pseudocasuale() {
// RAND_MAX e' il massimo numero casuale generabile
// double x = rand() / RAND_MAX; // x = 0 sempre
double x = double(rand()) / double(RAND_MAX);
return x;
}
void main () {
srand();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++)
cout << pseudocasuale() << "\t";
cout << "\n";
}
}
esempio di output:
| 0.538431 |
0.134463 |
0.535882 |
0.787069 |
0.51592 |
| 0.402621 |
0.162227 |
0.447079 |
0.933299 |
0.800465 |
| 0.380121 |
0.724816 |
0.240518 |
0.257309 |
0.368562 |
| 0.0406549 |
0.0897557 |
0.109004 |
0.810874 |
0.107771 |
| 0.961749 |
0.517911 |
0.758584 |
0.115805 |
0.776136 |
In questo caso la conversione esplicita è fondamentale nello statement:
double x = double(rand()) / double(RAND_MAX);
|
perché in caso contrario (si consiglia di provare per credere) il
programma effettua per prima cosa la divisione fra due interi, la quale
ha quoziente sempre nullo perchè rand()
è sempre più
piccolo di RAND_MAX
, e poi converte implicitamente il risultato
in double. Dobbiamo invece far sì che la divisione operata sia tra
numeri reali, sfruttando le conversioni esplicite (nota: un cast avrebbe
funzionato ugualmente).
- ex-2
- si scriva un programma che accetti un numero intero, un carattere e un
numero reale; dopo avere effettuato le opportune conversioni, si stampi la
loro somma, la quale deve essere un numero intero;
- ex-3
- si scriva un programma che accetti un numero intero e restituisca il suo
inverso (come numero reale); si gestisca il caso in cui l'utente inserisce
il numero
;
Next: Funzioni matematiche
Up: Funzioni
Previous: Ancora sulle funzioni
  Indice
  Indice analitico
Claudio Cicconetti
2000-09-06