Input/Output Formattato
Controllare l’aspetto dell’output
Section titled “Controllare l’aspetto dell’output”Stampare “3.14159265358979” va bene in alcuni casi, ma se stai mostrando un prezzo vuoi “3.14”. Se stai costruendo una tabella vuoi che le colonne siano allineate.
Il C++ offre strumenti per controllare con precisione come appaiono i dati sullo schermo. Per usarli, includi <iomanip>:
#include <iostream>#include <iomanip>using namespace std;Quante cifre decimali: setprecision
Section titled “Quante cifre decimali: setprecision”Di default, cout mostra 6 cifre significative. Con setprecision puoi cambiarle:
double pi = 3.14159265358979;
cout << pi << endl; // 3.14159 (default: 6 cifre)cout << setprecision(3) << pi << endl; // 3.14cout << setprecision(10) << pi << endl; // 3.141592654Per controllare le cifre dopo la virgola (non le cifre significative), aggiungi fixed:
double x = 1234.5678;
cout << fixed << setprecision(2) << x << endl; // 1234.57cout << fixed << setprecision(4) << x << endl; // 1234.5678cout << fixed << setprecision(0) << x << endl; // 1235 (arrotondato)Per la notazione scientifica (es. per numeri molto grandi o piccoli):
double grande = 1234567.89;cout << scientific << setprecision(3) << grande << endl; // 1.235e+06Larghezza minima: setw
Section titled “Larghezza minima: setw”setw(n) riserva almeno n spazi per il prossimo valore stampato. Se il valore è più corto, vengono aggiunti spazi davanti (a destra di default):
cout << setw(10) << "Nome" << setw(10) << "Età" << endl;cout << setw(10) << "Alice" << setw(10) << 16 << endl;cout << setw(10) << "Bob" << setw(10) << 17 << endl;Output:
Nome Età Alice 16 Bob 17Attenzione: setw è temporaneo. Vale solo per il prossimo valore stampato, poi va reimpostato.
Allineamento: left e right
Section titled “Allineamento: left e right”Di default i valori vengono allineati a destra. Puoi cambiarlo con left:
cout << left << setw(10) << "Alice" << endl; // Alicecout << right << setw(10) << "Alice" << endl; // AliceOutput:
Alice Aliceleft e right sono persistenti: rimangono attivi finché non li cambi.
Carattere di riempimento: setfill
Section titled “Carattere di riempimento: setfill”Di default setw riempie con spazi. Puoi usare un altro carattere:
cout << setfill('*') << setw(10) << "ciao" << endl; // ******ciaocout << setfill('0') << setw(5) << 42 << endl; // 00042Utile per creare separatori o codici con zeri iniziali.
Stampare bool come parole
Section titled “Stampare bool come parole”Di default true e false vengono stampati come 1 e 0. Con boolalpha vengono stampate le parole:
bool b = true;cout << b << endl; // 1cout << boolalpha << b << endl; // true
bool f = false;cout << boolalpha << f << endl; // falseRiepilogo: persistente vs temporaneo
Section titled “Riepilogo: persistente vs temporaneo”| Modificatore | Dura fino a… |
|---|---|
fixed, scientific | Finché non lo cambi |
left, right | Finché non lo cambi |
boolalpha | Finché non lo cambi |
setprecision(n) | Finché non lo cambi |
setfill(c) | Finché non lo cambi |
setw(n) | Solo il prossimo valore |
Esempio pratico: tabella formattata
Section titled “Esempio pratico: tabella formattata”#include <iostream>#include <iomanip>#include <string>using namespace std;
int main() { // Intestazione della tabella cout << left << setw(15) << "Studente" << setw(8) << "Età" << setw(10) << "Voto" << endl;
// Riga separatrice cout << setfill('-') << setw(33) << "" << endl; cout << setfill(' '); // ripristina il riempimento con spazio
// Dati degli studenti struct Studente { string nome; int eta; double voto; }; Studente studenti[] = { {"Alice", 16, 8.5}, {"Bob", 17, 7.2}, {"Carlo Verdi", 15, 9.1} };
for (const auto& s : studenti) { cout << left << setw(15) << s.nome << setw(8) << s.eta << fixed << setprecision(1) << setw(10) << s.voto << endl; }
return 0;}Output:
Studente Età Voto---------------------------------Alice 16 8.5Bob 17 7.2Carlo Verdi 15 9.1