CAPITOLO 1 - Primi programmi in C++.

1.5 – Le istruzioni di I/O cin e cout

La forma generale di una istruzione per la lettura da tastiera di n variabili x1 x2 …xn è la seguente:
cin>>x1>>x2>>…>>xn;
allorchè il cursore lampeggia per effetto di questa istruzione l’utente dovrà immettere uno dopo l’altro il valore delle corrispondenti variabili, ognuno separato dall’altro da almeno uno spazio vuoto (blank) e premere il tasto Invio, I caratteri immessi sono inviati in un buffer di ingresso che rappresenta l’area di memoria dell’oggetto cin ( canale di input ).
L’operatore di estrazione ">>" provvede ad estrarli nel modo seguente:
Per ogni variabile x che si deve leggere

Infine la sequenza di caratteri letti è codificata nella corrispondente sequenza di zeri e di uno (che dipende dal tipo della variabile ) e quest’ultima è inserita nell’indirizzo di memoria corrispondente alla variabile.
ESEMPI.
Supponiamo che base e altezza siano variabili di tipo float, eseguendo l’istruzione
cin >> base >> altezza;
il computer estrae un valore corretto dai caratteri digitati da tastiera finché non incontra il primo carattere spazio: tale valore verrà associato alla variabile base. In altre parole ogni variabile termina quando incontriamo uno spazio vuoto, mentre il computer estrarrà valori per queste variabili fino al carattere di fine linea.
Per esempio, all’apparire dell’istruzione precedente si può digitare
15.2 12.2[INVIO]
ed il computer provvederà a porre 15.2 nella zona di memoria relativa alla variabile base e 12.2 in quella relativa alla variabile altezza.
Allorché un programma deve ricevere dati in input è utile stampare un opportuno messaggio a video che spieghi all’utente cosa deve scrivere.

REGOLA 3: Far precedere ogni istruzione di lettura da un opportuno messaggio che fornisca informazioni sull’input che ci si aspetta.

Per questo motivo nell’illustrare l’algoritmo del calcolo della circonferenza abbiamo usato l’espressione

leggi(raggio)

come un’abbreviazione per avvertire l’utente con un opportuno messaggio di digitare il valore del raggio. Analogamente l’espressione stampa(circonferenza) è una abbreviazione per:
avvertire l’utente con un opportuno messaggio sul significato di ciò che sarà stampato a video.

La forma generale di una istruzione di scrittura tramite cout (canale di output) è la seguente:
cout<<espr1<<espr2<<.…<<esprn;
dove espr1,espr2,…,esprn sono espressioni che all’atto dell’esecuzione dell’istruzione sono valutate e poi inviate al dispositivo standard di uscita, il monitor del personal computer, tramite l’operatore di inserzione "<<".
Tutti i dati di output siano scritti sulla stessa linea, l’uno di seguito all’altro. È utile adoperare opportuni spazi bianchi dentro le stringhe di output per rendere più leggibili gli output.
Ad esempio l’istruzione:
cout<<”Circonferenza= ”<<circonferenza;
ordina di inviare il contenuto dei dati che appaiono a destra ( il valore letterale “Circonferenza= ” ed il contenuto della variabile circonferenza ) sul monitor.
Per portare il cursore sulla riga successiva si può:
1) includere il carattere speciale di fine riga \n, in una stringa costante, come “Salve mondo! \n”
2) inserire l’identificatore speciale, endl.
Per esempio, per far comparire sul monitor i valori delle variabili base, altezza su due linee separate si possono utilizzare le seguenti istruzioni:
cout << “Base triangolo: “ << base << endl;
cout << “Altezza triangolo: “ << altezza << endl;

Si noti che le variabili base e altezza rappresentano in queste istruzioni il loro valore (right value) mentre nell’istruzione:
cin>>base>>altezza;
rappresentano il loro indirizzo (left value).
Le seguenti istruzioni:
cout << “Salve! \n”;
cout << “Come va? \n”;

genereranno il seguente output:
Salve!
Come va?

REGOLA 4: E’ opportuno che al termine di una istruzione di stampa il cursore sia situato all’inizio della linea successiva.

