Sezione 1.4 
Comunicazione da console. 


La  console è l'interfaccia base del calcolatore, essa è di solito composta da una tastiera ed un video. La tastiera viene usata come unità di input standard e il video come unità di output output standard.

Nalla libreria standard iostream del C++ le operazioni di input ed output di un programma vengono gestite da due flussi di dati ( stream): cin per l'input e cout per l'output. Sono definiti  inoltre altri due flussi - cerr e clog - il cui scopo è quello di segnalare eventuali messaggi di errore. Tali flussi possono essere mandati anch'essi sul video oppure inviati in un file di log .

Dunque cout (il flusso di output standard) è normalmente diretto al video e  cin (il flusso di input standard) è normalmente assegnato alla tastiera.

Usando questi due flussi un programma può interagire con un utente mostrando messaggi sullo schermo e ricevendo l'input da parte dell'utente dalla tastiera.

Output (cout)

Il flusso cout viene usato assieme all'operatore sovraccaricato << (una coppia di segni di "minore" ).
cout << "Frase di output"; // stampa Frase di output sullo schermo
cout << 120;               // stampa il numero 120 sullo schermo
cout << x;                 // stampa il valore della variabile x sullo schermo
L'operatore << è noto come operatore di inserimento in quanto esso inserisce il valore alla sua destra nel flusso di dati indicato alla sua sinistra. Negli esempi precedenti esso inserisce nel flusso di output standard cout la stringa costante Frase di output, la costante numerica 120 e il valore della variabile x. Osserviamo che nella prima riga la frase da stampare è racchiusa tra doppi apici  ( "), questo perché essa è una stringa di caratteri. Quando vogliamo usare una stringa costante di caratteri dobbiamo racchiuderla tra doppi apici ( ") per distinguerla da un identificatore di variabile.  Ad esempio, le due frasi seguenti hanno un significato molto diverso:
cout << "Salve";      // stampa Salve sullo schermo
cout << Salve;        // stampa il valore della variabile Salve sullo schermo
L'operatore di inserzione  (<<) può essere usato più di una volta nella stessa frase. Ad esempio:
cout << "Salve, " << "io sono " << "una frase C++";
stampa sullo schermo Salve, io sono una frase C++ . L'utilità di poter usare più volte l'operatore di inserzione nella stessa frase si vede quando dobbiamo stampare una combinazione di costanti e variabili o anche semplicemente più di una variabile:
cout << "Salve, io ho " << eta << " anni e il mio CAP e' " << cap;
Se assumiamo che la variabile eta  abbia il valore 24 e che la variabile cap abbia valore 65064 l'output che si ottiene è:
Salve, io ho 24 anni e il mio CAP e' 65064
Attenzione: cout non va a capo dopo aver stampato a meno che non glielo si dica esplicitamente. Pertanto, con le due seguenti frasi:
cout << "Questa e' una frase.";
cout << "Questa e' un'altra frase.";
otteniamo:
Questa e' una frase.Questa e' un'altra frase.
anche se sono state scritte con due distinte chiamate a cout . Per andare a capo bisogna inserire esplicitamente nel flusso un carattere speciale di nuove-linea che, in C++, si indica con \n :
cout << "Prima frase.\n ";
cout << "Seconda frase.\nTerza frase.";
produce:
Prima frase.
Seconda frase.
Terza frase.
Per andare a capo possiamo anche usare il manipolatore endl . Ad esempio:
cout << "Prima frase." << endl;
cout << "Seconda frase." << endl;
stampa:
Prima frase.
Seconda frase.

Input (cin).

In C++ l'input standard si effettua applicando l'operatore di estrazione (>>) al flusso cin . Tale operatore deve essere seguito dalla variabile in cui deve essere memorizzato il valore da leggere. Ad esempio: 
int eta;
cin >> eta;
dichiara la variabile age di tipo int e quindi aspetta un input da cin (tastiera) per poter memorizzare un valore intero in tale variabile.

Attenzione: cin elabora l'input ricevuto da tastiera soltanto dopo che è stato premuto il tasto di invio ENTER. Quindi, anche se viene richiesto di leggere un singolo carattere, cin non elabora l'input fino a quando, dopo aver premuto il tasto del carattere da leggere, non viene premuto anche il tasto ENTER.

Quando si usa l'estrattore (>> ) su cin bisogna tener presente il tipo della variabile che si usa per memorizzare il valore letto. Se viene richiesto un intero deve essere introdotto un intero, se viene richiesto un carattere deve essere introdotto un carattere e se viene richiesta una stringa deve essere introdotta una stringa.

// esempio di i/o
#include <iostream.h>

int main ()
{
  int i;
  cout << "Dammi un intero: ";
  cin >> i;
  cout << "Il valore che mi hai dato e' " << i;
  cout << " e il suo doppio e' " << i*2 << ".\n";
  return 0;
}
Dammi un intero: 702
Il valore che mi hai dato e' 702 e il suo doppio e' 1404.

Un utente malaccorto può essere una delle cause che provocano un errore nell'esecuzione di semplici programmi che usano cin (come quello appena visto). La ragione è che se viene richiesto un intero e l'utente introduce il suo nome (che è una stringa di caratterei) il programma non funziona correttamente perché una stringa non è ciò che esso si aspetta dall'utente. Per ora, nei nostri programmi di esempio, assumeremo che l'utente sia perfettamente cooperativo ed introduca sempre dati del tipo richiesto dal programma. Vedremo in seguito come sia possibile scrivere programmi più robusti che accettano qualsisi input e, qualora esso non sia del tipo appropriato, chiedono all'utente di riimmettere un valore corretto.                          

Si può anche usare cin per richiedere più di un dato alla volta: 

cin >> a >> b;
è equivalente a:                                                      
cin >> a;
cin >> b;
  In entrambi i casi l'utente deve fornire due valori dei tipi appropriati, uno per la variabile a ed uno per la variabile b . Tali valori possono essere separati da uno o più caratteri spazio o tabulazione o nuova-linea .


Precedente:
1-3. Operatori.

indice
Seguente:
2-1. Strutture di controllo.