next up previous contents index
Next: Introduzione alle funzioni Up: Funzioni Previous: Costanti letterali   Indice   Indice analitico

Variabili costanti

Nel paragrafo precedente abbiamo trattato le costanti letterali, definendole come identificatori avente un valore noto a priori, imposto dal linguaggio. Ben diverse sono invece le variabili costanti, le quali sono vere e proprie variabili, per cui la sintassi di inizializzazione e dichiarazione è la stessa delle variabili, il cui valore non può essere modificato. Le variabili costanti non esistevano in C, ove era invece comune usare delle direttive al preprocessore, di cui non abbiamo al momento parlato, che permettevano di creare delle nuove costanti letterali; ad esempio con lo statement

#define PIGRECO 3.141592
si aveva che prima di compilare il programma, venivano letteralmente sostituite tutte le ricorrenze di PIGRECO con 3.141592. Tale modo di procedere era comodo ed efficace per un linguaggio a basso livello come il C, ma del tutto insufficiente e pericoloso per il più astratto C++. Nelle ultime versioni del C, comunque, le variabili costanti sono state introdotte di riflesso dal C++, pur con una implementazione leggeremente diversa. Noi comunque ci occuperemo unicamente delle variabili costanti in C++. Si veda il seguente esempio:

// ex4_2_1.cpp
#include <iostream.h>
void main() {
  int a = 5;
  const int b = 5;
  int c = b;
  // const int d;  // ERRORE: le variabili costanti
                   // devono essere inizializzate
  a = 10;
  // b = 10;       // ERRORE: non si puo' modificare il
                   // valore di una costante
  cout << a << '\t' << b << '\t' << c;
}
output:
 10 5 5

Se si prova a compilare il programma togliendo il commento nello statement b = 10 si ottiene un errore da parte del compilatore, perché non è possibile, come abbiamo detto, modificare il valore di una variabile costante4.6. Le costanti devono essere inizializzate, poiché per esse non è definito l'operatore di assegnamento. In qualunque programma è utile avere delle costanti che sappiamo essere fisse sempre e comunque, perché il loro uso evita il diffondersi dei cosiddetti numeri magici, ossia costanti letterali numeriche dal significato esoterico per tutti tranne il programmatore stesso. Vediamo i seguenti esempi:


// ex4_2_2.cpp
#include <iostream.h>
void main() {
  const double PIGRECO = 3.141592;
  double raggio;
  cout << "raggio? ";
  cin >> raggio;
  double area = raggio * raggio * PIGRECO;
  cout << "l'area e' " << area;
}

esempio di output:
raggio: 10
l'area e' 314.159

Il numero $\pi$ si presta molto bene ad essere rappresentato come una costante, in quanto esso è matematicamente ben definito. Si noti che le costanti, per convenzione universalmente accettata, usano identificatori con caratteri esclusivamente in maiuscolo. Prendiamo il seguente esempio:


// ex4_2_3.cpp
#include <iostream.h>
void main() {
  const int N_COMPITI_IN_CLASSE = 3;
  double totale = 0;
  for (int i = 1; i <= N_COMPITI_IN_CLASSE; i++) {
    double voto;
    cout << "voto compito in classe n. " << i << "? ";
    cin >> voto;
    totale += voto;
  }
  double media = totale / N_COMPITI_IN_CLASSE;
  cout << "media: " << media;
  if (media < 6)
    cout << "\nstudiare non fa poi cosi' male...";
  else if ( (media >= 6) && (media < 7) )
    cout << "\nchi si contenta gode...";
  else if ( (media >= 7) && (media < 8) )
    cout << "\ncontinua cosi' :-)";
  else
    cout << "\nsiamo proprio sicuri che non hai barato ;-) ?";
}

esempio di output:
voto compito in classe n. 1? 6.5
voto compito in classe n. 2? 7.5
voto compito in classe n. 3? 7
media: 7
continua cosi' :-)

In questo esempio il numero di compiti in classe sui quali effettuare la media, non è una costante matematica (come $\pi$), tuttavia è comunque meglio utilizzare una variabile costante, perché il numero $3$ sostituito nelle occorrenze di N_COMPITI_IN_CLASSE sarebbe un numero magico: come potrebbe un utilizzatore del codice comprendere il suo significato?


// ex4_2_4.cpp
#include <iostream.h>
void main() {
  // costante gravitazionale (sistema MKS)
  const double G = 6.67e-11;
  double m1, m2, distanza;
  cout << "massa 1 ? "; cin >> m1;
  cout << "massa 2 ? "; cin >> m2;
  cout << "distanza? "; cin >> distanza;
  double F = G * (m1 * m2) / (distanza * distanza);
  cout << "F = " << F;
}

esempio di output 4.7:
massa 1 ? 5.98e24
massa 2 ? 7.34e22
distanza? 3.84e8
F = 1.98546e+20

Abbiamo utilizzato nel precedente esempio la formula della gravitazione universale di Newton:

\begin{displaymath}
F = G~\frac{m_1 \cdot m_2}{d^2}
\end{displaymath}

ove $G$ è la costante gravitazionale (nel sistema MKS è $G = 6.670 \cdot
10^{-11}~N~m^2~/~kg^2$), e $m_1$ e $m_2$ sono le masse di due corpi posti a distanza $d$. Si noti che è stato utilizzato l'identificatore F, cioè una lettera maiuscola, per una variabile; F, la forza gravitazionale, è solitamente utilizzata in carattere maiuscolo, per cui è bene fare una eccezione alla regola convenzionale precedentemente enunciata a proposito degli identificatori delle variabili; una eccezione del genere riguarda la costante di Nepero, la quale viene per chiarezza solitamente identificata con una e minuscola.

ex-2
si scriva un programma che calcoli la forza elettrostatica agente tra due cariche fisse $q_1$ e $q_2$ poste a distanza $d$; si usi la formula di Coulomb:

\begin{displaymath}
F = k \cdot \frac{q_1 \cdot q_2}{d^2}
\end{displaymath}

nel sistema MKS è $k = 8.99 \cdot 10^9~N~m^2~/~C^2$
ex-3
si scriva un programma che calcoli la superficie e l'area di una sfera di raggio $r$ immesso dall'utene; ricordiamo le formule:

\begin{displaymath}
S = 4\pi~r^2 \qquad V = \frac{4}{3}\pi~r^3
\end{displaymath}


next up previous contents index
Next: Introduzione alle funzioni Up: Funzioni Previous: Costanti letterali   Indice   Indice analitico
Claudio Cicconetti
2000-09-06