Per andare a capo abbiamo utilizzato, all'interno della stringa da scrivere, i simboli “\n”.
La barra inversa ‘\’ è detta carattere di escape, mentre l’insieme dei due caratteri, barra inversa più carattere successivo, prende il nome di sequenza di escape. Essi sono utili sia per andare a capo, per muoversi nelle tabulazioni, …... e così via.

Sequenza di escape Descrizione
\n Carattere di fine linea (è inserito premendo il tasto Invio
\t Posiziona il cursore del video sulla tabulazione successiva (tasto TAB)
\a Emette un beep
\r Posiziona il cursore all'inizio della linea corrente
\b Il cursore ritorna indietro di un carattere ( tasto Backspace ←)
\\ Stampa la barra inversa
\" Stampa le doppie virgolette

Le sequenze di escape sono utili anche per scrivere sul monitor dei caratteri particolari quali la stessa barra inversa ( \ ) o le doppie virgolette ( “ ). Per esempio, per far scrivere sul monitor la frase seguente, contenente la barra inversa e le doppie virgolette
Stampiamo questi due simboli \ e “

dobbiamo assegnare la seguente istruzione
cout<<”Stampiamo questi due simboli \\ e \””;

Ricordiamo che le costanti stringa devono essere racchiuse tra doppi apici mentre le costanti carattere tra apici semplici.

Per l’output formattato abbiamo 4 diverse modalità di scrittura dei numeri,

fixednumeri scritti in formato decimale125.4
scientificnumeri scritti in formato esponenziale1.254e+02
hexfloatnumeri scritti in formato esadecimaleA09E
defaultfloatnumeri scritti sia in formato decimale che esponenziale (default)

che si possono abbinare con tre funzioni fondamentali definite nel file <iomanip>:

setw(ampiezza);
setprecision(cifre);
setfill(carattere);

dove ampiezza e cifre sono due interi che rappresentano, rispettivamente, l’ampiezza di campo totale messa a disposizione della variabile ed il numero massimo di cifre decimali che possono essere visualizzate per il formato fixed, il numero massimo totale di cifre per gli altri formati; il carattere richiamato in setfill sostituisce eventualmente il blank (spazio vuoto).
L'istruzione setw(...) deve precedere ogni ordine di stampa sul monitor, cioè ogni variabile che deve essere stampata deve essere preceduta dal rispettivo ordine di formattazione. Per esempio, se
A=12.45 e B=1234.56709;
le istruzioni:

cout<<setprecision(8); cout<<setw(12)<<A<<endl; cout<<B<<endl;

stamperanno sul video

12.45 1234.5671

per cui solo il valore di A sarà stampato con un’ampiezza di 12 caratteri, a partire da destra; il valore di B sarà stampato con la formattazione standard ( le cifre sono scritte a partire da sinistra). Scrivendo invece:

cout<<fixed<<setprecision(4); cout<<setw(12)<<A<<endl; cout<<setw(12)<<B<<endl;

si otterrà:

12.4500 1234.5671

la differenza è nell'uso del formato fixed e di setprecision(N): nel primo caso,setprecision(8), ordina di stampare 8 cifre complessive, mentre nel secondo esempio, con fixed, setprecision(4) ordina di stampare esattamente 4 cifre decimali.
Il programma completo, che contiene anche i due esempi precedenti, utilizza nell'ultima stampa anche il comando setfill('*'), che stampa il carattere '*' al posto del carattere spazio, con il formato scientific.

#include <iostream> #include <iomanip> using namespace std; int main() { float a=12.45,b=1234.56709; cout<<setprecision(8); cout<<setw(12)<<A<<endl; cout<<B<<endl; cout << "fixed" << endl; cout<<fixed<<setprecision(4); cout<<setw(12)<<A<<endl; cout<<setw(12)<<B<<endl; cout << "scientific" << endl; cout<<scientific<<setprecision(6); cout<<setfill('*')<<setw(18)<<A<<endl; cout<<setw(18)<<B<<endl; return 0; }

si otterrà l'immagine seguente

Scriviamo un programma che letti due numeri reali, li metta in colonna e li sommi.